diff --git a/.github/workflows/lynx.yml b/.github/workflows/lynx.yml index 16a9b4f28..c3e2a1164 100644 --- a/.github/workflows/lynx.yml +++ b/.github/workflows/lynx.yml @@ -25,13 +25,13 @@ jobs: os: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: 'pnpm' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c9d560a82..2cf7a06f8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,15 +9,15 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - node: ['18.x', '20.x', '22.x'] + node: ['22.x', '24.x'] os: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: 'pnpm' diff --git a/.github/workflows/mainnet.yml b/.github/workflows/mainnet.yml index cc52462f3..e3b174d21 100644 --- a/.github/workflows/mainnet.yml +++ b/.github/workflows/mainnet.yml @@ -23,13 +23,13 @@ jobs: os: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: 'pnpm' diff --git a/.github/workflows/npm.yml b/.github/workflows/npm.yml index 6a5df4521..93152ecb2 100644 --- a/.github/workflows/npm.yml +++ b/.github/workflows/npm.yml @@ -17,7 +17,7 @@ jobs: - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fa55a0060..0b1d39df3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,11 +11,11 @@ jobs: name: Publish NPM package using changesets runs-on: 'ubuntu-latest' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: 'pnpm' diff --git a/.github/workflows/tapir.yml b/.github/workflows/tapir.yml index dd207b0d7..c0ac2096f 100644 --- a/.github/workflows/tapir.yml +++ b/.github/workflows/tapir.yml @@ -27,13 +27,13 @@ jobs: os: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 with: version: 9 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: 'pnpm' diff --git a/.gitignore b/.gitignore index 68b9883f8..6e8e08641 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ docs-json .next packages/docs docs +.claude/ diff --git a/.nvmrc b/.nvmrc index 3c032078a..2bd5a0a98 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18 +22 diff --git a/demos/taco-demo/package.json b/demos/taco-demo/package.json index e69859f93..6ce20fe4c 100644 --- a/demos/taco-demo/package.json +++ b/demos/taco-demo/package.json @@ -25,22 +25,22 @@ "react-spinners": "^0.14.1" }, "devDependencies": { - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0", "@types/react": "^18.3.20", "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-dom": "^18.3.5", - "copy-webpack-plugin": "^12.0.2", + "copy-webpack-plugin": "^13.0.0", "crypto-browserify": "^3.12.1", "esbuild-loader": "^2.21.0", "html-webpack-plugin": "^5.6.3", "process": "^0.11.10", - "react-refresh": "^0.14.2", + "react-refresh": "^0.17.0", "rimraf": "^5.0.10", "stream-browserify": "^3.0.0", "typescript": "^4.9.5", "vm-browserify": "^1.1.2", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.2" + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" } } diff --git a/demos/taco-nft-demo/package.json b/demos/taco-nft-demo/package.json index 95b7acbf5..75e62e3e1 100644 --- a/demos/taco-nft-demo/package.json +++ b/demos/taco-nft-demo/package.json @@ -24,19 +24,19 @@ "react-spinners": "^0.14.1" }, "devDependencies": { - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0", "@types/react": "^18.3.20", "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-dom": "^18.3.5", - "copy-webpack-plugin": "^12.0.2", + "copy-webpack-plugin": "^13.0.0", "esbuild-loader": "^2.21.0", "html-webpack-plugin": "^5.6.3", - "react-refresh": "^0.14.2", + "react-refresh": "^0.17.0", "rimraf": "^5.0.10", "stream-browserify": "^3.0.0", "typescript": "^4.9.5", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.2" + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" } } diff --git a/examples/pre/nextjs/next-env.d.ts b/examples/pre/nextjs/next-env.d.ts index 40c3d6809..830fb594c 100644 --- a/examples/pre/nextjs/next-env.d.ts +++ b/examples/pre/nextjs/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/pre/nextjs/package.json b/examples/pre/nextjs/package.json index bc50d2318..937cdbd13 100644 --- a/examples/pre/nextjs/package.json +++ b/examples/pre/nextjs/package.json @@ -11,13 +11,13 @@ }, "dependencies": { "@nucypher/pre": "workspace:*", - "@types/node": "20.11.30", + "@types/node": "24.3.0", "@types/react": "18.3.5", "@types/react-dom": "18.3.0", "eslint": "8.57.0", "eslint-config-next": "14.0.4", "ethers": "^5.8.0", - "next": "14.2.10", + "next": "15.5.14", "react": "18.3.1", "react-dom": "18.3.1" } diff --git a/examples/pre/react/package.json b/examples/pre/react/package.json index d1cbd298c..653567731 100644 --- a/examples/pre/react/package.json +++ b/examples/pre/react/package.json @@ -29,7 +29,7 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@types/node": "^20.17.28", + "@types/node": "^24.3.0", "@types/react": "^18.3.20", "@types/react-dom": "^18.3.5", "react-scripts": "^5.0.1" diff --git a/examples/pre/webpack-5/package.json b/examples/pre/webpack-5/package.json index b257e9135..bd659a83a 100644 --- a/examples/pre/webpack-5/package.json +++ b/examples/pre/webpack-5/package.json @@ -15,11 +15,11 @@ "@nucypher/pre": "workspace:*" }, "devDependencies": { - "copy-webpack-plugin": "^12.0.2", + "copy-webpack-plugin": "^13.0.0", "esbuild-loader": "^2.21.0", "ethers": "^5.8.0", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.2" + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" } } diff --git a/examples/taco/nextjs/next-env.d.ts b/examples/taco/nextjs/next-env.d.ts index 40c3d6809..830fb594c 100644 --- a/examples/taco/nextjs/next-env.d.ts +++ b/examples/taco/nextjs/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/taco/nextjs/package.json b/examples/taco/nextjs/package.json index c27f7a2b0..660cc475e 100644 --- a/examples/taco/nextjs/package.json +++ b/examples/taco/nextjs/package.json @@ -14,13 +14,13 @@ "@nucypher/shared": "workspace:*", "@nucypher/taco": "workspace:*", "@nucypher/taco-auth": "workspace:*", - "@types/node": "20.11.30", + "@types/node": "24.3.0", "@types/react": "18.3.5", "@types/react-dom": "18.3.0", "eslint": "8.57.0", "eslint-config-next": "14.0.4", "ethers": "^5.8.0", - "next": "14.2.10", + "next": "15.5.14", "react": "18.3.1", "react-dom": "18.3.1", "typescript": "5.2.2" diff --git a/examples/taco/nodejs/package.json b/examples/taco/nodejs/package.json index 8fca0d054..b76b20a3e 100644 --- a/examples/taco/nodejs/package.json +++ b/examples/taco/nodejs/package.json @@ -12,7 +12,7 @@ "dependencies": { "@nucypher/taco": "workspace:*", "@nucypher/taco-auth": "workspace:*", - "dotenv": "^16.4.7", + "dotenv": "^16.5.0", "ethers": "^5.8.0" } } diff --git a/examples/taco/react/package.json b/examples/taco/react/package.json index 860a6cc63..0cfdf1338 100644 --- a/examples/taco/react/package.json +++ b/examples/taco/react/package.json @@ -30,7 +30,7 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@types/node": "^20.17.28", + "@types/node": "^24.3.0", "@types/react": "^18.3.20", "@types/react-dom": "^18.3.5", "react-scripts": "^5.0.1" diff --git a/examples/taco/webpack-5/package.json b/examples/taco/webpack-5/package.json index 35fc00075..5f231f408 100644 --- a/examples/taco/webpack-5/package.json +++ b/examples/taco/webpack-5/package.json @@ -16,11 +16,11 @@ "@nucypher/taco-auth": "workspace:*" }, "devDependencies": { - "copy-webpack-plugin": "^12.0.2", + "copy-webpack-plugin": "^13.0.0", "esbuild-loader": "^2.21.0", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.2" + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" }, "peerDependencies": { "ethers": "^5.7.2" diff --git a/package.json b/package.json index 37ac6d4a4..f5dfb2751 100644 --- a/package.json +++ b/package.json @@ -25,16 +25,16 @@ }, "dependencies": { "@changesets/cli": "^2.28.1", - "@nucypher/nucypher-core": "^0.14.5", + "@nucypher/nucypher-core": "^0.16.0", "ethers": "^5.8.0" }, "devDependencies": { "@skypack/package-check": "^0.2.2", - "@types/node": "^20.17.28", + "@types/node": "^24.3.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@vitest/coverage-v8": "^3.0.9", - "bundlemon": "^2.1.0", + "@vitest/coverage-v8": "^3.2.4", + "bundlemon": "^3.1.0", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-config-typestrict": "^1.0.5", @@ -42,7 +42,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-simple-import-sort": "^10.0.0", - "eslint-plugin-unused-imports": "^3.2.0", + "eslint-plugin-unused-imports": "^4.1.4", "gh-pages": "^6.3.0", "npm-run-all": "^4.1.5", "prettier": "^3.5.3", @@ -51,9 +51,9 @@ "ts-node": "^10.9.2", "ts-unused-exports": "^10.1.0", "typedoc": "^0.25.13", - "typedoc-plugin-coverage": "^2.2.0", + "typedoc-plugin-coverage": "^3.4.1", "typedoc-plugin-missing-exports": "^2.3.0", - "typedoc-plugin-zod": "^1.4.0", + "typedoc-plugin-zod": "^1.4.2", "typescript": "^5.8.2", "vitest": "^3.0.9" }, @@ -65,7 +65,7 @@ ] }, "overrides": { - "@nucypher/nucypher-core": "^0.14.5", + "@nucypher/nucypher-core": "^0.16.0", "glob-parent@<5.1.2": ">=5.1.2", "node-forge@<1.0.0": ">=1.0.0", "node-forge@<1.3.0": ">=1.3.0", diff --git a/packages/pre/package.json b/packages/pre/package.json index 6aa3ccf7f..e27e3a3f3 100644 --- a/packages/pre/package.json +++ b/packages/pre/package.json @@ -38,7 +38,7 @@ "typedoc": "typedoc" }, "dependencies": { - "@nucypher/nucypher-core": "^0.14.5", + "@nucypher/nucypher-core": "^0.16.0", "@nucypher/shared": "workspace:*", "ethers": "^5.8.0" }, diff --git a/packages/shared/package.json b/packages/shared/package.json index 1cdc44bc8..1159aaa37 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@nucypher/shared", - "version": "0.5.0", + "version": "0.6.0-alpha.12", "keywords": [ "pre", "taco", @@ -42,12 +42,12 @@ "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/providers": "^5.8.0", - "@nucypher/nucypher-contracts": "^0.25.0", - "@nucypher/nucypher-core": "^0.14.5", - "axios": "^1.8.4", + "@nucypher/nucypher-contracts": "^0.26.0-alpha.3", + "@nucypher/nucypher-core": "^0.16.0", + "axios": "^1.13.5", "deep-equal": "^2.2.3", "ethers": "^5.8.0", - "qs": "^6.14.0", + "qs": "^6.14.2", "zod": "^3.24.2" }, "devDependencies": { diff --git a/packages/shared/src/cache.ts b/packages/shared/src/cache.ts new file mode 100644 index 000000000..1cd62d853 --- /dev/null +++ b/packages/shared/src/cache.ts @@ -0,0 +1,25 @@ +export class TtlCache { + private readonly ttlMs: number; + private readonly store = new Map(); + + constructor(ttlMs: number) { + this.ttlMs = ttlMs; + } + + get(key: string): T | undefined { + const entry = this.store.get(key); + if (entry && Date.now() < entry.expiry) { + return entry.data as T; + } + this.store.delete(key); + return undefined; + } + + set(key: string, data: unknown): void { + this.store.set(key, { data, expiry: Date.now() + this.ttlMs }); + } + + clear(): void { + this.store.clear(); + } +} diff --git a/packages/shared/src/contracts/agents/coordinator.ts b/packages/shared/src/contracts/agents/coordinator.ts index ab50500c3..a570cb76c 100644 --- a/packages/shared/src/contracts/agents/coordinator.ts +++ b/packages/shared/src/contracts/agents/coordinator.ts @@ -1,9 +1,5 @@ import { getContract } from '@nucypher/nucypher-contracts'; -import { - DkgPublicKey, - SessionStaticKey, - ThresholdMessageKit, -} from '@nucypher/nucypher-core'; +import { DkgPublicKey, SessionStaticKey } from '@nucypher/nucypher-core'; import { BigNumberish, ethers } from 'ethers'; import { Domain } from '../../porter'; @@ -140,20 +136,6 @@ export class DkgCoordinatorAgent { return await coordinator.getRitualIdFromPublicKey(pointStruct); } - public static async isEncryptionAuthorized( - provider: ethers.providers.Provider, - domain: Domain, - ritualId: number, - thresholdMessageKit: ThresholdMessageKit, - ): Promise { - const coordinator = await this.connectReadOnly(provider, domain); - return await coordinator.isEncryptionAuthorized( - ritualId, - thresholdMessageKit.acp.authorization, - thresholdMessageKit.ciphertextHeader.toBytes(), - ); - } - private static async connectReadOnly( provider: ethers.providers.Provider, domain: Domain, diff --git a/packages/shared/src/contracts/agents/index.ts b/packages/shared/src/contracts/agents/index.ts index 61e29c0e6..2520222a0 100644 --- a/packages/shared/src/contracts/agents/index.ts +++ b/packages/shared/src/contracts/agents/index.ts @@ -1,3 +1,4 @@ export * from './coordinator'; export * from './global-allow-list'; +export * from './signing-coordinator'; export * from './subscription-manager'; diff --git a/packages/shared/src/contracts/agents/signing-coordinator.ts b/packages/shared/src/contracts/agents/signing-coordinator.ts new file mode 100644 index 000000000..0e5a9c6bb --- /dev/null +++ b/packages/shared/src/contracts/agents/signing-coordinator.ts @@ -0,0 +1,141 @@ +import { getContract } from '@nucypher/nucypher-contracts'; +import { SessionStaticKey } from '@nucypher/nucypher-core'; +import { ethers } from 'ethers'; + +import { TtlCache } from '../../cache'; +import { Domain } from '../../porter'; +import { fromHexString } from '../../utils'; +import { SigningCoordinator__factory } from '../ethers-typechain'; +import { SigningCoordinator } from '../ethers-typechain/SigningCoordinator'; + +export type SignerInfo = { + provider: string; + signerAddress: string; + signingRequestStaticKey: SessionStaticKey; +}; + +export class SigningCoordinatorAgent { + private static cache = new TtlCache(60_000); + + private static cacheKey( + domain: Domain, + cohortId: number, + field: string, + ): string { + return `${domain}:${cohortId}:${field}`; + } + + public static clearCache(): void { + this.cache.clear(); + } + + public static async getParticipants( + provider: ethers.providers.Provider, + domain: Domain, + cohortId: number, + ): Promise { + const key = this.cacheKey(domain, cohortId, 'participants'); + const cached = this.cache.get(key); + if (cached !== undefined) return cached; + + const coordinator = await this.connectReadOnly(provider, domain); + const participants = await coordinator.getSigners(cohortId); + + const result = participants.map( + ( + participant: SigningCoordinator.SigningCohortParticipantStructOutput, + ) => { + return { + provider: participant.provider, + signerAddress: participant.signerAddress, + signingRequestStaticKey: SessionStaticKey.fromBytes( + fromHexString(participant.signingRequestStaticKey), + ), + }; + }, + ); + + this.cache.set(key, result); + return result; + } + + public static async getThreshold( + provider: ethers.providers.Provider, + domain: Domain, + cohortId: number, + ): Promise { + const key = this.cacheKey(domain, cohortId, 'threshold'); + const cached = this.cache.get(key); + if (cached !== undefined) return cached; + + const coordinator = await this.connectReadOnly(provider, domain); + const cohort = await coordinator.signingCohorts(cohortId); + const result = cohort.threshold; + + this.cache.set(key, result); + return result; + } + + public static async getSigningCohortConditions( + provider: ethers.providers.Provider, + domain: Domain, + cohortId: number, + chainId: number, + ): Promise { + const coordinator = await this.connectReadOnly(provider, domain); + const cohortCondition = await coordinator.getSigningCohortConditions( + cohortId, + chainId, + ); + return cohortCondition; + } + + public static async setSigningCohortConditions( + provider: ethers.providers.Provider, + domain: Domain, + cohortId: number, + chainId: number, + conditions: Uint8Array, + signer: ethers.Signer, + ): Promise { + const coordinator = await this.connect(provider, domain, signer); + return await coordinator.setSigningCohortConditions( + cohortId, + chainId, + conditions, + ); + } + + public static async getSigningCoordinatorChild( + provider: ethers.providers.Provider, + domain: Domain, + chainId: number, + ): Promise { + const coordinator = await this.connectReadOnly(provider, domain); + return await coordinator.getSigningCoordinatorChild(chainId); + } + + private static async connectReadOnly( + provider: ethers.providers.Provider, + domain: Domain, + ) { + return await this.connect(provider, domain); + } + + private static async connect( + provider: ethers.providers.Provider, + domain: Domain, + signer?: ethers.Signer, + ): Promise { + const network = await provider.getNetwork(); + const contractAddress = getContract( + domain, + network.chainId, + 'SigningCoordinator', + ); + return SigningCoordinator__factory.connect( + contractAddress, + signer ?? provider, + ); + } +} diff --git a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts index 21619add1..c327751e1 100644 --- a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts +++ b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts @@ -67,23 +67,31 @@ export interface CoordinatorInterface extends utils.Interface { functions: { 'DEFAULT_ADMIN_ROLE()': FunctionFragment; 'FEE_MODEL_MANAGER_ROLE()': FunctionFragment; + 'HANDOVER_SUPERVISOR_ROLE()': FunctionFragment; 'TREASURY_ROLE()': FunctionFragment; 'acceptDefaultAdminTransfer()': FunctionFragment; 'application()': FunctionFragment; 'approveFeeModel(address)': FunctionFragment; 'beginDefaultAdminTransfer(address)': FunctionFragment; + 'blindedSharePosition(uint256,uint16)': FunctionFragment; 'cancelDefaultAdminTransfer()': FunctionFragment; + 'cancelHandover(uint32,address)': FunctionFragment; 'changeDefaultAdminDelay(uint48)': FunctionFragment; 'cohortFingerprint(address[])': FunctionFragment; 'defaultAdmin()': FunctionFragment; 'defaultAdminDelay()': FunctionFragment; 'defaultAdminDelayIncreaseWait()': FunctionFragment; + 'dkgTimeout()': FunctionFragment; + 'dkgTimeoutStub()': FunctionFragment; 'expectedTranscriptSize(uint16,uint16)': FunctionFragment; 'extendRitual(uint32,uint32)': FunctionFragment; 'feeModelsRegistry(address)': FunctionFragment; + 'finalizeHandover(uint32,address)': FunctionFragment; 'getAccessController(uint32)': FunctionFragment; 'getAuthority(uint32)': FunctionFragment; 'getFeeModel(uint32)': FunctionFragment; + 'getHandoverKey(uint32,address)': FunctionFragment; + 'getHandoverState(uint32,address)': FunctionFragment; 'getInitiator(uint32)': FunctionFragment; 'getParticipant(uint32,address,bool)': FunctionFragment; 'getParticipantFromProvider(uint32,address)': FunctionFragment; @@ -98,11 +106,12 @@ export interface CoordinatorInterface extends utils.Interface { 'getThresholdForRitualSize(uint16)': FunctionFragment; 'getTimestamps(uint32)': FunctionFragment; 'grantRole(bytes32,address)': FunctionFragment; + 'handoverRequest(uint32,address,address)': FunctionFragment; + 'handoverTimeout()': FunctionFragment; + 'handovers(bytes32)': FunctionFragment; 'hasRole(bytes32,address)': FunctionFragment; - 'initialize(uint32,uint16,address)': FunctionFragment; - 'initializeNumberOfRituals()': FunctionFragment; + 'initialize(uint16,address)': FunctionFragment; 'initiateRitual(address,address[],address,uint32,address)': FunctionFragment; - 'isEncryptionAuthorized(uint32,bytes,bytes)': FunctionFragment; 'isParticipant(uint32,address)': FunctionFragment; 'isProviderKeySet(address)': FunctionFragment; 'isProviderPublicKeySet(address)': FunctionFragment; @@ -113,9 +122,9 @@ export interface CoordinatorInterface extends utils.Interface { 'pendingDefaultAdmin()': FunctionFragment; 'pendingDefaultAdminDelay()': FunctionFragment; 'postAggregation(uint32,bytes,(bytes32,bytes16),bytes)': FunctionFragment; - 'postTranscript(uint32,bytes)': FunctionFragment; + 'postBlindedShare(uint32,bytes)': FunctionFragment; + 'postHandoverTranscript(uint32,address,bytes,bytes)': FunctionFragment; 'publishTranscript(uint32,bytes)': FunctionFragment; - 'reinitializeDefaultAdmin(address)': FunctionFragment; 'renounceRole(bytes32,address)': FunctionFragment; 'revokeRole(bytes32,address)': FunctionFragment; 'rituals(uint256)': FunctionFragment; @@ -123,34 +132,40 @@ export interface CoordinatorInterface extends utils.Interface { 'setMaxDkgSize(uint16)': FunctionFragment; 'setProviderPublicKey((bytes32,bytes32,bytes32))': FunctionFragment; 'setReimbursementPool(address)': FunctionFragment; - 'setTimeout(uint32)': FunctionFragment; 'supportsInterface(bytes4)': FunctionFragment; 'timeout()': FunctionFragment; 'transferRitualAuthority(uint32,address)': FunctionFragment; - 'withdrawAllTokens(address)': FunctionFragment; }; getFunction( nameOrSignatureOrTopic: | 'DEFAULT_ADMIN_ROLE' | 'FEE_MODEL_MANAGER_ROLE' + | 'HANDOVER_SUPERVISOR_ROLE' | 'TREASURY_ROLE' | 'acceptDefaultAdminTransfer' | 'application' | 'approveFeeModel' | 'beginDefaultAdminTransfer' + | 'blindedSharePosition' | 'cancelDefaultAdminTransfer' + | 'cancelHandover' | 'changeDefaultAdminDelay' | 'cohortFingerprint' | 'defaultAdmin' | 'defaultAdminDelay' | 'defaultAdminDelayIncreaseWait' + | 'dkgTimeout' + | 'dkgTimeoutStub' | 'expectedTranscriptSize' | 'extendRitual' | 'feeModelsRegistry' + | 'finalizeHandover' | 'getAccessController' | 'getAuthority' | 'getFeeModel' + | 'getHandoverKey' + | 'getHandoverState' | 'getInitiator' | 'getParticipant' | 'getParticipantFromProvider' @@ -165,11 +180,12 @@ export interface CoordinatorInterface extends utils.Interface { | 'getThresholdForRitualSize' | 'getTimestamps' | 'grantRole' + | 'handoverRequest' + | 'handoverTimeout' + | 'handovers' | 'hasRole' | 'initialize' - | 'initializeNumberOfRituals' | 'initiateRitual' - | 'isEncryptionAuthorized' | 'isParticipant' | 'isProviderKeySet' | 'isProviderPublicKeySet' @@ -180,9 +196,9 @@ export interface CoordinatorInterface extends utils.Interface { | 'pendingDefaultAdmin' | 'pendingDefaultAdminDelay' | 'postAggregation' - | 'postTranscript' + | 'postBlindedShare' + | 'postHandoverTranscript' | 'publishTranscript' - | 'reinitializeDefaultAdmin' | 'renounceRole' | 'revokeRole' | 'rituals' @@ -190,11 +206,9 @@ export interface CoordinatorInterface extends utils.Interface { | 'setMaxDkgSize' | 'setProviderPublicKey' | 'setReimbursementPool' - | 'setTimeout' | 'supportsInterface' | 'timeout' - | 'transferRitualAuthority' - | 'withdrawAllTokens', + | 'transferRitualAuthority', ): FunctionFragment; encodeFunctionData( @@ -205,6 +219,10 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'FEE_MODEL_MANAGER_ROLE', values?: undefined, ): string; + encodeFunctionData( + functionFragment: 'HANDOVER_SUPERVISOR_ROLE', + values?: undefined, + ): string; encodeFunctionData( functionFragment: 'TREASURY_ROLE', values?: undefined, @@ -225,10 +243,18 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'beginDefaultAdminTransfer', values: [string], ): string; + encodeFunctionData( + functionFragment: 'blindedSharePosition', + values: [BigNumberish, BigNumberish], + ): string; encodeFunctionData( functionFragment: 'cancelDefaultAdminTransfer', values?: undefined, ): string; + encodeFunctionData( + functionFragment: 'cancelHandover', + values: [BigNumberish, string], + ): string; encodeFunctionData( functionFragment: 'changeDefaultAdminDelay', values: [BigNumberish], @@ -249,6 +275,14 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'defaultAdminDelayIncreaseWait', values?: undefined, ): string; + encodeFunctionData( + functionFragment: 'dkgTimeout', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'dkgTimeoutStub', + values?: undefined, + ): string; encodeFunctionData( functionFragment: 'expectedTranscriptSize', values: [BigNumberish, BigNumberish], @@ -261,6 +295,10 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'feeModelsRegistry', values: [string], ): string; + encodeFunctionData( + functionFragment: 'finalizeHandover', + values: [BigNumberish, string], + ): string; encodeFunctionData( functionFragment: 'getAccessController', values: [BigNumberish], @@ -273,6 +311,14 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'getFeeModel', values: [BigNumberish], ): string; + encodeFunctionData( + functionFragment: 'getHandoverKey', + values: [BigNumberish, string], + ): string; + encodeFunctionData( + functionFragment: 'getHandoverState', + values: [BigNumberish, string], + ): string; encodeFunctionData( functionFragment: 'getInitiator', values: [BigNumberish], @@ -329,26 +375,30 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'grantRole', values: [BytesLike, string], ): string; + encodeFunctionData( + functionFragment: 'handoverRequest', + values: [BigNumberish, string, string], + ): string; + encodeFunctionData( + functionFragment: 'handoverTimeout', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'handovers', + values: [BytesLike], + ): string; encodeFunctionData( functionFragment: 'hasRole', values: [BytesLike, string], ): string; encodeFunctionData( functionFragment: 'initialize', - values: [BigNumberish, BigNumberish, string], - ): string; - encodeFunctionData( - functionFragment: 'initializeNumberOfRituals', - values?: undefined, + values: [BigNumberish, string], ): string; encodeFunctionData( functionFragment: 'initiateRitual', values: [string, string[], string, BigNumberish, string], ): string; - encodeFunctionData( - functionFragment: 'isEncryptionAuthorized', - values: [BigNumberish, BytesLike, BytesLike], - ): string; encodeFunctionData( functionFragment: 'isParticipant', values: [BigNumberish, string], @@ -387,16 +437,16 @@ export interface CoordinatorInterface extends utils.Interface { values: [BigNumberish, BytesLike, BLS12381.G1PointStruct, BytesLike], ): string; encodeFunctionData( - functionFragment: 'postTranscript', + functionFragment: 'postBlindedShare', values: [BigNumberish, BytesLike], ): string; encodeFunctionData( - functionFragment: 'publishTranscript', - values: [BigNumberish, BytesLike], + functionFragment: 'postHandoverTranscript', + values: [BigNumberish, string, BytesLike, BytesLike], ): string; encodeFunctionData( - functionFragment: 'reinitializeDefaultAdmin', - values: [string], + functionFragment: 'publishTranscript', + values: [BigNumberish, BytesLike], ): string; encodeFunctionData( functionFragment: 'renounceRole', @@ -426,10 +476,6 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'setReimbursementPool', values: [string], ): string; - encodeFunctionData( - functionFragment: 'setTimeout', - values: [BigNumberish], - ): string; encodeFunctionData( functionFragment: 'supportsInterface', values: [BytesLike], @@ -439,10 +485,6 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'transferRitualAuthority', values: [BigNumberish, string], ): string; - encodeFunctionData( - functionFragment: 'withdrawAllTokens', - values: [string], - ): string; decodeFunctionResult( functionFragment: 'DEFAULT_ADMIN_ROLE', @@ -452,6 +494,10 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'FEE_MODEL_MANAGER_ROLE', data: BytesLike, ): Result; + decodeFunctionResult( + functionFragment: 'HANDOVER_SUPERVISOR_ROLE', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'TREASURY_ROLE', data: BytesLike, @@ -472,10 +518,18 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'beginDefaultAdminTransfer', data: BytesLike, ): Result; + decodeFunctionResult( + functionFragment: 'blindedSharePosition', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'cancelDefaultAdminTransfer', data: BytesLike, ): Result; + decodeFunctionResult( + functionFragment: 'cancelHandover', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'changeDefaultAdminDelay', data: BytesLike, @@ -496,6 +550,11 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'defaultAdminDelayIncreaseWait', data: BytesLike, ): Result; + decodeFunctionResult(functionFragment: 'dkgTimeout', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'dkgTimeoutStub', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'expectedTranscriptSize', data: BytesLike, @@ -508,6 +567,10 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'feeModelsRegistry', data: BytesLike, ): Result; + decodeFunctionResult( + functionFragment: 'finalizeHandover', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'getAccessController', data: BytesLike, @@ -520,6 +583,14 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'getFeeModel', data: BytesLike, ): Result; + decodeFunctionResult( + functionFragment: 'getHandoverKey', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'getHandoverState', + data: BytesLike, + ): Result; decodeFunctionResult( functionFragment: 'getInitiator', data: BytesLike, @@ -573,18 +644,19 @@ export interface CoordinatorInterface extends utils.Interface { data: BytesLike, ): Result; decodeFunctionResult(functionFragment: 'grantRole', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'hasRole', data: BytesLike): Result; - decodeFunctionResult(functionFragment: 'initialize', data: BytesLike): Result; decodeFunctionResult( - functionFragment: 'initializeNumberOfRituals', + functionFragment: 'handoverRequest', data: BytesLike, ): Result; decodeFunctionResult( - functionFragment: 'initiateRitual', + functionFragment: 'handoverTimeout', data: BytesLike, ): Result; + decodeFunctionResult(functionFragment: 'handovers', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'hasRole', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'initialize', data: BytesLike): Result; decodeFunctionResult( - functionFragment: 'isEncryptionAuthorized', + functionFragment: 'initiateRitual', data: BytesLike, ): Result; decodeFunctionResult( @@ -622,15 +694,15 @@ export interface CoordinatorInterface extends utils.Interface { data: BytesLike, ): Result; decodeFunctionResult( - functionFragment: 'postTranscript', + functionFragment: 'postBlindedShare', data: BytesLike, ): Result; decodeFunctionResult( - functionFragment: 'publishTranscript', + functionFragment: 'postHandoverTranscript', data: BytesLike, ): Result; decodeFunctionResult( - functionFragment: 'reinitializeDefaultAdmin', + functionFragment: 'publishTranscript', data: BytesLike, ): Result; decodeFunctionResult( @@ -655,7 +727,6 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'setReimbursementPool', data: BytesLike, ): Result; - decodeFunctionResult(functionFragment: 'setTimeout', data: BytesLike): Result; decodeFunctionResult( functionFragment: 'supportsInterface', data: BytesLike, @@ -665,19 +736,20 @@ export interface CoordinatorInterface extends utils.Interface { functionFragment: 'transferRitualAuthority', data: BytesLike, ): Result; - decodeFunctionResult( - functionFragment: 'withdrawAllTokens', - data: BytesLike, - ): Result; events: { 'AggregationPosted(uint32,address,bytes32)': EventFragment; + 'BlindedSharePosted(uint32,address)': EventFragment; 'DefaultAdminDelayChangeCanceled()': EventFragment; 'DefaultAdminDelayChangeScheduled(uint48,uint48)': EventFragment; 'DefaultAdminTransferCanceled()': EventFragment; 'DefaultAdminTransferScheduled(address,uint48)': EventFragment; 'EndRitual(uint32,bool)': EventFragment; 'FeeModelApproved(address)': EventFragment; + 'HandoverCanceled(uint32,address,address)': EventFragment; + 'HandoverFinalized(uint32,address,address)': EventFragment; + 'HandoverRequest(uint32,address,address)': EventFragment; + 'HandoverTranscriptPosted(uint32,address,address)': EventFragment; 'Initialized(uint64)': EventFragment; 'MaxDkgSizeChanged(uint16,uint16)': EventFragment; 'ParticipantPublicKeySet(uint32,address,(bytes32,bytes32,bytes32))': EventFragment; @@ -689,11 +761,11 @@ export interface CoordinatorInterface extends utils.Interface { 'RoleRevoked(bytes32,address,address)': EventFragment; 'StartAggregationRound(uint32)': EventFragment; 'StartRitual(uint32,address,address[])': EventFragment; - 'TimeoutChanged(uint32,uint32)': EventFragment; 'TranscriptPosted(uint32,address,bytes32)': EventFragment; }; getEvent(nameOrSignatureOrTopic: 'AggregationPosted'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'BlindedSharePosted'): EventFragment; getEvent( nameOrSignatureOrTopic: 'DefaultAdminDelayChangeCanceled', ): EventFragment; @@ -708,6 +780,10 @@ export interface CoordinatorInterface extends utils.Interface { ): EventFragment; getEvent(nameOrSignatureOrTopic: 'EndRitual'): EventFragment; getEvent(nameOrSignatureOrTopic: 'FeeModelApproved'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'HandoverCanceled'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'HandoverFinalized'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'HandoverRequest'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'HandoverTranscriptPosted'): EventFragment; getEvent(nameOrSignatureOrTopic: 'Initialized'): EventFragment; getEvent(nameOrSignatureOrTopic: 'MaxDkgSizeChanged'): EventFragment; getEvent(nameOrSignatureOrTopic: 'ParticipantPublicKeySet'): EventFragment; @@ -719,7 +795,6 @@ export interface CoordinatorInterface extends utils.Interface { getEvent(nameOrSignatureOrTopic: 'RoleRevoked'): EventFragment; getEvent(nameOrSignatureOrTopic: 'StartAggregationRound'): EventFragment; getEvent(nameOrSignatureOrTopic: 'StartRitual'): EventFragment; - getEvent(nameOrSignatureOrTopic: 'TimeoutChanged'): EventFragment; getEvent(nameOrSignatureOrTopic: 'TranscriptPosted'): EventFragment; } @@ -736,6 +811,18 @@ export type AggregationPostedEvent = TypedEvent< export type AggregationPostedEventFilter = TypedEventFilter; +export interface BlindedSharePostedEventObject { + ritualId: number; + departingParticipant: string; +} +export type BlindedSharePostedEvent = TypedEvent< + [number, string], + BlindedSharePostedEventObject +>; + +export type BlindedSharePostedEventFilter = + TypedEventFilter; + export interface DefaultAdminDelayChangeCanceledEventObject {} export type DefaultAdminDelayChangeCanceledEvent = TypedEvent< [], @@ -800,6 +887,57 @@ export type FeeModelApprovedEvent = TypedEvent< export type FeeModelApprovedEventFilter = TypedEventFilter; +export interface HandoverCanceledEventObject { + ritualId: number; + departingParticipant: string; + incomingParticipant: string; +} +export type HandoverCanceledEvent = TypedEvent< + [number, string, string], + HandoverCanceledEventObject +>; + +export type HandoverCanceledEventFilter = + TypedEventFilter; + +export interface HandoverFinalizedEventObject { + ritualId: number; + departingParticipant: string; + incomingParticipant: string; +} +export type HandoverFinalizedEvent = TypedEvent< + [number, string, string], + HandoverFinalizedEventObject +>; + +export type HandoverFinalizedEventFilter = + TypedEventFilter; + +export interface HandoverRequestEventObject { + ritualId: number; + departingParticipant: string; + incomingParticipant: string; +} +export type HandoverRequestEvent = TypedEvent< + [number, string, string], + HandoverRequestEventObject +>; + +export type HandoverRequestEventFilter = TypedEventFilter; + +export interface HandoverTranscriptPostedEventObject { + ritualId: number; + departingParticipant: string; + incomingParticipant: string; +} +export type HandoverTranscriptPostedEvent = TypedEvent< + [number, string, string], + HandoverTranscriptPostedEventObject +>; + +export type HandoverTranscriptPostedEventFilter = + TypedEventFilter; + export interface InitializedEventObject { version: BigNumber; } @@ -927,17 +1065,6 @@ export type StartRitualEvent = TypedEvent< export type StartRitualEventFilter = TypedEventFilter; -export interface TimeoutChangedEventObject { - oldTimeout: number; - newTimeout: number; -} -export type TimeoutChangedEvent = TypedEvent< - [number, number], - TimeoutChangedEventObject ->; - -export type TimeoutChangedEventFilter = TypedEventFilter; - export interface TranscriptPostedEventObject { ritualId: number; node: string; @@ -982,6 +1109,8 @@ export interface Coordinator extends BaseContract { FEE_MODEL_MANAGER_ROLE(overrides?: CallOverrides): Promise<[string]>; + HANDOVER_SUPERVISOR_ROLE(overrides?: CallOverrides): Promise<[string]>; + TREASURY_ROLE(overrides?: CallOverrides): Promise<[string]>; acceptDefaultAdminTransfer( @@ -1000,10 +1129,22 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + blindedSharePosition( + index: BigNumberish, + threshold: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber]>; + cancelDefaultAdminTransfer( overrides?: Overrides & { from?: string }, ): Promise; + cancelHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + changeDefaultAdminDelay( newDelay: BigNumberish, overrides?: Overrides & { from?: string }, @@ -1020,6 +1161,10 @@ export interface Coordinator extends BaseContract { defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise<[number]>; + dkgTimeout(overrides?: CallOverrides): Promise<[number]>; + + dkgTimeoutStub(overrides?: CallOverrides): Promise<[number]>; + expectedTranscriptSize( dkgSize: BigNumberish, threshold: BigNumberish, @@ -1037,6 +1182,12 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise<[boolean]>; + finalizeHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + getAccessController( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1052,6 +1203,18 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise<[string]>; + getHandoverKey( + ritualId: BigNumberish, + departingProvider: string, + overrides?: CallOverrides, + ): Promise<[string]>; + + getHandoverState( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise<[number]>; + getInitiator( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1129,6 +1292,28 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + handoverRequest( + ritualId: BigNumberish, + departingParticipant: string, + incomingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + handoverTimeout(overrides?: CallOverrides): Promise<[number]>; + + handovers( + handoverKey: BytesLike, + overrides?: CallOverrides, + ): Promise< + [number, string, string, string, string] & { + requestTimestamp: number; + incomingProvider: string; + transcript: string; + decryptionRequestStaticKey: string; + blindedShare: string; + } + >; + hasRole( role: BytesLike, account: string, @@ -1136,16 +1321,11 @@ export interface Coordinator extends BaseContract { ): Promise<[boolean]>; initialize( - _timeout: BigNumberish, _maxDkgSize: BigNumberish, _admin: string, overrides?: Overrides & { from?: string }, ): Promise; - initializeNumberOfRituals( - overrides?: Overrides & { from?: string }, - ): Promise; - initiateRitual( feeModel: string, providers: string[], @@ -1155,13 +1335,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - isEncryptionAuthorized( - arg0: BigNumberish, - arg1: BytesLike, - arg2: BytesLike, - overrides?: CallOverrides, - ): Promise<[boolean]>; - isParticipant( ritualId: BigNumberish, provider: string, @@ -1205,20 +1378,23 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - postTranscript( - arg0: BigNumberish, - arg1: BytesLike, + postBlindedShare( + ritualId: BigNumberish, + blindedShare: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - publishTranscript( + postHandoverTranscript( ritualId: BigNumberish, + departingParticipant: string, transcript: BytesLike, + decryptionRequestStaticKey: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - reinitializeDefaultAdmin( - newDefaultAdmin: string, + publishTranscript( + ritualId: BigNumberish, + transcript: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; @@ -1235,7 +1411,7 @@ export interface Coordinator extends BaseContract { ): Promise; rituals( - ritualId: BigNumberish, + index: BigNumberish, overrides?: CallOverrides, ): Promise< [ @@ -1288,11 +1464,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - setTimeout( - newTimeout: BigNumberish, - overrides?: Overrides & { from?: string }, - ): Promise; - supportsInterface( interfaceId: BytesLike, overrides?: CallOverrides, @@ -1305,17 +1476,14 @@ export interface Coordinator extends BaseContract { newAuthority: string, overrides?: Overrides & { from?: string }, ): Promise; - - withdrawAllTokens( - token: string, - overrides?: Overrides & { from?: string }, - ): Promise; }; DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; FEE_MODEL_MANAGER_ROLE(overrides?: CallOverrides): Promise; + HANDOVER_SUPERVISOR_ROLE(overrides?: CallOverrides): Promise; + TREASURY_ROLE(overrides?: CallOverrides): Promise; acceptDefaultAdminTransfer( @@ -1334,10 +1502,22 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + blindedSharePosition( + index: BigNumberish, + threshold: BigNumberish, + overrides?: CallOverrides, + ): Promise; + cancelDefaultAdminTransfer( overrides?: Overrides & { from?: string }, ): Promise; + cancelHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + changeDefaultAdminDelay( newDelay: BigNumberish, overrides?: Overrides & { from?: string }, @@ -1354,6 +1534,10 @@ export interface Coordinator extends BaseContract { defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise; + dkgTimeout(overrides?: CallOverrides): Promise; + + dkgTimeoutStub(overrides?: CallOverrides): Promise; + expectedTranscriptSize( dkgSize: BigNumberish, threshold: BigNumberish, @@ -1368,6 +1552,12 @@ export interface Coordinator extends BaseContract { feeModelsRegistry(arg0: string, overrides?: CallOverrides): Promise; + finalizeHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + getAccessController( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1383,6 +1573,18 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + getHandoverKey( + ritualId: BigNumberish, + departingProvider: string, + overrides?: CallOverrides, + ): Promise; + + getHandoverState( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + getInitiator( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1460,6 +1662,28 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + handoverRequest( + ritualId: BigNumberish, + departingParticipant: string, + incomingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + handoverTimeout(overrides?: CallOverrides): Promise; + + handovers( + handoverKey: BytesLike, + overrides?: CallOverrides, + ): Promise< + [number, string, string, string, string] & { + requestTimestamp: number; + incomingProvider: string; + transcript: string; + decryptionRequestStaticKey: string; + blindedShare: string; + } + >; + hasRole( role: BytesLike, account: string, @@ -1467,16 +1691,11 @@ export interface Coordinator extends BaseContract { ): Promise; initialize( - _timeout: BigNumberish, _maxDkgSize: BigNumberish, _admin: string, overrides?: Overrides & { from?: string }, ): Promise; - initializeNumberOfRituals( - overrides?: Overrides & { from?: string }, - ): Promise; - initiateRitual( feeModel: string, providers: string[], @@ -1486,13 +1705,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - isEncryptionAuthorized( - arg0: BigNumberish, - arg1: BytesLike, - arg2: BytesLike, - overrides?: CallOverrides, - ): Promise; - isParticipant( ritualId: BigNumberish, provider: string, @@ -1536,20 +1748,23 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - postTranscript( - arg0: BigNumberish, - arg1: BytesLike, + postBlindedShare( + ritualId: BigNumberish, + blindedShare: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - publishTranscript( + postHandoverTranscript( ritualId: BigNumberish, + departingParticipant: string, transcript: BytesLike, + decryptionRequestStaticKey: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - reinitializeDefaultAdmin( - newDefaultAdmin: string, + publishTranscript( + ritualId: BigNumberish, + transcript: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; @@ -1566,7 +1781,7 @@ export interface Coordinator extends BaseContract { ): Promise; rituals( - ritualId: BigNumberish, + index: BigNumberish, overrides?: CallOverrides, ): Promise< [ @@ -1619,11 +1834,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - setTimeout( - newTimeout: BigNumberish, - overrides?: Overrides & { from?: string }, - ): Promise; - supportsInterface( interfaceId: BytesLike, overrides?: CallOverrides, @@ -1637,16 +1847,13 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - withdrawAllTokens( - token: string, - overrides?: Overrides & { from?: string }, - ): Promise; - callStatic: { DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; FEE_MODEL_MANAGER_ROLE(overrides?: CallOverrides): Promise; + HANDOVER_SUPERVISOR_ROLE(overrides?: CallOverrides): Promise; + TREASURY_ROLE(overrides?: CallOverrides): Promise; acceptDefaultAdminTransfer(overrides?: CallOverrides): Promise; @@ -1660,8 +1867,20 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + blindedSharePosition( + index: BigNumberish, + threshold: BigNumberish, + overrides?: CallOverrides, + ): Promise; + cancelDefaultAdminTransfer(overrides?: CallOverrides): Promise; + cancelHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + changeDefaultAdminDelay( newDelay: BigNumberish, overrides?: CallOverrides, @@ -1678,6 +1897,10 @@ export interface Coordinator extends BaseContract { defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise; + dkgTimeout(overrides?: CallOverrides): Promise; + + dkgTimeoutStub(overrides?: CallOverrides): Promise; + expectedTranscriptSize( dkgSize: BigNumberish, threshold: BigNumberish, @@ -1695,6 +1918,12 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + finalizeHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + getAccessController( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1710,6 +1939,18 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + getHandoverKey( + ritualId: BigNumberish, + departingProvider: string, + overrides?: CallOverrides, + ): Promise; + + getHandoverState( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + getInitiator( ritualId: BigNumberish, overrides?: CallOverrides, @@ -1787,6 +2028,28 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + handoverRequest( + ritualId: BigNumberish, + departingParticipant: string, + incomingParticipant: string, + overrides?: CallOverrides, + ): Promise; + + handoverTimeout(overrides?: CallOverrides): Promise; + + handovers( + handoverKey: BytesLike, + overrides?: CallOverrides, + ): Promise< + [number, string, string, string, string] & { + requestTimestamp: number; + incomingProvider: string; + transcript: string; + decryptionRequestStaticKey: string; + blindedShare: string; + } + >; + hasRole( role: BytesLike, account: string, @@ -1794,14 +2057,11 @@ export interface Coordinator extends BaseContract { ): Promise; initialize( - _timeout: BigNumberish, _maxDkgSize: BigNumberish, _admin: string, overrides?: CallOverrides, ): Promise; - initializeNumberOfRituals(overrides?: CallOverrides): Promise; - initiateRitual( feeModel: string, providers: string[], @@ -1811,13 +2071,6 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; - isEncryptionAuthorized( - arg0: BigNumberish, - arg1: BytesLike, - arg2: BytesLike, - overrides?: CallOverrides, - ): Promise; - isParticipant( ritualId: BigNumberish, provider: string, @@ -1861,20 +2114,23 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; - postTranscript( - arg0: BigNumberish, - arg1: BytesLike, + postBlindedShare( + ritualId: BigNumberish, + blindedShare: BytesLike, overrides?: CallOverrides, ): Promise; - publishTranscript( + postHandoverTranscript( ritualId: BigNumberish, + departingParticipant: string, transcript: BytesLike, + decryptionRequestStaticKey: BytesLike, overrides?: CallOverrides, ): Promise; - reinitializeDefaultAdmin( - newDefaultAdmin: string, + publishTranscript( + ritualId: BigNumberish, + transcript: BytesLike, overrides?: CallOverrides, ): Promise; @@ -1891,7 +2147,7 @@ export interface Coordinator extends BaseContract { ): Promise; rituals( - ritualId: BigNumberish, + index: BigNumberish, overrides?: CallOverrides, ): Promise< [ @@ -1942,11 +2198,6 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; - setTimeout( - newTimeout: BigNumberish, - overrides?: CallOverrides, - ): Promise; - supportsInterface( interfaceId: BytesLike, overrides?: CallOverrides, @@ -1959,8 +2210,6 @@ export interface Coordinator extends BaseContract { newAuthority: string, overrides?: CallOverrides, ): Promise; - - withdrawAllTokens(token: string, overrides?: CallOverrides): Promise; }; filters: { @@ -1975,6 +2224,15 @@ export interface Coordinator extends BaseContract { aggregatedTranscriptDigest?: null, ): AggregationPostedEventFilter; + 'BlindedSharePosted(uint32,address)'( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + ): BlindedSharePostedEventFilter; + BlindedSharePosted( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + ): BlindedSharePostedEventFilter; + 'DefaultAdminDelayChangeCanceled()'(): DefaultAdminDelayChangeCanceledEventFilter; DefaultAdminDelayChangeCanceled(): DefaultAdminDelayChangeCanceledEventFilter; @@ -2011,6 +2269,50 @@ export interface Coordinator extends BaseContract { 'FeeModelApproved(address)'(feeModel?: null): FeeModelApprovedEventFilter; FeeModelApproved(feeModel?: null): FeeModelApprovedEventFilter; + 'HandoverCanceled(uint32,address,address)'( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverCanceledEventFilter; + HandoverCanceled( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverCanceledEventFilter; + + 'HandoverFinalized(uint32,address,address)'( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverFinalizedEventFilter; + HandoverFinalized( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverFinalizedEventFilter; + + 'HandoverRequest(uint32,address,address)'( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverRequestEventFilter; + HandoverRequest( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverRequestEventFilter; + + 'HandoverTranscriptPosted(uint32,address,address)'( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverTranscriptPostedEventFilter; + HandoverTranscriptPosted( + ritualId?: BigNumberish | null, + departingParticipant?: string | null, + incomingParticipant?: string | null, + ): HandoverTranscriptPostedEventFilter; + 'Initialized(uint64)'(version?: null): InitializedEventFilter; Initialized(version?: null): InitializedEventFilter; @@ -2110,15 +2412,6 @@ export interface Coordinator extends BaseContract { participants?: null, ): StartRitualEventFilter; - 'TimeoutChanged(uint32,uint32)'( - oldTimeout?: null, - newTimeout?: null, - ): TimeoutChangedEventFilter; - TimeoutChanged( - oldTimeout?: null, - newTimeout?: null, - ): TimeoutChangedEventFilter; - 'TranscriptPosted(uint32,address,bytes32)'( ritualId?: BigNumberish | null, node?: string | null, @@ -2136,6 +2429,8 @@ export interface Coordinator extends BaseContract { FEE_MODEL_MANAGER_ROLE(overrides?: CallOverrides): Promise; + HANDOVER_SUPERVISOR_ROLE(overrides?: CallOverrides): Promise; + TREASURY_ROLE(overrides?: CallOverrides): Promise; acceptDefaultAdminTransfer( @@ -2154,10 +2449,22 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + blindedSharePosition( + index: BigNumberish, + threshold: BigNumberish, + overrides?: CallOverrides, + ): Promise; + cancelDefaultAdminTransfer( overrides?: Overrides & { from?: string }, ): Promise; + cancelHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + changeDefaultAdminDelay( newDelay: BigNumberish, overrides?: Overrides & { from?: string }, @@ -2176,6 +2483,10 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + dkgTimeout(overrides?: CallOverrides): Promise; + + dkgTimeoutStub(overrides?: CallOverrides): Promise; + expectedTranscriptSize( dkgSize: BigNumberish, threshold: BigNumberish, @@ -2193,6 +2504,12 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + finalizeHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + getAccessController( ritualId: BigNumberish, overrides?: CallOverrides, @@ -2208,6 +2525,18 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + getHandoverKey( + ritualId: BigNumberish, + departingProvider: string, + overrides?: CallOverrides, + ): Promise; + + getHandoverState( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + getInitiator( ritualId: BigNumberish, overrides?: CallOverrides, @@ -2286,6 +2615,20 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + handoverRequest( + ritualId: BigNumberish, + departingParticipant: string, + incomingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + handoverTimeout(overrides?: CallOverrides): Promise; + + handovers( + handoverKey: BytesLike, + overrides?: CallOverrides, + ): Promise; + hasRole( role: BytesLike, account: string, @@ -2293,16 +2636,11 @@ export interface Coordinator extends BaseContract { ): Promise; initialize( - _timeout: BigNumberish, _maxDkgSize: BigNumberish, _admin: string, overrides?: Overrides & { from?: string }, ): Promise; - initializeNumberOfRituals( - overrides?: Overrides & { from?: string }, - ): Promise; - initiateRitual( feeModel: string, providers: string[], @@ -2312,13 +2650,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - isEncryptionAuthorized( - arg0: BigNumberish, - arg1: BytesLike, - arg2: BytesLike, - overrides?: CallOverrides, - ): Promise; - isParticipant( ritualId: BigNumberish, provider: string, @@ -2358,20 +2689,23 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - postTranscript( - arg0: BigNumberish, - arg1: BytesLike, + postBlindedShare( + ritualId: BigNumberish, + blindedShare: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - publishTranscript( + postHandoverTranscript( ritualId: BigNumberish, + departingParticipant: string, transcript: BytesLike, + decryptionRequestStaticKey: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - reinitializeDefaultAdmin( - newDefaultAdmin: string, + publishTranscript( + ritualId: BigNumberish, + transcript: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; @@ -2387,10 +2721,7 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - rituals( - ritualId: BigNumberish, - overrides?: CallOverrides, - ): Promise; + rituals(index: BigNumberish, overrides?: CallOverrides): Promise; rollbackDefaultAdminDelay( overrides?: Overrides & { from?: string }, @@ -2411,11 +2742,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - setTimeout( - newTimeout: BigNumberish, - overrides?: Overrides & { from?: string }, - ): Promise; - supportsInterface( interfaceId: BytesLike, overrides?: CallOverrides, @@ -2428,11 +2754,6 @@ export interface Coordinator extends BaseContract { newAuthority: string, overrides?: Overrides & { from?: string }, ): Promise; - - withdrawAllTokens( - token: string, - overrides?: Overrides & { from?: string }, - ): Promise; }; populateTransaction: { @@ -2444,6 +2765,10 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + HANDOVER_SUPERVISOR_ROLE( + overrides?: CallOverrides, + ): Promise; + TREASURY_ROLE(overrides?: CallOverrides): Promise; acceptDefaultAdminTransfer( @@ -2462,10 +2787,22 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + blindedSharePosition( + index: BigNumberish, + threshold: BigNumberish, + overrides?: CallOverrides, + ): Promise; + cancelDefaultAdminTransfer( overrides?: Overrides & { from?: string }, ): Promise; + cancelHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + changeDefaultAdminDelay( newDelay: BigNumberish, overrides?: Overrides & { from?: string }, @@ -2484,6 +2821,10 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + dkgTimeout(overrides?: CallOverrides): Promise; + + dkgTimeoutStub(overrides?: CallOverrides): Promise; + expectedTranscriptSize( dkgSize: BigNumberish, threshold: BigNumberish, @@ -2501,6 +2842,12 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + finalizeHandover( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + getAccessController( ritualId: BigNumberish, overrides?: CallOverrides, @@ -2516,6 +2863,18 @@ export interface Coordinator extends BaseContract { overrides?: CallOverrides, ): Promise; + getHandoverKey( + ritualId: BigNumberish, + departingProvider: string, + overrides?: CallOverrides, + ): Promise; + + getHandoverState( + ritualId: BigNumberish, + departingParticipant: string, + overrides?: CallOverrides, + ): Promise; + getInitiator( ritualId: BigNumberish, overrides?: CallOverrides, @@ -2594,6 +2953,20 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; + handoverRequest( + ritualId: BigNumberish, + departingParticipant: string, + incomingParticipant: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + handoverTimeout(overrides?: CallOverrides): Promise; + + handovers( + handoverKey: BytesLike, + overrides?: CallOverrides, + ): Promise; + hasRole( role: BytesLike, account: string, @@ -2601,16 +2974,11 @@ export interface Coordinator extends BaseContract { ): Promise; initialize( - _timeout: BigNumberish, _maxDkgSize: BigNumberish, _admin: string, overrides?: Overrides & { from?: string }, ): Promise; - initializeNumberOfRituals( - overrides?: Overrides & { from?: string }, - ): Promise; - initiateRitual( feeModel: string, providers: string[], @@ -2620,13 +2988,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - isEncryptionAuthorized( - arg0: BigNumberish, - arg1: BytesLike, - arg2: BytesLike, - overrides?: CallOverrides, - ): Promise; - isParticipant( ritualId: BigNumberish, provider: string, @@ -2670,20 +3031,23 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - postTranscript( - arg0: BigNumberish, - arg1: BytesLike, + postBlindedShare( + ritualId: BigNumberish, + blindedShare: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - publishTranscript( + postHandoverTranscript( ritualId: BigNumberish, + departingParticipant: string, transcript: BytesLike, + decryptionRequestStaticKey: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; - reinitializeDefaultAdmin( - newDefaultAdmin: string, + publishTranscript( + ritualId: BigNumberish, + transcript: BytesLike, overrides?: Overrides & { from?: string }, ): Promise; @@ -2700,7 +3064,7 @@ export interface Coordinator extends BaseContract { ): Promise; rituals( - ritualId: BigNumberish, + index: BigNumberish, overrides?: CallOverrides, ): Promise; @@ -2723,11 +3087,6 @@ export interface Coordinator extends BaseContract { overrides?: Overrides & { from?: string }, ): Promise; - setTimeout( - newTimeout: BigNumberish, - overrides?: Overrides & { from?: string }, - ): Promise; - supportsInterface( interfaceId: BytesLike, overrides?: CallOverrides, @@ -2740,10 +3099,5 @@ export interface Coordinator extends BaseContract { newAuthority: string, overrides?: Overrides & { from?: string }, ): Promise; - - withdrawAllTokens( - token: string, - overrides?: Overrides & { from?: string }, - ): Promise; }; } diff --git a/packages/shared/src/contracts/ethers-typechain/SigningCoordinator.ts b/packages/shared/src/contracts/ethers-typechain/SigningCoordinator.ts new file mode 100644 index 000000000..72bfa1963 --- /dev/null +++ b/packages/shared/src/contracts/ethers-typechain/SigningCoordinator.ts @@ -0,0 +1,1903 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + EventFragment, + FunctionFragment, + Result, +} from '@ethersproject/abi'; +import type { Listener, Provider } from '@ethersproject/providers'; +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from 'ethers'; +import type { + OnEvent, + TypedEvent, + TypedEventFilter, + TypedListener, +} from './common'; + +export declare namespace SigningCoordinator { + export type SigningCohortParticipantStruct = { + provider: string; + signerAddress: string; + signingRequestStaticKey: BytesLike; + gap: BigNumberish[]; + }; + + export type SigningCohortParticipantStructOutput = [ + string, + string, + string, + BigNumber[], + ] & { + provider: string; + signerAddress: string; + signingRequestStaticKey: string; + gap: BigNumber[]; + }; +} + +export interface SigningCoordinatorInterface extends utils.Interface { + functions: { + 'DEFAULT_ADMIN_ROLE()': FunctionFragment; + 'INITIATOR_ROLE()': FunctionFragment; + 'SIGNING_REQUEST_KEY_LENGTH()': FunctionFragment; + 'acceptDefaultAdminTransfer()': FunctionFragment; + 'application()': FunctionFragment; + 'beginDefaultAdminTransfer(address)': FunctionFragment; + 'cancelDefaultAdminTransfer()': FunctionFragment; + 'changeDefaultAdminDelay(uint48)': FunctionFragment; + 'defaultAdmin()': FunctionFragment; + 'defaultAdminDelay()': FunctionFragment; + 'defaultAdminDelayIncreaseWait()': FunctionFragment; + 'deployAdditionalChainForSigningMultisig(uint256,uint32)': FunctionFragment; + 'extendSigningCohortDuration(uint32,uint32)': FunctionFragment; + 'getChains(uint32)': FunctionFragment; + 'getRoleAdmin(bytes32)': FunctionFragment; + 'getSigner(uint32,address)': FunctionFragment; + 'getSigners(uint32)': FunctionFragment; + 'getSigningCohortConditions(uint32,uint256)': FunctionFragment; + 'getSigningCohortDataHash(uint32,address)': FunctionFragment; + 'getSigningCohortState(uint32)': FunctionFragment; + 'getSigningCoordinatorChild(uint256)': FunctionFragment; + 'getThreshold(uint32)': FunctionFragment; + 'grantRole(bytes32,address)': FunctionFragment; + 'hasRole(bytes32,address)': FunctionFragment; + 'initialize(uint32,uint16,address,address)': FunctionFragment; + 'initiateSigningCohort(uint256,address,address[],uint16,uint32)': FunctionFragment; + 'isCohortActive(uint32)': FunctionFragment; + 'isSigner(uint32,address)': FunctionFragment; + 'maxCohortSize()': FunctionFragment; + 'numberOfSigningCohorts()': FunctionFragment; + 'owner()': FunctionFragment; + 'pendingDefaultAdmin()': FunctionFragment; + 'pendingDefaultAdminDelay()': FunctionFragment; + 'postSigningCohortData(uint32,bytes,bytes)': FunctionFragment; + 'renounceRole(bytes32,address)': FunctionFragment; + 'revokeRole(bytes32,address)': FunctionFragment; + 'rollbackDefaultAdminDelay()': FunctionFragment; + 'setDispatcher(address)': FunctionFragment; + 'setMaxDkgSize(uint16)': FunctionFragment; + 'setSigningCohortConditions(uint32,uint256,bytes)': FunctionFragment; + 'setTimeout(uint32)': FunctionFragment; + 'signingCohorts(uint32)': FunctionFragment; + 'signingCoordinatorDispatcher()': FunctionFragment; + 'supportsInterface(bytes4)': FunctionFragment; + 'timeout()': FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | 'DEFAULT_ADMIN_ROLE' + | 'INITIATOR_ROLE' + | 'SIGNING_REQUEST_KEY_LENGTH' + | 'acceptDefaultAdminTransfer' + | 'application' + | 'beginDefaultAdminTransfer' + | 'cancelDefaultAdminTransfer' + | 'changeDefaultAdminDelay' + | 'defaultAdmin' + | 'defaultAdminDelay' + | 'defaultAdminDelayIncreaseWait' + | 'deployAdditionalChainForSigningMultisig' + | 'extendSigningCohortDuration' + | 'getChains' + | 'getRoleAdmin' + | 'getSigner' + | 'getSigners' + | 'getSigningCohortConditions' + | 'getSigningCohortDataHash' + | 'getSigningCohortState' + | 'getSigningCoordinatorChild' + | 'getThreshold' + | 'grantRole' + | 'hasRole' + | 'initialize' + | 'initiateSigningCohort' + | 'isCohortActive' + | 'isSigner' + | 'maxCohortSize' + | 'numberOfSigningCohorts' + | 'owner' + | 'pendingDefaultAdmin' + | 'pendingDefaultAdminDelay' + | 'postSigningCohortData' + | 'renounceRole' + | 'revokeRole' + | 'rollbackDefaultAdminDelay' + | 'setDispatcher' + | 'setMaxDkgSize' + | 'setSigningCohortConditions' + | 'setTimeout' + | 'signingCohorts' + | 'signingCoordinatorDispatcher' + | 'supportsInterface' + | 'timeout', + ): FunctionFragment; + + encodeFunctionData( + functionFragment: 'DEFAULT_ADMIN_ROLE', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'INITIATOR_ROLE', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'SIGNING_REQUEST_KEY_LENGTH', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'acceptDefaultAdminTransfer', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'application', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'beginDefaultAdminTransfer', + values: [string], + ): string; + encodeFunctionData( + functionFragment: 'cancelDefaultAdminTransfer', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'changeDefaultAdminDelay', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'defaultAdmin', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'defaultAdminDelay', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'defaultAdminDelayIncreaseWait', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'deployAdditionalChainForSigningMultisig', + values: [BigNumberish, BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'extendSigningCohortDuration', + values: [BigNumberish, BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getChains', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getRoleAdmin', + values: [BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'getSigner', + values: [BigNumberish, string], + ): string; + encodeFunctionData( + functionFragment: 'getSigners', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getSigningCohortConditions', + values: [BigNumberish, BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getSigningCohortDataHash', + values: [BigNumberish, string], + ): string; + encodeFunctionData( + functionFragment: 'getSigningCohortState', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getSigningCoordinatorChild', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'getThreshold', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'grantRole', + values: [BytesLike, string], + ): string; + encodeFunctionData( + functionFragment: 'hasRole', + values: [BytesLike, string], + ): string; + encodeFunctionData( + functionFragment: 'initialize', + values: [BigNumberish, BigNumberish, string, string], + ): string; + encodeFunctionData( + functionFragment: 'initiateSigningCohort', + values: [BigNumberish, string, string[], BigNumberish, BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'isCohortActive', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'isSigner', + values: [BigNumberish, string], + ): string; + encodeFunctionData( + functionFragment: 'maxCohortSize', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'numberOfSigningCohorts', + values?: undefined, + ): string; + encodeFunctionData(functionFragment: 'owner', values?: undefined): string; + encodeFunctionData( + functionFragment: 'pendingDefaultAdmin', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'pendingDefaultAdminDelay', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'postSigningCohortData', + values: [BigNumberish, BytesLike, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'renounceRole', + values: [BytesLike, string], + ): string; + encodeFunctionData( + functionFragment: 'revokeRole', + values: [BytesLike, string], + ): string; + encodeFunctionData( + functionFragment: 'rollbackDefaultAdminDelay', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'setDispatcher', + values: [string], + ): string; + encodeFunctionData( + functionFragment: 'setMaxDkgSize', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'setSigningCohortConditions', + values: [BigNumberish, BigNumberish, BytesLike], + ): string; + encodeFunctionData( + functionFragment: 'setTimeout', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'signingCohorts', + values: [BigNumberish], + ): string; + encodeFunctionData( + functionFragment: 'signingCoordinatorDispatcher', + values?: undefined, + ): string; + encodeFunctionData( + functionFragment: 'supportsInterface', + values: [BytesLike], + ): string; + encodeFunctionData(functionFragment: 'timeout', values?: undefined): string; + + decodeFunctionResult( + functionFragment: 'DEFAULT_ADMIN_ROLE', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'INITIATOR_ROLE', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'SIGNING_REQUEST_KEY_LENGTH', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'acceptDefaultAdminTransfer', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'application', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'beginDefaultAdminTransfer', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'cancelDefaultAdminTransfer', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'changeDefaultAdminDelay', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'defaultAdmin', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'defaultAdminDelay', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'defaultAdminDelayIncreaseWait', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'deployAdditionalChainForSigningMultisig', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'extendSigningCohortDuration', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'getChains', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'getRoleAdmin', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'getSigner', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'getSigners', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'getSigningCohortConditions', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'getSigningCohortDataHash', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'getSigningCohortState', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'getSigningCoordinatorChild', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'getThreshold', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'grantRole', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'hasRole', data: BytesLike): Result; + decodeFunctionResult(functionFragment: 'initialize', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'initiateSigningCohort', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'isCohortActive', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'isSigner', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'maxCohortSize', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'numberOfSigningCohorts', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'owner', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'pendingDefaultAdmin', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'pendingDefaultAdminDelay', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'postSigningCohortData', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'renounceRole', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'revokeRole', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'rollbackDefaultAdminDelay', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'setDispatcher', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'setMaxDkgSize', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'setSigningCohortConditions', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'setTimeout', data: BytesLike): Result; + decodeFunctionResult( + functionFragment: 'signingCohorts', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'signingCoordinatorDispatcher', + data: BytesLike, + ): Result; + decodeFunctionResult( + functionFragment: 'supportsInterface', + data: BytesLike, + ): Result; + decodeFunctionResult(functionFragment: 'timeout', data: BytesLike): Result; + + events: { + 'DefaultAdminDelayChangeCanceled()': EventFragment; + 'DefaultAdminDelayChangeScheduled(uint48,uint48)': EventFragment; + 'DefaultAdminTransferCanceled()': EventFragment; + 'DefaultAdminTransferScheduled(address,uint48)': EventFragment; + 'DispatcherChanged(address,address)': EventFragment; + 'Initialized(uint64)': EventFragment; + 'InitiateSigningCohort(uint32,uint256,address,address[])': EventFragment; + 'MaxCohortSizeChanged(uint16,uint16)': EventFragment; + 'RoleAdminChanged(bytes32,bytes32,bytes32)': EventFragment; + 'RoleGranted(bytes32,address,address)': EventFragment; + 'RoleRevoked(bytes32,address,address)': EventFragment; + 'SigningCohortConditionsSet(uint32,uint256,bytes)': EventFragment; + 'SigningCohortDeployed(uint32,uint256)': EventFragment; + 'SigningCohortSignaturePosted(uint32,address,address,bytes)': EventFragment; + 'TimeoutChanged(uint32,uint32)': EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: 'DefaultAdminDelayChangeCanceled', + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: 'DefaultAdminDelayChangeScheduled', + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: 'DefaultAdminTransferCanceled', + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: 'DefaultAdminTransferScheduled', + ): EventFragment; + getEvent(nameOrSignatureOrTopic: 'DispatcherChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'Initialized'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'InitiateSigningCohort'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'MaxCohortSizeChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RoleAdminChanged'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RoleGranted'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'RoleRevoked'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'SigningCohortConditionsSet'): EventFragment; + getEvent(nameOrSignatureOrTopic: 'SigningCohortDeployed'): EventFragment; + getEvent( + nameOrSignatureOrTopic: 'SigningCohortSignaturePosted', + ): EventFragment; + getEvent(nameOrSignatureOrTopic: 'TimeoutChanged'): EventFragment; +} + +export interface DefaultAdminDelayChangeCanceledEventObject {} +export type DefaultAdminDelayChangeCanceledEvent = TypedEvent< + [], + DefaultAdminDelayChangeCanceledEventObject +>; + +export type DefaultAdminDelayChangeCanceledEventFilter = + TypedEventFilter; + +export interface DefaultAdminDelayChangeScheduledEventObject { + newDelay: number; + effectSchedule: number; +} +export type DefaultAdminDelayChangeScheduledEvent = TypedEvent< + [number, number], + DefaultAdminDelayChangeScheduledEventObject +>; + +export type DefaultAdminDelayChangeScheduledEventFilter = + TypedEventFilter; + +export interface DefaultAdminTransferCanceledEventObject {} +export type DefaultAdminTransferCanceledEvent = TypedEvent< + [], + DefaultAdminTransferCanceledEventObject +>; + +export type DefaultAdminTransferCanceledEventFilter = + TypedEventFilter; + +export interface DefaultAdminTransferScheduledEventObject { + newAdmin: string; + acceptSchedule: number; +} +export type DefaultAdminTransferScheduledEvent = TypedEvent< + [string, number], + DefaultAdminTransferScheduledEventObject +>; + +export type DefaultAdminTransferScheduledEventFilter = + TypedEventFilter; + +export interface DispatcherChangedEventObject { + oldDispatcher: string; + newDispatcher: string; +} +export type DispatcherChangedEvent = TypedEvent< + [string, string], + DispatcherChangedEventObject +>; + +export type DispatcherChangedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: BigNumber; +} +export type InitializedEvent = TypedEvent<[BigNumber], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface InitiateSigningCohortEventObject { + cohortId: number; + chainId: BigNumber; + authority: string; + participants: string[]; +} +export type InitiateSigningCohortEvent = TypedEvent< + [number, BigNumber, string, string[]], + InitiateSigningCohortEventObject +>; + +export type InitiateSigningCohortEventFilter = + TypedEventFilter; + +export interface MaxCohortSizeChangedEventObject { + oldSize: number; + newSize: number; +} +export type MaxCohortSizeChangedEvent = TypedEvent< + [number, number], + MaxCohortSizeChangedEventObject +>; + +export type MaxCohortSizeChangedEventFilter = + TypedEventFilter; + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface SigningCohortConditionsSetEventObject { + cohortId: number; + chainId: BigNumber; + conditions: string; +} +export type SigningCohortConditionsSetEvent = TypedEvent< + [number, BigNumber, string], + SigningCohortConditionsSetEventObject +>; + +export type SigningCohortConditionsSetEventFilter = + TypedEventFilter; + +export interface SigningCohortDeployedEventObject { + cohortId: number; + chainId: BigNumber; +} +export type SigningCohortDeployedEvent = TypedEvent< + [number, BigNumber], + SigningCohortDeployedEventObject +>; + +export type SigningCohortDeployedEventFilter = + TypedEventFilter; + +export interface SigningCohortSignaturePostedEventObject { + cohortId: number; + provider: string; + signer: string; + signature: string; +} +export type SigningCohortSignaturePostedEvent = TypedEvent< + [number, string, string, string], + SigningCohortSignaturePostedEventObject +>; + +export type SigningCohortSignaturePostedEventFilter = + TypedEventFilter; + +export interface TimeoutChangedEventObject { + oldTimeout: number; + newTimeout: number; +} +export type TimeoutChangedEvent = TypedEvent< + [number, number], + TimeoutChangedEventObject +>; + +export type TimeoutChangedEventFilter = TypedEventFilter; + +export interface SigningCoordinator extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: SigningCoordinatorInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined, + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter, + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter, + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + INITIATOR_ROLE(overrides?: CallOverrides): Promise<[string]>; + + SIGNING_REQUEST_KEY_LENGTH(overrides?: CallOverrides): Promise<[BigNumber]>; + + acceptDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + application(overrides?: CallOverrides): Promise<[string]>; + + beginDefaultAdminTransfer( + newAdmin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + cancelDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + changeDefaultAdminDelay( + newDelay: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + defaultAdmin(overrides?: CallOverrides): Promise<[string]>; + + defaultAdminDelay(overrides?: CallOverrides): Promise<[number]>; + + defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise<[number]>; + + deployAdditionalChainForSigningMultisig( + chainId: BigNumberish, + cohortId: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + extendSigningCohortDuration( + cohortId: BigNumberish, + additionalDuration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + getChains( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[BigNumber[]]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + getSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise<[SigningCoordinator.SigningCohortParticipantStructOutput]>; + + getSigners( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[SigningCoordinator.SigningCohortParticipantStructOutput[]]>; + + getSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[string]>; + + getSigningCohortDataHash( + cohortId: BigNumberish, + operator: string, + overrides?: CallOverrides, + ): Promise<[string]>; + + getSigningCohortState( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[number]>; + + getSigningCoordinatorChild( + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[string]>; + + getThreshold( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[number]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise<[boolean]>; + + initialize( + _timeout: BigNumberish, + _maxDkgSize: BigNumberish, + _signingCoordinatorDispatcher: string, + _admin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + initiateSigningCohort( + chainId: BigNumberish, + authority: string, + providers: string[], + threshold: BigNumberish, + duration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + isCohortActive( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise<[boolean]>; + + isSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise<[boolean]>; + + maxCohortSize(overrides?: CallOverrides): Promise<[number]>; + + numberOfSigningCohorts(overrides?: CallOverrides): Promise<[BigNumber]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pendingDefaultAdmin( + overrides?: CallOverrides, + ): Promise<[string, number] & { newAdmin: string; schedule: number }>; + + pendingDefaultAdminDelay( + overrides?: CallOverrides, + ): Promise<[number, number] & { newDelay: number; schedule: number }>; + + postSigningCohortData( + cohortId: BigNumberish, + signature: BytesLike, + signingRequestStaticKey: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + rollbackDefaultAdminDelay( + overrides?: Overrides & { from?: string }, + ): Promise; + + setDispatcher( + dispatcher: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + setMaxDkgSize( + newSize: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + setSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + conditions: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + setTimeout( + newTimeout: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + signingCohorts( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, number, number, string, number, number, number] & { + initiator: string; + initTimestamp: number; + endTimestamp: number; + authority: string; + totalSignatures: number; + numSigners: number; + threshold: number; + } + >; + + signingCoordinatorDispatcher(overrides?: CallOverrides): Promise<[string]>; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides, + ): Promise<[boolean]>; + + timeout(overrides?: CallOverrides): Promise<[number]>; + }; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + INITIATOR_ROLE(overrides?: CallOverrides): Promise; + + SIGNING_REQUEST_KEY_LENGTH(overrides?: CallOverrides): Promise; + + acceptDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + application(overrides?: CallOverrides): Promise; + + beginDefaultAdminTransfer( + newAdmin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + cancelDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + changeDefaultAdminDelay( + newDelay: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + defaultAdmin(overrides?: CallOverrides): Promise; + + defaultAdminDelay(overrides?: CallOverrides): Promise; + + defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise; + + deployAdditionalChainForSigningMultisig( + chainId: BigNumberish, + cohortId: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + extendSigningCohortDuration( + cohortId: BigNumberish, + additionalDuration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + getChains( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + getSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + getSigners( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortDataHash( + cohortId: BigNumberish, + operator: string, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortState( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCoordinatorChild( + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getThreshold( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + initialize( + _timeout: BigNumberish, + _maxDkgSize: BigNumberish, + _signingCoordinatorDispatcher: string, + _admin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + initiateSigningCohort( + chainId: BigNumberish, + authority: string, + providers: string[], + threshold: BigNumberish, + duration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + isCohortActive( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + isSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + maxCohortSize(overrides?: CallOverrides): Promise; + + numberOfSigningCohorts(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingDefaultAdmin( + overrides?: CallOverrides, + ): Promise<[string, number] & { newAdmin: string; schedule: number }>; + + pendingDefaultAdminDelay( + overrides?: CallOverrides, + ): Promise<[number, number] & { newDelay: number; schedule: number }>; + + postSigningCohortData( + cohortId: BigNumberish, + signature: BytesLike, + signingRequestStaticKey: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + rollbackDefaultAdminDelay( + overrides?: Overrides & { from?: string }, + ): Promise; + + setDispatcher( + dispatcher: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + setMaxDkgSize( + newSize: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + setSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + conditions: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + setTimeout( + newTimeout: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + signingCohorts( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, number, number, string, number, number, number] & { + initiator: string; + initTimestamp: number; + endTimestamp: number; + authority: string; + totalSignatures: number; + numSigners: number; + threshold: number; + } + >; + + signingCoordinatorDispatcher(overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides, + ): Promise; + + timeout(overrides?: CallOverrides): Promise; + + callStatic: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + INITIATOR_ROLE(overrides?: CallOverrides): Promise; + + SIGNING_REQUEST_KEY_LENGTH(overrides?: CallOverrides): Promise; + + acceptDefaultAdminTransfer(overrides?: CallOverrides): Promise; + + application(overrides?: CallOverrides): Promise; + + beginDefaultAdminTransfer( + newAdmin: string, + overrides?: CallOverrides, + ): Promise; + + cancelDefaultAdminTransfer(overrides?: CallOverrides): Promise; + + changeDefaultAdminDelay( + newDelay: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + defaultAdmin(overrides?: CallOverrides): Promise; + + defaultAdminDelay(overrides?: CallOverrides): Promise; + + defaultAdminDelayIncreaseWait(overrides?: CallOverrides): Promise; + + deployAdditionalChainForSigningMultisig( + chainId: BigNumberish, + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + extendSigningCohortDuration( + cohortId: BigNumberish, + additionalDuration: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getChains( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + getSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + getSigners( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortDataHash( + cohortId: BigNumberish, + operator: string, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortState( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCoordinatorChild( + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getThreshold( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + initialize( + _timeout: BigNumberish, + _maxDkgSize: BigNumberish, + _signingCoordinatorDispatcher: string, + _admin: string, + overrides?: CallOverrides, + ): Promise; + + initiateSigningCohort( + chainId: BigNumberish, + authority: string, + providers: string[], + threshold: BigNumberish, + duration: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + isCohortActive( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + isSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + maxCohortSize(overrides?: CallOverrides): Promise; + + numberOfSigningCohorts(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingDefaultAdmin( + overrides?: CallOverrides, + ): Promise<[string, number] & { newAdmin: string; schedule: number }>; + + pendingDefaultAdminDelay( + overrides?: CallOverrides, + ): Promise<[number, number] & { newDelay: number; schedule: number }>; + + postSigningCohortData( + cohortId: BigNumberish, + signature: BytesLike, + signingRequestStaticKey: BytesLike, + overrides?: CallOverrides, + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + rollbackDefaultAdminDelay(overrides?: CallOverrides): Promise; + + setDispatcher(dispatcher: string, overrides?: CallOverrides): Promise; + + setMaxDkgSize( + newSize: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + setSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + conditions: BytesLike, + overrides?: CallOverrides, + ): Promise; + + setTimeout( + newTimeout: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + signingCohorts( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise< + [string, number, number, string, number, number, number] & { + initiator: string; + initTimestamp: number; + endTimestamp: number; + authority: string; + totalSignatures: number; + numSigners: number; + threshold: number; + } + >; + + signingCoordinatorDispatcher(overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides, + ): Promise; + + timeout(overrides?: CallOverrides): Promise; + }; + + filters: { + 'DefaultAdminDelayChangeCanceled()'(): DefaultAdminDelayChangeCanceledEventFilter; + DefaultAdminDelayChangeCanceled(): DefaultAdminDelayChangeCanceledEventFilter; + + 'DefaultAdminDelayChangeScheduled(uint48,uint48)'( + newDelay?: null, + effectSchedule?: null, + ): DefaultAdminDelayChangeScheduledEventFilter; + DefaultAdminDelayChangeScheduled( + newDelay?: null, + effectSchedule?: null, + ): DefaultAdminDelayChangeScheduledEventFilter; + + 'DefaultAdminTransferCanceled()'(): DefaultAdminTransferCanceledEventFilter; + DefaultAdminTransferCanceled(): DefaultAdminTransferCanceledEventFilter; + + 'DefaultAdminTransferScheduled(address,uint48)'( + newAdmin?: string | null, + acceptSchedule?: null, + ): DefaultAdminTransferScheduledEventFilter; + DefaultAdminTransferScheduled( + newAdmin?: string | null, + acceptSchedule?: null, + ): DefaultAdminTransferScheduledEventFilter; + + 'DispatcherChanged(address,address)'( + oldDispatcher?: null, + newDispatcher?: null, + ): DispatcherChangedEventFilter; + DispatcherChanged( + oldDispatcher?: null, + newDispatcher?: null, + ): DispatcherChangedEventFilter; + + 'Initialized(uint64)'(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + 'InitiateSigningCohort(uint32,uint256,address,address[])'( + cohortId?: BigNumberish | null, + chainId?: null, + authority?: string | null, + participants?: null, + ): InitiateSigningCohortEventFilter; + InitiateSigningCohort( + cohortId?: BigNumberish | null, + chainId?: null, + authority?: string | null, + participants?: null, + ): InitiateSigningCohortEventFilter; + + 'MaxCohortSizeChanged(uint16,uint16)'( + oldSize?: null, + newSize?: null, + ): MaxCohortSizeChangedEventFilter; + MaxCohortSizeChanged( + oldSize?: null, + newSize?: null, + ): MaxCohortSizeChangedEventFilter; + + 'RoleAdminChanged(bytes32,bytes32,bytes32)'( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null, + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null, + ): RoleAdminChangedEventFilter; + + 'RoleGranted(bytes32,address,address)'( + role?: BytesLike | null, + account?: string | null, + sender?: string | null, + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null, + ): RoleGrantedEventFilter; + + 'RoleRevoked(bytes32,address,address)'( + role?: BytesLike | null, + account?: string | null, + sender?: string | null, + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null, + ): RoleRevokedEventFilter; + + 'SigningCohortConditionsSet(uint32,uint256,bytes)'( + cohortId?: BigNumberish | null, + chainId?: null, + conditions?: null, + ): SigningCohortConditionsSetEventFilter; + SigningCohortConditionsSet( + cohortId?: BigNumberish | null, + chainId?: null, + conditions?: null, + ): SigningCohortConditionsSetEventFilter; + + 'SigningCohortDeployed(uint32,uint256)'( + cohortId?: BigNumberish | null, + chainId?: null, + ): SigningCohortDeployedEventFilter; + SigningCohortDeployed( + cohortId?: BigNumberish | null, + chainId?: null, + ): SigningCohortDeployedEventFilter; + + 'SigningCohortSignaturePosted(uint32,address,address,bytes)'( + cohortId?: BigNumberish | null, + provider?: string | null, + signer?: string | null, + signature?: null, + ): SigningCohortSignaturePostedEventFilter; + SigningCohortSignaturePosted( + cohortId?: BigNumberish | null, + provider?: string | null, + signer?: string | null, + signature?: null, + ): SigningCohortSignaturePostedEventFilter; + + 'TimeoutChanged(uint32,uint32)'( + oldTimeout?: null, + newTimeout?: null, + ): TimeoutChangedEventFilter; + TimeoutChanged( + oldTimeout?: null, + newTimeout?: null, + ): TimeoutChangedEventFilter; + }; + + estimateGas: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + INITIATOR_ROLE(overrides?: CallOverrides): Promise; + + SIGNING_REQUEST_KEY_LENGTH(overrides?: CallOverrides): Promise; + + acceptDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + application(overrides?: CallOverrides): Promise; + + beginDefaultAdminTransfer( + newAdmin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + cancelDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + changeDefaultAdminDelay( + newDelay: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + defaultAdmin(overrides?: CallOverrides): Promise; + + defaultAdminDelay(overrides?: CallOverrides): Promise; + + defaultAdminDelayIncreaseWait( + overrides?: CallOverrides, + ): Promise; + + deployAdditionalChainForSigningMultisig( + chainId: BigNumberish, + cohortId: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + extendSigningCohortDuration( + cohortId: BigNumberish, + additionalDuration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + getChains( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides, + ): Promise; + + getSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + getSigners( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortDataHash( + cohortId: BigNumberish, + operator: string, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortState( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCoordinatorChild( + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getThreshold( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + initialize( + _timeout: BigNumberish, + _maxDkgSize: BigNumberish, + _signingCoordinatorDispatcher: string, + _admin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + initiateSigningCohort( + chainId: BigNumberish, + authority: string, + providers: string[], + threshold: BigNumberish, + duration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + isCohortActive( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + isSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + maxCohortSize(overrides?: CallOverrides): Promise; + + numberOfSigningCohorts(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingDefaultAdmin(overrides?: CallOverrides): Promise; + + pendingDefaultAdminDelay(overrides?: CallOverrides): Promise; + + postSigningCohortData( + cohortId: BigNumberish, + signature: BytesLike, + signingRequestStaticKey: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + rollbackDefaultAdminDelay( + overrides?: Overrides & { from?: string }, + ): Promise; + + setDispatcher( + dispatcher: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + setMaxDkgSize( + newSize: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + setSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + conditions: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + setTimeout( + newTimeout: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + signingCohorts( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + signingCoordinatorDispatcher(overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides, + ): Promise; + + timeout(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides, + ): Promise; + + INITIATOR_ROLE(overrides?: CallOverrides): Promise; + + SIGNING_REQUEST_KEY_LENGTH( + overrides?: CallOverrides, + ): Promise; + + acceptDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + application(overrides?: CallOverrides): Promise; + + beginDefaultAdminTransfer( + newAdmin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + cancelDefaultAdminTransfer( + overrides?: Overrides & { from?: string }, + ): Promise; + + changeDefaultAdminDelay( + newDelay: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + defaultAdmin(overrides?: CallOverrides): Promise; + + defaultAdminDelay(overrides?: CallOverrides): Promise; + + defaultAdminDelayIncreaseWait( + overrides?: CallOverrides, + ): Promise; + + deployAdditionalChainForSigningMultisig( + chainId: BigNumberish, + cohortId: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + extendSigningCohortDuration( + cohortId: BigNumberish, + additionalDuration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + getChains( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides, + ): Promise; + + getSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + getSigners( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortDataHash( + cohortId: BigNumberish, + operator: string, + overrides?: CallOverrides, + ): Promise; + + getSigningCohortState( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getSigningCoordinatorChild( + chainId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + getThreshold( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides, + ): Promise; + + initialize( + _timeout: BigNumberish, + _maxDkgSize: BigNumberish, + _signingCoordinatorDispatcher: string, + _admin: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + initiateSigningCohort( + chainId: BigNumberish, + authority: string, + providers: string[], + threshold: BigNumberish, + duration: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + isCohortActive( + cohortId: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + isSigner( + cohortId: BigNumberish, + provider: string, + overrides?: CallOverrides, + ): Promise; + + maxCohortSize(overrides?: CallOverrides): Promise; + + numberOfSigningCohorts( + overrides?: CallOverrides, + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pendingDefaultAdmin( + overrides?: CallOverrides, + ): Promise; + + pendingDefaultAdminDelay( + overrides?: CallOverrides, + ): Promise; + + postSigningCohortData( + cohortId: BigNumberish, + signature: BytesLike, + signingRequestStaticKey: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + rollbackDefaultAdminDelay( + overrides?: Overrides & { from?: string }, + ): Promise; + + setDispatcher( + dispatcher: string, + overrides?: Overrides & { from?: string }, + ): Promise; + + setMaxDkgSize( + newSize: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + setSigningCohortConditions( + cohortId: BigNumberish, + chainId: BigNumberish, + conditions: BytesLike, + overrides?: Overrides & { from?: string }, + ): Promise; + + setTimeout( + newTimeout: BigNumberish, + overrides?: Overrides & { from?: string }, + ): Promise; + + signingCohorts( + arg0: BigNumberish, + overrides?: CallOverrides, + ): Promise; + + signingCoordinatorDispatcher( + overrides?: CallOverrides, + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides, + ): Promise; + + timeout(overrides?: CallOverrides): Promise; + }; +} diff --git a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts index e3800e887..ae8e72d4c 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts @@ -16,6 +16,16 @@ const _abi = [ type: 'address', internalType: 'contract ITACoChildApplication', }, + { + name: '_dkgTimeout', + type: 'uint32', + internalType: 'uint32', + }, + { + name: '_handoverTimeout', + type: 'uint32', + internalType: 'uint32', + }, ], }, { @@ -66,33 +76,6 @@ const _abi = [ }, ], }, - { - type: 'error', - name: 'AddressEmptyCode', - inputs: [ - { - name: 'target', - type: 'address', - internalType: 'address', - }, - ], - }, - { - type: 'error', - name: 'AddressInsufficientBalance', - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - }, - ], - }, - { - type: 'error', - name: 'FailedInnerCall', - inputs: [], - }, { type: 'error', name: 'InvalidInitialization', @@ -119,17 +102,6 @@ const _abi = [ }, ], }, - { - type: 'error', - name: 'SafeERC20FailedOperation', - inputs: [ - { - name: 'token', - type: 'address', - internalType: 'address', - }, - ], - }, { type: 'event', name: 'AggregationPosted', @@ -155,6 +127,25 @@ const _abi = [ ], anonymous: false, }, + { + type: 'event', + name: 'BlindedSharePosted', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, { type: 'event', name: 'DefaultAdminDelayChangeCanceled', @@ -237,6 +228,106 @@ const _abi = [ ], anonymous: false, }, + { + type: 'event', + name: 'HandoverCanceled', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'incomingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'HandoverFinalized', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'incomingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'HandoverRequest', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'incomingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'HandoverTranscriptPosted', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'incomingParticipant', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, { type: 'event', name: 'Initialized', @@ -481,25 +572,6 @@ const _abi = [ ], anonymous: false, }, - { - type: 'event', - name: 'TimeoutChanged', - inputs: [ - { - name: 'oldTimeout', - type: 'uint32', - internalType: 'uint32', - indexed: false, - }, - { - name: 'newTimeout', - type: 'uint32', - internalType: 'uint32', - indexed: false, - }, - ], - anonymous: false, - }, { type: 'event', name: 'TranscriptPosted', @@ -551,6 +623,19 @@ const _abi = [ }, ], }, + { + type: 'function', + name: 'HANDOVER_SUPERVISOR_ROLE', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, { type: 'function', name: 'TREASURY_ROLE', @@ -610,6 +695,30 @@ const _abi = [ ], outputs: [], }, + { + type: 'function', + name: 'blindedSharePosition', + stateMutability: 'pure', + inputs: [ + { + name: 'index', + type: 'uint256', + internalType: 'uint256', + }, + { + name: 'threshold', + type: 'uint16', + internalType: 'uint16', + }, + ], + outputs: [ + { + name: '', + type: 'uint256', + internalType: 'uint256', + }, + ], + }, { type: 'function', name: 'cancelDefaultAdminTransfer', @@ -617,6 +726,24 @@ const _abi = [ inputs: [], outputs: [], }, + { + type: 'function', + name: 'cancelHandover', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, { type: 'function', name: 'changeDefaultAdminDelay', @@ -688,6 +815,32 @@ const _abi = [ }, ], }, + { + type: 'function', + name: 'dkgTimeout', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + }, + { + type: 'function', + name: 'dkgTimeoutStub', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + }, { type: 'function', name: 'expectedTranscriptSize', @@ -749,6 +902,24 @@ const _abi = [ }, ], }, + { + type: 'function', + name: 'finalizeHandover', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, { type: 'function', name: 'getAccessController', @@ -806,6 +977,54 @@ const _abi = [ }, ], }, + { + type: 'function', + name: 'getHandoverKey', + stateMutability: 'view', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'departingProvider', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'function', + name: 'getHandoverState', + stateMutability: 'view', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'uint8', + internalType: 'enum Coordinator.HandoverState', + }, + ], + }, { type: 'function', name: 'getInitiator', @@ -1240,6 +1459,81 @@ const _abi = [ ], outputs: [], }, + { + type: 'function', + name: 'handoverRequest', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + }, + { + name: 'incomingParticipant', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'handoverTimeout', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + }, + { + type: 'function', + name: 'handovers', + stateMutability: 'view', + inputs: [ + { + name: 'handoverKey', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + outputs: [ + { + name: 'requestTimestamp', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'incomingProvider', + type: 'address', + internalType: 'address', + }, + { + name: 'transcript', + type: 'bytes', + internalType: 'bytes', + }, + { + name: 'decryptionRequestStaticKey', + type: 'bytes', + internalType: 'bytes', + }, + { + name: 'blindedShare', + type: 'bytes', + internalType: 'bytes', + }, + ], + }, { type: 'function', name: 'hasRole', @@ -1269,11 +1563,6 @@ const _abi = [ name: 'initialize', stateMutability: 'nonpayable', inputs: [ - { - name: '_timeout', - type: 'uint32', - internalType: 'uint32', - }, { name: '_maxDkgSize', type: 'uint16', @@ -1287,13 +1576,6 @@ const _abi = [ ], outputs: [], }, - { - type: 'function', - name: 'initializeNumberOfRituals', - stateMutability: 'nonpayable', - inputs: [], - outputs: [], - }, { type: 'function', name: 'initiateRitual', @@ -1333,35 +1615,6 @@ const _abi = [ }, ], }, - { - type: 'function', - name: 'isEncryptionAuthorized', - stateMutability: 'view', - inputs: [ - { - name: '', - type: 'uint32', - internalType: 'uint32', - }, - { - name: '', - type: 'bytes', - internalType: 'bytes', - }, - { - name: '', - type: 'bytes', - internalType: 'bytes', - }, - ], - outputs: [ - { - name: '', - type: 'bool', - internalType: 'bool', - }, - ], - }, { type: 'function', name: 'isParticipant', @@ -1560,16 +1813,16 @@ const _abi = [ }, { type: 'function', - name: 'postTranscript', + name: 'postBlindedShare', stateMutability: 'nonpayable', inputs: [ { - name: '', + name: 'ritualId', type: 'uint32', internalType: 'uint32', }, { - name: '', + name: 'blindedShare', type: 'bytes', internalType: 'bytes', }, @@ -1578,7 +1831,7 @@ const _abi = [ }, { type: 'function', - name: 'publishTranscript', + name: 'postHandoverTranscript', stateMutability: 'nonpayable', inputs: [ { @@ -1586,23 +1839,38 @@ const _abi = [ type: 'uint32', internalType: 'uint32', }, + { + name: 'departingParticipant', + type: 'address', + internalType: 'address', + }, { name: 'transcript', type: 'bytes', internalType: 'bytes', }, + { + name: 'decryptionRequestStaticKey', + type: 'bytes', + internalType: 'bytes', + }, ], outputs: [], }, { type: 'function', - name: 'reinitializeDefaultAdmin', + name: 'publishTranscript', stateMutability: 'nonpayable', inputs: [ { - name: 'newDefaultAdmin', - type: 'address', - internalType: 'address', + name: 'ritualId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'transcript', + type: 'bytes', + internalType: 'bytes', }, ], outputs: [], @@ -1649,7 +1917,7 @@ const _abi = [ stateMutability: 'view', inputs: [ { - name: 'ritualId', + name: 'index', type: 'uint256', internalType: 'uint256', }, @@ -1797,19 +2065,6 @@ const _abi = [ ], outputs: [], }, - { - type: 'function', - name: 'setTimeout', - stateMutability: 'nonpayable', - inputs: [ - { - name: 'newTimeout', - type: 'uint32', - internalType: 'uint32', - }, - ], - outputs: [], - }, { type: 'function', name: 'supportsInterface', @@ -1860,19 +2115,6 @@ const _abi = [ ], outputs: [], }, - { - type: 'function', - name: 'withdrawAllTokens', - stateMutability: 'nonpayable', - inputs: [ - { - name: 'token', - type: 'address', - internalType: 'contract IERC20', - }, - ], - outputs: [], - }, ] as const; export class Coordinator__factory { diff --git a/packages/shared/src/contracts/ethers-typechain/factories/SigningCoordinator__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/SigningCoordinator__factory.ts new file mode 100644 index 000000000..1ec9d4dd5 --- /dev/null +++ b/packages/shared/src/contracts/ethers-typechain/factories/SigningCoordinator__factory.ts @@ -0,0 +1,1285 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import type { Provider } from '@ethersproject/providers'; +import { Contract, Signer, utils } from 'ethers'; +import type { + SigningCoordinator, + SigningCoordinatorInterface, +} from '../SigningCoordinator'; + +const _abi = [ + { + type: 'constructor', + stateMutability: 'nonpayable', + inputs: [ + { + name: '_application', + type: 'address', + internalType: 'contract TACoApplication', + }, + ], + }, + { + type: 'error', + name: 'AccessControlBadConfirmation', + inputs: [], + }, + { + type: 'error', + name: 'AccessControlEnforcedDefaultAdminDelay', + inputs: [ + { + name: 'schedule', + type: 'uint48', + internalType: 'uint48', + }, + ], + }, + { + type: 'error', + name: 'AccessControlEnforcedDefaultAdminRules', + inputs: [], + }, + { + type: 'error', + name: 'AccessControlInvalidDefaultAdmin', + inputs: [ + { + name: 'defaultAdmin', + type: 'address', + internalType: 'address', + }, + ], + }, + { + type: 'error', + name: 'AccessControlUnauthorizedAccount', + inputs: [ + { + name: 'account', + type: 'address', + internalType: 'address', + }, + { + name: 'neededRole', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'error', + name: 'ECDSAInvalidSignature', + inputs: [], + }, + { + type: 'error', + name: 'ECDSAInvalidSignatureLength', + inputs: [ + { + name: 'length', + type: 'uint256', + internalType: 'uint256', + }, + ], + }, + { + type: 'error', + name: 'ECDSAInvalidSignatureS', + inputs: [ + { + name: 's', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'error', + name: 'InvalidInitialization', + inputs: [], + }, + { + type: 'error', + name: 'NotInitializing', + inputs: [], + }, + { + type: 'error', + name: 'SafeCastOverflowedUintDowncast', + inputs: [ + { + name: 'bits', + type: 'uint8', + internalType: 'uint8', + }, + { + name: 'value', + type: 'uint256', + internalType: 'uint256', + }, + ], + }, + { + type: 'event', + name: 'DefaultAdminDelayChangeCanceled', + inputs: [], + anonymous: false, + }, + { + type: 'event', + name: 'DefaultAdminDelayChangeScheduled', + inputs: [ + { + name: 'newDelay', + type: 'uint48', + internalType: 'uint48', + indexed: false, + }, + { + name: 'effectSchedule', + type: 'uint48', + internalType: 'uint48', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'DefaultAdminTransferCanceled', + inputs: [], + anonymous: false, + }, + { + type: 'event', + name: 'DefaultAdminTransferScheduled', + inputs: [ + { + name: 'newAdmin', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'acceptSchedule', + type: 'uint48', + internalType: 'uint48', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'DispatcherChanged', + inputs: [ + { + name: 'oldDispatcher', + type: 'address', + internalType: 'address', + indexed: false, + }, + { + name: 'newDispatcher', + type: 'address', + internalType: 'address', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'Initialized', + inputs: [ + { + name: 'version', + type: 'uint64', + internalType: 'uint64', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'InitiateSigningCohort', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + indexed: false, + }, + { + name: 'authority', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'participants', + type: 'address[]', + internalType: 'address[]', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'MaxCohortSizeChanged', + inputs: [ + { + name: 'oldSize', + type: 'uint16', + internalType: 'uint16', + indexed: false, + }, + { + name: 'newSize', + type: 'uint16', + internalType: 'uint16', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RoleAdminChanged', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + indexed: true, + }, + { + name: 'previousAdminRole', + type: 'bytes32', + internalType: 'bytes32', + indexed: true, + }, + { + name: 'newAdminRole', + type: 'bytes32', + internalType: 'bytes32', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RoleGranted', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + indexed: true, + }, + { + name: 'account', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'sender', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'RoleRevoked', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + indexed: true, + }, + { + name: 'account', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'sender', + type: 'address', + internalType: 'address', + indexed: true, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'SigningCohortConditionsSet', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + indexed: false, + }, + { + name: 'conditions', + type: 'bytes', + internalType: 'bytes', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'SigningCohortDeployed', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'SigningCohortSignaturePosted', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + indexed: true, + }, + { + name: 'provider', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'signer', + type: 'address', + internalType: 'address', + indexed: true, + }, + { + name: 'signature', + type: 'bytes', + internalType: 'bytes', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'TimeoutChanged', + inputs: [ + { + name: 'oldTimeout', + type: 'uint32', + internalType: 'uint32', + indexed: false, + }, + { + name: 'newTimeout', + type: 'uint32', + internalType: 'uint32', + indexed: false, + }, + ], + anonymous: false, + }, + { + type: 'function', + name: 'DEFAULT_ADMIN_ROLE', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'function', + name: 'INITIATOR_ROLE', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'function', + name: 'SIGNING_REQUEST_KEY_LENGTH', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint256', + internalType: 'uint256', + }, + ], + }, + { + type: 'function', + name: 'acceptDefaultAdminTransfer', + stateMutability: 'nonpayable', + inputs: [], + outputs: [], + }, + { + type: 'function', + name: 'application', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'address', + internalType: 'contract TACoApplication', + }, + ], + }, + { + type: 'function', + name: 'beginDefaultAdminTransfer', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'newAdmin', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'cancelDefaultAdminTransfer', + stateMutability: 'nonpayable', + inputs: [], + outputs: [], + }, + { + type: 'function', + name: 'changeDefaultAdminDelay', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'newDelay', + type: 'uint48', + internalType: 'uint48', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'defaultAdmin', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'address', + internalType: 'address', + }, + ], + }, + { + type: 'function', + name: 'defaultAdminDelay', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint48', + internalType: 'uint48', + }, + ], + }, + { + type: 'function', + name: 'defaultAdminDelayIncreaseWait', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint48', + internalType: 'uint48', + }, + ], + }, + { + type: 'function', + name: 'deployAdditionalChainForSigningMultisig', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + }, + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'extendSigningCohortDuration', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'additionalDuration', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'getChains', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'uint256[]', + internalType: 'uint256[]', + }, + ], + }, + { + type: 'function', + name: 'getRoleAdmin', + stateMutability: 'view', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'function', + name: 'getSigner', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'provider', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'tuple', + components: [ + { + name: 'provider', + type: 'address', + internalType: 'address', + }, + { + name: 'signerAddress', + type: 'address', + internalType: 'address', + }, + { + name: 'signingRequestStaticKey', + type: 'bytes', + internalType: 'bytes', + }, + { + name: 'gap', + type: 'uint256[20]', + internalType: 'uint256[20]', + }, + ], + internalType: 'struct SigningCoordinator.SigningCohortParticipant', + }, + ], + }, + { + type: 'function', + name: 'getSigners', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'tuple[]', + components: [ + { + name: 'provider', + type: 'address', + internalType: 'address', + }, + { + name: 'signerAddress', + type: 'address', + internalType: 'address', + }, + { + name: 'signingRequestStaticKey', + type: 'bytes', + internalType: 'bytes', + }, + { + name: 'gap', + type: 'uint256[20]', + internalType: 'uint256[20]', + }, + ], + internalType: 'struct SigningCoordinator.SigningCohortParticipant[]', + }, + ], + }, + { + type: 'function', + name: 'getSigningCohortConditions', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + }, + ], + outputs: [ + { + name: '', + type: 'bytes', + internalType: 'bytes', + }, + ], + }, + { + type: 'function', + name: 'getSigningCohortDataHash', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'operator', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'bytes32', + internalType: 'bytes32', + }, + ], + }, + { + type: 'function', + name: 'getSigningCohortState', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'uint8', + internalType: 'enum SigningCoordinator.SigningCohortState', + }, + ], + }, + { + type: 'function', + name: 'getSigningCoordinatorChild', + stateMutability: 'view', + inputs: [ + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + }, + ], + outputs: [ + { + name: '', + type: 'address', + internalType: 'address', + }, + ], + }, + { + type: 'function', + name: 'getThreshold', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'uint16', + internalType: 'uint16', + }, + ], + }, + { + type: 'function', + name: 'grantRole', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + }, + { + name: 'account', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'hasRole', + stateMutability: 'view', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + }, + { + name: 'account', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'bool', + internalType: 'bool', + }, + ], + }, + { + type: 'function', + name: 'initialize', + stateMutability: 'nonpayable', + inputs: [ + { + name: '_timeout', + type: 'uint32', + internalType: 'uint32', + }, + { + name: '_maxDkgSize', + type: 'uint16', + internalType: 'uint16', + }, + { + name: '_signingCoordinatorDispatcher', + type: 'address', + internalType: 'contract SigningCoordinatorDispatcher', + }, + { + name: '_admin', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'initiateSigningCohort', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + }, + { + name: 'authority', + type: 'address', + internalType: 'address', + }, + { + name: 'providers', + type: 'address[]', + internalType: 'address[]', + }, + { + name: 'threshold', + type: 'uint16', + internalType: 'uint16', + }, + { + name: 'duration', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + }, + { + type: 'function', + name: 'isCohortActive', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: '', + type: 'bool', + internalType: 'bool', + }, + ], + }, + { + type: 'function', + name: 'isSigner', + stateMutability: 'view', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'provider', + type: 'address', + internalType: 'address', + }, + ], + outputs: [ + { + name: '', + type: 'bool', + internalType: 'bool', + }, + ], + }, + { + type: 'function', + name: 'maxCohortSize', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint16', + internalType: 'uint16', + }, + ], + }, + { + type: 'function', + name: 'numberOfSigningCohorts', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint256', + internalType: 'uint256', + }, + ], + }, + { + type: 'function', + name: 'owner', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'address', + internalType: 'address', + }, + ], + }, + { + type: 'function', + name: 'pendingDefaultAdmin', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: 'newAdmin', + type: 'address', + internalType: 'address', + }, + { + name: 'schedule', + type: 'uint48', + internalType: 'uint48', + }, + ], + }, + { + type: 'function', + name: 'pendingDefaultAdminDelay', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: 'newDelay', + type: 'uint48', + internalType: 'uint48', + }, + { + name: 'schedule', + type: 'uint48', + internalType: 'uint48', + }, + ], + }, + { + type: 'function', + name: 'postSigningCohortData', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'signature', + type: 'bytes', + internalType: 'bytes', + }, + { + name: 'signingRequestStaticKey', + type: 'bytes', + internalType: 'bytes', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'renounceRole', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + }, + { + name: 'account', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'revokeRole', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'role', + type: 'bytes32', + internalType: 'bytes32', + }, + { + name: 'account', + type: 'address', + internalType: 'address', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'rollbackDefaultAdminDelay', + stateMutability: 'nonpayable', + inputs: [], + outputs: [], + }, + { + type: 'function', + name: 'setDispatcher', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'dispatcher', + type: 'address', + internalType: 'contract SigningCoordinatorDispatcher', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'setMaxDkgSize', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'newSize', + type: 'uint16', + internalType: 'uint16', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'setSigningCohortConditions', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'cohortId', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'chainId', + type: 'uint256', + internalType: 'uint256', + }, + { + name: 'conditions', + type: 'bytes', + internalType: 'bytes', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'setTimeout', + stateMutability: 'nonpayable', + inputs: [ + { + name: 'newTimeout', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [], + }, + { + type: 'function', + name: 'signingCohorts', + stateMutability: 'view', + inputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + outputs: [ + { + name: 'initiator', + type: 'address', + internalType: 'address', + }, + { + name: 'initTimestamp', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'endTimestamp', + type: 'uint32', + internalType: 'uint32', + }, + { + name: 'authority', + type: 'address', + internalType: 'address', + }, + { + name: 'totalSignatures', + type: 'uint16', + internalType: 'uint16', + }, + { + name: 'numSigners', + type: 'uint16', + internalType: 'uint16', + }, + { + name: 'threshold', + type: 'uint16', + internalType: 'uint16', + }, + ], + }, + { + type: 'function', + name: 'signingCoordinatorDispatcher', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'address', + internalType: 'contract SigningCoordinatorDispatcher', + }, + ], + }, + { + type: 'function', + name: 'supportsInterface', + stateMutability: 'view', + inputs: [ + { + name: 'interfaceId', + type: 'bytes4', + internalType: 'bytes4', + }, + ], + outputs: [ + { + name: '', + type: 'bool', + internalType: 'bool', + }, + ], + }, + { + type: 'function', + name: 'timeout', + stateMutability: 'view', + inputs: [], + outputs: [ + { + name: '', + type: 'uint32', + internalType: 'uint32', + }, + ], + }, +] as const; + +export class SigningCoordinator__factory { + static readonly abi = _abi; + static createInterface(): SigningCoordinatorInterface { + return new utils.Interface(_abi) as SigningCoordinatorInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider, + ): SigningCoordinator { + return new Contract(address, _abi, signerOrProvider) as SigningCoordinator; + } +} diff --git a/packages/shared/src/contracts/ethers-typechain/factories/index.ts b/packages/shared/src/contracts/ethers-typechain/factories/index.ts index 8187c7c16..2ee6b4d9d 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/index.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/index.ts @@ -3,4 +3,5 @@ /* eslint-disable */ export { Coordinator__factory } from './Coordinator__factory'; export { GlobalAllowList__factory } from './GlobalAllowList__factory'; +export { SigningCoordinator__factory } from './SigningCoordinator__factory'; export { SubscriptionManager__factory } from './SubscriptionManager__factory'; diff --git a/packages/shared/src/contracts/ethers-typechain/index.ts b/packages/shared/src/contracts/ethers-typechain/index.ts index e0b86d8c9..df379c575 100644 --- a/packages/shared/src/contracts/ethers-typechain/index.ts +++ b/packages/shared/src/contracts/ethers-typechain/index.ts @@ -5,6 +5,8 @@ export type { Coordinator } from './Coordinator'; export * as factories from './factories'; export { Coordinator__factory } from './factories/Coordinator__factory'; export { GlobalAllowList__factory } from './factories/GlobalAllowList__factory'; +export { SigningCoordinator__factory } from './factories/SigningCoordinator__factory'; export { SubscriptionManager__factory } from './factories/SubscriptionManager__factory'; export type { GlobalAllowList } from './GlobalAllowList'; +export type { SigningCoordinator } from './SigningCoordinator'; export type { SubscriptionManager } from './SubscriptionManager'; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 526d9cc5b..464d3cc14 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,7 +1,7 @@ export * from './contracts'; export * from './porter'; export * from './schemas'; -export type * from './types'; +export * from './types'; export * from './utils'; export * from './web3'; diff --git a/packages/shared/src/porter.ts b/packages/shared/src/porter.ts index 0a13050d3..a71239bc8 100644 --- a/packages/shared/src/porter.ts +++ b/packages/shared/src/porter.ts @@ -2,6 +2,8 @@ import { CapsuleFrag, EncryptedThresholdDecryptionRequest, EncryptedThresholdDecryptionResponse, + EncryptedThresholdSignatureRequest, + EncryptedThresholdSignatureResponse, PublicKey, RetrievalKit, TreasureMap, @@ -148,8 +150,41 @@ type PostTacoDecryptResponse = { }; export type TacoDecryptResult = { - encryptedResponses: Record; - errors: Record; + encryptedResponses: Record< + ChecksumAddress, + EncryptedThresholdDecryptionResponse + >; + errors: Record; +}; + +// Signing types + +type PostTacoSignRequest = { + readonly encrypted_signing_requests: Record< + ChecksumAddress, + Base64EncodedBytes + >; + readonly threshold: number; +}; + +type TacoSignResponse = { + readonly result: { + readonly signing_results: { + readonly encrypted_signature_responses: Record< + ChecksumAddress, + Base64EncodedBytes + >; + readonly errors: Record; + }; + }; +}; + +export type TacoSignResult = { + encryptedResponses: Record< + ChecksumAddress, + EncryptedThresholdSignatureResponse + >; + errors: Record; }; export class PorterClient { @@ -175,7 +210,20 @@ export class PorterClient { if (resp.status === HttpStatusCode.Ok) { return resp; } - } catch (e) { + } catch (e: unknown) { + const errorDetails: Record = { + url: porterUrl.toString(), + method: config.method, + requestData: config.data, + }; + + if (axios.isAxiosError(e)) { + errorDetails.status = e.response?.status; + errorDetails.statusText = e.response?.statusText; + errorDetails.data = e.response?.data; + } + + console.error('Porter request failed:', errorDetails); lastError = e; continue; } @@ -284,4 +332,47 @@ export class PorterClient { > = Object.fromEntries(decryptionResponses); return { encryptedResponses, errors }; } + + public async signUserOp( + encryptedSigningRequests: Record< + string, + EncryptedThresholdSignatureRequest + >, + threshold: number, + ): Promise { + const data: PostTacoSignRequest = { + encrypted_signing_requests: Object.fromEntries( + Object.entries(encryptedSigningRequests).map( + ([ursula, encryptedSigningRequest]) => [ + ursula, + toBase64(encryptedSigningRequest.toBytes()), + ], + ), + ), + threshold, + }; + + const resp: AxiosResponse = await this.tryAndCall({ + url: '/sign', + method: 'post', + data, + }); + const { encrypted_signature_responses, errors } = + resp.data.result.signing_results; + + const encryptedResponses: { + [ursulaAddress: string]: EncryptedThresholdSignatureResponse; + } = {}; + for (const [ursulaAddress, encryptedResponseBase64] of Object.entries( + encrypted_signature_responses || {}, + )) { + const encryptedSignatureResponse = + EncryptedThresholdSignatureResponse.fromBytes( + fromBase64(encryptedResponseBase64), + ); + encryptedResponses[ursulaAddress] = encryptedSignatureResponse; + } + + return { encryptedResponses, errors }; + } } diff --git a/packages/shared/src/schemas.ts b/packages/shared/src/schemas.ts index 37dfa2653..ea3bfc200 100644 --- a/packages/shared/src/schemas.ts +++ b/packages/shared/src/schemas.ts @@ -9,10 +9,24 @@ const isAddress = (address: string) => { } }; +const isAddressStrict = (address: string) => { + try { + // Verify the address was checksummed to prevent passing an address that has a typo + return address === ethers.utils.getAddress(address); + } catch (e) { + // If any error occurs during validation, fail the validation + return false; + } +}; + export const EthAddressSchema = z .string() .refine(isAddress, { message: 'Invalid Ethereum address' }); +export const EthAddressSchemaStrict = z.string().refine(isAddressStrict, { + message: 'Invalid Ethereum address - it must be valid and checksummed', +}); + const BLOCK_HASH_REGEXP = new RegExp('^0x[a-fA-F0-9]{64}$'); const BlockNumber = z.number().int().nonnegative(); const BlockHash = z.string().regex(BLOCK_HASH_REGEXP, 'Invalid block hash'); diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 02603b3c2..25eef5be0 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,3 +1,122 @@ +import { PackedUserOperation, UserOperation } from '@nucypher/nucypher-core'; + +import { fromHexString } from './utils'; + export type ChecksumAddress = `0x${string}`; export type HexEncodedBytes = string; export type Base64EncodedBytes = string; + +export type UserOperationToSign = { + sender: `0x${string}`; + nonce: bigint | number; + callData: `0x${string}` | Uint8Array; + callGasLimit: bigint | number; + verificationGasLimit: bigint | number; + preVerificationGas: bigint | number; + maxFeePerGas: bigint | number; + maxPriorityFeePerGas: bigint | number; + // optional fields + factory?: `0x${string}` | undefined; + factoryData?: `0x${string}` | Uint8Array | undefined; + paymaster?: `0x${string}` | undefined; + paymasterVerificationGasLimit?: bigint | number | undefined; + paymasterPostOpGasLimit?: bigint | number | undefined; + paymasterData?: `0x${string}` | Uint8Array | undefined; + signature?: `0x${string}` | Uint8Array | undefined; +}; + +export type PackedUserOperationToSign = { + sender: `0x${string}`; + nonce: bigint | number; + initCode: `0x${string}` | Uint8Array; + callData: `0x${string}` | Uint8Array; + accountGasLimits: `0x${string}` | Uint8Array; + preVerificationGas: bigint | number; + gasFees: `0x${string}` | Uint8Array; + paymasterAndData: `0x${string}` | Uint8Array; + signature?: `0x${string}` | Uint8Array | undefined; +}; + +function getBigIntValue(value: bigint | number): bigint { + return typeof value === 'bigint' ? value : BigInt(value); +} + +function getUint256String(value: bigint | number): string { + return getBigIntValue(value).toString(); +} + +function getUint8ArrayValue(value: `0x${string}` | Uint8Array): Uint8Array { + return value instanceof Uint8Array ? value : fromHexString(value); +} + +export function toCoreUserOperation( + userOperation: UserOperationToSign, +): UserOperation { + const userOp = new UserOperation( + userOperation.sender, + getUint256String(userOperation.nonce), // nonce as string to support big numbers + getUint8ArrayValue(userOperation.callData), + getBigIntValue(userOperation.callGasLimit), + getBigIntValue(userOperation.verificationGasLimit), + getBigIntValue(userOperation.preVerificationGas), + getBigIntValue(userOperation.maxFeePerGas), + getBigIntValue(userOperation.maxPriorityFeePerGas), + ); + + // optional factory data + if (userOperation.factory) { + let factory_data = undefined; + if (userOperation.factoryData) { + factory_data = getUint8ArrayValue(userOperation.factoryData); + } + + userOp.setFactoryData(userOperation.factory, factory_data); + } + + // optional paymaster data + if (userOperation.paymaster) { + if (!userOperation.paymasterVerificationGasLimit) { + throw new Error( + 'paymasterVerificationGasLimit is required when paymaster is set', + ); + } else if (!userOperation.paymasterPostOpGasLimit) { + throw new Error( + 'paymasterPostOpGasLimit is required when paymaster is set', + ); + } + + userOp.setPaymasterData( + userOperation.paymaster, + getBigIntValue(userOperation.paymasterVerificationGasLimit), + getBigIntValue(userOperation.paymasterPostOpGasLimit), + userOperation.paymasterData + ? getUint8ArrayValue(userOperation.paymasterData) + : undefined, + ); + } + + return userOp; +} + +export function toCorePackedUserOperation( + packedUserOperation: PackedUserOperationToSign, +): PackedUserOperation { + const packedUserOp = new PackedUserOperation( + packedUserOperation.sender, + getUint256String(packedUserOperation.nonce), // nonce as string to support big numbers + getUint8ArrayValue(packedUserOperation.initCode), + getUint8ArrayValue(packedUserOperation.callData), + getUint8ArrayValue(packedUserOperation.accountGasLimits), + getBigIntValue(packedUserOperation.preVerificationGas), + getUint8ArrayValue(packedUserOperation.gasFees), + getUint8ArrayValue(packedUserOperation.paymasterAndData), + ); + + return packedUserOp; +} + +export function isPackedUserOperation( + op: UserOperationToSign | PackedUserOperationToSign, +): op is PackedUserOperationToSign { + return 'initCode' in op && 'gasFees' in op; +} diff --git a/packages/shared/test/porter.test.ts b/packages/shared/test/porter.test.ts index 13fb992da..2e43b906b 100644 --- a/packages/shared/test/porter.test.ts +++ b/packages/shared/test/porter.test.ts @@ -1,16 +1,28 @@ import { fakeUrsulas } from '@nucypher/test-utils'; import axios, { HttpStatusCode } from 'axios'; -import { MockInstance, beforeAll, describe, expect, it, vi } from 'vitest'; +import { beforeAll, describe, expect, it, MockInstance, vi } from 'vitest'; + +import { + PackedUserOperationSignatureRequest, + SessionStaticSecret, + SignatureResponse, + UserOperationSignatureRequest, +} from '@nucypher/nucypher-core'; + import { - GetUrsulasResult, - PorterClient, - Ursula, domains, getPorterUris, getPorterUrisFromSource, + GetUrsulasResult, initialize, + PorterClient, + toBase64, + toCorePackedUserOperation, + toCoreUserOperation, toHexString, + Ursula, } from '../src'; +import { fromHexString } from '../src/utils'; const fakePorterUris = [ 'https://_this_should_crash.com/', @@ -49,6 +61,97 @@ const mockGetUrsulas = (ursulas: Ursula[] = fakeUrsulas()): MockInstance => { }); }; +const createMockSignResponse = (errorCase?: boolean) => { + // mimic requester public key obtained from original encrypted request + const requesterPk = SessionStaticSecret.random().publicKey(); + + const response = { + result: { + signing_results: { + encrypted_signature_responses: errorCase + ? { + '0xabcd': [ + toBase64( + new SignatureResponse( + '0x0000000000000000000000000000000000000001', + fromHexString('0x1234'), + fromHexString('0xbeef'), + 0, + ) + .encrypt( + SessionStaticSecret.random().deriveSharedSecret( + requesterPk, + ), + ) + .toBytes(), + ), + ], + } + : { + '0x1234': [ + toBase64( + new SignatureResponse( + '0x0000000000000000000000000000000000000002', + fromHexString('0x1234'), + fromHexString('0xdead'), + 0, + ) + .encrypt( + SessionStaticSecret.random().deriveSharedSecret( + requesterPk, + ), + ) + .toBytes(), + ), + ], + '0xabcd': [ + toBase64( + new SignatureResponse( + '0x0000000000000000000000000000000000000001', + fromHexString('0x1234'), + fromHexString('0xbeef'), + 0, + ) + .encrypt( + SessionStaticSecret.random().deriveSharedSecret( + requesterPk, + ), + ) + .toBytes(), + ), + ], + }, + errors: errorCase + ? { + '0x1234': 'Failed to sign', + } + : {}, + }, + }, + }; + + return response; +}; + +const createMockSignImplementation = + (endpoint: string) => + (success: boolean = true, errorCase?: boolean): MockInstance => { + return vi.spyOn(axios, 'request').mockImplementation(async (config) => { + // Handle sign requests + if (config.url === endpoint && config.baseURL === fakePorterUris[2]) { + if (success) { + return Promise.resolve({ + status: HttpStatusCode.Ok, + data: createMockSignResponse(errorCase), + }); + } + return Promise.resolve({ status: HttpStatusCode.BadRequest, data: '' }); + } + }); + }; + +const mockSignUserOp = createMockSignImplementation('/sign'); + describe('getPorterUris', () => { beforeAll(async () => { await initialize(); @@ -117,3 +220,192 @@ describe('PorterClient', () => { ); }); }); + +describe('PorterClient Signing', () => { + beforeAll(async () => { + await initialize(); + }); + + describe('signUserOp', () => { + // since this uses wasm it must be called after initialize (beforeAll()) so we use a factory function + let requesterSk: SessionStaticSecret; + let requesterPk: any; + + beforeAll(async () => { + requesterSk = SessionStaticSecret.random(); + requesterPk = requesterSk.publicKey(); + }); + + const createUserOpSignatureRequest = () => + new UserOperationSignatureRequest( + toCoreUserOperation({ + sender: '0x000000000000000000000000000000000000000a', + nonce: BigInt(123), + callData: fromHexString('0xabc'), + callGasLimit: BigInt(456), + verificationGasLimit: BigInt(789), + preVerificationGas: BigInt(101112), + maxFeePerGas: BigInt(131415), + maxPriorityFeePerGas: BigInt(161718), + }), + 1, // cohort ID + BigInt(1), // chain ID + '0.8.0', + null, + ); + + it('should successfully sign a UserOperation', async () => { + const userOpSignatureRequest = createUserOpSignatureRequest(); + + mockSignUserOp(true); + const porterClient = new PorterClient(fakePorterUris[2]); + const result = await porterClient.signUserOp( + { + '0x1234': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + '0xabcd': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + }, + 2, + ); + + expect(Object.keys(result.errors).length).toBe(0); + expect(Object.keys(result.encryptedResponses).length).toBe(2); + }); + + it('should successfully sign a PackedUserOperation', async () => { + const packedUserOperationSignatureRequest = + new PackedUserOperationSignatureRequest( + toCorePackedUserOperation({ + sender: '0x000000000000000000000000000000000000000a', + nonce: BigInt(123), + initCode: fromHexString('0xabc'), + callData: fromHexString('0xdef'), + accountGasLimits: fromHexString('0x01020304'), + preVerificationGas: BigInt(101112), + gasFees: fromHexString('0x05060708'), + paymasterAndData: fromHexString('0x090a0b0c'), + }), + 1, // cohort ID + BigInt(1), // chain ID + 'mdt', + null, + ); + + mockSignUserOp(true); + const porterClient = new PorterClient(fakePorterUris[2]); + const result = await porterClient.signUserOp( + { + '0x1234': packedUserOperationSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + '0xabcd': packedUserOperationSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + }, + 2, + ); + + expect(Object.keys(result.errors).length).toBe(0); + expect(Object.keys(result.encryptedResponses).length).toBe(2); + }); + + it('should handle UserOperation signing failures', async () => { + const userOpSignatureRequest = createUserOpSignatureRequest(); + + mockSignUserOp(false); + const porterClient = new PorterClient(fakePorterUris[2]); + + await expect( + porterClient.signUserOp( + { + '0x1234': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + '0xabcd': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + }, + 2, + ), + ).rejects.toThrow('Porter returned bad response: 400 - '); + }); + + it('should handle errors from Porter response in UserOperation signing', async () => { + const userOpSignatureRequest = createUserOpSignatureRequest(); + + // Mock a response with errors from Porter + mockSignUserOp(true, true); + const porterClient = new PorterClient(fakePorterUris[2]); + const result = await porterClient.signUserOp( + { + '0x1234': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + '0xabcd': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + }, + 2, + ); + + expect(Object.keys(result.encryptedResponses).length).toBe(1); + expect(result.errors).toEqual({ + '0x1234': 'Failed to sign', + }); + }); + + it('should successfully sign', async () => { + const userOpSignatureRequest = createUserOpSignatureRequest(); + + mockSignUserOp(true); + const porterClient = new PorterClient(fakePorterUris[2]); + const result = await porterClient.signUserOp( + { + '0x1234': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + '0xabcd': userOpSignatureRequest.encrypt( + requesterSk.deriveSharedSecret( + SessionStaticSecret.random().publicKey(), + ), + requesterPk, + ), + }, + 2, + ); + + expect(Object.keys(result.errors).length).toBe(0); + expect(Object.keys(result.encryptedResponses).length).toBe(2); + }); + }); +}); diff --git a/packages/shared/test/signing-coordinator-cache.test.ts b/packages/shared/test/signing-coordinator-cache.test.ts new file mode 100644 index 000000000..ed2a266fa --- /dev/null +++ b/packages/shared/test/signing-coordinator-cache.test.ts @@ -0,0 +1,131 @@ +import { SessionStaticSecret } from '@nucypher/nucypher-core'; +import { initialize } from '@nucypher/shared'; +import { + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from 'vitest'; + +import { SigningCoordinatorAgent } from '../src/contracts/agents/signing-coordinator'; +import { toHexString } from '../src/utils'; + +// We need to mock the private connectReadOnly method's dependencies +// Mock getContract from nucypher-contracts and the factory +vi.mock('@nucypher/nucypher-contracts', () => ({ + getContract: vi.fn().mockReturnValue('0xMockContractAddress'), +})); + +vi.mock('../src/contracts/ethers-typechain', () => ({ + SigningCoordinator__factory: { + connect: vi.fn(), + }, +})); + +import { SigningCoordinator__factory } from '../src/contracts/ethers-typechain'; + +describe('SigningCoordinatorAgent cache', () => { + const mockProvider = { + getNetwork: vi.fn(), + } as any; + + const domain = 'lynx' as const; + const cohortId = 5; + + let mockContract: any; + + beforeAll(async () => { + await initialize(); + }); + + beforeEach(() => { + vi.useFakeTimers(); + + mockProvider.getNetwork.mockResolvedValue({ chainId: 11155111 }); + + const signerKey = SessionStaticSecret.random(); + mockContract = { + getSigners: vi.fn().mockResolvedValue([ + { + provider: '0xnode1', + signerAddress: '0x0000000000000000000000000000000000000001', + signingRequestStaticKey: `0x${toHexString(signerKey.publicKey().toBytes())}`, + }, + ]), + signingCohorts: vi.fn().mockResolvedValue({ threshold: 2 }), + }; + + vi.mocked(SigningCoordinator__factory.connect).mockReturnValue( + mockContract as any, + ); + + // Clear cache between tests + SigningCoordinatorAgent.clearCache(); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.restoreAllMocks(); + }); + + it('caches getParticipants for same domain and cohortId', async () => { + await SigningCoordinatorAgent.getParticipants( + mockProvider, + domain, + cohortId, + ); + await SigningCoordinatorAgent.getParticipants( + mockProvider, + domain, + cohortId, + ); + + expect(mockContract.getSigners).toHaveBeenCalledTimes(1); + }); + + it('caches getThreshold for same domain and cohortId', async () => { + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + + expect(mockContract.signingCohorts).toHaveBeenCalledTimes(1); + }); + + it('expires cache after 60 seconds', async () => { + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + + vi.advanceTimersByTime(60_001); + + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + + expect(mockContract.signingCohorts).toHaveBeenCalledTimes(2); + }); + + it('does not share cache across different cohortIds', async () => { + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, 1); + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, 2); + + expect(mockContract.signingCohorts).toHaveBeenCalledTimes(2); + }); + + it('does not share cache across different domains', async () => { + await SigningCoordinatorAgent.getThreshold(mockProvider, 'lynx', cohortId); + await SigningCoordinatorAgent.getThreshold( + mockProvider, + 'mainnet', + cohortId, + ); + + expect(mockContract.signingCohorts).toHaveBeenCalledTimes(2); + }); + + it('clearCache forces fresh fetch', async () => { + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + SigningCoordinatorAgent.clearCache(); + await SigningCoordinatorAgent.getThreshold(mockProvider, domain, cohortId); + + expect(mockContract.signingCohorts).toHaveBeenCalledTimes(2); + }); +}); diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 2e68475af..0ab7beda5 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -1,6 +1,6 @@ { "name": "@nucypher/taco-auth", - "version": "0.3.0", + "version": "0.4.0-alpha.12", "keywords": [ "pre", "threshold", diff --git a/packages/taco/examples/conditions.ts b/packages/taco/examples/conditions.ts index 3ac71b0e0..a69c6cc00 100644 --- a/packages/taco/examples/conditions.ts +++ b/packages/taco/examples/conditions.ts @@ -112,7 +112,7 @@ const myContractCallCondition = new conditions.base.contract.ContractCondition({ method: 'myFunctionAbi', // `myMethodAbi.name` parameters: [':userAddress', ':myCustomParam'], // `myMethodAbi.inputs` functionAbi: myFunctionAbi, - contractAddress: '0x0...1', + contractAddress: '0x0000000000000000000000000000000000000001', chain: ChainId.SEPOLIA, returnValueTest: { comparator: '>', @@ -121,6 +121,29 @@ const myContractCallCondition = new conditions.base.contract.ContractCondition({ }); console.assert( - !myContractCallCondition.requiresAuthentication(), - 'ContractCondition does not require a signer', + myContractCallCondition.requiresAuthentication(), + 'ContractCondition requires a signer', +); + +// Address Allowlist Condition Example +const addressAllowlistCondition = + new conditions.predefined.addressAllowlist.AddressAllowlistCondition([ + '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + '0x742d35Cc6634C0532925a3b844Bc454e4438f44e', + '0x0000000000000000000000000000000000000001', + ]); + +console.assert( + addressAllowlistCondition.requiresAuthentication(), + 'AddressAllowlistCondition requires authentication', +); + +// You can check if an address is allowed with the condition's toObj method +const addressToCheck = '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77'; +const addresses = addressAllowlistCondition.toObj().returnValueTest.value; +// This would be checked by taco nodes after validating the wallet signature provided by encryptor (the value of the variable `addressToCheck`). +const isAllowed = addresses.includes(addressToCheck); +console.assert( + isAllowed, + 'Address should be in the addresses list but it is not.', ); diff --git a/packages/taco/examples/ecdsa-condition.ts b/packages/taco/examples/ecdsa-condition.ts new file mode 100644 index 000000000..18a81c0dc --- /dev/null +++ b/packages/taco/examples/ecdsa-condition.ts @@ -0,0 +1,124 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { ECDSACondition } from '../src/conditions/base/ecdsa'; + +// Example verifying keys (public keys) - in production these would come from actual key pairs +const EXAMPLE_VERIFYING_KEY_SECP256K1 = + '0437a1c9c0e8ff7a2e0e0a9b5a8c3d5b7e9f1c3e5a7b9d1f3e5c7a9b1d3f5e7c9a1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a1b3c5d7e9f1a3b5c7d9e1f3a5'; +const EXAMPLE_VERIFYING_KEY_NIST256P = + '0423456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; +const EXAMPLE_VERIFYING_KEY_ED25519 = + '0fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba987654321'; + +// Example 1: ECDSA condition with hardcoded message, dynamic signature +const attestationCondition = new ECDSACondition({ + message: + 'I attest that I am authorized to access this data and agree to use it responsibly', + signature: ':userSignature', // User provides signature at runtime + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'SECP256k1', +}); + +// Example 2: ECDSA condition with context variables +const dynamicECDSACondition = new ECDSACondition({ + message: ':userMessage', + signature: ':userSignature', + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'SECP256k1', +}); + +// Example 3: ECDSA condition with different curve +const p256ECDSACondition = new ECDSACondition({ + message: 'hello world', + signature: ':signature', + verifyingKey: EXAMPLE_VERIFYING_KEY_NIST256P, + curve: 'NIST256p', +}); + +// This ECDSA condition uses the default context variables (:message and :signature) +const defaultECDSACondition = new ECDSACondition({ + message: ':message', // Default context variable + signature: ':signature', // Default context variable + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'SECP256k1', +}); + +// For compound conditions with multiple ECDSA conditions, use custom context parameters +// to avoid variable name conflicts +const compoundECDSACondition = new CompoundCondition({ + operator: 'and', + operands: [ + new ECDSACondition({ + message: ':message1', // Custom context parameter + signature: ':signature1', // Custom context parameter + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'SECP256k1', + }), + new ECDSACondition({ + message: ':message2', // Different context parameter + signature: ':signature2', // Different context parameter + verifyingKey: EXAMPLE_VERIFYING_KEY_NIST256P, + curve: 'NIST256p', + }), + ], +}); + +// Example 5: Complex usage with compound condition +import { TimeCondition } from '../src/conditions/base/time'; +import { CompoundCondition } from '../src/conditions/compound-condition'; + +const timeCondition = new TimeCondition({ + returnValueTest: { + comparator: '>=', + value: 1643723400, + }, + chain: 1, + method: 'blocktime', +}); + +const compoundCondition = CompoundCondition.and([ + attestationCondition, + timeCondition, +]); + +// Example 6: Real-world usage scenario +const authorizationCondition = CompoundCondition.and([ + new TimeCondition({ + returnValueTest: { + comparator: '>=', + value: Math.floor(Date.now() / 1000), // Current timestamp + }, + chain: 1, + method: 'blocktime', + }), + new ECDSACondition({ + message: 'I authorize access to this encrypted data', + signature: ':userSignature', + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'SECP256k1', + }), +]); + +// Example 7: Edwards curve example (Ed25519) +const ed25519Condition = new ECDSACondition({ + message: 'Edwards curve signature verification', + signature: ':ed25519Signature', + verifyingKey: EXAMPLE_VERIFYING_KEY_ED25519, + curve: 'Ed25519', +}); + +// Example 8: Brainpool curve example +const brainpoolCondition = new ECDSACondition({ + message: 'Brainpool P-256 verification', + signature: ':brainpoolSignature', + verifyingKey: EXAMPLE_VERIFYING_KEY_SECP256K1, + curve: 'BRAINPOOLP256r1', +}); + +// Example 9: NIST P-384 curve +const p384Condition = new ECDSACondition({ + message: 'High-security P-384 verification', + signature: ':p384Signature', + verifyingKey: EXAMPLE_VERIFYING_KEY_NIST256P, + curve: 'NIST384p', +}); diff --git a/packages/taco/integration-test/condition-lingo.test.ts b/packages/taco/integration-test/condition-lingo.test.ts new file mode 100644 index 000000000..ee06c6be3 --- /dev/null +++ b/packages/taco/integration-test/condition-lingo.test.ts @@ -0,0 +1,278 @@ +import axios from 'axios'; +import * as https from 'https'; +import { describe, test } from 'vitest'; +import { conditions } from '../src'; +import { + CompoundCondition, + CompoundConditionType, +} from '../src/conditions/compound-condition'; +import { ConditionExpression } from '../src/conditions/condition-expr'; +import { IfThenElseConditionType } from '../src/conditions/if-then-else-condition'; +import { + ECDSAConditionProps, + ECDSAConditionType, + SUPPORTED_ECDSA_CURVES, +} from '../src/conditions/schemas/ecdsa'; +import { SequentialCondition } from '../src/conditions/sequential'; +import { + testContextVariableConditionObj, + testContractConditionObj, + testJsonApiConditionObj, + testJsonConditionObj, + testJsonRpcConditionObj, + testJWTConditionObj, + testRpcConditionObj, + testSigningObjectAbiAttributeConditionObj, + testSigningObjectAttributeConditionObj, + testTimeConditionObj, +} from '../test/test-utils'; + +const LYNX_NODES = [ + 'https://lynx-1.nucypher.network', + 'https://lynx-2.nucypher.network', + 'https://lynx-3.nucypher.network', +]; + +async function validateConditionExpression( + conditionExpr: ConditionExpression, +): Promise { + const lynxNode = LYNX_NODES[Math.floor(Math.random() * LYNX_NODES.length)]; + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }); + + const response = await axios.post( + `${lynxNode}:9151/validate_condition_lingo`, + JSON.stringify(conditionExpr.toJson()), + { + httpsAgent, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + if (response.status !== 200) { + throw new Error( + `Request failed with status ${response.status}: ${JSON.stringify(response.data)}`, + ); + } + return; +} + +// skip integration test if RUNNING_IN_CI is not set (it is set in CI environments) +describe.skipIf(!process.env.RUNNING_IN_CI)( + 'TACo Condition Lingos Integration Test', + () => { + test('validate condition lingo with lynx node to confirm consistency', async () => { + // Note: there are limits to conditions + // - max 5 operands in a compound condition + // - max 20 condition variables in a sequential condition + // - max 4 nested levels of multi-conditions (compound, sequential, if-then-else) + const overallCondition = new SequentialCondition({ + conditionVariables: [ + { + varName: 'compound-1', + condition: { + conditionType: CompoundConditionType, + operator: 'and', + operands: [ + testRpcConditionObj, + testTimeConditionObj, + testContractConditionObj, + testJsonApiConditionObj, + testJsonRpcConditionObj, + ], + }, + }, + { + varName: 'compound-2', + condition: { + conditionType: CompoundConditionType, + operator: 'or', + operands: [ + { + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + }, + { + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + authorizationType: 'Bearer', + }, + { + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + authorizationType: 'X-API-Key', + }, + { + ...testJsonRpcConditionObj, + authorizationToken: ':otherAuthToken', + authorizationType: 'Basic', + }, + testJWTConditionObj, + ], + }, + }, + { + varName: 'ifThenElse', + condition: { + conditionType: IfThenElseConditionType, + ifCondition: testSigningObjectAttributeConditionObj, + thenCondition: testSigningObjectAbiAttributeConditionObj, + elseCondition: false, + }, + }, + ], + }); + const conditionExpr = new ConditionExpression(overallCondition); + await validateConditionExpression(conditionExpr); + }, 20000); + test('validate ecdsa condition lingo and supported curves consistency', async () => { + // Split SUPPORTED_ECDSA_CURVES into chunks of 5 to respect the operand limit + const preGeneratedVerifyingKeys = { + SECP256k1: + '73149ad37ec1f7cde150064b30e4b0b087ef2f8970c05e53e94f1e87c832d76be0bcc14fdbcf3a6c0118d2288ee85613f31df7faddfa83901f5d45e416d84524', + NIST256p: + 'ef48b327951114d2c54428c5b21a71e01f5cc0660c7087c99df7b1617091425fa660e3ead29e87670ea4074dc8ef5aabb5e433285eeff8c4ff83f6159c11028d', + NIST384p: + '64b65f2e8bfd92d8e14f172100f00e31d467f4f178fcd587e44c07a2482ae3d01ea5a7f67b70e2f77412ecc72954b769b80b0286864c124a3ac769d7705080a66e2b2da408b3d2dac06259118b713000d850898fdcceb5cdb736112c3897a07f', + NIST521p: + '01990fbe474c5c757210d3ad93961bb510b330f37fb8e96b5038616d73ffea0d0bb6956be31859e3bf9c4e1b47e160c8f1493f21f76e7b03cdc9f0df835a33261ac5004e2ad7564ccb95f38f7a81d8b4fecb72816d93ca8e52186fc4209049b46c685ed0d4fe8b34ca6276f0a640184046c751fe131d757b1169a88d4f996c9f6f8274fb', + Ed25519: + 'e6a8ea0dd8b6d7f82ba1b24aeca4ee53f69632ed75480a13e823899a9c3e9554', + BRAINPOOLP256r1: + '975fda96fa12226a378f52a423e2d12d4fed717162ec7e5838169ed57e3357f2410dce2ce1b6bce3bb46ee97d90e542d9895c7d5b0224da05209eaaf0e484acd', + }; + + // Value used for chunkSize is to ensure: + // 1. we don't exceed the max 5 operands in a compound condition + // 2. we adhere to the fact that "and" compound conditions must have at least 2 operands + // 3. SUPPORTED_ECDSA_CURVES.length is currently 6, so we can split it into chunks of 3 + const chunkSize = 3; + for (let i = 0; i < SUPPORTED_ECDSA_CURVES.length; i += chunkSize) { + const chunk = SUPPORTED_ECDSA_CURVES.slice(i, i + chunkSize); + const operands: ECDSAConditionProps[] = chunk.map((curve) => ({ + conditionType: ECDSAConditionType, + message: ':message', + signature: ':signature', + verifyingKey: preGeneratedVerifyingKeys[curve], + curve, + })); + const overallCondition = new CompoundCondition({ + operator: 'and', + operands, + }); + const conditionExpr = new ConditionExpression(overallCondition); + await validateConditionExpression(conditionExpr); + } + }, 15000); + + test('validate context variable condition structure', async () => { + const contextVariableCondition = + new conditions.base.contextVariable.ContextVariableCondition( + testContextVariableConditionObj, + ); + const conditionExpr = new ConditionExpression(contextVariableCondition); + await validateConditionExpression(conditionExpr); + }, 15000); + + test('validate json condition structure', async () => { + const jsonCondition = new conditions.base.json.JsonCondition( + testJsonConditionObj, + ); + const conditionExpr = new ConditionExpression(jsonCondition); + await validateConditionExpression(conditionExpr); + }, 15000); + + test('validate conditions with operations', async () => { + const sequentialCondition = new SequentialCondition({ + conditionVariables: [ + { + varName: 'rpcValue', + condition: testRpcConditionObj, + operations: [ + { operation: 'abs' }, + { operation: '+=', value: BigInt('1000000000000000') }, + ], + }, + { + // add some operations + varName: 'timeValue', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>', + value: 100, + operations: [ + { operation: 'abs' }, + { operation: 'index', value: 0 }, + { operation: '+=', value: 5 }, + { operation: '*=', value: ':multiplier' }, // context variable + ], + }, + }, + }, + { + varName: 'contractValue', + condition: testContractConditionObj, + operations: [{ operation: '-=', value: 5.5 }], + }, + ], + }); + const conditionExpr = new ConditionExpression(sequentialCondition); + await validateConditionExpression(conditionExpr); + }, 15000); + + test('validate conditions with JSON, hex, and keccak operations', async () => { + const sequentialCondition = new SequentialCondition({ + conditionVariables: [ + { + varName: 'jsonValue', + condition: { + ...testJsonApiConditionObj, + returnValueTest: { + comparator: '==', + value: + '0x7b226b6579223a2276616c7565222c226e756d626572223a3432ffffffffffffff', + operations: [ + { operation: 'fromJson' }, + { operation: 'toJson' }, + { operation: 'toHex' }, + ], + }, + }, + }, + { + varName: 'hexValue', + condition: { + ...testRpcConditionObj, + returnValueTest: { + comparator: '==', + value: '"test string"', + operations: [{ operation: 'toHex' }, { operation: 'fromHex' }], + }, + }, + }, + { + varName: 'keccakValue', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '==', + value: + '0x9c22ff5f21f0b81b113e633f7db6da94fededef11b2119b40888b89664fb9a3cb658', + operations: [ + { operation: 'str' }, + { operation: 'keccak' }, + { operation: 'toHex' }, + ], + }, + }, + }, + ], + }); + const conditionExpr = new ConditionExpression(sequentialCondition); + await validateConditionExpression(conditionExpr); + }, 15000); + }, +); diff --git a/packages/taco/integration-test/encrypt-decrypt.test.ts b/packages/taco/integration-test/encrypt-decrypt.test.ts index db1482940..f1676dc20 100644 --- a/packages/taco/integration-test/encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/encrypt-decrypt.test.ts @@ -5,6 +5,7 @@ import { EIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; +import { randomBytes } from 'crypto'; import { ethers } from 'ethers'; import { conditions, @@ -14,7 +15,11 @@ import { ThresholdMessageKit, } from '../src'; import { CompoundCondition } from '../src/conditions/compound-condition'; -import { UINT256_MAX } from '../test/test-utils'; +import { + createSignatureForTestSecp256k1ECDSACondition, + createTestSecp256k1ECDSACondition, + UINT256_MAX, +} from '../test/test-utils'; const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; const ENCRYPTOR_PRIVATE_KEY = @@ -25,8 +30,10 @@ const DOMAIN = 'lynx'; const RITUAL_ID = 27; const CHAIN_ID = 80002; +const CONSUMER_ADDRESS = ethers.utils.computeAddress(CONSUMER_PRIVATE_KEY); + describe.skipIf(!process.env.RUNNING_IN_CI)( - 'Taco Encrypt/Decrypt Integration Test', + 'TACo Encrypt/Decrypt Integration Test', () => { let provider: ethers.providers.JsonRpcProvider; let encryptorSigner: ethers.Wallet; @@ -37,10 +44,8 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( encryptorSigner = new ethers.Wallet(ENCRYPTOR_PRIVATE_KEY, provider); consumerSigner = new ethers.Wallet(CONSUMER_PRIVATE_KEY, provider); - // Initialize the library await initialize(); - // Verify network connection const network = await provider.getNetwork(); if (network.chainId !== CHAIN_ID) { throw new Error( @@ -49,12 +54,10 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( } }); - test('should encrypt and decrypt a message with large condition values', async (value) => { - // Create test message + test('should encrypt and decrypt a message with RPC balance condition less than UINT256_MAX', async (value) => { const messageString = 'This is a secret 🤐'; const message = toBytes(messageString); - // Create conditions const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ chain: CHAIN_ID, method: 'eth_getBalance', @@ -65,6 +68,23 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( }, }); + const forcedZeroBalanceDueToOperations = + new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '==', + value: 0, + operations: [ + { operation: '*=', value: 0 }, + // no-op additional operations + { operation: 'abs' }, + { operation: 'int' }, + ], + }, + }); + const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition( { chain: CHAIN_ID, @@ -72,7 +92,6 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( parameters: [':userAddress', 'latest'], returnValueTest: { comparator: '<', - // max uint256 value: UINT256_MAX, }, }, @@ -81,9 +100,9 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const compoundCondition = CompoundCondition.and([ hasPositiveBalance, balanceLessThanMaxUintBigInt, + forcedZeroBalanceDueToOperations, ]); - // Encrypt message const messageKit = await encrypt( provider, DOMAIN, @@ -95,28 +114,22 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const encryptedBytes = messageKit.toBytes(); - // Prepare for decryption const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); const conditionContext = conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - // Add auth provider for condition if ( conditionContext.requestedContextParameters.has( USER_ADDRESS_PARAM_DEFAULT, ) ) { - const authProvider = new EIP4361AuthProvider(provider, consumerSigner, { - domain: 'localhost', - uri: 'http://localhost:3000', - }); + const authProvider = new EIP4361AuthProvider(provider, consumerSigner); conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, authProvider, ); } - // Decrypt message const decryptedBytes = await decrypt( provider, DOMAIN, @@ -125,8 +138,354 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ); const decryptedMessageString = fromBytes(decryptedBytes); - // Verify decryption expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout + }, 15000); + + test('should encrypt and decrypt according to ECDSA signature condition with predefined verifying key', async () => { + const messageString = + 'This message is protected by ECDSA signature verification 🔐'; + const message = toBytes(messageString); + + const authorizationMessage = 'I authorize access to this encrypted data'; + + // Create a predefined ECDSA condition (simulates server-side condition creation) + const { condition: ecdsaCondition, privateKey } = + createTestSecp256k1ECDSACondition(authorizationMessage); + + expect(ecdsaCondition.requiresAuthentication()).toBe(false); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + ecdsaCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + expect( + conditionContext.requestedContextParameters.has(':signature'), + ).toBeTruthy(); + + // Create signature using the predefined condition's private key + const signatureHex = createSignatureForTestSecp256k1ECDSACondition( + { + condition: ecdsaCondition, + privateKey, + }, + authorizationMessage, + ); + + conditionContext.addCustomContextParameterValues({ + ':signature': signatureHex, + }); + + const decryptedBytes = await decrypt( + provider, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + expect(decryptedMessageString).toEqual(messageString); + }, 20000); + + test('should fail to decrypt with ECDSA condition when signature is invalid', async () => { + const messageString = 'This should fail with wrong signature'; + const message = toBytes(messageString); + + const authorizationMessage = 'I authorize access to this encrypted data'; + + // Create a predefined ECDSA condition (simulates server-side condition creation) + const { condition: ecdsaCondition } = + createTestSecp256k1ECDSACondition(authorizationMessage); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + ecdsaCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add invalid signature + const invalidSignature = randomBytes(64).toString('hex'); + conditionContext.addCustomContextParameterValues({ + ':signature': invalidSignature, + }); + + await expect( + decrypt(provider, DOMAIN, messageKitFromBytes, conditionContext), + ).rejects.toThrow(); + }, 20000); + + test('should encrypt and decrypt with ECDSA condition using context parameters', async () => { + const messageString = + 'This message uses ECDSA signature verification with context parameters 🔐✍️'; + const message = toBytes(messageString); + + // Create a predefined ECDSA condition that uses :message context parameter + const { condition: ecdsaCondition, privateKey } = + createTestSecp256k1ECDSACondition(':message'); + + // ECDSA conditions with :message and :signature don't require auth providers + // like :userAddress does, they just need context parameters to be provided + expect(ecdsaCondition.requiresAuthentication()).toBe(false); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + ecdsaCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + expect( + conditionContext.requestedContextParameters.has(':message'), + ).toBeTruthy(); + expect( + conditionContext.requestedContextParameters.has(':signature'), + ).toBeTruthy(); + + // Define the message to be signed (provided via :message context parameter) + const messageToSign = 'User authentication message'; + + // Sign the message with the predefined condition's private key + const signatureHex = createSignatureForTestSecp256k1ECDSACondition( + { + condition: ecdsaCondition, + privateKey, + }, + messageToSign, + ); + + conditionContext.addCustomContextParameterValues({ + ':message': messageToSign, + ':signature': signatureHex, + }); + + const decryptedBytes = await decrypt( + provider, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + expect(decryptedMessageString).toEqual(messageString); + }, 25000); + + test('should encrypt and decrypt with ContextVariableCondition', async () => { + const messageString = + 'This message is protected by context variable condition 🔐'; + const message = toBytes(messageString); + + // Create a context variable condition that checks if userAddress is in allowlist + + const addressAllowlistCondition = + new conditions.predefined.addressAllowlist.AddressAllowlistCondition([ + CONSUMER_ADDRESS, + '0x742d35Cc6634C0532925a3b844Bc454e4438f44e', // Some other address + '0x0000000000000000000000000000000000000001', // Another address + ]); + + expect(addressAllowlistCondition.requiresAuthentication()).toBe(true); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + addressAllowlistCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + expect( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ), + ).toBeTruthy(); + + // Add auth provider for userAddress context parameter + const authProvider = new EIP4361AuthProvider(provider, consumerSigner); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + + const decryptedBytes = await decrypt( + provider, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + expect(decryptedMessageString).toEqual(messageString); + }, 20000); + + test('should fail to decrypt with ContextVariableCondition when userAddress is not in allowlist', async () => { + const messageString = 'This should fail with wrong address'; + const message = toBytes(messageString); + + // Create a context variable condition with specific allowed addresses + const restrictedAllowlistCondition = + new conditions.predefined.addressAllowlist.AddressAllowlistCondition([ + // consumer address is not in the list + '0x0000000000000000000000000000000000000001', + '0x0000000000000000000000000000000000000002', + ]); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + restrictedAllowlistCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider for userAddress context parameter (but with wrong address) + const authProvider = new EIP4361AuthProvider(provider, consumerSigner); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + + await expect( + decrypt(provider, DOMAIN, messageKitFromBytes, conditionContext), + ).rejects.toThrow(); + }, 20000); + + test('should encrypt and decrypt with JsonCondition using context variable', async () => { + const messageString = 'This message is protected by JsonCondition 🔐'; + const message = toBytes(messageString); + + // JSON data that will be provided at decryption time + const jsonData = { + store: { + book: [ + { price: 10.5, category: 'fiction' }, + { price: 8.99, category: 'non-fiction' }, + ], + }, + }; + + // Create JsonCondition that checks price of first book + const jsonCondition = new conditions.base.json.JsonCondition({ + conditionType: 'json', + data: ':jsonData', + query: '$.store.book[0].price', + returnValueTest: { + comparator: '==', + value: 10.5, + }, + }); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + jsonCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + expect( + conditionContext.requestedContextParameters.has(':jsonData'), + ).toBeTruthy(); + + // Provide the JSON data as a custom context parameter + conditionContext.addCustomContextParameterValues({ + ':jsonData': jsonData, + }); + + const decryptedBytes = await decrypt( + provider, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + expect(decryptedMessageString).toEqual(messageString); + }, 20000); + + test('should fail to decrypt with JsonCondition when JSON data does not match', async () => { + const messageString = 'This should fail with wrong JSON data'; + const message = toBytes(messageString); + + // Create JsonCondition expecting specific price + const jsonCondition = new conditions.base.json.JsonCondition({ + conditionType: 'json', + data: ':productData', + query: '$.price', + returnValueTest: { + comparator: '>', + value: 100, + }, + }); + + const messageKit = await encrypt( + provider, + DOMAIN, + message, + jsonCondition, + RITUAL_ID, + encryptorSigner, + ); + + const encryptedBytes = messageKit.toBytes(); + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Provide JSON data that doesn't meet the condition (price <= 100) + conditionContext.addCustomContextParameterValues({ + ':productData': { price: 50 }, + }); + + await expect( + decrypt(provider, DOMAIN, messageKitFromBytes, conditionContext), + ).rejects.toThrow(); + }, 20000); }, ); diff --git a/packages/taco/integration-test/sign.test.ts b/packages/taco/integration-test/sign.test.ts new file mode 100644 index 000000000..9ce8dc548 --- /dev/null +++ b/packages/taco/integration-test/sign.test.ts @@ -0,0 +1,151 @@ +import { + Domain, + fromHexString, + getPorterUris, + SigningCoordinatorAgent, + UserOperationToSign, +} from '@nucypher/shared'; +import { ethers } from 'ethers'; +import { beforeAll, describe, expect, test } from 'vitest'; + +import { initialize } from '../src'; +import { context } from '../src/conditions'; +import { ConditionExpression } from '../src/conditions/condition-expr'; +import { signUserOp } from '../src/sign'; +import { CoreConditions } from '../src/types'; + +const RPC_PROVIDER_URL = 'https://ethereum-sepolia-rpc.publicnode.com'; +const DUMMY_ADDRESS = '0x742D35Cc6634C0532925A3b8D33c9c0E7B66C8E8'; +const DOMAIN = 'lynx'; +const COHORT_ID = 1; +const CHAIN_ID = 11155111; + +// skip integration test if RUNNING_IN_CI is not set (it is set in CI environments) +describe.skipIf(!process.env.RUNNING_IN_CI)( + 'TACo Sign Integration Test', + () => { + let provider: ethers.providers.JsonRpcProvider; + + beforeAll(async () => { + provider = new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL); + + // Initialize the library + await initialize(); + + // Verify network connection + const network = await provider.getNetwork(); + if (network.chainId !== CHAIN_ID) { + throw new Error( + `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${network.chainId}`, + ); + } + }); + + test('should sign a user operation', async () => { + // Create a sample user operation with all required fields + const userOp: UserOperationToSign = { + sender: DUMMY_ADDRESS, + nonce: 0, + callData: '0x', + callGasLimit: 0, + verificationGasLimit: 0, + preVerificationGas: 0, + maxFeePerGas: 0, + maxPriorityFeePerGas: 0, + signature: '0x', + }; + + // Get porter URIs + const porterUris = await getPorterUris(DOMAIN as Domain); + + // Get context + const signingContext = await context.ConditionContext.forSigningCohort( + provider, + DOMAIN as Domain, + COHORT_ID, + CHAIN_ID, + ); + + // Sign user operation + const signResult = await signUserOp( + provider, + DOMAIN as Domain, + COHORT_ID, + CHAIN_ID, + userOp, + '0.8.0', + signingContext, + porterUris, + ); + + const threshold = await SigningCoordinatorAgent.getThreshold( + provider, + DOMAIN as Domain, + COHORT_ID, + ); + + // Verify sign result + expect(signResult).toBeDefined(); + expect(signResult.messageHash).toBeDefined(); + expect(signResult.aggregatedSignature).toBeDefined(); + expect(fromHexString(signResult.aggregatedSignature!).length).toEqual( + threshold * 65, // Each signature is 65 bytes (32 bytes r, 32 bytes s, 1 byte v) + ); + expect(signResult.signingResults).toBeDefined(); + expect(Object.keys(signResult.signingResults).length).toBeGreaterThan(0); + }, 15000); + + test('should validate condition serialization round-trip with existing cohort conditions', async () => { + // This integration test validates condition serialization/deserialization without writing to blockchain: + // 1. Read existing conditions from a known cohort on the chain + // 2. Convert those bytes to ConditionExpression object + // 3. Convert the object back to bytes (what would be written to chain) + // 4. Verify the bytes match exactly + + // Read conditions from the existing ritual/cohort + const retrievedConditionHex = + await SigningCoordinatorAgent.getSigningCohortConditions( + provider, + DOMAIN as Domain, + COHORT_ID, + CHAIN_ID, + ); + + // Verify that conditions are set for this cohort/chain combination + expect(retrievedConditionHex).toBeDefined(); + expect(retrievedConditionHex).not.toBe('0x'); + expect(retrievedConditionHex.length).toBeGreaterThan(2); + + // Convert hex back to JSON string (simulating what the chain stores) + const chainConditionJson = ethers.utils.toUtf8String( + retrievedConditionHex, + ); + + // Parse the JSON and recreate the ConditionExpression from the chain data + // This simulates reading conditions from chain and converting to our object model + const coreConditions = new CoreConditions(chainConditionJson); + const retrievedConditions = + ConditionExpression.fromCoreConditions(coreConditions); + + // Verify we can create a ConditionContext from it (this validates the data is readable) + await expect( + context.ConditionContext.forSigningCohort( + provider, + DOMAIN as Domain, + COHORT_ID, + CHAIN_ID, + ), + ).resolves.not.toThrow(); + + // Convert back to JSON (this is what would be written to chain) + const roundTripJson = retrievedConditions.toJson(); + + // The core verification: ensure serialization round-trip is identical + // This proves that read → object → write produces identical bytes + expect(JSON.parse(roundTripJson)).toEqual(JSON.parse(chainConditionJson)); + + // Additional verification: ensure the objects have expected properties + expect(retrievedConditions.condition).toBeDefined(); + }, 6000); // Shorter timeout since no blockchain writes + }, +); diff --git a/packages/taco/package.json b/packages/taco/package.json index 1a3a675e5..f2e4e9fab 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -1,6 +1,6 @@ { "name": "@nucypher/taco", - "version": "0.6.0", + "version": "0.7.0-alpha.12", "keywords": [ "taco", "threshold", @@ -42,7 +42,7 @@ }, "dependencies": { "@astronautlabs/jsonpath": "^1.1.2", - "@nucypher/nucypher-core": "^0.14.5", + "@nucypher/nucypher-core": "^0.16.0", "@nucypher/shared": "workspace:*", "@nucypher/taco-auth": "workspace:*", "ethers": "^5.8.0", @@ -52,9 +52,11 @@ "devDependencies": { "@nucypher/test-utils": "workspace:*", "@types/semver": "^7.7.0", - "dotenv": "^16.4.7", - "glob": "^11.0.1", - "modified-zod2md": "0.1.5-modified.4" + "axios": "^1.8.4", + "dotenv": "^16.5.0", + "glob": "^11.1.0", + "modified-zod2md": "0.1.5-modified.4", + "zod-to-json-schema": "^3.24.5" }, "engines": { "node": ">=18", diff --git a/packages/taco/schema-docs/condition-schema.json b/packages/taco/schema-docs/condition-schema.json new file mode 100644 index 000000000..c4699b63d --- /dev/null +++ b/packages/taco/schema-docs/condition-schema.json @@ -0,0 +1,1087 @@ +{ + "$ref": "#/definitions/ConditionExpression", + "definitions": { + "ConditionExpression": { + "type": "object", + "properties": { + "version": { + "type": "string", + "const": "1.0.0" + }, + "condition": { + "anyOf": [ + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "rpc", + "default": "rpc" + }, + "chain": { + "type": "integer", + "minimum": 0 + }, + "method": { + "type": "string", + "enum": [ + "eth_getBalance" + ], + "description": "Only 'eth_getBalance' method is supported" + }, + "parameters": { + "anyOf": [ + { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "const": ":userAddress", + "description": "This is a context variable that will be replaced at decryption time. It represents the Ethereum address of the requester attempting decryption." + }, + { + "type": "string", + "pattern": "^:[a-zA-Z_][a-zA-Z0-9_]*$", + "description": "A Context Parameter i.e. a placeholder used within conditions and specified at the encryption time, whose value is provided at decryption time." + } + ] + }, + { + "anyOf": [ + { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{64}$" + }, + { + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ] + } + ] + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + } + ], + "description": "A block identifier or a context variable that will be replaced with a block identifier at execution time." + } + ], + "description": "Spec requires 2 parameters - an address and a block identifier" + }, + { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": [ + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0" + } + ], + "description": "Block identifier, which defaults to 'latest' if not specified" + } + ] + }, + "returnValueTest": { + "type": "object", + "properties": { + "index": { + "type": "integer", + "minimum": 0 + }, + "comparator": { + "type": "string", + "enum": [ + "==", + ">", + "<", + ">=", + "<=", + "!=", + "in", + "!in" + ] + }, + "operations": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "operation": { + "type": "string", + "enum": [ + "+=", + "-=", + "*=", + "/=", + "%=", + "toTokenBaseUnits", + "index", + "round", + "abs", + "avg", + "ceil", + "ethToWei", + "floor", + "len", + "max", + "min", + "sum", + "weiToEth", + "bool", + "float", + "int", + "str", + "fromJson", + "toJson", + "fromHex", + "toHex", + "keccak" + ] + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string", + "description": "Any string that is not a Context Parameter i.e. does not start with `:`." + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "integer", + "format": "int64" + } + ] + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations/items/anyOf/0/properties/value" + } + } + ] + } + }, + "required": [ + "operation" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "operation": { + "type": "string", + "const": "create2" + }, + "value": { + "type": "object", + "properties": { + "deployerAddress": { + "anyOf": [ + { + "type": "string", + "pattern": "^0x[0-9a-fA-F]+$" + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + } + ] + }, + "bytecodeHash": { + "anyOf": [ + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations/items/anyOf/1/properties/value/properties/deployerAddress/anyOf/0" + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + } + ] + } + }, + "required": [ + "deployerAddress", + "bytecodeHash" + ], + "additionalProperties": false, + "description": "Value for create2 operation containing deployerAddress and bytecodeHash for computing CREATE2 addresses locally." + } + }, + "required": [ + "operation", + "value" + ], + "additionalProperties": false + } + ], + "description": "An operation that can be performed on an obtained result." + }, + "minItems": 1, + "maxItems": 5, + "description": "Optional operations to perform on the obtained result before comparison" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations/items/anyOf/0/properties/value/anyOf/0/anyOf/0" + }, + { + "type": "boolean" + }, + { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + { + "type": "integer", + "format": "int64" + } + ], + "description": "Blockchain-compatible parameter values for blockchain RPC API calls and Smart Contracts functions; numbers must be in safe range and bigints must be in the range [-2^255, 2^256-1])." + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/value" + } + } + ] + } + }, + "required": [ + "comparator", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "chain", + "method", + "parameters", + "returnValueTest" + ], + "additionalProperties": false, + "description": "RPC Condition for calling [Ethereum JSON RPC APIs](https://ethereum.github.io/execution-apis/api-documentation/)" + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "time", + "default": "time" + }, + "chain": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/chain" + }, + "method": { + "type": "string", + "const": "blocktime", + "default": "blocktime" + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest" + } + }, + "required": [ + "chain", + "returnValueTest" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "context-variable" + }, + "contextVariable": { + "type": "string", + "pattern": "^:[a-zA-Z_][a-zA-Z0-9_]*$", + "description": "The context variable to check (e.g., \":userAddress\", \":customParam\")" + }, + "returnValueTest": { + "type": "object", + "properties": { + "index": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/index" + }, + "comparator": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/comparator" + }, + "operations": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations" + }, + "value": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations/items/anyOf/0/properties/value" + } + }, + "required": [ + "comparator", + "value" + ], + "additionalProperties": false, + "description": "Test to perform on a value. Supports comparison operators like ==, >, <, >=, <=, !=, in, !in" + } + }, + "required": [ + "conditionType", + "contextVariable", + "returnValueTest" + ], + "additionalProperties": false, + "description": "Context Variable Condition for performing comparison operations on context variable values." + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "contract", + "default": "contract" + }, + "chain": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/chain" + }, + "method": { + "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/value" + } + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest" + }, + "contractAddress": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/0" + }, + "standardContractType": { + "type": "string", + "enum": [ + "ERC20", + "ERC721" + ] + }, + "functionAbi": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "const": "function" + }, + "inputs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string", + "address", + "address payable", + "bytes1", + "bytes2", + "bytes3", + "bytes4", + "bytes5", + "bytes6", + "bytes7", + "bytes8", + "bytes9", + "bytes10", + "bytes11", + "bytes12", + "bytes13", + "bytes14", + "bytes15", + "bytes16", + "bytes17", + "bytes18", + "bytes19", + "bytes20", + "bytes21", + "bytes22", + "bytes23", + "bytes24", + "bytes25", + "bytes26", + "bytes27", + "bytes28", + "bytes29", + "bytes30", + "bytes31", + "bytes32", + "bytes", + "uint8", + "uint16", + "uint24", + "uint32", + "uint40", + "uint48", + "uint56", + "uint64", + "uint72", + "uint80", + "uint88", + "uint96", + "uint104", + "uint112", + "uint120", + "uint128", + "uint136", + "uint144", + "uint152", + "uint160", + "uint168", + "uint176", + "uint184", + "uint192", + "uint200", + "uint208", + "uint216", + "uint224", + "uint232", + "uint240", + "uint248", + "uint256", + "int8", + "int16", + "int24", + "int32", + "int40", + "int48", + "int56", + "int64", + "int72", + "int80", + "int88", + "int96", + "int104", + "int112", + "int120", + "int128", + "int136", + "int144", + "int152", + "int160", + "int168", + "int176", + "int184", + "int192", + "int200", + "int208", + "int216", + "int224", + "int232", + "int240", + "int248", + "int256" + ] + }, + "internalType": { + "type": "string", + "enum": [ + "bool", + "string", + "address", + "address payable", + "bytes1", + "bytes2", + "bytes3", + "bytes4", + "bytes5", + "bytes6", + "bytes7", + "bytes8", + "bytes9", + "bytes10", + "bytes11", + "bytes12", + "bytes13", + "bytes14", + "bytes15", + "bytes16", + "bytes17", + "bytes18", + "bytes19", + "bytes20", + "bytes21", + "bytes22", + "bytes23", + "bytes24", + "bytes25", + "bytes26", + "bytes27", + "bytes28", + "bytes29", + "bytes30", + "bytes31", + "bytes32", + "bytes", + "uint8", + "uint16", + "uint24", + "uint32", + "uint40", + "uint48", + "uint56", + "uint64", + "uint72", + "uint80", + "uint88", + "uint96", + "uint104", + "uint112", + "uint120", + "uint128", + "uint136", + "uint144", + "uint152", + "uint160", + "uint168", + "uint176", + "uint184", + "uint192", + "uint200", + "uint208", + "uint216", + "uint224", + "uint232", + "uint240", + "uint248", + "uint256", + "int8", + "int16", + "int24", + "int32", + "int40", + "int48", + "int56", + "int64", + "int72", + "int80", + "int88", + "int96", + "int104", + "int112", + "int120", + "int128", + "int136", + "int144", + "int152", + "int160", + "int168", + "int176", + "int184", + "int192", + "int200", + "int208", + "int216", + "int224", + "int232", + "int240", + "int248", + "int256" + ] + } + }, + "required": [ + "name", + "type", + "internalType" + ], + "additionalProperties": false + }, + "minItems": 0 + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/3/properties/functionAbi/properties/inputs/items" + }, + "minItems": 1 + }, + "stateMutability": { + "type": "string", + "enum": [ + "view", + "pure" + ] + } + }, + "required": [ + "name", + "type", + "inputs", + "outputs", + "stateMutability" + ], + "additionalProperties": false + } + }, + "required": [ + "chain", + "method", + "parameters", + "returnValueTest", + "contractAddress" + ], + "additionalProperties": false, + "description": "RPC Condition for calling [Ethereum JSON RPC APIs](https://ethereum.github.io/execution-apis/api-documentation/)" + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "ecdsa", + "default": "ecdsa" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + } + ], + "default": ":message" + }, + "signature": { + "anyOf": [ + { + "type": "string", + "pattern": "^[0-9a-fA-F]+$", + "description": "A string containing only hexadecimal characters (0-9, a-f, A-F)" + }, + { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2" + } + ], + "default": ":signature" + }, + "verifyingKey": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/4/properties/signature/anyOf/0" + }, + "curve": { + "type": "string", + "enum": [ + "SECP256k1", + "NIST256p", + "NIST384p", + "NIST521p", + "Ed25519", + "BRAINPOOLP256r1" + ] + } + }, + "required": [ + "verifyingKey", + "curve" + ], + "additionalProperties": false, + "description": "ECDSA Condition for verifying the authenticity of a message using ECDSA signatures." + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "json", + "default": "json" + }, + "data": { + "type": "string", + "pattern": "^:[a-zA-Z_][a-zA-Z0-9_]*$", + "description": "Context variable that resolves to JSON data at decryption time." + }, + "query": { + "type": "string", + "description": "Optional JSONPath query to extract a specific value from the data." + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/2/properties/returnValueTest" + } + }, + "required": [ + "data", + "returnValueTest" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "json-api", + "default": "json-api" + }, + "endpoint": { + "type": "string", + "format": "uri" + }, + "parameters": { + "type": "object", + "additionalProperties": {} + }, + "query": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/5/properties/query", + "description": "A string containing either a valid JSON Path Expression, or a Context Parameter." + }, + "authorizationToken": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2", + "description": "A Context Parameter i.e. a placeholder used within conditions and specified at the encryption time, whose value is provided at decryption time." + }, + "authorizationType": { + "type": "string", + "enum": [ + "Bearer", + "Basic", + "X-API-Key" + ], + "description": "The type of authorization to use when making the request." + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/2/properties/returnValueTest" + } + }, + "required": [ + "endpoint", + "returnValueTest" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "json-rpc", + "default": "json-rpc" + }, + "endpoint": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/6/properties/endpoint" + }, + "method": { + "type": "string" + }, + "params": { + "anyOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": {} + } + ] + }, + "query": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/5/properties/query", + "description": "A string containing either a valid JSON Path Expression, or a Context Parameter." + }, + "authorizationToken": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2", + "description": "A Context Parameter i.e. a placeholder used within conditions and specified at the encryption time, whose value is provided at decryption time." + }, + "authorizationType": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/6/properties/authorizationType", + "description": "The type of authorization to use when making the request." + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/2/properties/returnValueTest" + } + }, + "required": [ + "endpoint", + "method", + "returnValueTest" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "jwt", + "default": "jwt" + }, + "publicKey": { + "type": "string" + }, + "expectedIssuer": { + "type": "string" + }, + "jwtToken": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/parameters/anyOf/0/items/0/anyOf/2", + "default": ":jwtToken", + "description": "A Context Parameter i.e. a placeholder used within conditions and specified at the encryption time, whose value is provided at decryption time." + } + }, + "required": [ + "publicKey" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "signing-attribute", + "default": "signing-attribute" + }, + "signingObjectContextVar": { + "type": "string", + "const": ":signingConditionObject", + "default": ":signingConditionObject", + "description": "The context variable that will be replaced with the signing object at signing" + }, + "attributeName": { + "type": "string", + "minLength": 1, + "description": "The name of the attribute to check" + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest" + } + }, + "required": [ + "attributeName", + "returnValueTest" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "signing-abi-attribute", + "default": "signing-abi-attribute" + }, + "signingObjectContextVar": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/9/properties/signingObjectContextVar" + }, + "attributeName": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/9/properties/attributeName" + }, + "abiValidation": { + "type": "object", + "properties": { + "allowedAbiCalls": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "parameterIndex": { + "type": "integer", + "minimum": 0, + "description": "Index of parameter to check within abi calldata." + }, + "subIndices": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + }, + "description": "Sequential indices for navigating nested structures (arrays and tuples). The ABI type determines interpretation at each step: array types consume an index and access that element, tuple types consume an index and access that field." + }, + "returnValueTest": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest", + "description": "Comparison check for value within calldata" + }, + "nestedAbiValidation": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/10/properties/abiValidation", + "description": "Additional checks for nested abi calldata" + } + }, + "required": [ + "parameterIndex" + ], + "additionalProperties": false + } + } + } + }, + "required": [ + "allowedAbiCalls" + ], + "additionalProperties": false, + "description": "A map of allowed ABI calls with their respective parameter validations." + } + }, + "required": [ + "attributeName", + "abiValidation" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "compound", + "default": "compound" + }, + "operator": { + "type": "string", + "enum": [ + "and", + "or", + "not" + ] + }, + "operands": { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionExpression/properties/condition" + }, + "minItems": 1, + "maxItems": 5 + } + }, + "required": [ + "operator", + "operands" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "sequential", + "default": "sequential" + }, + "conditionVariables": { + "type": "array", + "items": { + "type": "object", + "properties": { + "varName": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations/items/anyOf/0/properties/value/anyOf/0/anyOf/0" + }, + "condition": { + "$ref": "#/definitions/ConditionExpression/properties/condition" + }, + "operations": { + "$ref": "#/definitions/ConditionExpression/properties/condition/anyOf/0/properties/returnValueTest/properties/operations", + "description": "Optional operations to perform on the obtained condition result before storing it" + } + }, + "required": [ + "varName", + "condition" + ], + "additionalProperties": false, + "description": "Executes a condition and stores the result as a variable within a sequential condition." + }, + "minItems": 2, + "maxItems": 20 + } + }, + "required": [ + "conditionVariables" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "conditionType": { + "type": "string", + "const": "if-then-else", + "default": "if-then-else" + }, + "ifCondition": { + "$ref": "#/definitions/ConditionExpression/properties/condition" + }, + "thenCondition": { + "$ref": "#/definitions/ConditionExpression/properties/condition" + }, + "elseCondition": { + "anyOf": [ + { + "$ref": "#/definitions/ConditionExpression/properties/condition" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "ifCondition", + "thenCondition", + "elseCondition" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "version", + "condition" + ], + "additionalProperties": false + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" +} diff --git a/packages/taco/schema-docs/condition-schemas.md b/packages/taco/schema-docs/condition-schemas.md index 93b1c76a5..c177db5cd 100644 --- a/packages/taco/schema-docs/condition-schemas.md +++ b/packages/taco/schema-docs/condition-schemas.md @@ -6,11 +6,16 @@ _Union of the following possible types:_ - [RpcCondition](#rpccondition) - [TimeCondition](#timecondition) +- [ContextVariableCondition](#contextvariablecondition) - [ContractCondition](#contractcondition) -- [CompoundCondition](#compoundcondition) +- [EcdsaCondition](#ecdsacondition) +- [JsonCondition](#jsoncondition) - [JsonApiCondition](#jsonapicondition) - [JsonRpcCondition](#jsonrpccondition) - [JwtCondition](#jwtcondition) +- [SigningObjectAttributeCondition](#signingobjectattributecondition) +- [SigningObjectAbiAttributeCondition](#signingobjectabiattributecondition) +- [CompoundCondition](#compoundcondition) - [SequentialCondition](#sequentialcondition) - [IfThenElseCondition](#ifthenelsecondition) @@ -24,16 +29,32 @@ _Literal `':userAddress'` value._ _Object containing the following properties:_ -| Property | Type | -| :----------------------- | :------- | -| **`conditionType`** (\*) | `string` | +| Property | Description | Type | +| :----------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------- | +| **`conditionType`** (\*) | A unique identifier that indicates the condition variant in its serialized form. It is set automatically at every sub-class constructor when a new object is being created. | `string` | _(\*) Required._ +## HexString + +A string containing only hexadecimal characters (0-9, a-f, A-F) + +_String which matches the regular expression `/^[0-9a-fA-F]+$/`._ + ## HttpsURL _String which is a valid URL._ +## JsonAuthorizationType + +The type of authorization to use when making the request. + +_Enum string, one of the following possible values:_ + +- `'Bearer'` +- `'Basic'` +- `'X-API-Key'` + ## JsonPath A string containing either a valid JSON Path Expression, or a Context Parameter. @@ -80,6 +101,20 @@ _Object containing the following properties:_ _(\*) Required._ +## ContextVariableCondition + +Context Variable Condition for performing comparison operations on context variable values. + +_Object containing the following properties:_ + +| Property | Description | Type | +| :------------------------- | :------------------------------------------------------------------------------------------- | :------------------------------------------------ | +| **`conditionType`** (\*) | | `'context-variable'` | +| **`contextVariable`** (\*) | The context variable to check (e.g., ":userAddress", ":customParam") | `string` (_regex: `/^:[a-zA-Z_][a-zA-Z0-9_]*$/`_) | +| **`returnValueTest`** (\*) | Test to perform on a value. Supports comparison operators like ==, >, <, >=, <=, !=, in, !in | [ReturnValueTest](#returnvaluetest) | + +_(\*) Required._ + ## ContractCondition _Object containing the following properties:_ @@ -123,6 +158,22 @@ _Object containing the following properties:_ _(\*) Required._ +## EcdsaCondition + +ECDSA Condition for verifying the authenticity of a message using ECDSA signatures. + +_Object containing the following properties:_ + +| Property | Type | Default | +| :---------------------- | :---------------------------------------------------------------------------------------- | :------------- | +| `conditionType` | `'ecdsa'` | `'ecdsa'` | +| `message` | `string` _or_ [ContextParam](#contextparam) | `':message'` | +| `signature` | [HexString](#hexstring) _or_ [ContextParam](#contextparam) | `':signature'` | +| **`verifyingKey`** (\*) | [HexString](#hexstring) | | +| **`curve`** (\*) | `'SECP256k1' \| 'NIST256p' \| 'NIST384p' \| 'NIST521p' \| 'Ed25519' \| 'BRAINPOOLP256r1'` | | + +_(\*) Required._ + ## IfThenElseCondition _Object containing the following properties:_ @@ -136,6 +187,19 @@ _Object containing the following properties:_ _(\*) Required._ +## JsonCondition + +_Object containing the following properties:_ + +| Property | Description | Type | Default | +| :------------------------- | :------------------------------------------------------------------------------------------- | :------------------------------------------------ | :------- | +| `conditionType` | | `'json'` | `'json'` | +| **`data`** (\*) | Context variable that resolves to JSON data at decryption time. | `string` (_regex: `/^:[a-zA-Z_][a-zA-Z0-9_]*$/`_) | | +| `query` | Optional JSONPath query to extract a specific value from the data. | [JsonPath](#jsonpath) | | +| **`returnValueTest`** (\*) | Test to perform on a value. Supports comparison operators like ==, >, <, >=, <=, !=, in, !in | [ReturnValueTest](#returnvaluetest) | | + +_(\*) Required._ + ## JsonApiCondition _Object containing the following properties:_ @@ -147,6 +211,7 @@ _Object containing the following properties:_ | `parameters` | _Object with dynamic keys of type_ `string` _and values of type_ `unknown` (_optional & nullable_) | | | `query` | [JsonPath](#jsonpath) | | | `authorizationToken` | [ContextParam](#contextparam) | | +| `authorizationType` | [JsonAuthorizationType](#jsonauthorizationtype) | | | **`returnValueTest`** (\*) | [ReturnValueTest](#returnvaluetest) | | _(\*) Required._ @@ -163,6 +228,7 @@ _Object containing the following properties:_ | `params` | `Array` _or_ _Object with dynamic keys of type_ `string` _and values of type_ `unknown` (_optional & nullable_) | | | `query` | [JsonPath](#jsonpath) | | | `authorizationToken` | [ContextParam](#contextparam) | | +| `authorizationType` | [JsonAuthorizationType](#jsonauthorizationtype) | | | **`returnValueTest`** (\*) | [ReturnValueTest](#returnvaluetest) | | _(\*) Required._ @@ -184,23 +250,27 @@ _(\*) Required._ _Object containing the following properties:_ -| Property | Type | -| :-------------------- | :-------------------------------------------------------------- | -| `index` | `number` (_int, ≥0_) | -| **`comparator`** (\*) | `'==' \| '>' \| '<' \| '>=' \| '<=' \| '!='` | -| **`value`** (\*) | [BlockchainParamOrContextParam](#blockchainparamorcontextparam) | +| Property | Description | Type | +| :-------------------- | :---------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | +| `index` | | `number` (_int, ≥0_) | +| **`comparator`** (\*) | | `'==' \| '>' \| '<' \| '>=' \| '<=' \| '!=' \| 'in' \| '!in'` | +| `operations` | Optional operations to perform on the obtained result before comparison | _Array of at least 1 and at most 5 [VariableOperation](#variableoperation) items_ | +| **`value`** (\*) | | [BlockchainParamOrContextParam](#blockchainparamorcontextparam) | _(\*) Required._ ## ReturnValueTest +Test to perform on a value. Supports comparison operators like ==, >, <, >=, <=, !=, in, !in + _Object containing the following properties:_ -| Property | Type | -| :-------------------- | :------------------------------------------- | -| `index` | `number` (_int, ≥0_) | -| **`comparator`** (\*) | `'==' \| '>' \| '<' \| '>=' \| '<=' \| '!='` | -| **`value`** (\*) | [ParamOrContextParam](#paramorcontextparam) | +| Property | Description | Type | +| :-------------------- | :---------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | +| `index` | | `number` (_int, ≥0_) | +| **`comparator`** (\*) | | `'==' \| '>' \| '<' \| '>=' \| '<=' \| '!=' \| 'in' \| '!in'` | +| `operations` | Optional operations to perform on the obtained result before comparison | _Array of at least 1 and at most 5 [VariableOperation](#variableoperation) items_ | +| **`value`** (\*) | | [ParamOrContextParam](#paramorcontextparam) | _(\*) Required._ @@ -224,10 +294,11 @@ _(\*) Required._ _Object containing the following properties:_ -| Property | Type | -| :------------------- | :---------------------------- | -| **`varName`** (\*) | [PlainString](#plainstring) | -| **`condition`** (\*) | [AnyCondition](#anycondition) | +| Property | Description | Type | +| :------------------- | :-------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | +| **`varName`** (\*) | Any string that is not a Context Parameter i.e. does not start with `:`. | [PlainString](#plainstring) | +| **`condition`** (\*) | | [AnyCondition](#anycondition) | +| `operations` | Optional operations to perform on the obtained condition result before storing it | _Array of at least 1 and at most 5 [VariableOperation](#variableoperation) items_ | _(\*) Required._ @@ -235,10 +306,61 @@ _(\*) Required._ _Object containing the following properties:_ -| Property | Type | Default | -| :---------------------------- | :---------------------------------------------------------------------------------- | :------------- | -| `conditionType` | `'sequential'` | `'sequential'` | -| **`conditionVariables`** (\*) | _Array of at least 2 and at most 5 [ConditionVariable](#conditionvariable) items_ | | +| Property | Type | Default | +| :---------------------------- | :----------------------------------------------------------------------------------- | :------------- | +| `conditionType` | `'sequential'` | `'sequential'` | +| **`conditionVariables`** (\*) | _Array of at least 2 and at most 20 [ConditionVariable](#conditionvariable) items_ | | + +_(\*) Required._ + +## AbiCallValidation + +A map of allowed ABI calls with their respective parameter validations. + +_Object containing the following properties:_ + +| Property | Type | +| :------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | +| **`allowedAbiCalls`** (\*) | _Object with dynamic keys of type_ `string` _and values of type_ _Array of [AbiParameterValidation](#abiparametervalidation) items_ | + +_(\*) Required._ + +## AbiParameterValidation + +_Object containing the following properties:_ + +| Property | Description | Type | +| :------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`parameterIndex`** (\*) | Index of parameter to check within abi calldata. | `number` (_int, ≥0_) | +| `subIndices` | Sequential indices for navigating nested structures (arrays and tuples). The ABI type determines interpretation at each step: array types access elements, tuple types access fields by index. | _Array of `number` (_int, ≥0_) items_ | +| `returnValueTest` | Comparison check for value within calldata | [BlockchainReturnValueTest](#blockchainreturnvaluetest) | +| `nestedAbiValidation` | Additional checks for nested abi calldata | _Object with properties:_
  • `allowedAbiCalls`: _Object with dynamic keys of type_ `string` _and values of type_ _Array of [AbiParameterValidation](#abiparametervalidation) items_
| + +_(\*) Required._ + +## SigningObjectAbiAttributeCondition + +_Object containing the following properties:_ + +| Property | Description | Type | Default | +| :------------------------ | :---------------------------------------------------------------------------- | :-------------------------------------- | :-------------------------- | +| `conditionType` | | `'signing-abi-attribute'` | `'signing-abi-attribute'` | +| `signingObjectContextVar` | The context variable that will be replaced with the signing object at signing | `':signingConditionObject'` | `':signingConditionObject'` | +| **`attributeName`** (\*) | The name of the attribute to check | `string` (_min length: 1_) | | +| **`abiValidation`** (\*) | A map of allowed ABI calls with their respective parameter validations. | [AbiCallValidation](#abicallvalidation) | | + +_(\*) Required._ + +## SigningObjectAttributeCondition + +_Object containing the following properties:_ + +| Property | Description | Type | Default | +| :------------------------- | :---------------------------------------------------------------------------- | :------------------------------------------------------ | :-------------------------- | +| `conditionType` | | `'signing-attribute'` | `'signing-attribute'` | +| `signingObjectContextVar` | The context variable that will be replaced with the signing object at signing | `':signingConditionObject'` | `':signingConditionObject'` | +| **`attributeName`** (\*) | The name of the attribute to check | `string` (_min length: 1_) | | +| **`returnValueTest`** (\*) | | [BlockchainReturnValueTest](#blockchainreturnvaluetest) | | _(\*) Required._ @@ -255,6 +377,27 @@ _Object containing the following properties:_ _(\*) Required._ +## VariableOperation + +An operation that can be performed on an obtained result. + +_Union of the following possible types:_ + +- _Object with properties:_
  • `operation`: `'+=' | '-=' | '*=' | '/=' | '%=' | 'toTokenBaseUnits' | 'index' | 'round' | 'abs' | 'avg' | 'ceil' | 'ethToWei' | 'floor' | 'len' | 'max' | 'min' | 'sum' | 'weiToEth' | 'bool' | 'float' | ...`
  • `value`: [ParamOrContextParam](#paramorcontextparam)
+- _Object with properties:_
  • `operation`: `'create2'`
  • `value`: _Object with properties:_
    • `deployerAddress`: `string` (_regex: `/^0x[0-9a-fA-F]+$/`_) _or_ [ContextParam](#contextparam)
    • `bytecodeHash`: `string` (_regex: `/^0x[0-9a-fA-F]+$/`_) _or_ [ContextParam](#contextparam)
    - Value for create2 operation containing deployerAddress and bytecodeHash for computing CREATE2 addresses locally.
+ +## VariableOperationsArray + +Optional operations to perform on the obtained result + +_Array of at least 1 and at most 5 [VariableOperation](#variableoperation) items._ (_optional_) + +## AddressAllowlistCondition + +List of allowed wallet addresses. Addresses should be provided in checksummed form. + +_Array of at least 1 and at most 25 `string` items._ + ## More resources For more information, please refer to the TACo documentation: diff --git a/packages/taco/scripts/schema-docs-generation.ts b/packages/taco/scripts/schema-docs-generation.ts index 55d45aa69..0a4f485e2 100644 --- a/packages/taco/scripts/schema-docs-generation.ts +++ b/packages/taco/scripts/schema-docs-generation.ts @@ -13,6 +13,10 @@ import { mkdir, writeFile } from 'fs/promises'; import { glob } from 'glob'; import * as path from 'path'; +import { z } from 'zod'; +import { zodToJsonSchema } from 'zod-to-json-schema'; + +import { anyConditionSchema } from '../src/conditions/schemas/utils'; // Because of an issue with the bundleRequire that is used within zod2md, the importModules function has been modified to work and the files that calls it needed to be copied. @@ -80,6 +84,7 @@ const schemaSource = './src/conditions/schemas/export-for-zod-doc-gen.ts'; const schemaOutputDirectory = './schema-docs/'; // The directory where Markdown will be saved const schemaOutputFile = 'condition-schemas.md'; // File name where the Markdown will be saved +const jsonSchemaOutputFile = 'condition-schema.json'; // JSON Schema for editor / LLM consumption const appendedText = ` ## More resources @@ -118,4 +123,64 @@ async function generateMdFiles() { ); } -generateMdFiles(); +// Generates a standard JSON Schema document describing the full +// ConditionExpression envelope ({version, condition}). Editors that +// understand $schema (VS Code, JetBrains, etc.) and LLMs both consume +// this format directly, giving inline validation and structured output +// without depending on @nucypher/taco at runtime. +async function generateJsonSchema() { + try { + const conditionExpressionSchema = z.object({ + version: z.literal('1.0.0'), + condition: anyConditionSchema, + }); + + const jsonSchema = zodToJsonSchema(conditionExpressionSchema, { + name: 'ConditionExpression', + $refStrategy: 'root', + }); + + await mkdir(schemaOutputDirectory, { recursive: true }); + // BigInt bounds (e.g. uint256 ranges) are not representable in + // standard JSON Schema, which requires numeric bounds. Walk the + // tree and drop any minimum/maximum whose value is a BigInt — the + // type constraint (`integer`) still applies. + const stripBigIntBounds = (node: unknown): void => { + if (Array.isArray(node)) { + node.forEach(stripBigIntBounds); + return; + } + if (node && typeof node === 'object') { + const obj = node as Record; + for (const key of ['minimum', 'maximum']) { + if (typeof obj[key] === 'bigint') { + delete obj[key]; + } + } + for (const v of Object.values(obj)) { + stripBigIntBounds(v); + } + } + }; + stripBigIntBounds(jsonSchema); + + await writeFile( + schemaOutputDirectory + jsonSchemaOutputFile, + JSON.stringify(jsonSchema, null, 2) + '\n', + ); + + console.info( + 'Condition JSON Schema generated successfully at:', + schemaOutputDirectory + jsonSchemaOutputFile, + ); + } catch (error) { + console.error('Failed to generate JSON Schema:', error); + } +} + +async function main() { + await generateMdFiles(); + await generateJsonSchema(); +} + +main(); diff --git a/packages/taco/src/conditions/base/context-variable.ts b/packages/taco/src/conditions/base/context-variable.ts new file mode 100644 index 000000000..7a52d5290 --- /dev/null +++ b/packages/taco/src/conditions/base/context-variable.ts @@ -0,0 +1,21 @@ +import { Condition } from '../condition'; +import { + ContextVariableConditionProps, + contextVariableConditionSchema, + ContextVariableConditionType, +} from '../schemas/context-variable'; +import { OmitConditionType } from '../shared'; + +export { ContextVariableConditionProps, ContextVariableConditionType }; + +/** + * A condition that performs comparison operations on context variable values. + */ +export class ContextVariableCondition extends Condition { + constructor(value: OmitConditionType) { + super(contextVariableConditionSchema, { + conditionType: ContextVariableConditionType, + ...value, + }); + } +} diff --git a/packages/taco/src/conditions/base/ecdsa.ts b/packages/taco/src/conditions/base/ecdsa.ts new file mode 100644 index 000000000..731ad6491 --- /dev/null +++ b/packages/taco/src/conditions/base/ecdsa.ts @@ -0,0 +1,26 @@ +import { Condition } from '../condition'; +import { + ECDSAConditionProps, + ecdsaConditionSchema, + ECDSAConditionType, +} from '../schemas/ecdsa'; +import { OmitConditionType } from '../shared'; + +export { + ECDSA_MESSAGE_PARAM_DEFAULT, + ECDSA_SIGNATURE_PARAM_DEFAULT, + ECDSAConditionProps, + ecdsaConditionSchema, + ECDSAConditionType, + ECDSACurve, + SUPPORTED_ECDSA_CURVES, +} from '../schemas/ecdsa'; + +export class ECDSACondition extends Condition { + constructor(value: OmitConditionType) { + super(ecdsaConditionSchema, { + conditionType: ECDSAConditionType, + ...value, + }); + } +} diff --git a/packages/taco/src/conditions/base/index.ts b/packages/taco/src/conditions/base/index.ts index 6de843d86..2e9085294 100644 --- a/packages/taco/src/conditions/base/index.ts +++ b/packages/taco/src/conditions/base/index.ts @@ -1,9 +1,13 @@ // Exporting classes here instead of their respective schema files to // avoid circular dependency on Condition class. +export * as contextVariable from './context-variable'; export * as contract from './contract'; +export * as ecdsa from './ecdsa'; +export * as json from './json'; export * as jsonApi from './json-api'; export * as jsonRpc from './json-rpc'; export * as jwt from './jwt'; export * as rpc from './rpc'; +export * as signing from './signing'; export * as time from './time'; diff --git a/packages/taco/src/conditions/base/json.ts b/packages/taco/src/conditions/base/json.ts new file mode 100644 index 000000000..c22d6fe7c --- /dev/null +++ b/packages/taco/src/conditions/base/json.ts @@ -0,0 +1,22 @@ +import { Condition } from '../condition'; +import { + JsonConditionProps, + jsonConditionSchema, + JsonConditionType, +} from '../schemas/json'; +import { OmitConditionType } from '../shared'; + +export { + JsonConditionProps, + jsonConditionSchema, + JsonConditionType, +} from '../schemas/json'; + +export class JsonCondition extends Condition { + constructor(value: OmitConditionType) { + super(jsonConditionSchema, { + conditionType: JsonConditionType, + ...value, + }); + } +} diff --git a/packages/taco/src/conditions/base/signing.ts b/packages/taco/src/conditions/base/signing.ts new file mode 100644 index 000000000..ed4f03a16 --- /dev/null +++ b/packages/taco/src/conditions/base/signing.ts @@ -0,0 +1,44 @@ +import { Condition } from '../condition'; +import { + SigningObjectAbiAttributeConditionProps, + signingObjectAbiAttributeConditionSchema, + SigningObjectAbiAttributeConditionType, + SigningObjectAttributeConditionProps, + signingObjectAttributeConditionSchema, + SigningObjectAttributeConditionType, +} from '../schemas/signing'; +import { OmitConditionType } from '../shared'; + +export { + AbiCallValidationProps, + abiCallValidationSchema, + AbiParameterValidationProps, + abiParameterValidationSchema, + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + SigningObjectAbiAttributeConditionProps, + signingObjectAbiAttributeConditionSchema, + SigningObjectAbiAttributeConditionType, + SigningObjectAttributeConditionProps, + signingObjectAttributeConditionSchema, + SigningObjectAttributeConditionType, +} from '../schemas/signing'; + +export class SigningObjectAttributeCondition extends Condition { + constructor(value: OmitConditionType) { + super(signingObjectAttributeConditionSchema, { + conditionType: SigningObjectAttributeConditionType, + ...value, + }); + } +} + +export class SigningObjectAbiAttributeCondition extends Condition { + constructor( + value: OmitConditionType, + ) { + super(signingObjectAbiAttributeConditionSchema, { + conditionType: SigningObjectAbiAttributeConditionType, + ...value, + }); + } +} diff --git a/packages/taco/src/conditions/condition-factory.ts b/packages/taco/src/conditions/condition-factory.ts index ab84ae909..8c302821b 100644 --- a/packages/taco/src/conditions/condition-factory.ts +++ b/packages/taco/src/conditions/condition-factory.ts @@ -1,8 +1,23 @@ +import { + ContextVariableCondition, + ContextVariableConditionProps, + ContextVariableConditionType, +} from './base/context-variable'; import { ContractCondition, ContractConditionProps, ContractConditionType, } from './base/contract'; +import { + ECDSACondition, + ECDSAConditionProps, + ECDSAConditionType, +} from './base/ecdsa'; +import { + JsonCondition, + JsonConditionProps, + JsonConditionType, +} from './base/json'; import { JsonApiCondition, JsonApiConditionProps, @@ -15,6 +30,14 @@ import { } from './base/json-rpc'; import { JWTCondition, JWTConditionProps, JWTConditionType } from './base/jwt'; import { RpcCondition, RpcConditionProps, RpcConditionType } from './base/rpc'; +import { + SigningObjectAbiAttributeCondition, + SigningObjectAbiAttributeConditionProps, + SigningObjectAbiAttributeConditionType, + SigningObjectAttributeCondition, + SigningObjectAttributeConditionProps, + SigningObjectAttributeConditionType, +} from './base/signing'; import { TimeCondition, TimeConditionProps, @@ -50,12 +73,28 @@ export class ConditionFactory { return new TimeCondition(props as TimeConditionProps); case ContractConditionType: return new ContractCondition(props as ContractConditionProps); + case ECDSAConditionType: + return new ECDSACondition(props as ECDSAConditionProps); + case JsonConditionType: + return new JsonCondition(props as JsonConditionProps); case JsonApiConditionType: return new JsonApiCondition(props as JsonApiConditionProps); case JsonRpcConditionType: return new JsonRpcCondition(props as JsonRpcConditionProps); case JWTConditionType: return new JWTCondition(props as JWTConditionProps); + case SigningObjectAttributeConditionType: + return new SigningObjectAttributeCondition( + props as SigningObjectAttributeConditionProps, + ); + case SigningObjectAbiAttributeConditionType: + return new SigningObjectAbiAttributeCondition( + props as SigningObjectAbiAttributeConditionProps, + ); + case ContextVariableConditionType: + return new ContextVariableCondition( + props as ContextVariableConditionProps, + ); // Logical Conditions case CompoundConditionType: return new CompoundCondition(props as CompoundConditionProps); diff --git a/packages/taco/src/conditions/condition.ts b/packages/taco/src/conditions/condition.ts index 1db41e3b6..487e74665 100644 --- a/packages/taco/src/conditions/condition.ts +++ b/packages/taco/src/conditions/condition.ts @@ -10,7 +10,7 @@ export { baseConditionSchema } from './schemas/common'; type ConditionSchema = z.ZodSchema; export type ConditionProps = z.infer; -const ERR_INVALID_CONDITION = (error: z.ZodError) => +export const ERR_INVALID_CONDITION = (error: z.ZodError) => `Invalid condition: ${JSON.stringify(error.issues)}`; export class Condition { diff --git a/packages/taco/src/conditions/const.ts b/packages/taco/src/conditions/const.ts index 39d053240..bbe28ecf5 100644 --- a/packages/taco/src/conditions/const.ts +++ b/packages/taco/src/conditions/const.ts @@ -12,6 +12,8 @@ export const CONTEXT_PARAM_FULL_MATCH_REGEXP = new RegExp( export const CONTEXT_PARAM_PREFIX = ':'; +export const NULL_ADDRESS_CONTEXT_VAR = ':nullAddress'; + export const USER_ADDRESS_PARAMS = [ // Ordering matters, this should always be last USER_ADDRESS_PARAM_DEFAULT, diff --git a/packages/taco/src/conditions/context/context.ts b/packages/taco/src/conditions/context/context.ts index c22993ac8..1104d488b 100644 --- a/packages/taco/src/conditions/context/context.ts +++ b/packages/taco/src/conditions/context/context.ts @@ -1,4 +1,5 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { Domain, SigningCoordinatorAgent } from '@nucypher/shared'; import { AuthProvider, AuthSignature, @@ -7,6 +8,7 @@ import { SingleSignOnEIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; +import { ethers } from 'ethers'; import { CoreConditions, CoreContext } from '../../types'; import { toJSON } from '../../utils'; @@ -16,8 +18,15 @@ import { CONTEXT_PARAM_FULL_MATCH_REGEXP, CONTEXT_PARAM_PREFIX, CONTEXT_PARAM_REGEXP, + NULL_ADDRESS_CONTEXT_VAR, USER_ADDRESS_PARAMS, } from '../const'; +import { ConditionVariableProps } from '../schemas/sequential'; +import { SIGNING_CONDITION_OBJECT_CONTEXT_VAR } from '../schemas/signing'; +import { + SequentialConditionProps, + SequentialConditionType, +} from '../sequential'; export type CustomContextParam = | string @@ -41,6 +50,8 @@ const ERR_INVALID_AUTH_PROVIDER_TYPE = (param: string, expected: string) => `Invalid AuthProvider type for ${param}; expected ${expected}`; const ERR_AUTH_PROVIDER_NOT_NEEDED_FOR_CONTEXT_PARAM = (param: string) => `AuthProvider not necessary for context parameter: ${param}`; +const ERR_AUTO_INJECTED_CONTEXT_PARAM = (param: string) => + `Context parameter ${param} is automatically injected and cannot be set manually`; type AuthProviderType = | typeof EIP4361AuthProvider @@ -55,7 +66,16 @@ const EXPECTED_AUTH_PROVIDER_TYPES: Record = { ], }; -export const RESERVED_CONTEXT_PARAMS = [USER_ADDRESS_PARAM_DEFAULT]; +export const AUTOMATICALLY_INJECTED_CONTEXT_PARAMS = [ + // These context parameters are automatically injected on the node side. + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + NULL_ADDRESS_CONTEXT_VAR, +]; +export const RESERVED_CONTEXT_PARAMS = [ + USER_ADDRESS_PARAM_DEFAULT, + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + NULL_ADDRESS_CONTEXT_VAR, +]; export class ConditionContext { public requestedContextParameters: Set; @@ -135,6 +155,10 @@ export class ConditionContext { throw new Error(ERR_INVALID_CUSTOM_PARAM(customParam)); } + if (AUTOMATICALLY_INJECTED_CONTEXT_PARAMS.includes(customParam)) { + throw new Error(ERR_AUTO_INJECTED_CONTEXT_PARAM(customParam)); + } + if (RESERVED_CONTEXT_PARAMS.includes(customParam)) { throw new Error(ERR_RESERVED_PARAM(customParam)); } @@ -182,10 +206,30 @@ export class ConditionContext { }); } else if (typeof value === 'object') { // dictionary (Record - complex object eg. Condition, ConditionVariable, ReturnValueTest etc.) + + // Collect internally-defined variable names from sequential conditions + // These are scoped within the condition and should not be required as external context + const internalContextVariablesFromConditionVariables = new Set(); + if ( + 'conditionType' in value && + value.conditionType === SequentialConditionType + ) { + (value as SequentialConditionProps).conditionVariables.forEach( + (variable: ConditionVariableProps) => { + internalContextVariablesFromConditionVariables.add( + `:${variable.varName}`, + ); + }, + ); + } + + // iterate through all entries for (const [, entry] of Object.entries(value)) { const contextVarsForValue = this.findContextParameter(entry); contextVarsForValue.forEach((contextVar) => { - includedContextVars.add(contextVar); + if (!internalContextVariablesFromConditionVariables.has(contextVar)) { + includedContextVars.add(contextVar); + } }); } } @@ -197,11 +241,32 @@ export class ConditionContext { // find all the context variables we need const requestedParameters = new Set(); + // Collect internally-defined variable names from sequential conditions + // These are scoped within the condition and should not be required as external context + const internalContextVariablesFromConditionVariables = new Set(); + if ( + 'conditionType' in condition && + condition.conditionType === SequentialConditionType + ) { + (condition as SequentialConditionProps).conditionVariables.forEach( + (variable: ConditionVariableProps) => { + internalContextVariablesFromConditionVariables.add( + `:${variable.varName}`, + ); + }, + ); + } + // iterate through all properties in ConditionProps const properties = Object.keys(condition) as (keyof typeof condition)[]; properties.forEach((prop) => { this.findContextParameter(condition[prop]).forEach((contextVar) => { - requestedParameters.add(contextVar); + if ( + !AUTOMATICALLY_INJECTED_CONTEXT_PARAMS.includes(contextVar) && + !internalContextVariablesFromConditionVariables.has(contextVar) + ) { + requestedParameters.add(contextVar); + } }); }); @@ -261,4 +326,28 @@ export class ConditionContext { ); return new ConditionContext(conditionExpr.condition); } + + public static async forSigningCohort( + provider: ethers.providers.JsonRpcProvider, + domain: Domain, + cohortId: number, + chainId: number, + ): Promise { + // get signing condition from SigningCoordinator contract + const cohortConditionHex = + await SigningCoordinatorAgent.getSigningCohortConditions( + provider, + domain, + cohortId, + chainId, + ); + + // Convert hex string to UTF-8 JSON string + const cohortConditionJson = ethers.utils.toUtf8String(cohortConditionHex); + + const cohortCondition = new CoreConditions(cohortConditionJson); + const conditionExpr = + ConditionExpression.fromCoreConditions(cohortCondition); + return new ConditionContext(conditionExpr.condition); + } } diff --git a/packages/taco/src/conditions/predefined/address-allowlist.ts b/packages/taco/src/conditions/predefined/address-allowlist.ts new file mode 100644 index 000000000..d596090ca --- /dev/null +++ b/packages/taco/src/conditions/predefined/address-allowlist.ts @@ -0,0 +1,42 @@ +import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; + +import { + ContextVariableCondition, + ContextVariableConditionProps, + ContextVariableConditionType, +} from '../base/context-variable'; +import { ERR_INVALID_CONDITION } from '../condition'; +import { + AddressAllowlistConditionProps, + addressAllowlistConditionSchema, +} from '../schemas/address-allowlist'; + +export { AddressAllowlistConditionProps } from '../schemas/address-allowlist'; + +/** + * A Client-side condition that checks if a user's address is in an allowlist and transforms the object into `ContextVariableCondition`. + * The nodes process this as a standard context variable that checks if the user's address is in the allowlist. + * @remark This condition doesn’t have a unique type of its own; it is simply a wrapper for creating a `ContextVariableCondition`. + */ +export class AddressAllowlistCondition extends ContextVariableCondition { + constructor(value: AddressAllowlistConditionProps) { + const { data, error } = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + value, + ); + if (error) { + throw new Error(ERR_INVALID_CONDITION(error)); + } + + const contextVariableConditionProps: ContextVariableConditionProps = { + conditionType: ContextVariableConditionType, + contextVariable: USER_ADDRESS_PARAM_DEFAULT, + returnValueTest: { + comparator: 'in', + value: data, + }, + }; + + super(contextVariableConditionProps); + } +} diff --git a/packages/taco/src/conditions/predefined/index.ts b/packages/taco/src/conditions/predefined/index.ts index 7d29ceb02..cf099e6a2 100644 --- a/packages/taco/src/conditions/predefined/index.ts +++ b/packages/taco/src/conditions/predefined/index.ts @@ -1,2 +1,3 @@ +export * as addressAllowlist from './address-allowlist'; export * as erc20 from './erc20'; export * as erc721 from './erc721'; diff --git a/packages/taco/src/conditions/schemas/address-allowlist.ts b/packages/taco/src/conditions/schemas/address-allowlist.ts new file mode 100644 index 000000000..074515978 --- /dev/null +++ b/packages/taco/src/conditions/schemas/address-allowlist.ts @@ -0,0 +1,14 @@ +import { EthAddressSchemaStrict } from '@nucypher/shared'; +import { z } from 'zod'; + +export const addressAllowlistConditionSchema = z + .array(EthAddressSchemaStrict) + .min(1, 'At least one address must be provided') + .max(25, 'A maximum of 25 addresses is allowed') + .describe( + 'List of allowed wallet addresses. Addresses should be provided in checksummed form.', + ); + +export type AddressAllowlistConditionProps = z.infer< + typeof addressAllowlistConditionSchema +>; diff --git a/packages/taco/src/conditions/schemas/common.ts b/packages/taco/src/conditions/schemas/common.ts index 6669e4d30..74c18134b 100644 --- a/packages/taco/src/conditions/schemas/common.ts +++ b/packages/taco/src/conditions/schemas/common.ts @@ -27,7 +27,11 @@ export const UserAddressSchema = z ); export const baseConditionSchema = z.object({ - conditionType: z.string(), + conditionType: z + .string() + .describe( + 'A unique identifier that indicates the condition variant in its serialized form. It is set automatically at every sub-class constructor when a new object is being created.', + ), }); // Source: https://github.com/colinhacks/zod/issues/831#issuecomment-1063481764 @@ -85,9 +89,20 @@ export const jsonPathSchema = z ); const validateHttpsURL = (url: string): boolean => { - return URL.canParse(url) && url.startsWith('https://'); + try { + const parsedUrl = new URL(url); + // Check if the URL is valid and uses HTTPS + return parsedUrl.protocol === 'https:'; + } catch (e) { + // If URL constructor throws, the URL is invalid + return false; + } }; +export const jsonAuthorizationTypeSchema = z + .enum(['Bearer', 'Basic', 'X-API-Key']) + .describe('The type of authorization to use when making the request.'); + // Use our own URL refinement check due to https://github.com/colinhacks/zod/issues/2236 export const httpsURLSchema = z .string() @@ -95,3 +110,8 @@ export const httpsURLSchema = z .refine((url) => validateHttpsURL(url), { message: 'Invalid URL', }); + +export const hexStringSchema = z + .string() + .regex(/^[0-9a-fA-F]+$/, 'Invalid hex string') + .describe('A string containing only hexadecimal characters (0-9, a-f, A-F)'); diff --git a/packages/taco/src/conditions/schemas/compound.ts b/packages/taco/src/conditions/schemas/compound.ts index df8dd40ce..1a390c72a 100644 --- a/packages/taco/src/conditions/schemas/compound.ts +++ b/packages/taco/src/conditions/schemas/compound.ts @@ -37,11 +37,11 @@ export const compoundConditionSchema: z.ZodSchema = z.lazy(() => }), ) .refine( - (condition) => maxNestedDepth(2)(condition), + (condition) => maxNestedDepth(4)(condition), { - message: 'Exceeded max nested depth of 2 for multi-condition type', + message: 'Exceeded max nested depth of 4 for multi-condition type', path: ['operands'], - }, // Max nested depth of 2 + }, // Max nested depth of 4 ), ); diff --git a/packages/taco/src/conditions/schemas/context-variable.ts b/packages/taco/src/conditions/schemas/context-variable.ts new file mode 100644 index 000000000..ad50eea7e --- /dev/null +++ b/packages/taco/src/conditions/schemas/context-variable.ts @@ -0,0 +1,24 @@ +import { z } from 'zod'; + +import { baseConditionSchema } from './common'; +import { contextParamSchema } from './context'; +import { returnValueTestSchema } from './return-value-test'; + +export const ContextVariableConditionType = 'context-variable'; + +export const contextVariableConditionSchema = baseConditionSchema + .extend({ + conditionType: z.literal(ContextVariableConditionType), + contextVariable: contextParamSchema.describe( + 'The context variable to check (e.g., ":userAddress", ":customParam")', + ), + returnValueTest: returnValueTestSchema, + }) + .strict() + .describe( + 'Context Variable Condition for performing comparison operations on context variable values.', + ); + +export type ContextVariableConditionProps = z.infer< + typeof contextVariableConditionSchema +>; diff --git a/packages/taco/src/conditions/schemas/ecdsa.ts b/packages/taco/src/conditions/schemas/ecdsa.ts new file mode 100644 index 000000000..3b77911bb --- /dev/null +++ b/packages/taco/src/conditions/schemas/ecdsa.ts @@ -0,0 +1,50 @@ +import { z } from 'zod'; + +import { baseConditionSchema, hexStringSchema } from './common'; +import { contextParamSchema } from './context'; + +export const ECDSA_MESSAGE_PARAM_DEFAULT = ':message'; +export const ECDSA_SIGNATURE_PARAM_DEFAULT = ':signature'; + +export const ECDSAConditionType = 'ecdsa'; + +export const SUPPORTED_ECDSA_CURVES = [ + 'SECP256k1', + 'NIST256p', + 'NIST384p', + 'NIST521p', + 'Ed25519', + 'BRAINPOOLP256r1', +] as const; + +export type ECDSACurve = (typeof SUPPORTED_ECDSA_CURVES)[number]; + +export const ecdsaConditionSchema = baseConditionSchema + .extend({ + conditionType: z.literal(ECDSAConditionType).default(ECDSAConditionType), + message: z + .union([z.string(), contextParamSchema]) + .default(ECDSA_MESSAGE_PARAM_DEFAULT), + signature: z + .union([hexStringSchema, contextParamSchema]) + .default(ECDSA_SIGNATURE_PARAM_DEFAULT), + verifyingKey: hexStringSchema, + curve: z.enum(SUPPORTED_ECDSA_CURVES), + }) + .refine( + (data) => { + // ensure that if message starts with 0x that it is valid hex + if (data.message.startsWith('0x')) + return hexStringSchema.safeParse(data.message.slice(2)).success; + return true; + }, + { + message: 'Message must be a valid hex string if it starts with "0x"', + path: ['message'], + }, + ) + .describe( + 'ECDSA Condition for verifying the authenticity of a message using ECDSA signatures.', + ); + +export type ECDSAConditionProps = z.infer; diff --git a/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts b/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts index 36e6cfa24..b350502cc 100755 --- a/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts +++ b/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts @@ -10,12 +10,19 @@ export * from './common'; export * from './context'; // ts-unused-exports:disable-next-line - this comment line is added to prevent lint from changing or objecting the export order. export * from './compound'; +export * from './context-variable'; export * from './contract'; +export * from './ecdsa'; export * from './if-then-else'; +export * from './json'; export * from './json-api'; export * from './json-rpc'; export * from './jwt'; export * from './return-value-test'; export * from './rpc'; export * from './sequential'; +export * from './signing'; export * from './time'; +export * from './variable-operation'; +// ts-unused-exports:disable-next-line - this comment line is added to prevent lint from changing or objecting the export order. +export * from './address-allowlist'; diff --git a/packages/taco/src/conditions/schemas/if-then-else.ts b/packages/taco/src/conditions/schemas/if-then-else.ts index dc90ee992..725196629 100644 --- a/packages/taco/src/conditions/schemas/if-then-else.ts +++ b/packages/taco/src/conditions/schemas/if-then-else.ts @@ -19,32 +19,32 @@ export const ifThenElseConditionSchema: z.ZodSchema = z.lazy(() => }) .refine( // already at 2nd level since checking member condition - (condition) => maxNestedDepth(2)(condition.ifCondition, 2), + (condition) => maxNestedDepth(4)(condition.ifCondition, 2), { - message: 'Exceeded max nested depth of 2 for multi-condition type', + message: 'Exceeded max nested depth of 4 for multi-condition type', path: ['ifCondition'], - }, // Max nested depth of 2 + }, // Max nested depth of 4 ) .refine( // already at 2nd level since checking member condition - (condition) => maxNestedDepth(2)(condition.thenCondition, 2), + (condition) => maxNestedDepth(4)(condition.thenCondition, 2), { - message: 'Exceeded max nested depth of 2 for multi-condition type', + message: 'Exceeded max nested depth of 4 for multi-condition type', path: ['thenCondition'], - }, // Max nested depth of 2 + }, // Max nested depth of 4 ) .refine( (condition) => { if (typeof condition.elseCondition !== 'boolean') { // already at 2nd level since checking member condition - return maxNestedDepth(2)(condition.elseCondition, 2); + return maxNestedDepth(4)(condition.elseCondition, 2); } return true; }, { - message: 'Exceeded max nested depth of 2 for multi-condition type', + message: 'Exceeded max nested depth of 4 for multi-condition type', path: ['elseCondition'], - }, // Max nested depth of 2 + }, // Max nested depth of 4 ), ); diff --git a/packages/taco/src/conditions/schemas/json-api.ts b/packages/taco/src/conditions/schemas/json-api.ts index 8fa6e7928..8876facd4 100644 --- a/packages/taco/src/conditions/schemas/json-api.ts +++ b/packages/taco/src/conditions/schemas/json-api.ts @@ -1,18 +1,41 @@ import { z } from 'zod'; -import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common'; +import { + baseConditionSchema, + httpsURLSchema, + jsonAuthorizationTypeSchema, + jsonPathSchema, +} from './common'; import { contextParamSchema } from './context'; import { returnValueTestSchema } from './return-value-test'; export const JsonApiConditionType = 'json-api'; -export const jsonApiConditionSchema = baseConditionSchema.extend({ - conditionType: z.literal(JsonApiConditionType).default(JsonApiConditionType), - endpoint: httpsURLSchema, - parameters: z.record(z.string(), z.unknown()).optional(), - query: jsonPathSchema.optional(), - authorizationToken: contextParamSchema.optional(), - returnValueTest: returnValueTestSchema, // Update to allow multiple return values after expanding supported methods -}); +export const jsonApiConditionSchema = baseConditionSchema + .extend({ + conditionType: z + .literal(JsonApiConditionType) + .default(JsonApiConditionType), + endpoint: httpsURLSchema, + parameters: z.record(z.string(), z.unknown()).optional(), + query: jsonPathSchema.optional(), + authorizationToken: contextParamSchema.optional(), + authorizationType: jsonAuthorizationTypeSchema.optional(), + returnValueTest: returnValueTestSchema, // Update to allow multiple return values after expanding supported methods + }) + .refine( + (data) => { + // Ensure that if authorizationType is provided, then authorizationToken is set + if (data.authorizationType && !data.authorizationToken) { + return false; + } + return true; + }, + { + message: + 'authorizationToken must be provided if authorizationType is set', + path: ['authorizationType'], + }, + ); export type JsonApiConditionProps = z.infer; diff --git a/packages/taco/src/conditions/schemas/json-rpc.ts b/packages/taco/src/conditions/schemas/json-rpc.ts index d945f2f5b..bd32820a9 100644 --- a/packages/taco/src/conditions/schemas/json-rpc.ts +++ b/packages/taco/src/conditions/schemas/json-rpc.ts @@ -1,22 +1,45 @@ import { z } from 'zod'; -import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common'; +import { + baseConditionSchema, + httpsURLSchema, + jsonAuthorizationTypeSchema, + jsonPathSchema, +} from './common'; import { contextParamSchema } from './context'; import { returnValueTestSchema } from './return-value-test'; export const JsonRpcConditionType = 'json-rpc'; -export const jsonRpcConditionSchema = baseConditionSchema.extend({ - conditionType: z.literal(JsonRpcConditionType).default(JsonRpcConditionType), - endpoint: httpsURLSchema, - method: z.string(), - // list or dictionary - params: z - .union([z.array(z.unknown()), z.record(z.string(), z.unknown())]) - .optional(), - query: jsonPathSchema.optional(), - authorizationToken: contextParamSchema.optional(), - returnValueTest: returnValueTestSchema, -}); +export const jsonRpcConditionSchema = baseConditionSchema + .extend({ + conditionType: z + .literal(JsonRpcConditionType) + .default(JsonRpcConditionType), + endpoint: httpsURLSchema, + method: z.string(), + // list or dictionary + params: z + .union([z.array(z.unknown()), z.record(z.string(), z.unknown())]) + .optional(), + query: jsonPathSchema.optional(), + authorizationToken: contextParamSchema.optional(), + authorizationType: jsonAuthorizationTypeSchema.optional(), + returnValueTest: returnValueTestSchema, + }) + .refine( + (data) => { + // Ensure that if authorizationType is provided, then authorizationToken is set + if (data.authorizationType && !data.authorizationToken) { + return false; + } + return true; + }, + { + message: + 'authorizationToken must be provided if authorizationType is set', + path: ['authorizationType'], + }, + ); export type JsonRpcConditionProps = z.infer; diff --git a/packages/taco/src/conditions/schemas/json.ts b/packages/taco/src/conditions/schemas/json.ts new file mode 100644 index 000000000..86aa2b625 --- /dev/null +++ b/packages/taco/src/conditions/schemas/json.ts @@ -0,0 +1,22 @@ +import { z } from 'zod'; + +import { baseConditionSchema, jsonPathSchema } from './common'; +import { contextParamSchema } from './context'; +import { returnValueTestSchema } from './return-value-test'; + +export const JsonConditionType = 'json'; + +export const jsonConditionSchema = baseConditionSchema.extend({ + conditionType: z.literal(JsonConditionType).default(JsonConditionType), + data: contextParamSchema.describe( + 'Context variable that resolves to JSON data at decryption time.', + ), + query: jsonPathSchema + .optional() + .describe( + 'Optional JSONPath query to extract a specific value from the data.', + ), + returnValueTest: returnValueTestSchema, +}); + +export type JsonConditionProps = z.infer; diff --git a/packages/taco/src/conditions/schemas/return-value-test.ts b/packages/taco/src/conditions/schemas/return-value-test.ts index 17f168f6c..72e190219 100644 --- a/packages/taco/src/conditions/schemas/return-value-test.ts +++ b/packages/taco/src/conditions/schemas/return-value-test.ts @@ -4,21 +4,46 @@ import { blockchainParamOrContextParamSchema, paramOrContextParamSchema, } from './context'; +import { variableOperationsArraySchema } from './variable-operation'; const returnValueTestBaseSchema = z.object({ index: z.number().int().nonnegative().optional(), - comparator: z.enum(['==', '>', '<', '>=', '<=', '!=']), + comparator: z.enum(['==', '>', '<', '>=', '<=', '!=', 'in', '!in']), + operations: variableOperationsArraySchema.describe( + 'Optional operations to perform on the obtained result before comparison', + ), }); -export const returnValueTestSchema = returnValueTestBaseSchema.extend({ - value: paramOrContextParamSchema, -}); +const requireNonEmptyArrayIfComparatorIsIn = (data: { + comparator: '==' | '>' | '<' | '>=' | '<=' | '!=' | 'in' | '!in'; + value?: unknown; + index?: number | undefined; +}): boolean => { + if (data.comparator === 'in' || data.comparator === '!in') { + return Array.isArray(data.value) && data.value.length > 0; + } + return true; +}; + +const inComparatorErrorConfig = { + message: `"value" must be a non-empty array when comparator is "in"/"!in"`, + path: ['value'], +}; + +export const returnValueTestSchema = returnValueTestBaseSchema + .extend({ + value: paramOrContextParamSchema, + }) + .refine(requireNonEmptyArrayIfComparatorIsIn, inComparatorErrorConfig) + .describe( + 'Test to perform on a value. Supports comparison operators like ==, >, <, >=, <=, !=, in, !in', + ); -export const blockchainReturnValueTestSchema = returnValueTestBaseSchema.extend( - { +export const blockchainReturnValueTestSchema = returnValueTestBaseSchema + .extend({ value: blockchainParamOrContextParamSchema, - }, -); + }) + .refine(requireNonEmptyArrayIfComparatorIsIn, inComparatorErrorConfig); export type ReturnValueTestProps = z.infer; diff --git a/packages/taco/src/conditions/schemas/sequential.ts b/packages/taco/src/conditions/schemas/sequential.ts index 60942d047..b9c1f932c 100644 --- a/packages/taco/src/conditions/schemas/sequential.ts +++ b/packages/taco/src/conditions/schemas/sequential.ts @@ -1,18 +1,69 @@ import { z } from 'zod'; +import { ConditionProps } from '../condition'; import { maxNestedDepth } from '../multi-condition'; import { baseConditionSchema, plainStringSchema } from './common'; +import { CompoundConditionType } from './compound'; +import { IfThenElseConditionType } from './if-then-else'; import { anyConditionSchema } from './utils'; +import { variableOperationsArraySchema } from './variable-operation'; + +export const getAllNestedConditionVariableNames = ( + condition: ConditionProps, +): string[] => { + const conditionVariables: string[] = []; + if (condition.conditionType === SequentialConditionType) { + for (const variable of condition.conditionVariables) { + conditionVariables.push(variable.varName); + conditionVariables.push( + ...getAllNestedConditionVariableNames(variable.condition), + ); + } + } else if (condition.conditionType === IfThenElseConditionType) { + conditionVariables.push( + ...getAllNestedConditionVariableNames(condition.ifCondition), + ); + conditionVariables.push( + ...getAllNestedConditionVariableNames(condition.thenCondition), + ); + if (typeof condition.elseCondition !== 'boolean') { + conditionVariables.push( + ...getAllNestedConditionVariableNames(condition.elseCondition), + ); + } + } else if (condition.conditionType === CompoundConditionType) { + for (const operand of condition.operands) { + conditionVariables.push(...getAllNestedConditionVariableNames(operand)); + } + } + return conditionVariables; +}; + +const noDuplicateVarNames = (condition: ConditionProps): boolean => { + const allVarNames = getAllNestedConditionVariableNames(condition); + const duplicates = allVarNames.filter( + (item, index) => allVarNames.indexOf(item) !== index, + ); + return duplicates.length === 0; +}; export const SequentialConditionType = 'sequential'; export const conditionVariableSchema: z.ZodSchema = z.lazy(() => - z.object({ - varName: plainStringSchema, - condition: anyConditionSchema, - }), + z + .object({ + varName: plainStringSchema, + condition: anyConditionSchema, + operations: variableOperationsArraySchema.describe( + 'Optional operations to perform on the obtained condition result before storing it', + ), + }) + .describe( + 'Executes a condition and stores the result as a variable within a sequential condition.', + ), ); + export type ConditionVariableProps = z.infer; export const sequentialConditionSchema: z.ZodSchema = baseConditionSchema @@ -20,28 +71,18 @@ export const sequentialConditionSchema: z.ZodSchema = baseConditionSchema conditionType: z .literal(SequentialConditionType) .default(SequentialConditionType), - conditionVariables: z.array(conditionVariableSchema).min(2).max(5), + conditionVariables: z.array(conditionVariableSchema).min(2).max(20), }) .refine( - (condition) => maxNestedDepth(2)(condition), + (condition) => maxNestedDepth(4)(condition), { - message: 'Exceeded max nested depth of 2 for multi-condition type', + message: 'Exceeded max nested depth of 4 for multi-condition type', path: ['conditionVariables'], - }, // Max nested depth of 2 + }, // Max nested depth of 4 ) .refine( - // check for duplicate var names (condition) => { - const seen = new Set(); - return condition.conditionVariables.every( - (child: ConditionVariableProps) => { - if (seen.has(child.varName)) { - return false; - } - seen.add(child.varName); - return true; - }, - ); + return noDuplicateVarNames(condition); }, { message: 'Duplicate variable names are not allowed', diff --git a/packages/taco/src/conditions/schemas/signing.ts b/packages/taco/src/conditions/schemas/signing.ts new file mode 100644 index 000000000..09e6f5da6 --- /dev/null +++ b/packages/taco/src/conditions/schemas/signing.ts @@ -0,0 +1,306 @@ +import { FunctionFragment, ParamType } from 'ethers/lib/utils'; +import { z } from 'zod'; + +import { baseConditionSchema } from './common'; +import { blockchainReturnValueTestSchema } from './return-value-test'; + +export const SIGNING_CONDITION_OBJECT_CONTEXT_VAR = ':signingConditionObject'; + +const signingConditionSchema = baseConditionSchema.extend({ + signingObjectContextVar: z + .literal(SIGNING_CONDITION_OBJECT_CONTEXT_VAR) + .default(SIGNING_CONDITION_OBJECT_CONTEXT_VAR) + .describe( + 'The context variable that will be replaced with the signing object at signing', + ), +}); + +const baseSigningObjectAttributeConditionSchema = signingConditionSchema.extend( + { + attributeName: z + .string() + .min(1) + .describe('The name of the attribute to check'), + }, +); + +export const SigningObjectAttributeConditionType = 'signing-attribute'; + +export const signingObjectAttributeConditionSchema: z.ZodSchema = + baseSigningObjectAttributeConditionSchema.extend({ + conditionType: z + .literal(SigningObjectAttributeConditionType) + .default(SigningObjectAttributeConditionType), + returnValueTest: blockchainReturnValueTestSchema, + }); + +export type SigningObjectAttributeConditionProps = z.infer< + typeof signingObjectAttributeConditionSchema +>; + +export const abiParameterValidationSchema: z.ZodSchema = z + .object({ + parameterIndex: z + .number() + .int() + .nonnegative() + .describe('Index of parameter to check within abi calldata.'), + subIndices: z + .array(z.number().int().nonnegative()) + .optional() + .describe( + 'Sequential indices for navigating nested structures (arrays and tuples). ' + + 'The ABI type determines interpretation at each step: array types consume an index ' + + 'and access that element, tuple types consume an index and access that field.', + ), + returnValueTest: blockchainReturnValueTestSchema + .optional() + .describe('Comparison check for value within calldata'), + nestedAbiValidation: z + .lazy(() => abiCallValidationSchema) + .optional() + .describe('Additional checks for nested abi calldata'), + }) + .refine( + // An XOR check to see if either 'returnValueTest' or 'nestedAbiValidation' is set + (parameterValidation) => + Boolean(parameterValidation.returnValueTest) !== + Boolean(parameterValidation.nestedAbiValidation), + { + message: + "At most one of the fields 'returnValueTest' and 'nestedAbiValidation' must be defined", + path: ['returnValueTest'], + }, + ); + +export type AbiParameterValidationProps = z.infer< + typeof abiParameterValidationSchema +>; + +// TODO: is there something already built out there to validate Solidity types? + +function generateSolidityBaseTypeRegExp(): RegExp { + // Generate a regex pattern for Solidity base types + + // Generate int/uint sizes (8, 16, ..., 256) + const intSizes = Array.from({ length: 32 }, (_, i) => (i + 1) * 8); // [8, 16, ..., 256] + const intSizePattern = intSizes.join('|'); + + // Generate bytes sizes (1, 2, ..., 32) + const bytesSizes = Array.from({ length: 32 }, (_, i) => i + 1); // [1, 2, ..., 32] + const bytesSizePattern = bytesSizes.join('|'); + + // Build the regex string + const baseTypes = [ + `u?int(${intSizePattern})?`, // uint8, uint16, ..., uint256, int8, int16, ..., int256 + `bytes(${bytesSizePattern})?`, // bytes1, bytes2, ..., bytes32 + 'string', + 'address', + 'bool', + ].join('|'); + + return new RegExp(`^(${baseTypes})$`); +} + +// YIKES! +const solidityBaseTypePattern = generateSolidityBaseTypeRegExp(); + +const isValidSolidityType = (param: ParamType): boolean => { + // Recursive check for valid Solidity types + if (!param.baseType || !param.baseType.trim()) { + return false; // empty type is not valid + } + + // Check for arrays and tuples + if (param.baseType === 'tuple') { + if (!param.components || param.components.length === 0) { + return false; // tuples must have components defined + } + return param.components.every(isValidSolidityType); + } else if (param.baseType === 'array') { + if (!param.arrayChildren) { + return false; // arrays must have children type defined + } + return isValidSolidityType(param.arrayChildren); + } else { + return solidityBaseTypePattern.test(param.baseType); + } +}; + +// TODO; find a better way to validate the param type - incomplete best effort for now +const isValidHumanAbiCallSignature = (signature: string): boolean => { + try { + // TODO: verify this works properly + const fragment = FunctionFragment.from(signature); + for (const parameter of fragment.inputs) { + if (!isValidSolidityType(parameter)) { + return false; // invalid Solidity type + } + } + + // ensure the same sighash format was provided + return fragment.format() === signature; + } catch { + return false; + } +}; + +const humanAbiCallSignatureSchema = z + .string() + .refine(isValidHumanAbiCallSignature, { + message: 'Invalid human readable ABI signature provided', + }) + .describe('A human readable ABI signature, e.g. "transfer(address,uint256)"'); + +/** + * Resolves the final ParamType after applying subIndices navigation. + * Returns the resolved type or undefined if navigation fails (with errors added to ctx). + * + * @param ctx - The Zod refinement context. + * @param paramType - The starting ParamType to navigate from. + * @param subIndices - The array of indices to navigate through. + * @param signature - The ABI signature (for error messages). + * @param validationIndex - The index of the validation (for error paths). + * @returns The resolved ParamType or undefined if validation failed. + */ +function resolveTypeWithSubIndices( + ctx: z.RefinementCtx, + paramType: ParamType, + subIndices: number[], + signature: string, + validationIndex: number, +): ParamType | undefined { + let currentType = paramType; + + for (let i = 0; i < subIndices.length; i++) { + const idx = subIndices[i]; + + if (currentType.baseType === 'array') { + // Array type - navigate to element type (cannot validate bounds at schema time) + currentType = currentType.arrayChildren; + } else if (currentType.baseType === 'tuple') { + // Tuple type - navigate to component at index + if (idx >= currentType.components.length) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Index ${idx} at subIndices position ${i} is out of range for tuple with ${currentType.components.length} fields`, + path: ['allowedAbiCalls', signature, validationIndex, 'subIndices'], + }); + return undefined; + } + currentType = currentType.components[idx]; + } else { + // Not an indexable type + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Cannot apply index at subIndices position ${i}: type "${currentType.baseType}" is not indexable (not an array or tuple)`, + path: ['allowedAbiCalls', signature, validationIndex, 'subIndices'], + }); + return undefined; + } + } + + return currentType; +} + +/** + * Validates the allowed ABI calls against the provided signature and validations. + * This function is used in the superRefine method of the abiCallValidationSchema. + * + * @param ctx - The Zod refinement context. + * @param signature - The ABI signature to validate against. + * @param validations - The array of validations for the ABI parameters. + */ +function validateAllowedAbiCall( + ctx: z.RefinementCtx, + signature: string, + validations: AbiParameterValidationProps[], +) { + try { + const fragment = FunctionFragment.from(signature); + for (const [index, validation] of validations.entries()) { + if (validation.parameterIndex >= fragment.inputs.length) { + // invalid parameter index + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Parameter index, "${validation.parameterIndex}", is out of range`, + path: ['allowedAbiCalls', signature, index, 'parameterIndex'], + }); + continue; + } + + let finalType = fragment.inputs[validation.parameterIndex]; + + // Validate and resolve subIndices if present + if (validation.subIndices && validation.subIndices.length > 0) { + const resolvedType = resolveTypeWithSubIndices( + ctx, + finalType, + validation.subIndices, + signature, + index, + ); + if (resolvedType === undefined) { + continue; // Validation failed, errors already added + } + finalType = resolvedType; + } + + if (validation.nestedAbiValidation) { + // if there is nested ABI validation, the final type must be bytes + if (finalType.baseType !== 'bytes') { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Invalid type for nested ABI validation, "${finalType.baseType}"; expected bytes`, + path: ['allowedAbiCalls', signature, index], + }); + } + } + } + } catch { + // even though abi signatures are already validated by nested schema - zod uses "greedy" (continuable) validation so all validations are run + // ignore invalid ABI signature + } +} + +export const abiCallValidationSchema: z.ZodSchema = z + .object({ + allowedAbiCalls: z.record( + humanAbiCallSignatureSchema, + z.array(abiParameterValidationSchema), + ), + }) + .refine( + (abiCallValidation) => + Object.keys(abiCallValidation.allowedAbiCalls).length > 0, + { + message: 'At least one allowed ABI call must be defined', + path: ['allowedAbiCalls'], + }, + ) + .superRefine((data, ctx) => { + for (const [signature, validations] of Object.entries( + data.allowedAbiCalls, + )) { + validateAllowedAbiCall(ctx, signature, validations); + } + }) + .describe( + 'A map of allowed ABI calls with their respective parameter validations.', + ); + +export type AbiCallValidationProps = z.infer; + +export const SigningObjectAbiAttributeConditionType = 'signing-abi-attribute'; + +export const signingObjectAbiAttributeConditionSchema: z.ZodSchema = + baseSigningObjectAttributeConditionSchema.extend({ + conditionType: z + .literal(SigningObjectAbiAttributeConditionType) + .default(SigningObjectAbiAttributeConditionType), + abiValidation: abiCallValidationSchema, + }); + +export type SigningObjectAbiAttributeConditionProps = z.infer< + typeof signingObjectAbiAttributeConditionSchema +>; diff --git a/packages/taco/src/conditions/schemas/utils.ts b/packages/taco/src/conditions/schemas/utils.ts index abd14f36b..b58c472cb 100644 --- a/packages/taco/src/conditions/schemas/utils.ts +++ b/packages/taco/src/conditions/schemas/utils.ts @@ -2,24 +2,36 @@ import { z } from 'zod'; import { compoundConditionSchema } from '../compound-condition'; +import { contextVariableConditionSchema } from './context-variable'; import { contractConditionSchema } from './contract'; +import { ecdsaConditionSchema } from './ecdsa'; import { ifThenElseConditionSchema } from './if-then-else'; +import { jsonConditionSchema } from './json'; import { jsonApiConditionSchema } from './json-api'; import { jsonRpcConditionSchema } from './json-rpc'; import { jwtConditionSchema } from './jwt'; import { rpcConditionSchema } from './rpc'; import { sequentialConditionSchema } from './sequential'; +import { + signingObjectAbiAttributeConditionSchema, + signingObjectAttributeConditionSchema, +} from './signing'; import { timeConditionSchema } from './time'; export const anyConditionSchema: z.ZodSchema = z.lazy(() => z.union([ rpcConditionSchema, timeConditionSchema, + contextVariableConditionSchema, contractConditionSchema, - compoundConditionSchema, + ecdsaConditionSchema, + jsonConditionSchema, jsonApiConditionSchema, jsonRpcConditionSchema, jwtConditionSchema, + signingObjectAttributeConditionSchema, + signingObjectAbiAttributeConditionSchema, + compoundConditionSchema, sequentialConditionSchema, ifThenElseConditionSchema, ]), diff --git a/packages/taco/src/conditions/schemas/variable-operation.ts b/packages/taco/src/conditions/schemas/variable-operation.ts new file mode 100644 index 000000000..41c6a1689 --- /dev/null +++ b/packages/taco/src/conditions/schemas/variable-operation.ts @@ -0,0 +1,150 @@ +import { z } from 'zod'; + +import { contextParamSchema, paramOrContextParamSchema } from './context'; + +const hexPrefixedStringSchema = z + .string() + .regex(/^0x[0-9a-fA-F]+$/, 'Must be a 0x-prefixed hex string'); + +const create2ValueSchema = z + .object( + { + deployerAddress: z.union([hexPrefixedStringSchema, contextParamSchema]), + bytecodeHash: z.union([hexPrefixedStringSchema, contextParamSchema]), + }, + { + required_error: 'Value must be defined for operation', + invalid_type_error: + 'create2 operation requires an object with deployerAddress and bytecodeHash', + }, + ) + .describe( + 'Value for create2 operation containing deployerAddress and bytecodeHash for computing CREATE2 addresses locally.', + ); + +export const OPERATOR_FUNCTIONS = [ + '+=', + '-=', + '*=', + '/=', + '%=', + 'toTokenBaseUnits', + 'index', + 'round', + // operations that don't require 2nd value + 'abs', + 'avg', + 'ceil', + 'ethToWei', + 'floor', + 'len', + 'max', + 'min', + 'sum', + 'weiToEth', + // casting + 'bool', + 'float', + 'int', + 'str', + // JSON conversion + 'fromJson', + 'toJson', + // hex conversion + 'fromHex', + 'toHex', + // hashing + 'keccak', + // address computation + 'create2', +] as const; + +export const UNARY_OPERATOR_FUNCTIONS = [ + 'abs', + 'avg', + 'ceil', + 'ethToWei', + 'floor', + 'len', + 'max', + 'min', + 'sum', + 'weiToEth', + // casting + 'bool', + 'float', + 'int', + 'str', + // JSON conversion + 'fromJson', + 'toJson', + // hex conversion + 'fromHex', + 'toHex', + // hashing + 'keccak', +]; + +const baseVariableOperationSchema = z.object({ + operation: z.enum(OPERATOR_FUNCTIONS), + value: z.any().optional(), +}); + +const commonVariableOperationSchema = baseVariableOperationSchema + .extend({ + operation: z.enum( + OPERATOR_FUNCTIONS.filter((op) => op !== 'create2') as [ + string, + ...string[], + ], + ), + value: paramOrContextParamSchema.optional(), + }) + .refine( + (data) => { + if ( + UNARY_OPERATOR_FUNCTIONS.includes(data.operation) && + data.value !== undefined + ) { + return false; + } + return true; + }, + { + message: 'Value not allowed for this operation', + path: ['value'], + }, + ) + .refine( + (data) => { + if ( + !UNARY_OPERATOR_FUNCTIONS.includes(data.operation) && + data.value === undefined + ) { + return false; + } + return true; + }, + { + message: 'Value must be defined for operation', + path: ['value'], + }, + ); + +const create2VariableOperationSchema = baseVariableOperationSchema.extend({ + operation: z.literal('create2'), + value: create2ValueSchema, +}); + +export const variableOperationSchema = z + .union([commonVariableOperationSchema, create2VariableOperationSchema]) + .describe('An operation that can be performed on an obtained result.'); + +export const MAX_VARIABLE_OPERATIONS = 5; + +export const variableOperationsArraySchema = z + .array(variableOperationSchema) + .min(1) + .max(MAX_VARIABLE_OPERATIONS) + .optional() + .describe('Optional operations to perform on the obtained result'); diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 698685a1b..a2fe19992 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -1,6 +1,8 @@ export { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; export { Domain, + PackedUserOperationToSign, + UserOperationToSign, domains, fromBytes, getPorterUris, @@ -11,4 +13,11 @@ export { export * as conditions from './conditions'; +export { + AAVersion, + SignResult, + TacoSignature, + setSigningCohortConditions, + signUserOp, +} from './sign'; export { decrypt, encrypt, encryptWithPublicKey } from './taco'; diff --git a/packages/taco/src/sign.ts b/packages/taco/src/sign.ts new file mode 100644 index 000000000..0f220771a --- /dev/null +++ b/packages/taco/src/sign.ts @@ -0,0 +1,325 @@ +import { + EncryptedThresholdSignatureRequest, + EncryptedThresholdSignatureResponse, + PackedUserOperationSignatureRequest, + SessionSharedSecret, + SessionStaticSecret, + SignatureResponse, + UserOperationSignatureRequest, +} from '@nucypher/nucypher-core'; +import { + Domain, + fromHexString, + getPorterUris, + isPackedUserOperation, + PackedUserOperationToSign, + PorterClient, + SignerInfo, + SigningCoordinatorAgent, + toCorePackedUserOperation, + toCoreUserOperation, + toHexString, + UserOperationToSign, +} from '@nucypher/shared'; +import { ethers } from 'ethers'; + +import { Condition } from './conditions/condition'; +import { ConditionExpression } from './conditions/condition-expr'; +import { ConditionContext } from './conditions/context'; + +const ERR_INSUFFICIENT_SIGNATURES = (errors: unknown) => + `Threshold of signatures not met; TACo signing failed with errors: ${JSON.stringify( + errors, + )}`; +const ERR_MISMATCHED_HASHES = ( + hashToSignatures: Map, +) => + `Threshold of signatures not met; multiple mismatched hashes found: ${JSON.stringify( + Object.fromEntries(hashToSignatures.entries()), + )}`; + +export type TacoSignature = { + messageHash: string; + signature: string; + signerAddress: string; +}; + +export type SignResult = { + messageHash: string; + aggregatedSignature: string; + signingResults: { [ursulaAddress: string]: TacoSignature }; +}; + +export type AAVersion = '0.8.0' | 'mdt' | '0.7.0'; + +function aggregateSignatures( + signatures: TacoSignature[], + threshold: number, +): string { + // Aggregate hex signatures by concatenating them; being careful to sort + // and remove the '0x' prefix from each signature except the first one. + + // sort by signer address + const sortedSignatures = [...signatures] + .sort((a, b) => + a.signerAddress + .toLowerCase() + .localeCompare(b.signerAddress.toLowerCase()), + ) + .map((sig) => sig.signature); + + const thresholdSignatures = sortedSignatures.slice(0, threshold); + if (thresholdSignatures.length === 1) { + return thresholdSignatures[0]; + } + + // Concatenate signatures + const allBytes = thresholdSignatures.flatMap((sig) => + Array.from(fromHexString(sig)), + ); + return `0x${toHexString(new Uint8Array(allBytes))}`; +} + +async function makeSigningRequests( + cohortId: number, + chainId: number, + signers: Array, + userOp: UserOperationToSign | PackedUserOperationToSign, + aaVersion: AAVersion, + conditionContext?: ConditionContext, +): Promise<{ + sharedSecrets: Record; + encryptedRequests: Record; +}> { + const coreContext = conditionContext + ? await conditionContext.toCoreContext() + : null; + + let signingRequest: + | PackedUserOperationSignatureRequest + | UserOperationSignatureRequest; + if (isPackedUserOperation(userOp)) { + const corePackedUserOp = toCorePackedUserOperation(userOp); + signingRequest = new PackedUserOperationSignatureRequest( + corePackedUserOp, + cohortId, + BigInt(chainId), + aaVersion, + coreContext, + ); + } else { + const coreUserOp = toCoreUserOperation(userOp); + signingRequest = new UserOperationSignatureRequest( + coreUserOp, + cohortId, + BigInt(chainId), + aaVersion, + coreContext, + ); + } + + const ephemeralSessionKey = SessionStaticSecret.random(); + + const sharedSecrets: Record = Object.fromEntries( + signers.map(({ provider, signingRequestStaticKey }) => { + const sharedSecret = ephemeralSessionKey.deriveSharedSecret( + signingRequestStaticKey, + ); + return [provider, sharedSecret]; + }), + ); + + const encryptedRequests: Record = + Object.fromEntries( + Object.entries(sharedSecrets).map(([provider, sessionSharedSecret]) => { + const encryptedRequest = signingRequest.encrypt( + sessionSharedSecret, + ephemeralSessionKey.publicKey(), + ); + return [provider, encryptedRequest]; + }), + ); + + return { sharedSecrets, encryptedRequests }; +} + +/** + * Signs a UserOperation. + * @param provider - The Ethereum provider to use for signing. + * @param domain - The TACo domain being used. + * @param cohortId - The cohort ID that identifies the signing cohort. + * @param chainId - The chain ID for the signing operation. + * @param userOp - The UserOperation to be signed. + * @param aaVersion - The AA version of the account abstraction to use for signing. + * @param context - Optional condition context for the context variable resolution. + * @param porterUris - Optional URIs for the Porter service. If not provided, will fetch the default URIs from the domain. + * @returns A promise that resolves to a SignResult containing the message hash, aggregated signature, and signing results from the Porter service. + * @throws An error if the signing process fails due to insufficient signatures or mismatched hashes. + */ +export async function signUserOp( + provider: ethers.providers.Provider, + domain: Domain, + cohortId: number, + chainId: number, + userOp: UserOperationToSign | PackedUserOperationToSign, + aaVersion: AAVersion, + context?: ConditionContext, + porterUris?: string[], +): Promise { + const porterUrisFull: string[] = porterUris + ? porterUris + : await getPorterUris(domain); + const porter = new PorterClient(porterUrisFull); + + const signers = await SigningCoordinatorAgent.getParticipants( + provider, + domain, + cohortId, + ); + + const threshold = await SigningCoordinatorAgent.getThreshold( + provider, + domain, + cohortId, + ); + + const { sharedSecrets, encryptedRequests } = await makeSigningRequests( + cohortId, + chainId, + signers, + userOp, + aaVersion, + context, + ); + + // Build signing request for the user operation + const { encryptedResponses, errors } = await porter.signUserOp( + encryptedRequests, + threshold, + ); + if (Object.keys(encryptedResponses).length < threshold) { + // not enough signatures returned + throw new Error(ERR_INSUFFICIENT_SIGNATURES(errors)); + } + + const signaturesToAggregate = collectSignatures( + encryptedResponses, + sharedSecrets, + threshold, + ); + + const aggregatedSignature = aggregateSignatures( + Object.values(signaturesToAggregate), + threshold, + ); + + return { + messageHash: Object.values(signaturesToAggregate)[0].messageHash, + aggregatedSignature, + signingResults: signaturesToAggregate, + }; +} + +export async function setSigningCohortConditions( + provider: ethers.providers.JsonRpcProvider, + domain: Domain, + conditions: Condition, + cohortId: number, + chainId: number, + signer: ethers.Signer, +): Promise { + // Convert Condition to ConditionExpression, then to JSON, then to bytes + const conditionExpression = new ConditionExpression(conditions); + const conditionsJson = conditionExpression.toJson(); + const conditionsBytes = ethers.utils.toUtf8Bytes(conditionsJson); + + // Set conditions on the SigningCoordinator contract + return await SigningCoordinatorAgent.setSigningCohortConditions( + provider, + domain, + cohortId, + chainId, + conditionsBytes, + signer, + ); +} + +function decryptSignatureResponses( + encryptedResponses: Record, + sharedSecrets: Record, +): Record { + const decryptedResponses: Record = + Object.fromEntries( + Object.entries(encryptedResponses).map( + ([ursulaAddress, encryptedResponse]) => [ + ursulaAddress, + encryptedResponse.decrypt(sharedSecrets[ursulaAddress]), + ], + ), + ); + + const tacoSignatures: Record = Object.fromEntries( + Object.entries(decryptedResponses).map( + ([ursulaAddress, signatureResponse]) => [ + ursulaAddress, + { + messageHash: `0x${toHexString(signatureResponse.hash)}`, + signature: `0x${toHexString(signatureResponse.signature)}`, + signerAddress: signatureResponse.signer, + }, + ], + ), + ); + + return tacoSignatures; +} + +function collectSignatures( + encryptedResponses: Record, + sharedSecrets: Record, + threshold: number, +): Record { + const decryptedSignatures = decryptSignatureResponses( + encryptedResponses, + sharedSecrets, + ); + + const hashToSignatures: Map< + string, + Record + > = new Map(); + + // Single pass: decode signatures and populate signingResults + for (const [ursulaAddress, signature] of Object.entries( + decryptedSignatures, + )) { + // For non-optimistic: track hashes and group signatures for aggregation + const hash = signature.messageHash; + if (!hashToSignatures.has(hash)) { + hashToSignatures.set(hash, {}); + } + hashToSignatures.get(hash)![ursulaAddress] = signature; + } + + // Find a hash that meets the threshold + let signaturesToAggregate = undefined; + for (const signatures of hashToSignatures.values()) { + if (Object.keys(signatures).length >= threshold) { + signaturesToAggregate = signatures; + break; + } + } + + // Insufficient signatures for a message hash to meet the threshold + if (!signaturesToAggregate) { + // we have multiple hashes, which means we have mismatched hashes from different nodes + // we don't really expect this to happen (other than some malicious nodes) + console.error( + 'Porter returned mismatched message hashes:', + hashToSignatures, + ); + throw new Error(ERR_MISMATCHED_HASHES(hashToSignatures)); + } + + return signaturesToAggregate; +} diff --git a/packages/taco/src/types.ts b/packages/taco/src/types.ts index 406bf6910..d41b148c2 100644 --- a/packages/taco/src/types.ts +++ b/packages/taco/src/types.ts @@ -3,3 +3,6 @@ export { Conditions as CoreConditions, Context as CoreContext, } from '@nucypher/nucypher-core'; + +// Re-export UserOperationToSign from shared package to avoid duplication +export { UserOperationToSign } from '@nucypher/shared'; diff --git a/packages/taco/test/conditions/any-condition-schema.test.ts b/packages/taco/test/conditions/any-condition-schema.test.ts new file mode 100644 index 000000000..4ee4f8106 --- /dev/null +++ b/packages/taco/test/conditions/any-condition-schema.test.ts @@ -0,0 +1,80 @@ +import { describe, expect, it } from 'vitest'; + +import { + CompoundCondition, + compoundConditionSchema, + CompoundConditionType, +} from '../../src/conditions/compound-condition'; +import { + testCompoundConditionObj, + testContextVariableConditionObj, + testContractConditionObj, + testECDSAConditionObj, + testIfThenElseConditionObj, + testJsonApiConditionObj, + testJsonConditionObj, + testJsonRpcConditionObj, + testJWTConditionObj, + testRpcConditionObj, + testSequentialConditionObj, + testSigningObjectAbiAttributeConditionObj, + testSigningObjectAttributeConditionObj, + testTimeConditionObj, +} from '../test-utils'; + +/** + * This test ensures that all condition types are included in anyConditionSchema. + * If a new condition type is added but not included in anyConditionSchema, + * it will fail validation when used inside compound/sequential conditions. + * + * When adding a new condition type: + * 1. Add a test object in test-utils.ts + * 2. Add it to the test cases below + * 3. Ensure it's imported and added to anyConditionSchema in schemas/utils.ts + */ +describe('anyConditionSchema completeness', () => { + const allConditionTestObjects = [ + { name: 'rpc', obj: testRpcConditionObj }, + { name: 'time', obj: testTimeConditionObj }, + { name: 'contract', obj: testContractConditionObj }, + { name: 'contextVariable', obj: testContextVariableConditionObj }, + { name: 'json', obj: testJsonConditionObj }, + { name: 'jsonApi', obj: testJsonApiConditionObj }, + { name: 'jsonRpc', obj: testJsonRpcConditionObj }, + { name: 'jwt', obj: testJWTConditionObj }, + { name: 'ecdsa', obj: testECDSAConditionObj }, + { + name: 'signingObjectAttribute', + obj: testSigningObjectAttributeConditionObj, + }, + { + name: 'signingObjectAbiAttribute', + obj: testSigningObjectAbiAttributeConditionObj, + }, + { name: 'compound', obj: testCompoundConditionObj }, + { name: 'sequential', obj: testSequentialConditionObj }, + { name: 'ifThenElse', obj: testIfThenElseConditionObj }, + ]; + + it.each(allConditionTestObjects)( + 'validates $name condition inside compound condition', + ({ name, obj }) => { + const compoundWithCondition = { + conditionType: CompoundConditionType, + operator: 'not', + operands: [obj], + }; + + const result = CompoundCondition.validate( + compoundConditionSchema, + compoundWithCondition, + ); + + expect( + result.error, + `${name} condition should be valid inside compound condition. ` + + `If this fails, ensure ${name}ConditionSchema is added to anyConditionSchema in schemas/utils.ts`, + ).toBeUndefined(); + }, + ); +}); diff --git a/packages/taco/test/conditions/base/context-variable.test.ts b/packages/taco/test/conditions/base/context-variable.test.ts new file mode 100644 index 000000000..72a73f013 --- /dev/null +++ b/packages/taco/test/conditions/base/context-variable.test.ts @@ -0,0 +1,193 @@ +import { describe, expect, it } from 'vitest'; + +import { + ContextVariableCondition, + ContextVariableConditionProps, +} from '../../../src/conditions/base/context-variable'; +import { + contextVariableConditionSchema, + ContextVariableConditionType, +} from '../../../src/conditions/schemas/context-variable'; +import { testContextVariableConditionObj } from '../../test-utils'; + +describe('ContextVariableCondition', () => { + describe('validate', () => { + it('accepts valid condition object', () => { + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + testContextVariableConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testContextVariableConditionObj); + }); + + it('fills in conditionType if missing', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { conditionType: _, ...withoutType } = + testContextVariableConditionObj; + const condition = new ContextVariableCondition(withoutType); + + expect(condition.toObj().conditionType).toBe( + ContextVariableConditionType, + ); + }); + + it('rejects unknown fields', () => { + const conditionObj = { + ...testContextVariableConditionObj, + unknownField: 'unknown', + } as unknown as ContextVariableConditionProps; + + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + _errors: ["Unrecognized key(s) in object: 'unknownField'"], + }); + }); + + it('requires contextVariable to be present', () => { + const conditionObj = { + ...testContextVariableConditionObj, + contextVariable: undefined, + } as unknown as ContextVariableConditionProps; + + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toHaveProperty('contextVariable'); + }); + + it('requires contextVariable to be a valid context parameter', () => { + const conditionObj = { + ...testContextVariableConditionObj, + contextVariable: 'invalidParam', + } as unknown as ContextVariableConditionProps; + + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain('Invalid'); + }); + + it.each([':userAddress', ':customParam', ':myVariable'])( + 'accepts valid context parameters: %s', + (param) => { + const conditionObj = { + ...testContextVariableConditionObj, + contextVariable: param, + }; + + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + conditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data?.contextVariable).toBe(param); + }, + ); + + it('requires returnValueTest to be present', () => { + const conditionObj = { + ...testContextVariableConditionObj, + returnValueTest: undefined, + } as unknown as ContextVariableConditionProps; + + const result = ContextVariableCondition.validate( + contextVariableConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toHaveProperty('returnValueTest'); + }); + }); + + describe('constructor', () => { + it('creates a condition from a valid object', () => { + const condition = new ContextVariableCondition( + testContextVariableConditionObj, + ); + expect(condition.toObj()).toEqual(testContextVariableConditionObj); + }); + + it('throws an error for invalid condition', () => { + const invalidCondition = () => { + return new ContextVariableCondition({ + contextVariable: ':userAddress', + returnValueTest: { + comparator: 'in', + value: [], // empty array should fail + }, + }); + }; + + expect(invalidCondition).toThrow(/Invalid condition/); + }); + }); + + describe('requiresAuthentication', () => { + it('returns true when contextVariable references user authentication', () => { + const condition = new ContextVariableCondition({ + contextVariable: ':userAddress', + returnValueTest: { + comparator: 'in', + value: ['0x1234567890123456789012345678901234567890'], + }, + }); + expect(condition.requiresAuthentication()).toBe(true); + }); + + it('returns false when contextVariable does not reference user authentication', () => { + const condition = new ContextVariableCondition({ + contextVariable: ':customParam', + returnValueTest: { + comparator: '==', + value: 'someValue', + }, + }); + expect(condition.requiresAuthentication()).toBe(false); + }); + }); + + describe('equals', () => { + it('returns true for identical conditions', () => { + const condition1 = new ContextVariableCondition( + testContextVariableConditionObj, + ); + const condition2 = new ContextVariableCondition( + testContextVariableConditionObj, + ); + expect(condition1.equals(condition2)).toBe(true); + }); + + it('returns false for different conditions', () => { + const condition1 = new ContextVariableCondition( + testContextVariableConditionObj, + ); + const condition2 = new ContextVariableCondition({ + ...testContextVariableConditionObj, + returnValueTest: { + comparator: '==', + value: 'different-value', + }, + }); + expect(condition1.equals(condition2)).toBe(false); + }); + }); +}); diff --git a/packages/taco/test/conditions/base/ecdsa.test.ts b/packages/taco/test/conditions/base/ecdsa.test.ts new file mode 100644 index 000000000..0a27f7942 --- /dev/null +++ b/packages/taco/test/conditions/base/ecdsa.test.ts @@ -0,0 +1,175 @@ +import { describe, expect, it } from 'vitest'; + +import { + ECDSACondition, + ecdsaConditionSchema, + ECDSAConditionType, + SUPPORTED_ECDSA_CURVES, +} from '../../../src/conditions/base/ecdsa'; +import { testECDSAConditionObj } from '../../test-utils'; + +describe('ECDSACondition', () => { + describe('validation', () => { + it('accepts a valid schema', () => { + const result = ECDSACondition.validate( + ecdsaConditionSchema, + testECDSAConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testECDSAConditionObj); + }); + + it('rejects invalid message that is not a string or context variable', () => { + const badECDSAObj = { + ...testECDSAConditionObj, + message: 123, + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, badECDSAObj); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + message: { + _errors: expect.arrayContaining(['Expected string, received number']), + }, + }); + }); + + it('rejects 0x-prefixed hex message that is not valid hex', () => { + const badECDSAObj = { + ...testECDSAConditionObj, + message: '0x123g', // Invalid hex + }; + const result = ECDSACondition.validate(ecdsaConditionSchema, badECDSAObj); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + message: { + _errors: [ + 'Message must be a valid hex string if it starts with "0x"', + ], + }, + }); + }); + + it('accepts valid hex message', () => { + const validECDSAObj = { + ...testECDSAConditionObj, + message: '0xabcdef1234567890', + }; + + const result = ECDSACondition.validate( + ecdsaConditionSchema, + validECDSAObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(validECDSAObj); + }); + + it('rejects invalid signature that is not a hex string', () => { + const badECDSAObj = { + ...testECDSAConditionObj, + signature: 'not-a-hex-string', + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, badECDSAObj); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + signature: { + _errors: ['Invalid hex string'], + }, + }); + }); + + it('rejects invalid curve', () => { + const badECDSAObj = { + ...testECDSAConditionObj, + curve: 'invalid-curve', + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, badECDSAObj); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + curve: { + _errors: expect.arrayContaining([ + expect.stringContaining('Invalid enum value'), + ]), + }, + }); + }); + + it('accepts valid curves', () => { + SUPPORTED_ECDSA_CURVES.forEach((curve) => { + const ecdsaObj = { + ...testECDSAConditionObj, + curve, + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, ecdsaObj); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(ecdsaObj); + }); + }); + + it('accepts context variables for message', () => { + const ecdsaObj = { + ...testECDSAConditionObj, + message: ':customMessage', + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, ecdsaObj); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(ecdsaObj); + }); + + it('accepts context variables for signature', () => { + const ecdsaObj = { + ...testECDSAConditionObj, + signature: ':customSignature', + }; + + const result = ECDSACondition.validate(ecdsaConditionSchema, ecdsaObj); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(ecdsaObj); + }); + + it('rejects when curve parameter is missing', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { curve: _curve, ...ecdsaObjWithoutCurve } = testECDSAConditionObj; + + const result = ECDSACondition.validate( + ecdsaConditionSchema, + ecdsaObjWithoutCurve, + ); + + expect(result.error).toBeDefined(); + expect(result.error!.issues[0].code).toEqual('invalid_type'); + expect(result.error!.issues[0].path).toEqual(['curve']); + }); + + it('creates valid condition instance', () => { + const condition = new ECDSACondition({ + message: 'test message', + signature: 'abcdef123456', + verifyingKey: + '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + curve: 'SECP256k1', + }); + + expect(condition.value.conditionType).toBe(ECDSAConditionType); + expect(condition.value.message).toBe('test message'); + expect(condition.value.signature).toBe('abcdef123456'); + expect(condition.value.curve).toBe('SECP256k1'); + }); + }); +}); diff --git a/packages/taco/test/conditions/base/json-api.test.ts b/packages/taco/test/conditions/base/json-api.test.ts index a7fc9165b..5ad5d0c05 100644 --- a/packages/taco/test/conditions/base/json-api.test.ts +++ b/packages/taco/test/conditions/base/json-api.test.ts @@ -76,6 +76,59 @@ describe('JsonApiCondition', () => { }); }); + describe('authorizationType', () => { + it.each(['Bearer', 'Basic', 'X-API-Key'])( + 'accepts valid authorization types', + (authType) => { + const result = JsonApiCondition.validate(jsonApiConditionSchema, { + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual({ + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + }, + ); + it('authorizationToken must be set if authorizationType is provided', () => { + const result = JsonApiCondition.validate(jsonApiConditionSchema, { + ...testJsonApiConditionObj, + authorizationType: 'Bearer', + }); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + authorizationType: { + _errors: [ + 'authorizationToken must be provided if authorizationType is set', + ], + }, + }); + }); + it.each(['InvalidType', 'Bearer ', 'Basic123', 'Y-API-Key'])( + 'rejects invalid authorization types', + (authType) => { + const result = JsonApiCondition.validate(jsonApiConditionSchema, { + ...testJsonApiConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + authorizationType: { + _errors: [ + `Invalid enum value. Expected 'Bearer' | 'Basic' | 'X-API-Key', received '${authType}'`, + ], + }, + }); + }, + ); + }); + describe('parameters', () => { it('accepts conditions without query path', () => { const { query, ...noQueryObj } = testJsonApiConditionObj; diff --git a/packages/taco/test/conditions/base/json-rpc.test.ts b/packages/taco/test/conditions/base/json-rpc.test.ts index b54244160..7d7facae7 100644 --- a/packages/taco/test/conditions/base/json-rpc.test.ts +++ b/packages/taco/test/conditions/base/json-rpc.test.ts @@ -74,6 +74,58 @@ describe('JsonRpcCondition', () => { }); }); }); + describe('authorizationType', () => { + it.each(['Bearer', 'Basic', 'X-API-Key'])( + 'accepts valid authorization types', + (authType) => { + const result = JsonRpcCondition.validate(jsonRpcConditionSchema, { + ...testJsonRpcConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual({ + ...testJsonRpcConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + }, + ); + it('authorizationToken must be set if authorizationType is provided', () => { + const result = JsonRpcCondition.validate(jsonRpcConditionSchema, { + ...testJsonRpcConditionObj, + authorizationType: 'Basic', + }); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + authorizationType: { + _errors: [ + 'authorizationToken must be provided if authorizationType is set', + ], + }, + }); + }); + it.each(['InvalidType', 'Bearer ', 'Basic123', 'Y-API-Key'])( + 'rejects invalid authorization types', + (authType) => { + const result = JsonRpcCondition.validate(jsonRpcConditionSchema, { + ...testJsonRpcConditionObj, + authorizationToken: ':authToken', + authorizationType: authType, + }); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + authorizationType: { + _errors: [ + `Invalid enum value. Expected 'Bearer' | 'Basic' | 'X-API-Key', received '${authType}'`, + ], + }, + }); + }, + ); + }); describe('properties', () => { it('accepts conditions without query path', () => { diff --git a/packages/taco/test/conditions/base/json.test.ts b/packages/taco/test/conditions/base/json.test.ts new file mode 100644 index 000000000..5bfe631a8 --- /dev/null +++ b/packages/taco/test/conditions/base/json.test.ts @@ -0,0 +1,130 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { describe, expect, it } from 'vitest'; + +import { + JsonCondition, + JsonConditionProps, + jsonConditionSchema, + JsonConditionType, +} from '../../../src/conditions/base/json'; + +describe('JsonCondition', () => { + describe('validation', () => { + it('accepts valid schema with context variable data', () => { + const testJsonConditionObj: JsonConditionProps = { + conditionType: JsonConditionType, + data: ':jsonData', + query: '$.store.book[0].price', + returnValueTest: { + comparator: '==', + value: 10.5, + }, + }; + + const result = JsonCondition.validate( + jsonConditionSchema, + testJsonConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testJsonConditionObj); + }); + + it('accepts valid schema without query', () => { + const testJsonConditionObj: JsonConditionProps = { + conditionType: JsonConditionType, + data: ':jsonData', + returnValueTest: { + comparator: '==', + value: 42, + }, + }; + + const result = JsonCondition.validate( + jsonConditionSchema, + testJsonConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testJsonConditionObj); + }); + + it('rejects non-context variable data', () => { + const testJsonConditionObj = { + conditionType: JsonConditionType, + data: { store: { book: [{ price: 10.5 }] } }, + returnValueTest: { + comparator: '==', + value: 10.5, + }, + }; + + const result = JsonCondition.validate( + jsonConditionSchema, + testJsonConditionObj as unknown as JsonConditionProps, + ); + + expect(result.error).toBeDefined(); + }); + + describe('query validation', () => { + it.each([ + '$.store.book[0].price', + '$[2]', + '$.prices.usd', + '$.store.book[*].price', + '$..price', + ])('accepts valid JSONPath query: %s', (query) => { + const result = JsonCondition.validate(jsonConditionSchema, { + conditionType: JsonConditionType, + data: ':jsonData', + query, + returnValueTest: { comparator: '==', value: 0 }, + }); + + expect(result.error).toBeUndefined(); + }); + + it.each(['not-a-jsonpath', '$..[', 'random string'])( + 'rejects invalid JSONPath query: %s', + (query) => { + const result = JsonCondition.validate(jsonConditionSchema, { + conditionType: JsonConditionType, + data: ':jsonData', + query, + returnValueTest: { comparator: '==', value: 0 }, + }); + + expect(result.error).toBeDefined(); + const errorMessages = result.error?.errors.map((err) => err.message); + expect( + errorMessages?.includes('Invalid JSONPath expression'), + ).toBeTruthy(); + }, + ); + }); + + describe('context variables', () => { + it('allows context variables in data, query and return value test', () => { + const result = JsonCondition.validate(jsonConditionSchema, { + conditionType: JsonConditionType, + data: ':priceData', + query: '$.prices.:currency', + returnValueTest: { comparator: '==', value: ':expectedValue' }, + }); + + expect(result.error).toBeUndefined(); + }); + }); + + it('rejects invalid condition type', () => { + const result = JsonCondition.validate(jsonConditionSchema, { + conditionType: 'invalid-type', + data: { test: 'data' }, + returnValueTest: { comparator: '==', value: 0 }, + } as unknown as JsonConditionProps); + + expect(result.error).toBeDefined(); + }); + }); +}); diff --git a/packages/taco/test/conditions/base/rpc.test.ts b/packages/taco/test/conditions/base/rpc.test.ts index e1cb99cb6..be257c73e 100644 --- a/packages/taco/test/conditions/base/rpc.test.ts +++ b/packages/taco/test/conditions/base/rpc.test.ts @@ -42,7 +42,7 @@ describe('validation', () => { it('infers condition type from constructor', () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { conditionType, ...withoutType } = testRpcConditionObj; - const condition = new RpcCondition(testRpcConditionObj); + const condition = new RpcCondition(withoutType); expect(condition.value.conditionType).toEqual(RpcConditionType); }); diff --git a/packages/taco/test/conditions/base/signing.test.ts b/packages/taco/test/conditions/base/signing.test.ts new file mode 100644 index 000000000..8d07e12ea --- /dev/null +++ b/packages/taco/test/conditions/base/signing.test.ts @@ -0,0 +1,844 @@ +import { describe, expect, it } from 'vitest'; + +import { + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + SigningObjectAbiAttributeCondition, + signingObjectAbiAttributeConditionSchema, + SigningObjectAbiAttributeConditionType, + SigningObjectAttributeCondition, + signingObjectAttributeConditionSchema, + SigningObjectAttributeConditionType, +} from '../../../src/conditions/base/signing'; +import { + testSigningObjectAbiAttributeConditionObj, + testSigningObjectAttributeConditionObj, +} from '../../test-utils'; + +describe('SigningObjectAttributeCondition', () => { + describe('validation', () => { + it('accepts on a valid schema', () => { + const result = SigningObjectAttributeCondition.validate( + signingObjectAttributeConditionSchema, + testSigningObjectAttributeConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testSigningObjectAttributeConditionObj); + }); + + describe('rejects an invalid schema', () => { + it('rejects invalid condition type', () => { + const badSigningAttributeConditionObj = { + ...testSigningObjectAttributeConditionObj, + conditionType: 'myAttribute', + }; + const result = SigningObjectAttributeCondition.validate( + signingObjectAttributeConditionSchema, + badSigningAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + conditionType: { + _errors: ['Invalid literal value, expected "signing-attribute"'], + }, + }); + }); + it('rejects invalid context variable', () => { + const badSigningAttributeConditionObj = { + ...testSigningObjectAttributeConditionObj, + signingObjectContextVar: ':contextVar', + }; + const result = SigningObjectAttributeCondition.validate( + signingObjectAttributeConditionSchema, + badSigningAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + signingObjectContextVar: { + _errors: [ + 'Invalid literal value, expected ":signingConditionObject"', + ], + }, + }); + }); + it('rejects empty attributeName', () => { + const badSigningAttributeConditionObj = { + ...testSigningObjectAttributeConditionObj, + // Intentionally replacing `attributeName` with an invalid value + attributeName: '', + }; + + const result = SigningObjectAttributeCondition.validate( + signingObjectAttributeConditionSchema, + badSigningAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + attributeName: { + _errors: ['String must contain at least 1 character(s)'], + }, + }); + }); + it('rejects invalid attributeName value type', () => { + const badSigningAttributeConditionObj = { + ...testSigningObjectAttributeConditionObj, + // Intentionally replacing `attributeName` with an invalid value + attributeName: 100, + }; + + const result = SigningObjectAttributeCondition.validate( + signingObjectAttributeConditionSchema, + badSigningAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + attributeName: { + _errors: ['Expected string, received number'], + }, + }); + }); + }); + + it('infers condition type from constructor', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { conditionType, ...withoutType } = + testSigningObjectAttributeConditionObj; + const condition = new SigningObjectAttributeCondition(withoutType); + expect(condition.value.conditionType).toEqual( + SigningObjectAttributeConditionType, + ); + }); + it('infers context variable from constructor', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { conditionType, signingObjectContextVar, ...withoutType } = + testSigningObjectAttributeConditionObj; + const condition = new SigningObjectAttributeCondition(withoutType); + expect(condition.value.signingObjectContextVar).toEqual( + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + ); + }); + }); +}); + +describe('SigningObjectAbiAttributeCondition', () => { + it('accepts on a valid schema', () => { + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + testSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testSigningObjectAbiAttributeConditionObj); + }); + + it('rejects invalid condition type', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + conditionType: 'myAttribute', + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + conditionType: { + _errors: ['Invalid literal value, expected "signing-abi-attribute"'], + }, + }); + }); + it('rejects invalid context variable', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + signingObjectContextVar: ':contextVar', + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + signingObjectContextVar: { + _errors: ['Invalid literal value, expected ":signingConditionObject"'], + }, + }); + }); + it('rejects empty attributeName', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + // Intentionally replacing `attributeName` with an invalid value + attributeName: '', + }; + + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + attributeName: { + _errors: ['String must contain at least 1 character(s)'], + }, + }); + }); + it('rejects invalid attributeName value type', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + // Intentionally replacing `attributeName` with an invalid value + attributeName: 100, + }; + + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + attributeName: { + _errors: ['Expected string, received number'], + }, + }); + }); + it.each([ + 'transfer(address,uint256)', + 'approve(address,uint256)', + 'transferFrom(address,address,uint256)', + 'mint(address,uint256)', + 'burn(uint256)', + 'baseTypes(bool,address,bytes,string)', + 'intTypes(int256,int128,int64,int32,int16,int8)', + 'uintTypes(uint208,uint176,uint128,uint48,uint40,uint24)', + 'bytesTypes(bytes1,bytes32,bytes32,bytes29,bytes7)', + 'otherTypes(uint256,uint128,int32,int8,bytes1,bytes24)', + 'tupleType((string,uint256,address))', + 'arrayType(uint256[],address[],bytes32[],bytes20[2],int24[3],string[4],bool[])', + 'tupleArrayType((string,int256,address)[],(address,uint8,bool)[9])', + 'nestedTupleType(address,(string,uint256,(address,bool)[],(bytes,bool)))', + ])('accepts valid abi call signatures', (validAbiCallSignature) => { + const validSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + [validAbiCallSignature]: [], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + validSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toBeDefined(); + }); + it.each([ + 'invalidSignature', + 'mint(address, uint256)', // no spaces + '123start(address,uint256)', // invalid function name + '!start(address,uint256)', // invalid function name + 'bad(!!!, address)', // invalid parameter type + 'transfer(address,uint257)', // invalid parameter type uint257 + 'intType(int23)', // invalid parameter type int23 + 'uintType(uint22)', // invalid parameter type uint22 + 'bytesTypes(bytes0)', // invalid bytes type + 'bytesTypes(bytes33)', // invalid bytes type + 'transfer(address,uint256', // missing closing parenthesis + 'execute(address,uint256,(address,uint256,bytes)', // mismatched paraentheses + 'function transferFrom(address from, address to, uint256 value)', // unsupported signature format + 'function transferFrom(address,address,uint256)', // unsupported signature format + 'event Transfer(address indexed from, address indexed to, address value)', // unsupported event signature + 'transfer(,uint256)', // empty parameter type + 'transfer(address,uint256) extra', // extra text after valid signature + ])('rejects invalid abi call signatures', (invalidAbiCallSignature) => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + [invalidAbiCallSignature]: [], + }, + }, + }; + + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + [invalidAbiCallSignature]: { + _errors: ['Invalid human readable ABI signature provided'], + }, + }, + }, + }); + }); + it('rejects invalid abiCallValidation: both returnValueTest and nestedValidation', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + }, + }, + }, + ], + }, + }, + }; + + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': { + '0': { + returnValueTest: { + _errors: [ + "At most one of the fields 'returnValueTest' and 'nestedAbiValidation' must be defined", + ], + }, + }, + }, + }, + }, + }); + }); + it('rejects invalid parameterIndex in abiCallValidation', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 3, + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': { + '0': { + parameterIndex: { + _errors: ['Parameter index, "3", is out of range'], + }, + }, + }, + }, + }, + }); + }); + + it('accepts valid subIndices for array type in abiCallValidation', () => { + const validSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'batchTransfer(address[],uint256[])': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + validSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toBeDefined(); + }); + + it('rejects subIndices for non-indexable type in abiCallValidation', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': { + '0': { + subIndices: { + _errors: [ + 'Cannot apply index at subIndices position 0: type "address" is not indexable (not an array or tuple)', + ], + }, + }, + }, + }, + }, + }); + }); + + it('accepts subIndices for array of tuples', () => { + const validSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'executeBatch((address,uint256,bytes)[])': [ + { + parameterIndex: 0, + subIndices: [0, 0], // array[0] -> tuple[0] + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + validSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toBeDefined(); + }); + + it('accepts subIndices for tuple of arrays', () => { + const validSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'multiTransfer((address[],uint256[],bytes))': [ + { + parameterIndex: 0, + subIndices: [0, 0], // tuple[0] -> array[0] + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + validSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toBeDefined(); + }); + + it('rejects subIndices with out of range tuple index', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [5], // tuple only has 3 fields + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': { + '0': { + subIndices: { + _errors: [ + 'Index 5 at subIndices position 0 is out of range for tuple with 3 fields', + ], + }, + }, + }, + }, + }, + }); + }); + + it('accepts nested ABI validation with subIndices', () => { + const validSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'executeBatch(bytes[])': [ + { + parameterIndex: 0, + subIndices: [0], + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + }, + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + validSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toBeDefined(); + }); + + it('rejects nested ABI validation when subIndices resolves to non-bytes', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'batchTransfer(address[],uint256[])': [ + { + parameterIndex: 0, + subIndices: [0], + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + }, + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'batchTransfer(address[],uint256[])': { + '0': { + _errors: [ + 'Invalid type for nested ABI validation, "address"; expected bytes', + ], + }, + }, + }, + }, + }); + }); + + it('rejects subIndices on non-tuple type at parameterIndex', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': { + '0': { + subIndices: { + _errors: [ + 'Cannot apply index at subIndices position 0: type "address" is not indexable (not an array or tuple)', + ], + }, + }, + }, + }, + }, + }); + }); + + it('rejects invalid nested parameter index in abiCallValidation', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [2], + nestedAbiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 4, + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': { + '0': { + nestedAbiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': { + '0': { + parameterIndex: { + _errors: [`Parameter index, "4", is out of range`], + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + }); + it('rejects nested abi validation for non-bytes type in abiCallValidation', () => { + const badSigningObjectAbiAttributeConditionObj = { + ...testSigningObjectAbiAttributeConditionObj, + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [1], // index of uint256 + nestedAbiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 0, + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + ], + }, + }, + }, + ], + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + badSigningObjectAbiAttributeConditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error!.format()).toMatchObject({ + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': { + '0': { + _errors: [ + `Invalid type for nested ABI validation, "uint256"; expected bytes`, + ], + }, + }, + }, + }, + }); + }); + + it('infers condition type from constructor', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { conditionType, ...withoutType } = + testSigningObjectAbiAttributeConditionObj; + const condition = new SigningObjectAbiAttributeCondition(withoutType); + expect(condition.value.conditionType).toEqual( + SigningObjectAbiAttributeConditionType, + ); + }); + it('infers context variable from constructor', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { conditionType, signingObjectContextVar, ...withoutType } = + testSigningObjectAbiAttributeConditionObj; + const condition = new SigningObjectAbiAttributeCondition(withoutType); + expect(condition.value.signingObjectContextVar).toEqual( + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + ); + }); + it('handles ridiculously complex abi validation', () => { + const executeTupleAbiCallValidation: Record = { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + { + parameterIndex: 0, + subIndices: [2], + nestedAbiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 2, + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + }, + }, + }, + ], + }, + }, + }, + ], + }; + + const ridiculousNestingObj = { + conditionType: SigningObjectAbiAttributeConditionType, + signingObjectContextVar: SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + attributeName: 'callData', + abiValidation: { + allowedAbiCalls: { + 'approve(address,uint256)': [], + 'transfer(address,uint256)': [ + { + parameterIndex: 0, + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + { + parameterIndex: 1, + returnValueTest: { + comparator: '<', + value: BigInt('1000000000'), + }, + }, + ], + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 2, + returnValueTest: { + comparator: '==', + value: 0, + }, + }, + { + parameterIndex: 2, + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + 'approve(address,uint256)': [], + ...executeTupleAbiCallValidation, + }, + }, + }, + ], + 'mint(address,uint256)': [], + 'burn(uint256)': [], + ...executeTupleAbiCallValidation, + }, + }, + }; + const result = SigningObjectAbiAttributeCondition.validate( + signingObjectAbiAttributeConditionSchema, + ridiculousNestingObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(ridiculousNestingObj); + }); +}); diff --git a/packages/taco/test/conditions/base/time.test.ts b/packages/taco/test/conditions/base/time.test.ts index 06656301e..ada2c6289 100644 --- a/packages/taco/test/conditions/base/time.test.ts +++ b/packages/taco/test/conditions/base/time.test.ts @@ -30,31 +30,6 @@ describe('validation', () => { expect(result.data).toEqual(conditionObj); }); - it('rejects an invalid schema', () => { - const badObj = { - conditionType: TimeConditionType, - // Intentionally replacing `returnValueTest` with an invalid test - returnValueTest: { - ...returnValueTest, - comparator: 'not-a-comparator', - }, - chain: TEST_CHAIN_ID, - } as unknown as TimeConditionProps; - const result = TimeCondition.validate(timeConditionSchema, badObj); - - expect(result.error).toBeDefined(); - expect(result.data).toBeUndefined(); - expect(result.error?.format()).toMatchObject({ - returnValueTest: { - comparator: { - _errors: [ - "Invalid enum value. Expected '==' | '>' | '<' | '>=' | '<=' | '!=', received 'not-a-comparator'", - ], - }, - }, - }); - }); - it('infers condition type from constructor', () => { const condition = new TimeCondition({ returnValueTest, diff --git a/packages/taco/test/conditions/compound-condition.test.ts b/packages/taco/test/conditions/compound-condition.test.ts index aae719596..3d0e214cf 100644 --- a/packages/taco/test/conditions/compound-condition.test.ts +++ b/packages/taco/test/conditions/compound-condition.test.ts @@ -204,11 +204,11 @@ describe('validation', () => { }); it('limits max depth of nested compound condition', () => { + // Create 5 levels of nesting to exceed max depth of 4 const result = CompoundCondition.validate(compoundConditionSchema, { operator: 'or', operands: [ testRpcConditionObj, - testContractConditionObj, { conditionType: CompoundConditionType, operator: 'and', @@ -217,7 +217,21 @@ describe('validation', () => { { conditionType: CompoundConditionType, operator: 'or', - operands: [testTimeConditionObj, testRpcConditionObj], + operands: [ + testRpcConditionObj, + { + conditionType: CompoundConditionType, + operator: 'and', + operands: [ + testTimeConditionObj, + { + conditionType: CompoundConditionType, + operator: 'or', + operands: [testTimeConditionObj, testRpcConditionObj], + }, + ], + }, + ], }, ], }, @@ -227,20 +241,34 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ operands: { - _errors: [`Exceeded max nested depth of 2 for multi-condition type`], + _errors: [`Exceeded max nested depth of 4 for multi-condition type`], }, }); }); it('limits max depth of nested sequential condition', () => { + // Create 5 levels of nesting to exceed max depth of 4 const result = CompoundCondition.validate(compoundConditionSchema, { operator: 'or', operands: [ testRpcConditionObj, - testContractConditionObj, { conditionType: CompoundConditionType, - operator: 'not', - operands: [testSequentialConditionObj], + operator: 'and', + operands: [ + testTimeConditionObj, + { + conditionType: CompoundConditionType, + operator: 'or', + operands: [ + testRpcConditionObj, + { + conditionType: CompoundConditionType, + operator: 'not', + operands: [testSequentialConditionObj], + }, + ], + }, + ], }, ], }); @@ -248,7 +276,7 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ operands: { - _errors: ['Exceeded max nested depth of 2 for multi-condition type'], + _errors: ['Exceeded max nested depth of 4 for multi-condition type'], }, }); }); diff --git a/packages/taco/test/conditions/condition-expr.test.ts b/packages/taco/test/conditions/condition-expr.test.ts index a5a22944e..706879520 100644 --- a/packages/taco/test/conditions/condition-expr.test.ts +++ b/packages/taco/test/conditions/condition-expr.test.ts @@ -414,9 +414,7 @@ describe('condition set', () => { const conditionExprJson = conditionExpr.toJson(); expect(conditionExprJson).toBeDefined(); expect(conditionExprJson).toContain('endpoint'); - expect(conditionExprJson).toContain( - 'https://_this_would_totally_fail.com', - ); + expect(conditionExprJson).toContain('https://api.example.com/data'); expect(conditionExprJson).toContain('parameters'); expect(conditionExprJson).toContain('query'); expect(conditionExprJson).toContain('$.ethereum.usd'); diff --git a/packages/taco/test/conditions/context.test.ts b/packages/taco/test/conditions/context.test.ts index 887b29536..41156eb27 100644 --- a/packages/taco/test/conditions/context.test.ts +++ b/packages/taco/test/conditions/context.test.ts @@ -1,4 +1,5 @@ import { initialize } from '@nucypher/nucypher-core'; +import { Domain, SigningCoordinatorAgent } from '@nucypher/shared'; import { AuthProvider, AuthSignature, @@ -26,12 +27,16 @@ import { ContractConditionType, } from '../../src/conditions/base/contract'; import { RpcCondition } from '../../src/conditions/base/rpc'; +import { SIGNING_CONDITION_OBJECT_CONTEXT_VAR } from '../../src/conditions/base/signing'; import { CompoundConditionType } from '../../src/conditions/compound-condition'; import { ConditionContext, CustomContextParam, } from '../../src/conditions/context'; -import { RESERVED_CONTEXT_PARAMS } from '../../src/conditions/context/context'; +import { + AUTOMATICALLY_INJECTED_CONTEXT_PARAMS, + RESERVED_CONTEXT_PARAMS, +} from '../../src/conditions/context/context'; import { IfThenElseConditionType } from '../../src/conditions/if-then-else-condition'; import { blockchainParamOrContextParamSchema } from '../../src/conditions/schemas/context'; import { SequentialConditionType } from '../../src/conditions/sequential'; @@ -45,6 +50,8 @@ import { testJsonRpcConditionObj, testRpcConditionObj, testRpcReturnValueTest, + testSigningObjectAbiAttributeConditionObj, + testSigningObjectAttributeConditionObj, testTimeConditionObj, UINT256_MAX, } from '../test-utils'; @@ -406,11 +413,19 @@ describe('context', () => { RESERVED_CONTEXT_PARAMS.forEach((reservedParam) => { const badCustomParams: Record = {}; badCustomParams[reservedParam] = 'this-will-throw'; - expect(() => - conditionContext.addCustomContextParameterValues(badCustomParams), - ).toThrow( - `Cannot use reserved parameter name ${reservedParam} as custom parameter`, - ); + if (AUTOMATICALLY_INJECTED_CONTEXT_PARAMS.includes(reservedParam)) { + expect(() => + conditionContext.addCustomContextParameterValues(badCustomParams), + ).toThrow( + `Context parameter ${reservedParam} is automatically injected and cannot be set manually`, + ); + } else { + expect(() => + conditionContext.addCustomContextParameterValues(badCustomParams), + ).toThrow( + `Cannot use reserved parameter name ${reservedParam} as custom parameter`, + ); + } }); }); @@ -425,6 +440,47 @@ describe('context', () => { ).toThrow(`Unknown custom context parameter: ${badCustomParamKey}`); }); + describe('signing object context parameter', () => { + it.each([ + testSigningObjectAttributeConditionObj, + testSigningObjectAbiAttributeConditionObj, + ])( + 'rejects on using an auto injected signing object context parameter', + (signingObjectConditionProps) => { + const condition = ConditionFactory.conditionFromProps( + signingObjectConditionProps, + ); + const conditionContext = new ConditionContext(condition); + const badCustomParams: Record = {}; + badCustomParams[SIGNING_CONDITION_OBJECT_CONTEXT_VAR] = + 'this-will-throw'; + expect(() => + conditionContext.addCustomContextParameterValues(badCustomParams), + ).toThrow( + `Context parameter ${SIGNING_CONDITION_OBJECT_CONTEXT_VAR} is automatically injected and cannot be set manually`, + ); + }, + ); + + it.each([ + testSigningObjectAttributeConditionObj, + testSigningObjectAbiAttributeConditionObj, + ])( + 'empty condition context generated since context var will be automatically injected', + async (signingObjectConditionProps) => { + const condition = ConditionFactory.conditionFromProps( + signingObjectConditionProps, + ); + const conditionContext = new ConditionContext(condition); + expect(async () => + conditionContext.toContextParameters(), + ).not.toThrow(); + const asObj = await conditionContext.toContextParameters(); + expect(Object.keys(asObj).length).toBe(0); + }, + ); + }); + describe('custom method parameters', () => { const contractConditionObj: ContractConditionProps = { ...testContractConditionObj, @@ -933,6 +989,14 @@ describe('recognition of context variables in conditions', () => { returnValueTest: rvt, }; + const signingObjectAttributeCondition = { + ...testSigningObjectAttributeConditionObj, + }; + + const signingObjectAbiAttributeCondition = { + ...testSigningObjectAbiAttributeConditionObj, + }; + it('handles context params for rpc condition', () => { const condition = ConditionFactory.conditionFromProps(rpcCondition); const conditionContext = new ConditionContext(condition); @@ -1011,6 +1075,23 @@ describe('recognition of context variables in conditions', () => { ]), ); }); + it('handles context params for signing object attribute condition', () => { + const condition = ConditionFactory.conditionFromProps( + signingObjectAttributeCondition, + ); + const conditionContext = new ConditionContext(condition); + // Signing object context var is auto injected so not included in requested context params + expect(conditionContext.requestedContextParameters.size).toBe(0); + }); + it('handles context params for signing object abi attribute condition', () => { + const condition = ConditionFactory.conditionFromProps( + signingObjectAbiAttributeCondition, + ); + const conditionContext = new ConditionContext(condition); + + // Signing object context var is auto injected so not included in requested context params + expect(conditionContext.requestedContextParameters.size).toBe(0); + }); it.each([ { conditionType: SequentialConditionType, @@ -1044,6 +1125,14 @@ describe('recognition of context variables in conditions', () => { varName: 'jsonRpcParamsArray', condition: jsonRpcConditionParamsArray, }, + { + varName: 'signingObjectAttribute', + condition: signingObjectAttributeCondition, + }, + { + varName: 'signingObjectAbiAttribute', + condition: signingObjectAbiAttributeCondition, + }, ], }, }, @@ -1055,10 +1144,16 @@ describe('recognition of context variables in conditions', () => { operands: [ jsonApiCondition, jsonRpcConditionParamsDict, + signingObjectAbiAttributeCondition, { conditionType: CompoundConditionType, operator: 'and', - operands: [jsonRpcConditionParamsArray, rpcCondition, timeCondition], + operands: [ + jsonRpcConditionParamsArray, + rpcCondition, + timeCondition, + signingObjectAbiAttributeCondition, + ], }, { conditionType: CompoundConditionType, @@ -1079,6 +1174,7 @@ describe('recognition of context variables in conditions', () => { contractCondition, jsonApiCondition, jsonRpcConditionParamsDict, + signingObjectAbiAttributeCondition, ], }, }, @@ -1101,5 +1197,537 @@ describe('recognition of context variables in conditions', () => { ':expectedResult', ]), ); + // automatically injected signing object context variable is not included + expect(conditionContext.requestedContextParameters).not.toContain( + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + ); + }); +}); + +describe('forSigningCohort', () => { + beforeAll(async () => { + await initialize(); + }); + + it('creates ConditionContext from signing cohort conditions', async () => { + const mockProvider = fakeProvider(); + const domain = 'lynx' as Domain; + const cohortId = 1; + const chainId = 11155111; + + // Mock signing cohort conditions JSON + const mockConditionsJson = JSON.stringify({ + version: '1.0.0', + condition: { + conditionType: 'rpc', + chain: chainId, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }, + }); + + // Convert to hex string as the contract would return + const mockConditionsHex = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(mockConditionsJson), + ); + + // Mock the SigningCoordinatorAgent method + const getSigningCohortConditionsSpy = vi + .spyOn(SigningCoordinatorAgent, 'getSigningCohortConditions') + .mockResolvedValue(mockConditionsHex); + + // Test the forSigningCohort method + const conditionContext = await ConditionContext.forSigningCohort( + mockProvider, + domain, + cohortId, + chainId, + ); + + // Verify the method was called with correct parameters + expect(getSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + ); + + // Verify the context was created correctly + expect(conditionContext).toBeInstanceOf(ConditionContext); + expect(conditionContext.requestedContextParameters).toContain( + ':userAddress', + ); + + // Cleanup + getSigningCohortConditionsSpy.mockRestore(); + }); + + it('handles errors when signing cohort conditions fail to load', async () => { + const mockProvider = fakeProvider(); + const domain = 'lynx' as Domain; + const cohortId = 999; + const chainId = 11155111; + + // Mock the SigningCoordinatorAgent method to throw an error + const getSigningCohortConditionsSpy = vi + .spyOn(SigningCoordinatorAgent, 'getSigningCohortConditions') + .mockRejectedValue(new Error('Cohort not found')); + + // Test that error is propagated + await expect( + ConditionContext.forSigningCohort( + mockProvider, + domain, + cohortId, + chainId, + ), + ).rejects.toThrow('Cohort not found'); + + // Verify the method was called + expect(getSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + ); + + // Cleanup + getSigningCohortConditionsSpy.mockRestore(); + }); + + it('handles invalid JSON from signing cohort conditions', async () => { + const mockProvider = fakeProvider(); + const domain = 'lynx' as Domain; + const cohortId = 1; + const chainId = 11155111; + + // Mock the SigningCoordinatorAgent method to return invalid hex + const getSigningCohortConditionsSpy = vi + .spyOn(SigningCoordinatorAgent, 'getSigningCohortConditions') + .mockResolvedValue('0xinvalidhex'); + + // Test that JSON parse error is handled + await expect( + ConditionContext.forSigningCohort( + mockProvider, + domain, + cohortId, + chainId, + ), + ).rejects.toThrow(); + + // Verify the method was called + expect(getSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + ); + + // Cleanup + getSigningCohortConditionsSpy.mockRestore(); + }); + + it('handles complex condition structures', async () => { + const mockProvider = fakeProvider(); + const domain = 'lynx' as Domain; + const cohortId = 1; + const chainId = 11155111; + + // Mock compound condition JSON + const mockComplexConditionsJson = JSON.stringify({ + version: '1.0.0', + condition: { + conditionType: 'compound', + operator: 'and', + operands: [ + { + conditionType: 'rpc', + chain: chainId, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: 0, + }, + }, + { + conditionType: 'contract', + contractAddress: '0x1234567890123456789012345678901234567890', + chain: chainId, + standardContractType: 'ERC20', + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>=', + value: 1000, + }, + }, + ], + }, + }); + + // Convert to hex string as the contract would return + const mockComplexConditionsHex = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(mockComplexConditionsJson), + ); + + // Mock the SigningCoordinatorAgent method + const getSigningCohortConditionsSpy = vi + .spyOn(SigningCoordinatorAgent, 'getSigningCohortConditions') + .mockResolvedValue(mockComplexConditionsHex); + + // Test the forSigningCohort method with complex conditions + const conditionContext = await ConditionContext.forSigningCohort( + mockProvider, + domain, + cohortId, + chainId, + ); + + // Verify the context was created correctly + expect(conditionContext).toBeInstanceOf(ConditionContext); + expect(conditionContext.requestedContextParameters).toContain( + ':userAddress', + ); + + // Cleanup + getSigningCohortConditionsSpy.mockRestore(); + }); + + it('handles invalid condition schema', async () => { + const mockProvider = fakeProvider(); + const domain = 'lynx' as Domain; + const cohortId = 1; + const chainId = 11155111; + + // Mock invalid condition schema JSON + const mockInvalidConditionsJson = JSON.stringify({ + version: '1.0.0', + condition: { + conditionType: 'invalid_type', + missingRequiredFields: true, + }, + }); + + // Convert to hex string as the contract would return + const mockInvalidConditionsHex = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(mockInvalidConditionsJson), + ); + + // Mock the SigningCoordinatorAgent method + const getSigningCohortConditionsSpy = vi + .spyOn(SigningCoordinatorAgent, 'getSigningCohortConditions') + .mockResolvedValue(mockInvalidConditionsHex); + + // Test that invalid condition schema throws error + await expect( + ConditionContext.forSigningCohort( + mockProvider, + domain, + cohortId, + chainId, + ), + ).rejects.toThrow(); + + // Cleanup + getSigningCohortConditionsSpy.mockRestore(); + }); +}); + +describe('sequential condition varName scoping', () => { + it('excludes internal varName references from required context parameters', () => { + // This sequential condition defines varNames 'rpcValue' and 'timeValue' + // and references ':rpcValue' in a subsequent returnValueTest + // The ':rpcValue' should NOT be treated as an external context parameter + const sequentialCondition = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'rpcValue', + condition: testRpcConditionObj, + }, + { + varName: 'timeValue', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>', + value: ':rpcValue', // References internal varName + }, + }, + }, + ], + }; + + const condition = ConditionFactory.conditionFromProps(sequentialCondition); + const conditionContext = new ConditionContext(condition); + + // :rpcValue should NOT be in requestedContextParameters since it's internally defined + expect(conditionContext.requestedContextParameters.size).toBe(0); + expect(conditionContext.requestedContextParameters).not.toContain( + ':rpcValue', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':timeValue', + ); + }); + + it('correctly identifies external context params while excluding internal varNames', () => { + // This sequential condition has both: + // - Internal varNames: 'rpcValue', 'contractValue' + // - External context params: ':externalMultiplier', ':externalThreshold' + const sequentialCondition = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'rpcValue', + condition: testRpcConditionObj, + }, + { + varName: 'contractValue', + condition: { + ...testContractConditionObj, + returnValueTest: { + comparator: '>', + value: ':rpcValue', // Internal reference + }, + }, + }, + { + varName: 'finalValue', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>=', + value: ':externalThreshold', // External context param + operations: [ + { operation: '*=', value: ':externalMultiplier' }, // External context param + ], + }, + }, + }, + ], + }; + + const condition = ConditionFactory.conditionFromProps(sequentialCondition); + const conditionContext = new ConditionContext(condition); + + // Internal varNames should NOT be in requestedContextParameters + expect(conditionContext.requestedContextParameters).not.toContain( + ':rpcValue', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':contractValue', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':finalValue', + ); + + // External context params SHOULD be in requestedContextParameters + expect(conditionContext.requestedContextParameters.size).toBe(2); + expect(conditionContext.requestedContextParameters).toContain( + ':externalThreshold', + ); + expect(conditionContext.requestedContextParameters).toContain( + ':externalMultiplier', + ); + }); + + it('handles nested sequential conditions with varName scoping', () => { + // Nested sequential conditions should have their varNames properly scoped + const nestedSequentialCondition = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'outerRpc', + condition: testRpcConditionObj, + }, + { + varName: 'nestedSequential', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'innerRpc', + condition: testRpcConditionObj, + }, + { + varName: 'innerTime', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>', + value: ':innerRpc', // References inner varName + }, + }, + }, + ], + }, + }, + { + varName: 'outerFinal', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>=', + value: ':outerRpc', // References outer varName + }, + }, + }, + ], + }; + + const condition = ConditionFactory.conditionFromProps( + nestedSequentialCondition, + ); + const conditionContext = new ConditionContext(condition); + + // All internal varNames (outer and inner) should NOT be in requestedContextParameters + expect(conditionContext.requestedContextParameters).not.toContain( + ':outerRpc', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':nestedSequential', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':innerRpc', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':innerTime', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':outerFinal', + ); + + // Should have no external context parameters in this case + expect(conditionContext.requestedContextParameters.size).toBe(0); + }); + + it('handles compound conditions containing sequential conditions with varName scoping', () => { + const compoundWithSequential = { + conditionType: CompoundConditionType, + operator: 'or', + operands: [ + { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'seqVar1', + condition: testRpcConditionObj, + }, + { + varName: 'seqVar2', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>', + value: ':seqVar1', // Internal reference + }, + }, + }, + ], + }, + { + ...testContractConditionObj, + returnValueTest: { + comparator: '>=', + value: ':externalParam', // External context param + }, + }, + ], + }; + + const condition = ConditionFactory.conditionFromProps( + compoundWithSequential, + ); + const conditionContext = new ConditionContext(condition); + + // Internal varNames should NOT be in requestedContextParameters + expect(conditionContext.requestedContextParameters).not.toContain( + ':seqVar1', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':seqVar2', + ); + + // External context param SHOULD be in requestedContextParameters + expect(conditionContext.requestedContextParameters.size).toBe(1); + expect(conditionContext.requestedContextParameters).toContain( + ':externalParam', + ); + }); + it('handles external context variable within sequential', () => { + const compoundWithSequential = { + conditionType: CompoundConditionType, + operator: 'or', + operands: [ + { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'seqVar1', + condition: testRpcConditionObj, + }, + { + varName: 'seqVar2', + condition: { + ...testTimeConditionObj, + returnValueTest: { + comparator: '>', + value: ':externalContextVar1', // External context param + }, + }, + }, + { + varName: 'seqVar3', + condition: { + ...testContractConditionObj, + returnValueTest: { + comparator: '<=', + value: ':seqVar1', // Internal reference + }, + }, + }, + ], + }, + { + ...testContractConditionObj, + returnValueTest: { + comparator: '>=', + value: ':externalContextVar2', // External context param + }, + }, + ], + }; + + const condition = ConditionFactory.conditionFromProps( + compoundWithSequential, + ); + const conditionContext = new ConditionContext(condition); + + // Internal varNames should NOT be in requestedContextParameters + expect(conditionContext.requestedContextParameters).not.toContain( + ':seqVar1', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':seqVar2', + ); + expect(conditionContext.requestedContextParameters).not.toContain( + ':seqVar3', + ); + + // External context param SHOULD be in requestedContextParameters + expect(conditionContext.requestedContextParameters.size).toBe(2); + expect(conditionContext.requestedContextParameters).toContain( + ':externalContextVar1', + ); + expect(conditionContext.requestedContextParameters).toContain( + ':externalContextVar2', + ); }); }); diff --git a/packages/taco/test/conditions/if-then-else-condition.test.ts b/packages/taco/test/conditions/if-then-else-condition.test.ts index 50897ec9f..c2bc5c5e3 100644 --- a/packages/taco/test/conditions/if-then-else-condition.test.ts +++ b/packages/taco/test/conditions/if-then-else-condition.test.ts @@ -115,11 +115,23 @@ describe('validation', () => { ); it('limits max depth of nested if condition', () => { + // Need 5 levels of nesting to exceed max depth of 4 + // ifThenElse(1) -> ifThenElse(2) -> ifThenElse(3) -> ifThenElse(4) -> compound(5) const result = IfThenElseCondition.validate(ifThenElseConditionSchema, { ifCondition: { conditionType: IfThenElseConditionType, - ifCondition: testRpcConditionObj, - thenCondition: testCompoundConditionObj, + ifCondition: { + conditionType: IfThenElseConditionType, + ifCondition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testCompoundConditionObj, + elseCondition: testTimeConditionObj, + }, + thenCondition: testTimeConditionObj, + elseCondition: true, + }, + thenCondition: testTimeConditionObj, elseCondition: testTimeConditionObj, }, thenCondition: testRpcConditionObj, @@ -129,18 +141,30 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ ifCondition: { - _errors: [`Exceeded max nested depth of 2 for multi-condition type`], + _errors: [`Exceeded max nested depth of 4 for multi-condition type`], }, }); }); it('limits max depth of nested then condition', () => { + // Need 5 levels of nesting to exceed max depth of 4 + // ifThenElse(1) -> ifThenElse(2) -> ifThenElse(3) -> ifThenElse(4) -> compound(5) const result = IfThenElseCondition.validate(ifThenElseConditionSchema, { ifCondition: testRpcConditionObj, thenCondition: { conditionType: IfThenElseConditionType, ifCondition: testRpcConditionObj, - thenCondition: testCompoundConditionObj, + thenCondition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testCompoundConditionObj, + elseCondition: true, + }, + elseCondition: true, + }, elseCondition: true, }, elseCondition: testTimeConditionObj, @@ -149,27 +173,39 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ thenCondition: { - _errors: [`Exceeded max nested depth of 2 for multi-condition type`], + _errors: [`Exceeded max nested depth of 4 for multi-condition type`], }, }); }); it('limits max depth of nested else condition', () => { + // Need 5 levels of nesting to exceed max depth of 4 + // ifThenElse(1) -> ifThenElse(2) -> ifThenElse(3) -> ifThenElse(4) -> sequential(5) const result = IfThenElseCondition.validate(ifThenElseConditionSchema, { ifCondition: testRpcConditionObj, thenCondition: testTimeConditionObj, elseCondition: { conditionType: IfThenElseConditionType, ifCondition: testRpcConditionObj, - thenCondition: testSequentialConditionObj, - elseCondition: testTimeConditionObj, + thenCondition: testTimeConditionObj, + elseCondition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testTimeConditionObj, + elseCondition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testSequentialConditionObj, + elseCondition: testTimeConditionObj, + }, + }, }, }); expect(result.error).toBeDefined(); expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ elseCondition: { - _errors: [`Exceeded max nested depth of 2 for multi-condition type`], + _errors: [`Exceeded max nested depth of 4 for multi-condition type`], }, }); }); diff --git a/packages/taco/test/conditions/lingo.test.ts b/packages/taco/test/conditions/lingo.test.ts index 526e4d258..3878612e1 100644 --- a/packages/taco/test/conditions/lingo.test.ts +++ b/packages/taco/test/conditions/lingo.test.ts @@ -5,6 +5,7 @@ import { ContractCondition } from '../../src/conditions/base/contract'; import { ConditionExpression } from '../../src/conditions/condition-expr'; import { INT256_MIN, + testECDSAConditionObj, testJsonApiConditionObj, testJsonRpcConditionObj, testJWTConditionObj, @@ -89,6 +90,7 @@ describe('check that valid lingo in python is valid in typescript', () => { testJsonApiConditionObj, testJsonRpcConditionObj, testJWTConditionObj, + testECDSAConditionObj, compoundConditionProps, sequentialConditionProps, ifThenElseConditionProps, diff --git a/packages/taco/test/conditions/predefined/address-allowlist.test.ts b/packages/taco/test/conditions/predefined/address-allowlist.test.ts new file mode 100644 index 000000000..0bfb7b341 --- /dev/null +++ b/packages/taco/test/conditions/predefined/address-allowlist.test.ts @@ -0,0 +1,188 @@ +import { describe, expect, it } from 'vitest'; + +import { ContextVariableConditionType } from '../../../src/conditions/base/context-variable'; +import { + AddressAllowlistCondition, + AddressAllowlistConditionProps, +} from '../../../src/conditions/predefined/address-allowlist'; +import { addressAllowlistConditionSchema } from '../../../src/conditions/schemas/address-allowlist'; +import { testAddressAllowlistConditionObj } from '../../test-utils'; + +describe('AddressAllowlistCondition', () => { + describe('validate', () => { + it('accepts valid condition object', () => { + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + testAddressAllowlistConditionObj, + ); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(testAddressAllowlistConditionObj); + }); + + it('transforms to ContextVariableCondition with correct conditionType', () => { + const condition = new AddressAllowlistCondition( + testAddressAllowlistConditionObj, + ); + + expect(condition.toObj().conditionType).toBe( + ContextVariableConditionType, + ); + }); + + it('rejects unknown fields', () => { + const conditionObj = { + ...testAddressAllowlistConditionObj, + unknownField: 'unknown', + } as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + // The error format for unknown fields is just a top-level _errors array + expect(result.error?.format()).toMatchObject({ + _errors: ['Expected array, received object'], + }); + }); + + it('requires addresses to be present', () => { + const conditionObj = + undefined as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + _errors: ['Required'], + }); + }); + + it('requires addresses to be an array', () => { + const conditionObj = + 'not-an-array' as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain('Expected array'); + }); + + it('requires at least one address', () => { + const conditionObj = [] as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain( + 'At least one address must be provided', + ); + }); + + it('enforces a maximum of 25 addresses', () => { + // Create an array of 26 valid Ethereum addresses + const tooManyAddresses = Array(26) + .fill(0) + .map((_, i) => `0x${(i + 10).toString().padStart(40, '0')}`); + + const conditionObj = + tooManyAddresses as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain( + 'A maximum of 25 addresses is allowed', + ); + }); + + it('requires addresses to be valid Ethereum addresses', () => { + const conditionObj = [ + 'not-an-eth-address', + ] as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain('Invalid Ethereum address'); + }); + + it('requires addresses to be checksummed', () => { + const conditionObj = [ + '0x1e988ba4692e52bc50b375bcc8585b95c48aad77', + ] as unknown as AddressAllowlistConditionProps; + + const result = AddressAllowlistCondition.validate( + addressAllowlistConditionSchema, + conditionObj, + ); + + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.message).toContain( + 'Invalid Ethereum address - it must be valid and checksummed', + ); + }); + }); + + describe('constructor', () => { + it('creates a condition from a valid object', () => { + const condition = new AddressAllowlistCondition( + testAddressAllowlistConditionObj, + ); + expect(condition.toObj()).toEqual({ + conditionType: 'context-variable', + contextVariable: ':userAddress', + returnValueTest: { + comparator: 'in', + value: [ + '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + '0x0000000000000000000000000000000000000001', + '0x0000000000000000000000000000000000000002', + ], + }, + }); + }); + + it('throws an error for invalid condition', () => { + const invalidCondition = () => { + return new AddressAllowlistCondition([]); + }; + + // The error is wrapped in a general Error with message containing the Zod validation error + expect(invalidCondition).toThrow(/Invalid condition/); + }); + }); + + describe('requiresAuthentication', () => { + it('returns true', () => { + const condition = new AddressAllowlistCondition( + testAddressAllowlistConditionObj, + ); + expect(condition.requiresAuthentication()).toBe(true); + }); + }); +}); diff --git a/packages/taco/test/conditions/return-value-test.test.ts b/packages/taco/test/conditions/return-value-test.test.ts new file mode 100644 index 000000000..b0fd39942 --- /dev/null +++ b/packages/taco/test/conditions/return-value-test.test.ts @@ -0,0 +1,138 @@ +import { describe, expect, it } from 'vitest'; + +import { + MAX_VARIABLE_OPERATIONS, + OPERATOR_FUNCTIONS, +} from '../../src/conditions/schemas/variable-operation'; +import { + blockchainReturnValueTestSchema, + returnValueTestSchema, +} from '../../src/conditions/shared'; +import { getTestValueForOperation } from '../test-utils'; + +[blockchainReturnValueTestSchema, returnValueTestSchema].forEach((schema) => { + describe('validates schema', () => { + it('throws an error for invalid comparator', async () => { + const result = schema.safeParse({ + comparator: 'not-a-comparator', + value: 0, + }); + expect(result.success).toBe(false); + expect(result.error?.format()).toMatchObject({ + comparator: { + _errors: [ + "Invalid enum value. Expected '==' | '>' | '<' | '>=' | '<=' | '!=' | 'in' | '!in', received 'not-a-comparator'", + ], + }, + }); + }); + it.each([ + ['>', 0], + ['>=', 0], + ['<', 0], + ['<=', 0], + ['==', 0], + ['!=', 0], + ['in', ['value1', 'value2', 'value3']], + ['!in', ['value1', 'value2', 'value3']], + ])('valid comparator value combination', async (testComparator, value) => { + const result = schema.safeParse({ + comparator: testComparator, + value: value, + }); + expect(result.success).toBe(true); + expect(result.error).toBeUndefined(); + }); + it.each([ + ['in', 0], + ['in', 'string'], + ['in', true], + ['in', []], + ['!in', 0], + ['!in', 'string'], + ['!in', true], + ['!in', []], + ])( + 'must be a non-empty array value for "in"/"!in" operators', + async (testComparator, value) => { + const result = schema.safeParse({ + comparator: testComparator, + value: value, + }); + expect(result.success).toBe(false); + expect(result.error!.format()).toMatchObject({ + value: { + _errors: [ + '"value" must be a non-empty array when comparator is "in"/"!in"', + ], + }, + }); + }, + ); + it.each(OPERATOR_FUNCTIONS)('allows valid operations', (operation) => { + const result = schema.safeParse({ + comparator: '==', + value: 10, + operations: [ + { + operation: operation, + value: getTestValueForOperation(operation), + }, + ], + }); + expect(result.success).toBe(true); + expect(result.error).toBeUndefined(); + }); + it('requires at least one operation if defined', () => { + const result = schema.safeParse({ + comparator: '==', + value: 10, + operations: [], + }); + expect(result.success).toBe(false); + expect(result.error).toBeDefined(); + expect(result.error!.format()).toMatchObject({ + operations: { + _errors: ['Array must contain at least 1 element(s)'], + }, + }); + }); + it(`allows at most ${MAX_VARIABLE_OPERATIONS} operations`, () => { + const result = schema.safeParse({ + comparator: '==', + value: 10, + operations: Array.from( + { length: MAX_VARIABLE_OPERATIONS + 1 }, + (_, i) => ({ + operation: '+=', + value: i + 1, + }), + ), + }); + expect(result.success).toBe(false); + expect(result.error).toBeDefined(); + expect(result.error!.format()).toMatchObject({ + operations: { + _errors: [ + `Array must contain at most ${MAX_VARIABLE_OPERATIONS} element(s)`, + ], + }, + }); + }); + it('allows multiple valid operations', () => { + const result = schema.safeParse({ + comparator: '==', + value: 10, + operations: [ + { operation: 'index', value: 1 }, + { operation: '+=', value: 5 }, + { operation: '*=', value: 2.5 }, + { operation: 'abs' }, + { operation: '+=', value: BigInt('1000000000000000') }, + ], + }); + expect(result.success).toBe(true); + expect(result.error).toBeUndefined(); + }); + }); +}); diff --git a/packages/taco/test/conditions/sequential.test.ts b/packages/taco/test/conditions/sequential.test.ts index 0c08b2b95..fe3f75601 100644 --- a/packages/taco/test/conditions/sequential.test.ts +++ b/packages/taco/test/conditions/sequential.test.ts @@ -2,6 +2,11 @@ import { ChainId } from '@nucypher/shared'; import { describe, expect, it } from 'vitest'; import { CompoundConditionType } from '../../src/conditions/compound-condition'; +import { IfThenElseConditionType } from '../../src/conditions/if-then-else-condition'; +import { + MAX_VARIABLE_OPERATIONS, + OPERATOR_FUNCTIONS, +} from '../../src/conditions/schemas/variable-operation'; import { ConditionVariableProps, SequentialCondition, @@ -10,10 +15,11 @@ import { SequentialConditionType, } from '../../src/conditions/sequential'; import { + getTestValueForOperation, testCompoundConditionObj, testContractConditionObj, + testJsonApiConditionObj, testRpcConditionObj, - testSequentialConditionObj, testTimeConditionObj, } from '../test-utils'; @@ -34,9 +40,25 @@ describe('validation', () => { varName: 'compound', condition: testCompoundConditionObj, }; - const sequentialConditionVariable: ConditionVariableProps = { + const nestedSequentialConditionVariable: ConditionVariableProps = { varName: 'nestedSequential', - condition: testSequentialConditionObj, + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'nestedRpc', + condition: testRpcConditionObj, + }, + { + varName: 'nestedTime', + condition: testTimeConditionObj, + }, + { + varName: 'nestedContract', + condition: testContractConditionObj, + }, + ], + }, }; it('rejects no varName', () => { @@ -90,7 +112,7 @@ describe('validation', () => { }); it('rejects > max number of condition variables', () => { - const tooManyConditionVariables = new Array(6); + const tooManyConditionVariables = new Array(21); for (let i = 0; i < tooManyConditionVariables.length; i++) { tooManyConditionVariables[i] = { varName: `var${i}`, @@ -105,7 +127,7 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ conditionVariables: { - _errors: ['Array must contain at most 5 element(s)'], + _errors: ['Array must contain at most 20 element(s)'], }, }); }); @@ -135,7 +157,84 @@ describe('validation', () => { ], }); }); - + it('rejects nested sequential with duplicate varname', () => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + rpcConditionVariable, + timeConditionVariable, + contractConditionVariable, + { + varName: 'nestedSequential', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + contractConditionVariable, + { + varName: 'nestedTime', + condition: testTimeConditionObj, + }, + ], + }, + }, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + conditionVariables: { + _errors: ['Duplicate variable names are not allowed'], + }, + }); + }); + it.each([true, false, testJsonApiConditionObj])( + 'rejects nested sequential with duplicate varname within nested if-then-else', + (variedElseCondition) => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'ifThenElse', + condition: { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testTimeConditionObj, + elseCondition: variedElseCondition, + }, + }, + contractConditionVariable, + { + varName: 'nestedSequential', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + contractConditionVariable, + { + varName: 'nestedTime', + condition: testTimeConditionObj, + }, + ], + }, + }, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.data).toBeUndefined(); + expect(result.error?.format()).toMatchObject({ + conditionVariables: { + _errors: ['Duplicate variable names are not allowed'], + }, + }); + }, + ); it('accepts nested sequential and compound conditions', () => { const conditionObj = { conditionType: SequentialConditionType, @@ -144,7 +243,7 @@ describe('validation', () => { timeConditionVariable, contractConditionVariable, compoundConditionVariable, - sequentialConditionVariable, + nestedSequentialConditionVariable, ], }; const result = SequentialCondition.validate( @@ -159,12 +258,14 @@ describe('validation', () => { timeConditionVariable, contractConditionVariable, compoundConditionVariable, - sequentialConditionVariable, + nestedSequentialConditionVariable, ], }); }); it('limits max depth of nested compound condition', () => { + // Need 5 levels of nesting to exceed max depth of 4 + // sequential(1) -> compound(2) -> compound(3) -> compound(4) -> compound(5) const result = SequentialCondition.validate(sequentialConditionSchema, { conditionVariables: [ rpcConditionVariable, @@ -178,7 +279,21 @@ describe('validation', () => { { conditionType: CompoundConditionType, operator: 'and', - operands: [testTimeConditionObj, testRpcConditionObj], + operands: [ + { + conditionType: CompoundConditionType, + operator: 'or', + operands: [ + { + conditionType: CompoundConditionType, + operator: 'not', + operands: [testTimeConditionObj], + }, + testRpcConditionObj, + ], + }, + testTimeConditionObj, + ], }, ], }, @@ -189,23 +304,64 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ conditionVariables: { - _errors: [`Exceeded max nested depth of 2 for multi-condition type`], + _errors: [`Exceeded max nested depth of 4 for multi-condition type`], }, }); }); it('limits max depth of nested sequential condition', () => { + // Need 5 levels of nesting to exceed max depth of 4 + // sequential(1) -> sequential(2) -> sequential(3) -> sequential(4) -> sequential(5) const result = SequentialCondition.validate(sequentialConditionSchema, { conditionVariables: [ rpcConditionVariable, contractConditionVariable, { - varName: 'sequentialNested', + varName: 'level2', condition: { conditionType: SequentialConditionType, conditionVariables: [ timeConditionVariable, - sequentialConditionVariable, + { + varName: 'level3', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'level4a', + condition: testRpcConditionObj, + }, + { + varName: 'level4', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'level5a', + condition: testTimeConditionObj, + }, + { + varName: 'level5', + condition: { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'level6a', + condition: testTimeConditionObj, + }, + { + varName: 'level6b', + condition: testContractConditionObj, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, ], }, }, @@ -215,7 +371,7 @@ describe('validation', () => { expect(result.data).toBeUndefined(); expect(result.error?.format()).toMatchObject({ conditionVariables: { - _errors: ['Exceeded max nested depth of 2 for multi-condition type'], + _errors: ['Exceeded max nested depth of 4 for multi-condition type'], }, }); }); @@ -293,4 +449,131 @@ describe('validation', () => { }); expect(condition.value.conditionType).toEqual(SequentialConditionType); }); + + it.each(OPERATOR_FUNCTIONS)('allows valid operations', (operation) => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'var1', + condition: testRpcConditionObj, + operations: [ + { + operation: operation, + value: getTestValueForOperation(operation), + }, + ], + }, + rpcConditionVariable, + timeConditionVariable, + contractConditionVariable, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(conditionObj); + }); + it('requires at least one operation if defined', () => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'var1', + condition: testRpcConditionObj, + operations: [], + }, + contractConditionVariable, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.error?.format()).toMatchObject({ + conditionVariables: { + '0': { + operations: { + _errors: ['Array must contain at least 1 element(s)'], + }, + }, + }, + }); + expect(result.data).toBeUndefined(); + }); + it(`allows at most ${MAX_VARIABLE_OPERATIONS} operations`, () => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'var1', + condition: testRpcConditionObj, + operations: Array.from( + { length: MAX_VARIABLE_OPERATIONS + 1 }, + (_, i) => ({ + operation: '*=', + value: i + 1, + }), + ), + }, + contractConditionVariable, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeDefined(); + expect(result.error?.format()).toMatchObject({ + conditionVariables: { + '0': { + operations: { + _errors: [ + `Array must contain at most ${MAX_VARIABLE_OPERATIONS} element(s)`, + ], + }, + }, + }, + }); + expect(result.data).toBeUndefined(); + }); + it('allows multiple operations', () => { + const conditionObj = { + conditionType: SequentialConditionType, + conditionVariables: [ + { + varName: 'var1', + condition: testRpcConditionObj, + operations: [ + { operation: 'index', value: 1 }, + { operation: '*=', value: 2.5 }, + { operation: '-=', value: 5.5 }, + { operation: 'int' }, + { operation: '+=', value: BigInt('1000000000000000') }, + ], + }, + { + varName: 'var2', + condition: testTimeConditionObj, + operations: [ + { operation: 'ceil' }, + { operation: '/=', value: 2.5 }, + { operation: 'floor' }, + { operation: 'ethToWei' }, + { operation: 'weiToEth' }, + ], + }, + contractConditionVariable, + ], + }; + const result = SequentialCondition.validate( + sequentialConditionSchema, + conditionObj, + ); + expect(result.error).toBeUndefined(); + expect(result.data).toEqual(conditionObj); + }); }); diff --git a/packages/taco/test/conditions/variable-operation.test.ts b/packages/taco/test/conditions/variable-operation.test.ts new file mode 100644 index 000000000..706f7ff3f --- /dev/null +++ b/packages/taco/test/conditions/variable-operation.test.ts @@ -0,0 +1,199 @@ +import { describe, expect, it } from 'vitest'; + +import { + OPERATOR_FUNCTIONS, + UNARY_OPERATOR_FUNCTIONS, + variableOperationSchema, +} from '../../src/conditions/schemas/variable-operation'; +import { getTestValueForOperation } from '../test-utils'; + +describe('validates schema', () => { + it.each(OPERATOR_FUNCTIONS)('allows valid operation', (operation) => { + const result = variableOperationSchema.safeParse({ + operation: operation, + value: getTestValueForOperation(operation), + }); + expect(result.success).toBe(true); + expect(result.error).toBeUndefined(); + }); + it.each(UNARY_OPERATOR_FUNCTIONS)( + 'disallows operations when value is missing for operation that requires a value', + (operation) => { + const result = variableOperationSchema.safeParse({ + operation: operation, + value: 5, // value should be omitted for these operations + }); + expect(result.success).toBe(false); + expect(result.error!.format()).toMatchObject({ + value: { + _errors: ['Value not allowed for this operation'], + }, + }); + }, + ); + + it.each( + OPERATOR_FUNCTIONS.filter((op) => !UNARY_OPERATOR_FUNCTIONS.includes(op)), + )( + 'disallows operations when value is not provided for operation that requires a value', + (operation) => { + const result = variableOperationSchema.safeParse({ + operation: operation, + // value is missing for these operations + }); + expect(result.success).toBe(false); + expect(result.error!.format()).toMatchObject({ + value: { + _errors: ['Value must be defined for operation'], + }, + }); + }, + ); +}); + +describe('toTokenBaseUnits operator', () => { + it('validates toTokenBaseUnits operator with decimals value', () => { + const result = variableOperationSchema.safeParse({ + operation: 'toTokenBaseUnits', + value: 18, + }); + expect(result.success).toBe(true); + expect(result.data).toEqual({ + operation: 'toTokenBaseUnits', + value: 18, + }); + }); + + it('validates toTokenBaseUnits operator with context parameter', () => { + const result = variableOperationSchema.safeParse({ + operation: 'toTokenBaseUnits', + value: ':tokenDecimals', + }); + expect(result.success).toBe(true); + expect(result.data).toEqual({ + operation: 'toTokenBaseUnits', + value: ':tokenDecimals', + }); + }); + + it('rejects toTokenBaseUnits operator without value', () => { + const result = variableOperationSchema.safeParse({ + operation: 'toTokenBaseUnits', + }); + expect(result.success).toBe(false); + expect(result.error!.format()).toMatchObject({ + value: { + _errors: ['Value must be defined for operation'], + }, + }); + }); +}); + +describe('create2 operator', () => { + it('validates create2 operator with deployerAddress and bytecodeHash', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: { + deployerAddress: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + bytecodeHash: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + }, + }); + expect(result.success).toBe(true); + expect(result.data).toEqual({ + operation: 'create2', + value: { + deployerAddress: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + bytecodeHash: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + }, + }); + }); + + it('validates create2 operator with context parameters', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: { + deployerAddress: ':factoryAddress', + bytecodeHash: ':initCodeHash', + }, + }); + expect(result.success).toBe(true); + expect(result.data).toEqual({ + operation: 'create2', + value: { + deployerAddress: ':factoryAddress', + bytecodeHash: ':initCodeHash', + }, + }); + }); + + it('validates create2 operator with mixed literal and context parameter', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: { + deployerAddress: '0x69Aa2f9fe1572F1B640E1bbc512f5c3a734fc77c', + bytecodeHash: ':initCodeHash', + }, + }); + expect(result.success).toBe(true); + }); + + it('rejects create2 operator without value', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + }); + expect(result.success).toBe(false); + // Multiple validation errors occur: missing value + invalid create2 value structure + const errors = result.error!.format().value?._errors ?? []; + expect(errors.length).toBeGreaterThan(0); + }); + + it('rejects create2 operator with missing deployerAddress', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: { + bytecodeHash: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + }, + }); + expect(result.success).toBe(false); + }); + + it('rejects create2 operator with missing bytecodeHash', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: { + deployerAddress: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + }, + }); + expect(result.success).toBe(false); + }); + + it('rejects create2 operator with primitive value', () => { + const result = variableOperationSchema.safeParse({ + operation: 'create2', + value: 5, + }); + expect(result.success).toBe(false); + }); + + it.each( + OPERATOR_FUNCTIONS.filter( + (op) => !UNARY_OPERATOR_FUNCTIONS.includes(op) && op !== 'create2', + ), + )( + 'rejects create2-shaped value for non-create2 operation %s', + (operation) => { + const result = variableOperationSchema.safeParse({ + operation, + value: { + deployerAddress: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + bytecodeHash: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + }, + }); + expect(result.success).toBe(false); + }, + ); +}); diff --git a/packages/taco/test/taco-sign.test.ts b/packages/taco/test/taco-sign.test.ts new file mode 100644 index 000000000..0498ea19e --- /dev/null +++ b/packages/taco/test/taco-sign.test.ts @@ -0,0 +1,916 @@ +import { + EncryptedThresholdSignatureRequest, + PackedUserOperation, + SessionStaticKey, + SessionStaticSecret, + SignatureResponse, + UserOperation, +} from '@nucypher/nucypher-core'; +import { + fromHexString, + initialize, + isPackedUserOperation, + PackedUserOperationToSign, + PorterClient, + SignerInfo, + SigningCoordinatorAgent, + toCorePackedUserOperation, + toCoreUserOperation, + UserOperationToSign, +} from '@nucypher/shared'; +import { fakePorterUri } from '@nucypher/test-utils'; +import { ethers } from 'ethers'; +import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; + +import { ContractCondition } from '../src/conditions/base/contract'; +import { RpcCondition } from '../src/conditions/base/rpc'; +import { CompoundCondition } from '../src/conditions/compound-condition'; +import { ConditionExpression } from '../src/conditions/condition-expr'; +import { AAVersion, setSigningCohortConditions, signUserOp } from '../src/sign'; + +import { mockMakeSessionKey } from './test-utils'; + +function toBigInt(value: bigint | number): bigint { + return typeof value === 'bigint' ? value : BigInt(value); +} + +function checkPackedUserOpEquality( + op1: PackedUserOperationToSign, + op2: PackedUserOperation, +) { + expect(op1.sender).toEqual(op2.sender); + + expect(toBigInt(op1.nonce).toString()).toEqual(`${op2.nonce}`); // nonce as string internally to support big numbers + + const initCode = + op1.initCode instanceof Uint8Array + ? op1.initCode + : fromHexString(op1.initCode); + expect(initCode).toEqual(op2.initCode); + + const callData = + op1.callData instanceof Uint8Array + ? op1.callData + : fromHexString(op1.callData); + expect(callData).toEqual(op2.callData); + + const accountGasLimits = + op1.accountGasLimits instanceof Uint8Array + ? op1.accountGasLimits + : fromHexString(op1.accountGasLimits); + expect(accountGasLimits).toEqual(op2.accountGasLimits); + + expect(toBigInt(op1.preVerificationGas)).toEqual(op2.preVerificationGas); + + const gasFees = + op1.gasFees instanceof Uint8Array + ? op1.gasFees + : fromHexString(op1.gasFees); + expect(gasFees).toEqual(op2.gasFees); + + const paymasterAndData = + op1.paymasterAndData instanceof Uint8Array + ? op1.paymasterAndData + : fromHexString(op1.paymasterAndData); + expect(paymasterAndData).toEqual(op2.paymasterAndData); +} + +function checkUserOpEquality(op1: UserOperationToSign, op2: UserOperation) { + expect(op1.sender).toEqual(op2.sender); + + expect(toBigInt(op1.nonce).toString()).toEqual(`${op2.nonce}`); // nonce as string internally to support big numbers + + const callData = + op1.callData instanceof Uint8Array + ? op1.callData + : fromHexString(op1.callData); + expect(callData).toEqual(op2.callData); + + expect(toBigInt(op1.callGasLimit)).toEqual(op2.callGasLimit); + expect(toBigInt(op1.verificationGasLimit)).toEqual(op2.verificationGasLimit); + expect(toBigInt(op1.preVerificationGas)).toEqual(op2.preVerificationGas); + expect(toBigInt(op1.maxFeePerGas)).toEqual(op2.maxFeePerGas); + expect(toBigInt(op1.maxPriorityFeePerGas)).toEqual(op2.maxPriorityFeePerGas); + + if (op1.factory === undefined) { + expect(op2.factory).toBeUndefined(); + } else { + expect(op1.factory).toEqual(op2.factory); + } + + if (op1.factoryData === undefined) { + expect(op2.factoryData).toBeUndefined(); + } else { + const factoryData = + op1.factoryData instanceof Uint8Array + ? op1.factoryData + : fromHexString(op1.factoryData); + expect(factoryData).toEqual(op2.factoryData); + } + + if (op1.paymaster === undefined) { + expect(op2.paymaster).toBeUndefined(); + } else { + expect(op1.paymaster).toEqual(op2.paymaster); + } + + if (op1.paymasterVerificationGasLimit === undefined) { + expect(op2.paymasterVerificationGasLimit).toBeUndefined(); + } else { + expect(toBigInt(op1.paymasterVerificationGasLimit)).toEqual( + op2.paymasterVerificationGasLimit, + ); + } + + if (op1.paymasterPostOpGasLimit === undefined) { + expect(op2.paymasterPostOpGasLimit).toBeUndefined(); + } else { + expect(toBigInt(op1.paymasterPostOpGasLimit)).toEqual( + op2.paymasterPostOpGasLimit, + ); + } + + if (op1.paymasterData === undefined) { + expect(op2.paymasterData).toBeUndefined(); + } else { + const paymasterData = + op1.paymasterData instanceof Uint8Array + ? op1.paymasterData + : fromHexString(op1.paymasterData); + expect(paymasterData).toEqual(op2.paymasterData); + } +} + +describe('TACo Signing', () => { + let porterSignUserOpMock: ReturnType; + let mockProvider: ethers.providers.Provider; + + beforeAll(async () => { + await initialize(); + }); + + let signersInfo: Record; + let requesterSk: SessionStaticSecret; + let signerStaticKeys: Record; + + beforeEach(() => { + porterSignUserOpMock = vi.fn(); + mockProvider = {} as ethers.providers.Provider; + + vi.spyOn(PorterClient.prototype, 'signUserOp').mockImplementation( + porterSignUserOpMock, + ); + signerStaticKeys = { + '0xnode1': SessionStaticSecret.random().publicKey(), + '0xnode2': SessionStaticSecret.random().publicKey(), + }; + + requesterSk = SessionStaticSecret.random(); + mockMakeSessionKey(requesterSk); + + signersInfo = { + '0xnode1': { + signerAddress: '0x0000000000000000000000000000000000000001', + provider: '0xnode1', + signingRequestStaticKey: signerStaticKeys['0xnode1'], + }, + '0xnode2': { + signerAddress: '0x0000000000000000000000000000000000000002', + provider: '0xnode2', + signingRequestStaticKey: signerStaticKeys['0xnode2'], + }, + }; + + vi.spyOn(SigningCoordinatorAgent, 'getParticipants').mockResolvedValue( + Object.values(signersInfo), + ); + vi.spyOn(SigningCoordinatorAgent, 'getThreshold').mockResolvedValue(2); + }); + + describe('toCoreUserOperation', () => { + const userOpToSign: UserOperationToSign = { + sender: '0x742D35Cc6634C0532925A3b8D33c9c0E7B66C8E8', + nonce: BigInt(1), + callData: fromHexString('0xabc'), + callGasLimit: BigInt(131072), + verificationGasLimit: BigInt(86016), + preVerificationGas: BigInt(4096), + maxFeePerGas: BigInt(2748), + maxPriorityFeePerGas: BigInt(291), + }; + + it('should convert base fields', () => { + const coreUserOp = toCoreUserOperation(userOpToSign); + checkUserOpEquality(userOpToSign, coreUserOp); + }); + it('should allow factory optional fields', () => { + const updatedUserOp: UserOperationToSign = { + ...userOpToSign, + factory: '0x000000000000000000000000000000000000000A', + factoryData: fromHexString('0xdef'), + }; + const coreUserOp = toCoreUserOperation(updatedUserOp); + checkUserOpEquality(updatedUserOp, coreUserOp); + }); + it('should allow factory and no factory data', () => { + const updatedUserOp: UserOperationToSign = { + ...userOpToSign, + factory: '0x000000000000000000000000000000000000000A', + }; + const coreUserOp = toCoreUserOperation(updatedUserOp); + checkUserOpEquality(updatedUserOp, coreUserOp); + }); + it('should allow paymaster optional fields with paymasterData', () => { + const updatedUserOp: UserOperationToSign = { + ...userOpToSign, + paymaster: '0x000000000000000000000000000000000000000C', + paymasterVerificationGasLimit: BigInt(50000), + paymasterPostOpGasLimit: BigInt(30000), + paymasterData: fromHexString('0xdef'), + }; + const coreUserOp = toCoreUserOperation(updatedUserOp); + checkUserOpEquality(updatedUserOp, coreUserOp); + }); + it('should allow paymaster optional fields with no paymasterData', () => { + const updatedUserOp: UserOperationToSign = { + ...userOpToSign, + paymaster: '0x000000000000000000000000000000000000000C', + paymasterVerificationGasLimit: BigInt(50000), + paymasterPostOpGasLimit: BigInt(30000), + }; + const coreUserOp = toCoreUserOperation(updatedUserOp); + checkUserOpEquality(updatedUserOp, coreUserOp); + }); + it('should raise when paymaster specified but other required fields are not present', () => { + let updatedUserOp: UserOperationToSign = { + ...userOpToSign, + paymaster: '0x000000000000000000000000000000000000000C', + // missing required paymasterVerificationGasLimit and paymasterPostOpGasLimit + }; + expect(() => toCoreUserOperation(updatedUserOp)).toThrow( + 'paymasterVerificationGasLimit is required when paymaster is set', + ); + + updatedUserOp = { + ...updatedUserOp, + paymasterVerificationGasLimit: BigInt(50000), + // missing required paymasterPostOpGasLimit + }; + expect(() => toCoreUserOperation(updatedUserOp)).toThrow( + 'paymasterPostOpGasLimit is required when paymaster is set', + ); + }); + it('should handle alternative types: number and byte fields', () => { + const updatedUserOp: UserOperationToSign = { + ...userOpToSign, + // number instead of bigint, hex instead of byte array + nonce: 1, + callData: '0xabc', + callGasLimit: 131072, + verificationGasLimit: 86016, + preVerificationGas: 4096, + maxFeePerGas: 2748, + maxPriorityFeePerGas: 291, + // include optional fields + factory: '0x000000000000000000000000000000000000000A', + factoryData: '0xabc', + + paymaster: '0x000000000000000000000000000000000000000C', + // number instead of big int + paymasterVerificationGasLimit: 50000, + paymasterPostOpGasLimit: 30000, + paymasterData: '0xdef', + }; + const coreUserOp = toCoreUserOperation(updatedUserOp); + checkUserOpEquality(updatedUserOp, coreUserOp); + }); + }); + describe('toCorePackedUserOperation', () => { + const packedUserOpToSign: PackedUserOperationToSign = { + sender: '0x742D35Cc6634C0532925A3b8D33c9c0E7B66C8E8', + nonce: BigInt(123), + initCode: fromHexString('0xabc'), + callData: fromHexString('0xdef'), + accountGasLimits: fromHexString('0x01020304'), + preVerificationGas: BigInt(101112), + gasFees: fromHexString('0x05060708'), + paymasterAndData: fromHexString('0x090a0b0c'), + }; + + it('should convert base fields', () => { + const corePackedUserOp = toCorePackedUserOperation(packedUserOpToSign); + checkPackedUserOpEquality(packedUserOpToSign, corePackedUserOp); + }); + it('should handle alternative types: number and byte fields', () => { + const updatedPackedUserOp: PackedUserOperationToSign = { + // number instead of bigint, hex instead of byte array + ...packedUserOpToSign, + nonce: 1, + initCode: '0xabc', + callData: '0xdef', + accountGasLimits: '0x01020304', + preVerificationGas: 4096, + gasFees: '0x05060708', + paymasterAndData: '0x090a0b0c', + }; + const corePackedUserOp = toCorePackedUserOperation(updatedPackedUserOp); + checkPackedUserOpEquality(updatedPackedUserOp, corePackedUserOp); + }); + }); + + describe('signUserOp', () => { + const userOp: UserOperationToSign = { + sender: '0x742D35Cc6634C0532925A3b8D33c9c0E7B66C8E8', + nonce: BigInt(1), + callData: fromHexString('0xabc'), + callGasLimit: BigInt(131072), + verificationGasLimit: BigInt(86016), + preVerificationGas: BigInt(4096), + maxFeePerGas: BigInt(2748), + maxPriorityFeePerGas: BigInt(291), + }; + const packedUserOp: PackedUserOperationToSign = { + sender: '0x742D35Cc6634C0532925A3b8D33c9c0E7B66C8E8', + nonce: BigInt(1), + initCode: fromHexString('0xabc'), + callData: fromHexString('0xdef'), + accountGasLimits: fromHexString('0x01020304'), + preVerificationGas: BigInt(101112), + gasFees: fromHexString('0x05060708'), + paymasterAndData: fromHexString('0x090a0b0c'), + }; + + const chainId = 1; + const cohortId = 5; + const porterUris = [fakePorterUri]; + const aaVersion = '0.8.0'; + const threshold = 2; + + const validAAVersionCases: Array< + [AAVersion, UserOperationToSign | PackedUserOperationToSign] + > = [ + ['0.7.0', userOp], + ['0.7.0', packedUserOp], + ['0.8.0', userOp], + ['0.8.0', packedUserOp], + ['mdt', userOp], + ['mdt', packedUserOp], + ]; + it.each(validAAVersionCases)( + 'should sign user operation and packed user operations for valid aa versions', + async ( + validAAVersion: AAVersion, + userOp: UserOperationToSign | PackedUserOperationToSign, + ) => { + const encryptedResponses = { + // return out of order to ensure sorting works correctly + '0xnode2': new SignatureResponse( + signersInfo['0xnode2'].signerAddress, + fromHexString('0xa1'), + fromHexString('0xbeef'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode2'].signingRequestStaticKey, + ), + ), + '0xnode1': new SignatureResponse( + signersInfo['0xnode1'].signerAddress, + fromHexString('0xa1'), + fromHexString('0xdead'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode1'].signingRequestStaticKey, + ), + ), + }; + const errors = {}; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + const result = await signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + validAAVersion, + undefined, + porterUris, + ); + + expect(porterSignUserOpMock).toHaveBeenCalledWith( + { + '0xnode1': expect.any(EncryptedThresholdSignatureRequest), + '0xnode2': expect.any(EncryptedThresholdSignatureRequest), + }, + threshold, + ); + + const call = + porterSignUserOpMock.mock.calls[ + porterSignUserOpMock.mock.calls.length - 1 + ]!; + const [op] = call; + + const nodes = ['0xnode1', '0xnode2']; + nodes.forEach((node) => { + const element = op[node]; + const decryptedRequest = element.decrypt( + requesterSk.deriveSharedSecret( + signersInfo[node].signingRequestStaticKey, + ), + ); + + if (isPackedUserOperation(userOp)) { + checkPackedUserOpEquality(userOp, decryptedRequest.packedUserOp); + } else { + checkUserOpEquality(userOp, decryptedRequest.userOp); + } + expect(decryptedRequest.aaVersion).toEqual(validAAVersion); + expect(decryptedRequest.cohortId).toEqual(cohortId); + expect(decryptedRequest.chainId).toEqual(BigInt(chainId)); + expect(decryptedRequest.context).toBeUndefined(); + }); + + expect(result).toEqual({ + messageHash: '0xa1', + aggregatedSignature: '0xdeadbeef', + signingResults: { + '0xnode1': { + messageHash: '0xa1', + signature: '0xdead', + signerAddress: signersInfo['0xnode1'].signerAddress, + }, + '0xnode2': { + messageHash: '0xa1', + signature: '0xbeef', + signerAddress: signersInfo['0xnode2'].signerAddress, + }, + }, + }); + }, + ); + + it('should handle only errors in Porter response', async () => { + // Mock a response with errors from Porter + const encryptedResponses = {}; + const errors = { + '0xnode1': 'Failed to sign', + '0xnode2': 'Failed to sign', + }; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + await expect( + signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + aaVersion, + undefined, + porterUris, + ), + ).rejects.toThrow( + `Threshold of signatures not met; TACo signing failed with errors: ${JSON.stringify(errors)}`, + ); + + expect(porterSignUserOpMock).toHaveBeenCalledWith( + { + '0xnode1': expect.any(EncryptedThresholdSignatureRequest), + '0xnode2': expect.any(EncryptedThresholdSignatureRequest), + }, + threshold, + ); + const call = + porterSignUserOpMock.mock.calls[ + porterSignUserOpMock.mock.calls.length - 1 + ]!; + const [op] = call; + + const nodes = ['0xnode1', '0xnode2']; + nodes.forEach((node) => { + const element = op[node]; + const decryptedRequest = element.decrypt( + requesterSk.deriveSharedSecret( + signersInfo[node].signingRequestStaticKey, + ), + ); + checkUserOpEquality(userOp, decryptedRequest.userOp); + expect(decryptedRequest.aaVersion).toEqual(aaVersion); + expect(decryptedRequest.cohortId).toEqual(cohortId); + expect(decryptedRequest.chainId).toEqual(BigInt(chainId)); + expect(decryptedRequest.context).toBeUndefined(); + }); + }); + it('should handle insufficient signatures in Porter response', async () => { + const encryptedResponses = { + '0xnode1': new SignatureResponse( + signersInfo['0xnode1'].signerAddress, + fromHexString('0xa1'), + fromHexString('0xdead'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode1'].signingRequestStaticKey, + ), + ), + }; + + const errors = { + '0xnode2': 'Failed to sign', + }; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + await expect( + signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + aaVersion, + undefined, + porterUris, + ), + ).rejects.toThrow( + `Threshold of signatures not met; TACo signing failed with errors: ${JSON.stringify(errors)}`, + ); + }); + + it('should handle insufficient matched hashes in Porter response', async () => { + // use 3 signers - it matters based on how mismatched hashes are handled + const node3SecretKey = SessionStaticSecret.random(); + vi.spyOn(SigningCoordinatorAgent, 'getParticipants').mockResolvedValue([ + ...Object.values(signersInfo), + { + signerAddress: '0x0000000000000000000000000000000000000003', + provider: '0xnode3', + signingRequestStaticKey: node3SecretKey.publicKey(), + }, + ]); + + const encryptedResponses = { + '0xnode1': new SignatureResponse( + signersInfo['0xnode1'].signerAddress, + fromHexString('0xa1'), + fromHexString('0xdead'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode1'].signingRequestStaticKey, + ), + ), + '0xnode2': new SignatureResponse( + signersInfo['0xnode2'].signerAddress, + fromHexString('0xa2'), + fromHexString('0xbeef'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode2'].signingRequestStaticKey, + ), + ), + '0xnode3': new SignatureResponse( + '0x0000000000000000000000000000000000000003', + fromHexString('0xa3'), + fromHexString('0xcafe'), + 0, + ).encrypt(requesterSk.deriveSharedSecret(node3SecretKey.publicKey())), + }; + const errors = {}; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + await expect( + signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + aaVersion, + undefined, + porterUris, + ), + ).rejects.toThrowError(/multiple mismatched hashes/); + }); + + it('properly handles threshold of 1 signature from Porter', async () => { + vi.spyOn(SigningCoordinatorAgent, 'getThreshold').mockResolvedValue(1); + + const encryptedResponses = { + '0xnode1': new SignatureResponse( + signersInfo['0xnode1'].signerAddress, + fromHexString('0xa1'), + fromHexString('0xdead'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode1'].signingRequestStaticKey, + ), + ), + }; + const errors = { + '0xnode2': 'Failed to sign', + }; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + const result = await signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + aaVersion, + undefined, + porterUris, + ); + + expect(result).toEqual({ + messageHash: '0xa1', + aggregatedSignature: '0xdead', + signingResults: { + '0xnode1': { + messageHash: '0xa1', + signature: '0xdead', + signerAddress: signersInfo['0xnode1'].signerAddress, + }, + }, + }); + }); + + it('ignore errors/mismatched hashes if threshold of matching hashes and signatures from Porter', async () => { + const node3SecretKey = SessionStaticSecret.random(); + const node4SecretKey = SessionStaticSecret.random(); + vi.spyOn(SigningCoordinatorAgent, 'getParticipants').mockResolvedValue([ + ...Object.values(signersInfo), + { + signerAddress: '0x0000000000000000000000000000000000000003', + provider: '0xnode3', + signingRequestStaticKey: node3SecretKey.publicKey(), + }, + { + signerAddress: '0x000000000000000000000000000000000000004', + provider: '0xnode4', + signingRequestStaticKey: node4SecretKey.publicKey(), + }, + ]); + + const encryptedResponses = { + '0xnode1': new SignatureResponse( + signersInfo['0xnode1'].signerAddress, + fromHexString('0xa1'), // matching hash + fromHexString('0xdead'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode1'].signingRequestStaticKey, + ), + ), + '0xnode2': new SignatureResponse( + signersInfo['0xnode2'].signerAddress, + fromHexString('0xa2'), + fromHexString('0xbeef'), + 0, + ).encrypt( + requesterSk.deriveSharedSecret( + signersInfo['0xnode2'].signingRequestStaticKey, + ), + ), + '0xnode3': new SignatureResponse( + '0x0000000000000000000000000000000000000003', + fromHexString('0xa3'), + fromHexString('0xcafe'), + 0, + ).encrypt(requesterSk.deriveSharedSecret(node3SecretKey.publicKey())), + '0xnode4': new SignatureResponse( + '0x0000000000000000000000000000000000000004', + fromHexString('0xa1'), // matching hash + fromHexString('0xcafe'), + 0, + ).encrypt(requesterSk.deriveSharedSecret(node4SecretKey.publicKey())), + }; + const errors = { + '0x7890': 'Failed to sign', + }; + + porterSignUserOpMock.mockResolvedValue({ + encryptedResponses, + errors, + }); + + const result = await signUserOp( + mockProvider, + 'lynx', + cohortId, + chainId, + userOp, + aaVersion, + undefined, + porterUris, + ); + + expect(result).toEqual({ + messageHash: '0xa1', + aggregatedSignature: '0xdeadcafe', // from node1 and node4 + signingResults: { + '0xnode1': { + messageHash: '0xa1', + signature: '0xdead', + signerAddress: signersInfo['0xnode1'].signerAddress, + }, + '0xnode4': { + messageHash: '0xa1', + signature: '0xcafe', + signerAddress: '0x0000000000000000000000000000000000000004', + }, + }, + }); + }); + }); + + describe('setSigningCohortConditions', () => { + let mockSigner: ethers.Signer; + let mockProvider: ethers.providers.JsonRpcProvider; + let setSigningCohortConditionsSpy: ReturnType; + + beforeEach(() => { + mockProvider = {} as ethers.providers.JsonRpcProvider; + mockSigner = {} as ethers.Signer; + setSigningCohortConditionsSpy = vi.fn(); + + vi.spyOn( + SigningCoordinatorAgent, + 'setSigningCohortConditions', + ).mockImplementation(setSigningCohortConditionsSpy); + }); + + it('should set signing cohort conditions successfully', async () => { + const domain = 'lynx'; + const cohortId = 1; + const chainId = 11155111; + const mockTransaction = { hash: '0x123' } as ethers.ContractTransaction; + + // Create a real ConditionExpression with RPC condition + const rpcCondition = new RpcCondition({ + chain: chainId, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: BigInt(0), + }, + }); + + const conditionExpression = new ConditionExpression(rpcCondition); + const expectedJson = conditionExpression.toJson(); + const expectedBytes = ethers.utils.toUtf8Bytes(expectedJson); + + setSigningCohortConditionsSpy.mockResolvedValue(mockTransaction); + + const result = await setSigningCohortConditions( + mockProvider, + domain, + rpcCondition, + cohortId, + chainId, + mockSigner, + ); + + expect(setSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + expectedBytes, + mockSigner, + ); + expect(result).toBe(mockTransaction); + }); + + it('should handle complex condition expressions', async () => { + const domain = 'lynx'; + const cohortId = 1; + const chainId = 11155111; + const mockTransaction = { hash: '0x456' } as ethers.ContractTransaction; + + // Create a real compound ConditionExpression + const rpcCondition = new RpcCondition({ + chain: chainId, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: BigInt(0), + }, + }); + + const contractCondition = new ContractCondition({ + contractAddress: '0x1234567890123456789012345678901234567890', + chain: chainId, + standardContractType: 'ERC20', + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>=', + value: BigInt(1000), + }, + }); + + const compoundCondition = CompoundCondition.and([ + rpcCondition, + contractCondition, + ]); + const conditionExpression = new ConditionExpression(compoundCondition); + const expectedJson = conditionExpression.toJson(); + const expectedBytes = ethers.utils.toUtf8Bytes(expectedJson); + + setSigningCohortConditionsSpy.mockResolvedValue(mockTransaction); + + const result = await setSigningCohortConditions( + mockProvider, + domain, + compoundCondition, + cohortId, + chainId, + mockSigner, + ); + + expect(setSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + expectedBytes, + mockSigner, + ); + expect(result).toBe(mockTransaction); + }); + + it('should handle errors from SigningCoordinatorAgent', async () => { + const domain = 'lynx'; + const cohortId = 999; + const chainId = 11155111; + + // Create a real ConditionExpression + const rpcCondition = new RpcCondition({ + chain: chainId, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>', + value: BigInt(0), + }, + }); + + const conditionExpression = new ConditionExpression(rpcCondition); + const expectedJson = conditionExpression.toJson(); + const expectedBytes = ethers.utils.toUtf8Bytes(expectedJson); + + setSigningCohortConditionsSpy.mockRejectedValue( + new Error('Cohort not found'), + ); + + await expect( + setSigningCohortConditions( + mockProvider, + domain, + rpcCondition, + cohortId, + chainId, + mockSigner, + ), + ).rejects.toThrow('Cohort not found'); + + expect(setSigningCohortConditionsSpy).toHaveBeenCalledWith( + mockProvider, + domain, + cohortId, + chainId, + expectedBytes, + mockSigner, + ); + }); + }); +}); diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index e035f211f..23ce52803 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -63,7 +63,7 @@ describe('taco', () => { const { decryptionShares } = fakeTDecFlow({ ...mockedDkg, message: toBytes(message), - dkgPublicKey: mockedDkg.dkg.publicKey(), + dkgPublicKey: mockedDkg.serverAggregate.publicKey, thresholdMessageKit: messageKit, }); const { participantSecrets, participants } = await mockDkgParticipants( diff --git a/packages/taco/test/test-utils.ts b/packages/taco/test/test-utils.ts index 5beac4443..fafc34eaa 100644 --- a/packages/taco/test/test-utils.ts +++ b/packages/taco/test/test-utils.ts @@ -3,6 +3,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unused-vars */ +import { createHash } from 'crypto'; + import { AggregatedTranscript, DecryptionShareSimple, @@ -36,11 +38,26 @@ import { import { ethers } from 'ethers'; import { MockInstance, vi } from 'vitest'; +import { + ContextVariableConditionProps, + ContextVariableConditionType, +} from '../src/conditions/base/context-variable'; import { ContractConditionProps, ContractConditionType, FunctionAbiProps, } from '../src/conditions/base/contract'; +import { + ECDSA_MESSAGE_PARAM_DEFAULT, + ECDSA_SIGNATURE_PARAM_DEFAULT, + ECDSACondition, + ECDSAConditionProps, + ECDSAConditionType, +} from '../src/conditions/base/ecdsa'; +import { + JsonConditionProps, + JsonConditionType, +} from '../src/conditions/base/json'; import { JsonApiConditionProps, JsonApiConditionType, @@ -54,6 +71,13 @@ import { RpcConditionProps, RpcConditionType, } from '../src/conditions/base/rpc'; +import { + SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + SigningObjectAbiAttributeConditionProps, + SigningObjectAbiAttributeConditionType, + SigningObjectAttributeConditionProps, + SigningObjectAttributeConditionType, +} from '../src/conditions/base/signing'; import { TimeConditionMethod, TimeConditionProps, @@ -64,11 +88,17 @@ import { CompoundConditionType, } from '../src/conditions/compound-condition'; import { ConditionExpression } from '../src/conditions/condition-expr'; +import { + IfThenElseConditionProps, + IfThenElseConditionType, +} from '../src/conditions/if-then-else-condition'; +import { AddressAllowlistConditionProps } from '../src/conditions/predefined/address-allowlist'; import { ERC721Balance } from '../src/conditions/predefined/erc721'; import { JsonRpcConditionProps, JsonRpcConditionType, } from '../src/conditions/schemas/json-rpc'; +import { UNARY_OPERATOR_FUNCTIONS } from '../src/conditions/schemas/variable-operation'; import { SequentialConditionProps, SequentialConditionType, @@ -80,6 +110,24 @@ import { import { DkgClient, DkgRitual } from '../src/dkg'; import { encryptMessage } from '../src/tdec'; +/** + * Returns a valid test value for the given operation type. + * Used in parameterized tests that iterate over OPERATOR_FUNCTIONS. + */ +export const getTestValueForOperation = (operation: string) => { + if (UNARY_OPERATOR_FUNCTIONS.includes(operation)) { + return undefined; + } + if (operation === 'create2') { + return { + deployerAddress: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f', + bytecodeHash: + '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f', + }; + } + return 5; +}; + export const fakeDkgTDecFlowE2E: ( ritualId?: number, variant?: FerveoVariant, @@ -109,7 +157,7 @@ export const fakeDkgTDecFlowE2E: ( threshold = 4, ) => { const ritual = fakeDkgFlow(variant, ritualId, sharesNum, threshold); - const dkgPublicKey = ritual.dkg.publicKey(); + const dkgPublicKey = ritual.serverAggregate.publicKey; const provider = fakeProvider(); const thresholdMessageKit = await encryptMessage( message, @@ -135,7 +183,7 @@ export const fakeDkgTDecFlowE2E: ( export const fakeCoordinatorRitual = async (): Promise => { const ritual = await fakeDkgTDecFlowE2E(); - const dkgPkBytes = ritual.dkg.publicKey().toBytes(); + const dkgPkBytes = ritual.serverAggregate.publicKey.toBytes(); return { initiator: ritual.validators[0].address.toString(), dkgSize: ritual.sharesNum, @@ -196,10 +244,11 @@ export const fakeDkgRitual = (ritual: { dkg: Dkg; sharesNum: number; threshold: number; + serverAggregate: AggregatedTranscript; }) => { return new DkgRitual( fakeRitualId, - ritual.dkg.publicKey(), + ritual.serverAggregate.publicKey, ritual.sharesNum, ritual.threshold, DkgRitualState.ACTIVE, @@ -218,16 +267,6 @@ export const mockGetActiveRitual = (dkgRitual: DkgRitual): MockInstance => { }); }; -export const mockIsEncryptionAuthorized = ( - isAuthorized = true, -): MockInstance => { - return vi - .spyOn(DkgCoordinatorAgent, 'isEncryptionAuthorized') - .mockImplementation(async () => { - return Promise.resolve(isAuthorized); - }); -}; - export const mockMakeSessionKey = (secret: SessionStaticSecret) => { return vi .spyOn(SessionStaticSecret, 'random') @@ -256,9 +295,26 @@ export const testTimeConditionObj: TimeConditionProps = { chain: TEST_CHAIN_ID, }; +export const testAddressAllowlistConditionObj: AddressAllowlistConditionProps = + [ + '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + '0x0000000000000000000000000000000000000001', + '0x0000000000000000000000000000000000000002', + ]; + +export const testJsonConditionObj: JsonConditionProps = { + conditionType: JsonConditionType, + data: ':jsonData', + query: '$.store.book[0].price', + returnValueTest: { + comparator: '==', + value: 10.5, + }, +}; + export const testJsonApiConditionObj: JsonApiConditionProps = { conditionType: JsonApiConditionType, - endpoint: 'https://_this_would_totally_fail.com', + endpoint: 'https://api.example.com/data', parameters: { ids: 'ethereum', vs_currencies: 'usd', @@ -286,6 +342,62 @@ export const testJWTConditionObj: JWTConditionProps = { jwtToken: JWT_PARAM_DEFAULT, }; +export const testECDSAConditionObj: ECDSAConditionProps = { + conditionType: ECDSAConditionType, + message: ECDSA_MESSAGE_PARAM_DEFAULT, + signature: ECDSA_SIGNATURE_PARAM_DEFAULT, + verifyingKey: + '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', // Test verifying key + curve: 'SECP256k1', +}; + +// Test utility for creating predefined ECDSA conditions (simulates server-side creation) +// In production, these would be created by servers/admins and stored with their verifying keys +export interface TestSecp256k1ECDSAConditionInfo { + condition: ECDSACondition; + privateKey: string; // For test signature generation only +} + +export function createTestSecp256k1ECDSACondition( + message: string, +): TestSecp256k1ECDSAConditionInfo { + const curve = 'SECP256k1'; + + // Simulate server-side key generation for the predefined condition + // ethers.Wallet uses SECP256k1 by default + const testWallet = ethers.Wallet.createRandom(); + const verifyingKey = testWallet.publicKey.slice(2); // Remove '0x' prefix + + return { + condition: new ECDSACondition({ + message: message, + signature: ECDSA_SIGNATURE_PARAM_DEFAULT, + verifyingKey: verifyingKey, + curve: curve, + }), + privateKey: testWallet.privateKey, // For test purposes only + }; +} + +export function createSignatureForTestSecp256k1ECDSACondition( + predefinedCondition: TestSecp256k1ECDSAConditionInfo, + messageToSign: string, +): string { + // Create signature that matches Python backend expectations + const messageHash = createHash('sha256') + .update(Buffer.from(messageToSign, 'utf8')) + .digest(); + const signingKey = new ethers.utils.SigningKey( + predefinedCondition.privateKey, + ); + const signature = signingKey.signDigest(messageHash); + + // Convert to hex format expected by Python (r+s format without 0x prefix) + const rHex = signature.r.slice(2).padStart(64, '0'); + const sHex = signature.s.slice(2).padStart(64, '0'); + return rHex + sHex; +} + export const testRpcConditionObj: RpcConditionProps = { conditionType: RpcConditionType, chain: TEST_CHAIN_ID, @@ -294,6 +406,18 @@ export const testRpcConditionObj: RpcConditionProps = { returnValueTest: testRpcReturnValueTest, }; +export const testContextVariableConditionObj: ContextVariableConditionProps = { + conditionType: ContextVariableConditionType, + contextVariable: ':userAddress', + returnValueTest: { + comparator: 'in', + value: [ + '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + '0x0000000000000000000000000000000000000001', + ], + }, +}; + export const testContractConditionObj: ContractConditionProps = { conditionType: ContractConditionType, contractAddress: '0x0000000000000000000000000000000000000000', @@ -332,6 +456,64 @@ export const testSequentialConditionObj: SequentialConditionProps = { ], }; +export const testIfThenElseConditionObj: IfThenElseConditionProps = { + conditionType: IfThenElseConditionType, + ifCondition: testRpcConditionObj, + thenCondition: testTimeConditionObj, + elseCondition: testContractConditionObj, +}; + +export const testSigningObjectAttributeConditionObj: SigningObjectAttributeConditionProps = + { + conditionType: SigningObjectAttributeConditionType, + signingObjectContextVar: ':signingConditionObject', + attributeName: 'value', + returnValueTest: { + comparator: '>', + value: 100, + }, + }; + +// some nested abi calls +export const testSigningObjectAbiAttributeConditionObj: SigningObjectAbiAttributeConditionProps = + { + conditionType: SigningObjectAbiAttributeConditionType, + signingObjectContextVar: SIGNING_CONDITION_OBJECT_CONTEXT_VAR, + attributeName: 'callData', + abiValidation: { + allowedAbiCalls: { + 'execute((address,uint256,bytes))': [ + { + parameterIndex: 0, + subIndices: [0], + returnValueTest: { + comparator: '==', + value: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + }, + }, + { + parameterIndex: 0, + subIndices: [2], + nestedAbiValidation: { + allowedAbiCalls: { + 'execute(address,uint256,bytes)': [ + { + parameterIndex: 2, + nestedAbiValidation: { + allowedAbiCalls: { + 'transfer(address,uint256)': [], + }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + }; + export const testFunctionAbi: FunctionAbiProps = { name: 'myFunction', type: 'function', diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index cea78cb70..d6c7f3ec0 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -29,10 +29,10 @@ "lint:fix": "pnpm lint --fix" }, "dependencies": { - "@nucypher/nucypher-core": "^0.14.5", + "@nucypher/nucypher-core": "^0.16.0", "@nucypher/shared": "workspace:*", "@nucypher/taco-auth": "workspace:*", - "axios": "^1.8.4", + "axios": "^1.13.5", "ethers": "^5.8.0", "vitest": "^3.0.9" }, diff --git a/packages/test-utils/src/utils.ts b/packages/test-utils/src/utils.ts index dc328f23c..77395dd87 100644 --- a/packages/test-utils/src/utils.ts +++ b/packages/test-utils/src/utils.ts @@ -239,7 +239,7 @@ export const fakeDkgFlow = ( for (let i = 0; i < sharesNum; i++) { const keypair = Keypair.random(); validatorKeypairs.push(keypair); - const validator = new Validator(genEthAddr(i), keypair.publicKey); + const validator = new Validator(genEthAddr(i), keypair.publicKey, i); validators.push(validator); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7393a03f0..2f0f5c1a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@nucypher/nucypher-core': ^0.14.5 + '@nucypher/nucypher-core': ^0.16.0 glob-parent@<5.1.2: '>=5.1.2' node-forge@<1.0.0: '>=1.0.0' node-forge@<1.3.0: '>=1.3.0' @@ -17,10 +17,10 @@ importers: dependencies: '@changesets/cli': specifier: ^2.28.1 - version: 2.28.1 + version: 2.29.5 '@nucypher/nucypher-core': - specifier: ^0.14.5 - version: 0.14.5 + specifier: ^0.16.0 + version: 0.16.0 ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -29,20 +29,20 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@types/node': - specifier: ^20.17.28 - version: 20.17.28 + specifier: ^24.3.0 + version: 24.3.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) + version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@vitest/coverage-v8': - specifier: ^3.0.9 - version: 3.1.1(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) + specifier: ^3.2.4 + version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0)) bundlemon: - specifier: ^2.1.0 - version: 2.1.0 + specifier: ^3.1.0 + version: 3.1.0(typescript@5.8.3) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -51,13 +51,13 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-config-typestrict: specifier: ^1.0.5 - version: 1.0.5(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint-plugin-sonarjs@0.23.0(eslint@8.57.1)) + version: 1.0.5(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-sonarjs@3.0.3(eslint@8.57.1)) eslint-plugin-eslint-comments: specifier: ^3.2.0 version: 3.2.0(eslint@8.57.1) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 @@ -65,8 +65,8 @@ importers: specifier: ^10.0.0 version: 10.0.0(eslint@8.57.1) eslint-plugin-unused-imports: - specifier: ^3.2.0 - version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1) + specifier: ^4.1.4 + version: 4.1.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -75,43 +75,43 @@ importers: version: 4.1.5 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.1 prettier-plugin-organize-imports: specifier: ^3.2.4 - version: 3.2.4(prettier@3.5.3)(typescript@5.8.2) + version: 3.2.4(prettier@3.6.1)(typescript@5.8.3) sort-package-json: specifier: ^2.15.1 version: 2.15.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.28)(typescript@5.8.2) + version: 10.9.2(@types/node@24.3.0)(typescript@5.8.3) ts-unused-exports: specifier: ^10.1.0 - version: 10.1.0(typescript@5.8.2) + version: 10.1.0(typescript@5.8.3) typedoc: specifier: ^0.25.13 - version: 0.25.13(typescript@5.8.2) + version: 0.25.13(typescript@5.8.3) typedoc-plugin-coverage: - specifier: ^2.2.0 - version: 2.2.0(typedoc@0.25.13(typescript@5.8.2)) + specifier: ^3.4.1 + version: 3.4.1(typedoc@0.25.13(typescript@5.8.3)) typedoc-plugin-missing-exports: specifier: ^2.3.0 - version: 2.3.0(typedoc@0.25.13(typescript@5.8.2)) + version: 2.3.0(typedoc@0.25.13(typescript@5.8.3)) typedoc-plugin-zod: - specifier: ^1.4.0 - version: 1.4.0(typedoc@0.25.13(typescript@5.8.2)) + specifier: ^1.4.2 + version: 1.4.2(typedoc@0.25.13(typescript@5.8.3)) typescript: specifier: ^5.8.2 - version: 5.8.2 + version: 5.8.3 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0) demos/taco-demo: dependencies: '@irys/sdk': specifier: ^0.1.24 - version: 0.1.24(arweave@1.15.0)(bufferutil@4.0.9)(got@11.8.6)(utf-8-validate@5.0.10) + version: 0.1.24(arweave@1.15.7)(bufferutil@4.0.9)(got@11.8.6)(typescript@4.9.5)(utf-8-validate@5.0.10) '@nucypher/taco': specifier: ^0.6.0 version: 0.6.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -129,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -144,35 +144,35 @@ importers: version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@pmmmwh/react-refresh-webpack-plugin': - specifier: ^0.5.15 - version: 0.5.15(react-refresh@0.14.2)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^0.6.0 + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 - version: 18.3.20 + version: 18.3.23 '@types/react-copy-to-clipboard': specifier: ^5.0.7 version: 5.0.7 '@types/react-dom': specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) copy-webpack-plugin: - specifier: ^12.0.2 - version: 12.0.2(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^13.0.0 + version: 13.0.0(webpack@5.99.9) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.98.0(webpack-cli@5.1.4)) + version: 5.6.3(webpack@5.99.9) process: specifier: ^0.11.10 version: 0.11.10 react-refresh: - specifier: ^0.14.2 - version: 0.14.2 + specifier: ^0.17.0 + version: 0.17.0 rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -186,14 +186,14 @@ importers: specifier: ^1.1.2 version: 1.1.2 webpack: - specifier: ^5.98.0 - version: 5.98.0(webpack-cli@5.1.4) + specifier: ^5.99.9 + version: 5.99.9(webpack-cli@6.0.1) webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + specifier: ^6.0.1 + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) webpack-dev-server: - specifier: ^4.15.2 - version: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + specifier: ^5.2.2 + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) demos/taco-nft-demo: dependencies: @@ -214,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -229,29 +229,29 @@ importers: version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@pmmmwh/react-refresh-webpack-plugin': - specifier: ^0.5.15 - version: 0.5.15(react-refresh@0.14.2)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^0.6.0 + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 - version: 18.3.20 + version: 18.3.23 '@types/react-copy-to-clipboard': specifier: ^5.0.7 version: 5.0.7 '@types/react-dom': specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) copy-webpack-plugin: - specifier: ^12.0.2 - version: 12.0.2(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^13.0.0 + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.98.0(webpack-cli@5.1.4)) + version: 5.6.3(webpack@5.99.9) react-refresh: - specifier: ^0.14.2 - version: 0.14.2 + specifier: ^0.17.0 + version: 0.17.0 rimraf: specifier: ^5.0.10 version: 5.0.10 @@ -262,14 +262,14 @@ importers: specifier: ^4.9.5 version: 4.9.5 webpack: - specifier: ^5.98.0 - version: 5.98.0(webpack-cli@5.1.4) + specifier: ^5.99.9 + version: 5.99.9(webpack-cli@6.0.1) webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + specifier: ^6.0.1 + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) webpack-dev-server: - specifier: ^4.15.2 - version: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + specifier: ^5.2.2 + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) examples/pre/nextjs: dependencies: @@ -277,8 +277,8 @@ importers: specifier: workspace:* version: link:../../../packages/pre '@types/node': - specifier: 20.11.30 - version: 20.11.30 + specifier: 24.3.0 + version: 24.3.0 '@types/react': specifier: 18.3.5 version: 18.3.5 @@ -290,13 +290,13 @@ importers: version: 8.57.0 eslint-config-next: specifier: 14.0.4 - version: 14.0.4(eslint@8.57.0)(typescript@5.8.2) + version: 14.0.4(eslint@8.57.0)(typescript@5.8.3) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 15.5.14 + version: 15.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -311,7 +311,7 @@ importers: version: link:../../../packages/pre dotenv: specifier: ^16.4.7 - version: 16.4.7 + version: 16.5.0 ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -332,17 +332,17 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@types/node': - specifier: ^20.17.28 - version: 20.17.28 + specifier: ^24.3.0 + version: 24.3.0 '@types/react': specifier: ^18.3.20 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(type-fest@0.21.3)(typescript@5.8.3)(utf-8-validate@5.0.10) examples/pre/webpack-5: dependencies: @@ -351,23 +351,23 @@ importers: version: link:../../../packages/pre devDependencies: copy-webpack-plugin: - specifier: ^12.0.2 - version: 12.0.2(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^13.0.0 + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 2.21.0(webpack@5.99.9) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) webpack: - specifier: ^5.98.0 - version: 5.98.0(webpack-cli@5.1.4) + specifier: ^5.99.9 + version: 5.99.9(webpack-cli@6.0.1) webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + specifier: ^6.0.1 + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) webpack-dev-server: - specifier: ^4.15.2 - version: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + specifier: ^5.2.2 + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) examples/taco/nextjs: dependencies: @@ -381,8 +381,8 @@ importers: specifier: workspace:* version: link:../../../packages/taco-auth '@types/node': - specifier: 20.11.30 - version: 20.11.30 + specifier: 24.3.0 + version: 24.3.0 '@types/react': specifier: 18.3.5 version: 18.3.5 @@ -399,8 +399,8 @@ importers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 15.5.14 + version: 15.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -420,8 +420,8 @@ importers: specifier: workspace:* version: link:../../../packages/taco-auth dotenv: - specifier: ^16.4.7 - version: 16.4.7 + specifier: ^16.5.0 + version: 16.5.0 ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -448,17 +448,17 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@types/node': - specifier: ^20.17.28 - version: 20.17.28 + specifier: ^24.3.0 + version: 24.3.0 '@types/react': specifier: ^18.3.20 - version: 18.3.20 + version: 18.3.23 '@types/react-dom': specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.23) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(type-fest@0.21.3)(typescript@5.8.3)(utf-8-validate@5.0.10) examples/taco/webpack-5: dependencies: @@ -473,26 +473,26 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) devDependencies: copy-webpack-plugin: - specifier: ^12.0.2 - version: 12.0.2(webpack@5.98.0(webpack-cli@5.1.4)) + specifier: ^13.0.0 + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.98.0(webpack-cli@5.1.4)) + version: 2.21.0(webpack@5.99.9) webpack: - specifier: ^5.98.0 - version: 5.98.0(webpack-cli@5.1.4) + specifier: ^5.99.9 + version: 5.99.9(webpack-cli@6.0.1) webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + specifier: ^6.0.1 + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) webpack-dev-server: - specifier: ^4.15.2 - version: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + specifier: ^5.2.2 + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) packages/pre: dependencies: '@nucypher/nucypher-core': - specifier: ^0.14.5 - version: 0.14.5 + specifier: ^0.16.0 + version: 0.16.0 '@nucypher/shared': specifier: workspace:* version: link:../shared @@ -513,14 +513,14 @@ importers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nucypher/nucypher-contracts': - specifier: ^0.25.0 - version: 0.25.0 + specifier: ^0.26.0-alpha.3 + version: 0.26.0-alpha.3 '@nucypher/nucypher-core': - specifier: ^0.14.5 - version: 0.14.5 + specifier: ^0.16.0 + version: 0.16.0 axios: - specifier: ^1.8.4 - version: 1.8.4 + specifier: ^1.13.5 + version: 1.15.0 deep-equal: specifier: ^2.2.3 version: 2.2.3 @@ -528,36 +528,36 @@ importers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) qs: - specifier: ^6.14.0 - version: 6.14.0 + specifier: ^6.14.2 + version: 6.15.1 zod: specifier: ^3.24.2 - version: 3.24.2 + version: 3.25.67 devDependencies: '@nucypher/test-utils': specifier: workspace:* version: link:../test-utils '@typechain/ethers-v5': specifier: ^11.1.2 - version: 11.1.2(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2) + version: 11.1.2(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) '@types/deep-equal': specifier: ^1.0.4 version: 1.0.4 '@types/qs': specifier: ^6.9.18 - version: 6.9.18 + version: 6.14.0 '@types/tmp': specifier: ^0.2.6 version: 0.2.6 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@types/node@22.13.14)(typescript@5.8.2) + version: 3.3.0(@types/node@24.3.0)(typescript@5.8.3) standard-version: specifier: ^9.5.0 version: 9.5.0 typechain: specifier: ^8.3.2 - version: 8.3.2(typescript@5.8.2) + version: 8.3.2(typescript@5.8.3) packages/taco: dependencies: @@ -565,8 +565,8 @@ importers: specifier: ^1.1.2 version: 1.1.2 '@nucypher/nucypher-core': - specifier: ^0.14.5 - version: 0.14.5 + specifier: ^0.16.0 + version: 0.16.0 '@nucypher/shared': specifier: workspace:* version: link:../shared @@ -578,10 +578,10 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) semver: specifier: ^7.7.1 - version: 7.7.1 + version: 7.7.2 zod: specifier: ^3.24.2 - version: 3.24.2 + version: 3.25.67 devDependencies: '@nucypher/test-utils': specifier: workspace:* @@ -589,15 +589,21 @@ importers: '@types/semver': specifier: ^7.7.0 version: 7.7.0 + axios: + specifier: ^1.8.4 + version: 1.10.0 dotenv: - specifier: ^16.4.7 - version: 16.4.7 + specifier: ^16.5.0 + version: 16.5.0 glob: - specifier: ^11.0.1 - version: 11.0.1 + specifier: ^11.1.0 + version: 11.1.0 modified-zod2md: specifier: 0.1.5-modified.4 - version: 0.1.5-modified.4(zod@3.24.2) + version: 0.1.5-modified.4(zod@3.25.67) + zod-to-json-schema: + specifier: ^3.24.5 + version: 3.25.2(zod@3.25.67) packages/taco-auth: dependencies: @@ -609,10 +615,10 @@ importers: version: link:../shared siwe: specifier: ^3.0.0 - version: 3.0.0(ethers@5.8.0) + version: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: specifier: ^3.24.2 - version: 3.24.2 + version: 3.25.67 devDependencies: '@nucypher/test-utils': specifier: workspace:* @@ -621,8 +627,8 @@ importers: packages/test-utils: dependencies: '@nucypher/nucypher-core': - specifier: ^0.14.5 - version: 0.14.5 + specifier: ^0.16.0 + version: 0.16.0 '@nucypher/shared': specifier: workspace:* version: link:../shared @@ -630,14 +636,14 @@ importers: specifier: workspace:* version: link:../taco-auth axios: - specifier: ^1.8.4 - version: 1.8.4 + specifier: ^1.13.5 + version: 1.15.0 ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.2.4(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0) packages: @@ -659,11 +665,11 @@ packages: resolution: {integrity: sha512-PYPsd0Kk3ynkxNfe3S4fanI3DiUICCoh4ibQderbvjPFL5A0oK6F4lPEO2t0MDsQySTk2t4vh99Xjy6Bd9y+aQ==} hasBin: true - '@aptos-labs/aptos-client@1.1.0': - resolution: {integrity: sha512-rkGVjQufVONAwnMcjIbdPRmJnAoqBFxd8IXVUBJIVlDXkPgjW+Vj0P3z31CxDFE4mVBN6Wpu30BeBzCW/+IDPQ==} + '@aptos-labs/aptos-client@1.2.0': + resolution: {integrity: sha512-pBlIAT/W+Qa0TOr/318U8r0Gxw/jfyRLcvDGMEXgcVrPqO9Qhwsmozw6LPPIZ963FB7smwIaMeexWFDs3zijcg==} engines: {node: '>=15.10.0'} peerDependencies: - axios: ^1.8.0 + axios: ^1.8.4 got: ^11.8.6 '@aptos-labs/aptos-dynamic-transaction-composer@0.1.3': @@ -672,52 +678,52 @@ packages: '@aptos-labs/script-composer-pack@0.0.9': resolution: {integrity: sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==} - '@aptos-labs/ts-sdk@1.37.1': - resolution: {integrity: sha512-l3kmbADrUPNEdnzt6Q4ehYJjky2jiSSRfpPtprctZSvAR/vXfKore1X07FQcx/LCZV9dIccw39zSgh9HBLUaIg==} + '@aptos-labs/ts-sdk@1.39.0': + resolution: {integrity: sha512-VFEWZsqb8Mto8XbLK8lDRdUvyHjp+geiwFxRzRcQK6HftMGB4bYuEsOI2Vy6u/TqkUft8DvmpV5yX027R5/SMQ==} engines: {node: '>=20.0.0'} '@astronautlabs/jsonpath@1.1.2': resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.27.0': - resolution: {integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==} + '@babel/eslint-parser@7.27.5': + resolution: {integrity: sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -727,95 +733,95 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -823,11 +829,12 @@ packages: '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.25.9': - resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + '@babel/plugin-proposal-decorators@7.27.1': + resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -835,24 +842,28 @@ packages: '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-numeric-separator@7.18.6': resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-optional-chaining@7.21.0': resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -865,6 +876,7 @@ packages: '@babel/plugin-proposal-private-property-in-object@7.21.11': resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -889,26 +901,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.25.9': - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.26.0': - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -923,8 +935,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -971,8 +983,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -983,356 +995,356 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/plugin-transform-block-scoping@7.27.5': + resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.3': + resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.3': + resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-constant-elements@7.25.9': - resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + '@babel/plugin-transform-react-display-name@7.27.1': + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + '@babel/plugin-transform-regenerator@7.27.5': + resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.26.10': - resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} + '@babel/plugin-transform-runtime@7.27.4': + resolution: {integrity: sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + '@babel/plugin-transform-typescript@7.27.1': + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1342,32 +1354,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.26.3': - resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1377,17 +1389,17 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.10': - resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.6': - resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.28.1': - resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true '@changesets/config@3.1.1': @@ -1399,14 +1411,14 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.8': - resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} @@ -1417,8 +1429,8 @@ packages: '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.3': - resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -1437,24 +1449,24 @@ packages: peerDependencies: commander: ~12.1.0 - '@commitlint/config-validator@19.8.0': - resolution: {integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==} + '@commitlint/config-validator@19.8.1': + resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} engines: {node: '>=v18'} - '@commitlint/execute-rule@19.8.0': - resolution: {integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==} + '@commitlint/execute-rule@19.8.1': + resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} engines: {node: '>=v18'} - '@commitlint/load@19.8.0': - resolution: {integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==} + '@commitlint/load@19.8.1': + resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@19.8.0': - resolution: {integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==} + '@commitlint/resolve-extends@19.8.1': + resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} engines: {node: '>=v18'} - '@commitlint/types@19.8.0': - resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} + '@commitlint/types@19.8.1': + resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': @@ -1554,18 +1566,18 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.10 - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@0.6.3': + resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + engines: {node: '>=14.17.0'} - '@emnapi/core@1.4.0': - resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/runtime@1.4.0': - resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} @@ -1573,8 +1585,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1591,8 +1603,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1609,8 +1621,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1627,8 +1639,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1645,8 +1657,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1663,8 +1675,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1681,8 +1693,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1699,8 +1711,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1717,8 +1729,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1735,8 +1747,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1753,8 +1765,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1771,8 +1783,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1789,8 +1801,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1807,8 +1819,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1825,8 +1837,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1843,8 +1855,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1861,14 +1873,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -1885,14 +1897,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1909,8 +1921,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1927,8 +1939,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1945,8 +1957,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1963,8 +1975,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1981,14 +1993,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -2102,10 +2114,12 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2113,11 +2127,148 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@hutson/parse-repository-url@3.0.2': resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@irys/arweave@0.0.2': resolution: {integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==} @@ -2128,6 +2279,7 @@ packages: '@irys/sdk@0.1.24': resolution: {integrity: sha512-8vpgd4o/B1KaChPDgSBcLjAJapi16t/6wlV0SIPEJefbPdDKVuPyK36N3SlFeMkYexrBdqQOkLomHxBaWs0pLA==} engines: {node: '>=16.10.0'} + deprecated: 'Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/' hasBin: true '@isaacs/cliui@8.0.2': @@ -2236,6 +2388,24 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.4.0': + resolution: {integrity: sha512-Akn8XZqN3xO9YGcgvIiTauBBXTP92QSvw6EcGha+p5nm7brhbwvev5gw4fi+ouLGrBpfPpb72+S5pxl4mkMIGQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.8.0': + resolution: {integrity: sha512-HeR0JQNEdBozt+FrfyM5T0X3R+fIN0D+BRDkxPP5o41fTWzHfeZEqtK16aTW8haU+h+SG7XYq9PP5kobvOmkSA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2249,8 +2419,8 @@ packages: resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} engines: {node: '>=14.0.0'} - '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} '@near-js/crypto@0.0.3': resolution: {integrity: sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==} @@ -2294,62 +2464,60 @@ packages: '@near-js/utils@0.0.4': resolution: {integrity: sha512-mPUEPJbTCMicGitjEGvQqOe8AS7O4KkRCxqd0xuE/X6gXF1jz1pYMZn4lNUeUz2C84YnVSGLAM0o9zcN6Y4hiA==} - '@next/env@14.2.10': - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + '@next/env@15.5.14': + resolution: {integrity: sha512-aXeirLYuASxEgi4X4WhfXsShCFxWDfNn/8ZeC5YXAS2BB4A8FJi1kwwGL6nvMVboE7fZCzmJPNdMvVHc8JpaiA==} '@next/eslint-plugin-next@14.0.4': resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} - '@next/swc-darwin-arm64@14.2.10': - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + '@next/swc-darwin-arm64@15.5.14': + resolution: {integrity: sha512-Y9K6SPzobnZvrRDPO2s0grgzC+Egf0CqfbdvYmQVaztV890zicw8Z8+4Vqw8oPck8r1TjUHxVh8299Cg4TrxXg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.10': - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + '@next/swc-darwin-x64@15.5.14': + resolution: {integrity: sha512-aNnkSMjSFRTOmkd7qoNI2/rETQm/vKD6c/Ac9BZGa9CtoOzy3c2njgz7LvebQJ8iPxdeTuGnAjagyis8a9ifBw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.10': - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + '@next/swc-linux-arm64-gnu@15.5.14': + resolution: {integrity: sha512-tjlpia+yStPRS//6sdmlVwuO1Rioern4u2onafa5n+h2hCS9MAvMXqpVbSrjgiEOoCs0nJy7oPOmWgtRRNSM5Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@next/swc-linux-arm64-musl@14.2.10': - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + '@next/swc-linux-arm64-musl@15.5.14': + resolution: {integrity: sha512-8B8cngBaLadl5lbDRdxGCP1Lef8ipD6KlxS3v0ElDAGil6lafrAM3B258p1KJOglInCVFUjk751IXMr2ixeQOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@next/swc-linux-x64-gnu@14.2.10': - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + '@next/swc-linux-x64-gnu@15.5.14': + resolution: {integrity: sha512-bAS6tIAg8u4Gn3Nz7fCPpSoKAexEt2d5vn1mzokcqdqyov6ZJ6gu6GdF9l8ORFrBuRHgv3go/RfzYz5BkZ6YSQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@next/swc-linux-x64-musl@14.2.10': - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + '@next/swc-linux-x64-musl@15.5.14': + resolution: {integrity: sha512-mMxv/FcrT7Gfaq4tsR22l17oKWXZmH/lVqcvjX0kfp5I0lKodHYLICKPoX1KRnnE+ci6oIUdriUhuA3rBCDiSw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@next/swc-win32-arm64-msvc@14.2.10': - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + '@next/swc-win32-arm64-msvc@15.5.14': + resolution: {integrity: sha512-OTmiBlYThppnvnsqx0rBqjDRemlmIeZ8/o4zI7veaXoeO1PVHoyj2lfTfXTiiGjCyRDhA10y4h6ZvZvBiynr2g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.10': - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.10': - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + '@next/swc-win32-x64-msvc@15.5.14': + resolution: {integrity: sha512-+W7eFf3RS7m4G6tppVTOSyP9Y6FsJXfOuKzav1qKniiFm3KFByQfPEcouHdjlZmysl4zJGuGLQ/M9XyVeyeNEg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2357,15 +2525,15 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/curves@1.8.1': - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + '@noble/curves@1.9.2': + resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} - '@noble/ed25519@1.7.3': - resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + '@noble/ed25519@1.7.5': + resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -2387,8 +2555,11 @@ packages: '@nucypher/nucypher-contracts@0.25.0': resolution: {integrity: sha512-4fRPKY6RzkXY1Zv2O0auJZsvP6z7tuj+Fsy83yJvADqFwRuIJfSlwgSgLwISX6q838SRG/Ve2i+sMLZRaVJfYw==} - '@nucypher/nucypher-core@0.14.5': - resolution: {integrity: sha512-Q3kBuJL0qtTtnxrM5DEQauQUvDlXmwubm9u1h7gbyLhs+aZNC9WDyjEUbE43+uahlHu4k1hKEMxD1gjV165ChA==} + '@nucypher/nucypher-contracts@0.26.0-alpha.3': + resolution: {integrity: sha512-BQSDTl+E77JHS0ck79vyGQTPjTFZieWaKY1nSAghQGTS3drOU21loqe9v6221zlycU6T1cZ4c3ffGXW3qc37ng==} + + '@nucypher/nucypher-core@0.16.0': + resolution: {integrity: sha512-cvA3G2yvJj0MWSD2fLgY4e8GqNUZLvBwikDOEPVOOVaQYR67OWdDUcSjrlgbGie9R6TPfkw5eyRP1xumPMs28A==} '@nucypher/shared@0.5.0': resolution: {integrity: sha512-Y+0oEgVtoud4BP/pvj2elPm5igrQ8AAUwYYmUiLpXNqQMRF4zFnYaGbl+xhKk45CYG8S9cDKJEN8nopzVADTNw==} @@ -2406,8 +2577,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pmmmwh/react-refresh-webpack-plugin@0.5.15': - resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} + '@pmmmwh/react-refresh-webpack-plugin@0.5.17': + resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} peerDependencies: '@types/webpack': 4.x || 5.x @@ -2432,6 +2603,32 @@ packages: webpack-plugin-serve: optional: true + '@pmmmwh/react-refresh-webpack-plugin@0.6.1': + resolution: {integrity: sha512-95DXXJxNkpYu+sqmpDp7vbw9JCyiNpHuCsvuMuOgVFrKQlwEIn9Y1+NNIQJq+zFL+eWyxw6htthB5CtdwJupNA==} + engines: {node: '>=18.12'} + peerDependencies: + '@types/webpack': 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <5.0.0' + webpack: ^5.0.0 + webpack-dev-server: ^4.8.0 || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + '@randlabs/communication-bridge@1.0.1': resolution: {integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==} @@ -2466,103 +2663,114 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 - '@rollup/rollup-android-arm-eabi@4.37.0': - resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.37.0': - resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.37.0': - resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.37.0': - resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.37.0': - resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.37.0': - resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.37.0': - resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.37.0': - resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} + '@rollup/rollup-linux-arm-musleabihf@4.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.37.0': - resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.37.0': - resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.37.0': - resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': - resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.37.0': - resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} + '@rollup/rollup-linux-riscv64-gnu@4.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.37.0': - resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.37.0': - resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} + '@rollup/rollup-linux-s390x-gnu@4.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.37.0': - resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} + '@rollup/rollup-linux-x64-gnu@4.44.1': + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.37.0': - resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-win32-arm64-msvc@4.37.0': - resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} + '@rollup/rollup-win32-arm64-msvc@4.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.37.0': - resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} + '@rollup/rollup-win32-ia32-msvc@4.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.37.0': - resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} + '@rollup/rollup-win32-x64-msvc@4.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] @@ -2572,14 +2780,14 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} - '@scure/base@1.2.4': - resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - '@scure/bip32@1.6.2': - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - '@scure/bip39@1.5.4': - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -2588,10 +2796,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -2606,8 +2810,27 @@ packages: resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} - '@solana/web3.js@1.98.0': - resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + '@solana/codecs-core@2.1.1': + resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@2.1.1': + resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@2.1.1': + resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/web3.js@1.98.2': + resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} '@spruceid/siwe-parser@3.0.0': resolution: {integrity: sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==} @@ -2687,14 +2910,11 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -2735,8 +2955,8 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} @@ -2744,8 +2964,8 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} @@ -2753,6 +2973,9 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -2762,6 +2985,9 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/deep-equal@1.0.4': resolution: {integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==} @@ -2777,11 +3003,8 @@ packages: '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -2789,8 +3012,8 @@ packages: '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -2801,8 +3024,8 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/http-proxy@1.17.16': resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} @@ -2825,8 +3048,8 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/lodash@4.17.19': + resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -2843,14 +3066,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - - '@types/node@20.17.28': - resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==} - - '@types/node@22.13.14': - resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2861,14 +3078,14 @@ packages: '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} '@types/q@1.5.8': resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -2879,13 +3096,13 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 - '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@18.3.23': + resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} '@types/react@18.3.5': resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} @@ -2899,17 +3116,20 @@ packages: '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} '@types/serve-index@1.9.4': resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -2929,8 +3149,8 @@ packages: '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - '@types/ws@8.18.0': - resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3070,78 +3290,106 @@ packages: resolution: {integrity: sha512-Hc3TfrFaupg0M84e/Zv7BoF+fmMWDV15mZ5s8ZQt2qZxUcNw2GQW+L6L/2k74who31G+p1m3GRYbJpAo7d1pqA==} engines: {node: '>=10'} - '@unrs/resolver-binding-darwin-arm64@1.3.2': - resolution: {integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==} + '@unrs/resolver-binding-android-arm-eabi@1.9.2': + resolution: {integrity: sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.9.2': + resolution: {integrity: sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.9.2': + resolution: {integrity: sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.3.2': - resolution: {integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==} + '@unrs/resolver-binding-darwin-x64@1.9.2': + resolution: {integrity: sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.3.2': - resolution: {integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==} + '@unrs/resolver-binding-freebsd-x64@1.9.2': + resolution: {integrity: sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2': - resolution: {integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': + resolution: {integrity: sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2': - resolution: {integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': + resolution: {integrity: sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.3.2': - resolution: {integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': + resolution: {integrity: sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==} cpu: [arm64] os: [linux] + libc: [glibc] - '@unrs/resolver-binding-linux-arm64-musl@1.3.2': - resolution: {integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==} + '@unrs/resolver-binding-linux-arm64-musl@1.9.2': + resolution: {integrity: sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==} cpu: [arm64] os: [linux] + libc: [musl] - '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2': - resolution: {integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': + resolution: {integrity: sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==} cpu: [ppc64] os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': + resolution: {integrity: sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': + resolution: {integrity: sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==} + cpu: [riscv64] + os: [linux] + libc: [musl] - '@unrs/resolver-binding-linux-s390x-gnu@1.3.2': - resolution: {integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==} + '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': + resolution: {integrity: sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==} cpu: [s390x] os: [linux] + libc: [glibc] - '@unrs/resolver-binding-linux-x64-gnu@1.3.2': - resolution: {integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==} + '@unrs/resolver-binding-linux-x64-gnu@1.9.2': + resolution: {integrity: sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==} cpu: [x64] os: [linux] + libc: [glibc] - '@unrs/resolver-binding-linux-x64-musl@1.3.2': - resolution: {integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==} + '@unrs/resolver-binding-linux-x64-musl@1.9.2': + resolution: {integrity: sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==} cpu: [x64] os: [linux] + libc: [musl] - '@unrs/resolver-binding-wasm32-wasi@1.3.2': - resolution: {integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==} + '@unrs/resolver-binding-wasm32-wasi@1.9.2': + resolution: {integrity: sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.3.2': - resolution: {integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==} + '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': + resolution: {integrity: sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.3.2': - resolution: {integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==} + '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': + resolution: {integrity: sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.3.2': - resolution: {integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==} + '@unrs/resolver-binding-win32-x64-msvc@1.9.2': + resolution: {integrity: sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==} cpu: [x64] os: [win32] @@ -3152,11 +3400,11 @@ packages: ethers: ^5 react: '*' - '@vitest/coverage-v8@3.1.1': - resolution: {integrity: sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: - '@vitest/browser': 3.1.1 - vitest: 3.1.1 + '@vitest/browser': 3.2.4 + vitest: 3.2.4 peerDependenciesMeta: '@vitest/browser': optional: true @@ -3164,6 +3412,9 @@ packages: '@vitest/expect@3.0.9': resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/mocker@3.0.9': resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} peerDependencies: @@ -3175,21 +3426,47 @@ packages: vite: optional: true + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.0.9': resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/runner@3.0.9': resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/snapshot@3.0.9': resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/spy@3.0.9': resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/utils@3.0.9': resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -3235,26 +3512,26 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} + '@webpack-cli/configtest@3.0.1': + resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} + engines: {node: '>=18.12.0'} peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + webpack: ^5.82.0 + webpack-cli: 6.x.x - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} + '@webpack-cli/info@3.0.1': + resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} + engines: {node: '>=18.12.0'} peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + webpack: ^5.82.0 + webpack-cli: 6.x.x - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} + '@webpack-cli/serve@3.0.1': + resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} + engines: {node: '>=18.12.0'} peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + webpack: ^5.82.0 + webpack-cli: 6.x.x webpack-dev-server: '*' peerDependenciesMeta: webpack-dev-server: @@ -3272,6 +3549,7 @@ packages: abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -3298,8 +3576,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -3357,6 +3635,9 @@ packages: resolution: {integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==} engines: {node: '>=14.0.0'} + anser@2.3.2: + resolution: {integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3452,8 +3733,8 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -3497,8 +3778,8 @@ packages: peerDependencies: arweave: ^1.10.0 - arweave@1.15.0: - resolution: {integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==} + arweave@1.15.7: + resolution: {integrity: sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA==} engines: {node: '>=18'} asap@2.0.6: @@ -3517,6 +3798,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -3549,11 +3833,16 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios-retry@3.9.1: - resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -3624,6 +3913,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -3654,20 +3947,13 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bip39-light@1.0.7: resolution: {integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==} @@ -3680,12 +3966,15 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3699,11 +3988,15 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -3736,8 +4029,8 @@ packages: resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} engines: {node: '>= 0.12'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3770,25 +4063,25 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bundle-require@4.2.1: resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' - bundlemon-utils@1.2.1: - resolution: {integrity: sha512-ydFZrI68L5j6hB9y88XGlbOp2lEwZHsDZl31ljHoi+wKE32glbuXMU0d0vQJLiR7Eq6uS0nDNYSmeoFHiV9R2g==} - engines: {node: '>=14.16'} + bundlemon-utils@2.0.1: + resolution: {integrity: sha512-7wxHoOlzICvQyMRfVqoBpnM5pJt1JdcUxsYPNiFx3RlVmUEANh2xdEyoyTsVCqzeJC3rn+AbPuiermBwA3szAQ==} + engines: {node: '>=18'} - bundlemon@2.1.0: - resolution: {integrity: sha512-zvsN7VDNeCtGIR+XUXobjxCSmnsUBqVe5ap2hMQnZOumfKAUJ6WVn/tnJOmt7TJfkXHeUKGi2sHARl7qrL+WDg==} - engines: {node: '>=14.16'} + bundlemon@3.1.0: + resolution: {integrity: sha512-8PAomH/fzAD/aXUKmphKmPm4Tl2L7mo51AAalO0EVAZE0cik58AM2x0CVdw4jutD069U2rSyRQstxHo2NEr+9Q==} + engines: {node: '>=18'} hasBin: true - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -3847,8 +4140,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001707: - resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + caniuse-lite@1.0.30001726: + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -3964,6 +4257,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -3982,9 +4282,9 @@ packages: resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} engines: {node: '>=8.0.0'} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} @@ -4009,10 +4309,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - commitizen@4.3.1: resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} engines: {node: '>= 12'} @@ -4147,20 +4443,20 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + copy-webpack-plugin@13.0.0: + resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.43.0: + resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} - core-js-pure@3.41.0: - resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==} + core-js-pure@3.43.0: + resolution: {integrity: sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==} - core-js@3.41.0: - resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} + core-js@3.43.0: + resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4181,6 +4477,15 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -4193,6 +4498,9 @@ packages: create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -4406,8 +4714,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4452,6 +4760,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} @@ -4471,6 +4787,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -4510,6 +4830,10 @@ packages: resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} engines: {node: '>=12.20'} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4577,6 +4901,7 @@ packages: domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} @@ -4602,8 +4927,8 @@ packages: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dotgitignore@2.1.0: @@ -4631,8 +4956,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.128: - resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} + electron-to-chromium@1.5.176: + resolution: {integrity: sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -4666,11 +4991,11 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -4695,8 +5020,8 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: @@ -4717,8 +5042,8 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -4757,8 +5082,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -4825,8 +5150,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.10.0: - resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==} + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -4838,8 +5163,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4873,8 +5198,8 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4918,8 +5243,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -4929,11 +5254,10 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-sonarjs@0.23.0: - resolution: {integrity: sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==} - engines: {node: '>=14'} + eslint-plugin-sonarjs@3.0.3: + resolution: {integrity: sha512-/UrTz8wyTW0MQVJKUF70vSjsMMf54+0cKHWAuYObuE82vNM8zrscm0wvZprolHNN0PIdnvVQ9Dm6MQkIzOKu4A==} peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.0.0 || ^9.0.0 eslint-plugin-testing-library@5.11.1: resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} @@ -4941,20 +5265,15 @@ packages: peerDependencies: eslint: ^7.5.0 || ^8.0.0 - eslint-plugin-unused-imports@3.2.0: - resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-unused-imports@4.1.4: + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} peerDependencies: - '@typescript-eslint/eslint-plugin': 6 - 7 - eslint: '8' + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -4981,11 +5300,13 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -5060,8 +5381,8 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - expect-type@1.2.0: - resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} expect@27.5.1: @@ -5119,8 +5440,8 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5150,9 +5471,6 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -5230,6 +5548,15 @@ packages: debug: optional: true + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -5256,8 +5583,12 @@ packages: resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -5309,6 +5640,9 @@ packages: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -5356,8 +5690,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} gh-pages@6.3.0: resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} @@ -5399,16 +5733,19 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -5446,10 +5783,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5510,6 +5843,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + hash-base@3.0.5: resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} engines: {node: '>= 0.10'} @@ -5553,8 +5889,8 @@ packages: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} - html-entities@2.5.3: - resolution: {integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -5579,8 +5915,8 @@ packages: htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -5597,15 +5933,15 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-parser-js@0.5.9: - resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} - http-proxy-middleware@2.0.7: - resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -5636,6 +5972,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -5664,10 +6004,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.3: - resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} - engines: {node: '>= 4'} - immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -5693,6 +6029,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -5742,6 +6079,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -5782,6 +6122,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5806,6 +6151,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -5817,6 +6167,14 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -5937,6 +6295,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -5986,8 +6348,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} jake@10.9.2: @@ -5995,8 +6357,8 @@ packages: engines: {node: '>=10'} hasBin: true - jayson@4.1.3: - resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} + jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} engines: {node: '>=8'} hasBin: true @@ -6195,6 +6557,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -6389,6 +6754,7 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} @@ -6435,8 +6801,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -6519,6 +6885,10 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} + memfs@4.24.0: + resolution: {integrity: sha512-PiyWpigBOgdsdvnn4U3PlQytj46ZEw/dMVmcqXuX1KUHoYzaGTL25E9rfK+c26mPAh9RmBdXldoxbQkYbH20Uw==} + engines: {node: '>= 4.0.0'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -6597,9 +6967,9 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6693,6 +7063,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -6716,21 +7091,24 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@14.2.10: - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} - engines: {node: '>=18.17.0'} + next@15.5.14: + resolution: {integrity: sha512-M6S+4JyRjmKic2Ssm7jHUPkE6YUJ6lv4507jprsSZLulubz0ihO2E+S4zmQK3JZ2ov81JrugukKU4Tz0ivgqqQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true '@playwright/test': optional: true + babel-plugin-react-compiler: + optional: true sass: optional: true @@ -6865,6 +7243,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -6936,6 +7318,10 @@ packages: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -7028,19 +7414,15 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} engines: {node: '>=0.12'} performance-now@2.1.0: @@ -7526,8 +7908,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.1.2: @@ -7556,8 +7938,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.1: + resolution: {integrity: sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==} engines: {node: '>=14'} hasBin: true @@ -7603,14 +7985,18 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -7619,13 +8005,17 @@ packages: q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} quansync@0.2.10: @@ -7634,6 +8024,7 @@ packages: querystring@0.2.1: resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -7706,8 +8097,8 @@ packages: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} react-scripts@5.0.1: @@ -7782,6 +8173,10 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -7796,15 +8191,13 @@ packages: regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regex-parser@2.3.1: resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -7902,17 +8295,22 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.10: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} rollup-plugin-terser@7.0.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: rollup: ^2.0.0 @@ -7921,14 +8319,18 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.37.0: - resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rpc-websockets@9.1.1: resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -8004,13 +8406,17 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + secp256k1@5.0.1: resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} engines: {node: '>=18.0.0'} @@ -8030,8 +8436,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -8079,6 +8485,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -8095,8 +8505,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} shiki@0.14.7: @@ -8128,6 +8538,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -8144,10 +8557,6 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -8185,9 +8594,11 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -8225,6 +8636,7 @@ packages: stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} @@ -8252,8 +8664,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -8262,13 +8674,15 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} @@ -8330,6 +8744,7 @@ packages: stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -8363,6 +8778,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -8373,13 +8791,13 @@ packages: peerDependencies: webpack: ^5.0.0 - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' peerDependenciesMeta: '@babel/core': optional: true @@ -8427,6 +8845,7 @@ packages: svgo@1.3.2: resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. hasBin: true svgo@2.8.0: @@ -8450,8 +8869,8 @@ packages: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} temp-dir@2.0.0: @@ -8486,8 +8905,8 @@ packages: uglify-js: optional: true - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -8516,6 +8935,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} @@ -8537,12 +8962,12 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: @@ -8553,6 +8978,10 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -8567,6 +8996,10 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -8595,6 +9028,12 @@ packages: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} + tree-dump@1.0.3: + resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -8730,19 +9169,19 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typedoc-plugin-coverage@2.2.0: - resolution: {integrity: sha512-/hq9nwSNBz2p7+VYfljT/zFSmaxN8tlfcIp6CCAaQN6VIxXCciYFIqR+pcckRhjmfHIeSJ5uy2OpCt5F683npA==} - engines: {node: '>= 16'} + typedoc-plugin-coverage@3.4.1: + resolution: {integrity: sha512-V23DAwinAMpGMGcL1R1s8Snr26hrjfIdwGf+4jR/65ZdmeAN+yRX0onfx5JlembTQhR6AePQ/parfQNS0AZ64A==} + engines: {node: '>= 18'} peerDependencies: - typedoc: ^0.22.12 || 0.23.x || 0.24.x || 0.25.x + typedoc: 0.25.x || 0.26.x || 0.27.x typedoc-plugin-missing-exports@2.3.0: resolution: {integrity: sha512-iI9ITNNLlbsLCBBeYDyu0Qqp3GN/9AGyWNKg8bctRXuZEPT7G1L+0+MNWG9MsHcf/BFmNbXL0nQ8mC/tXRicog==} peerDependencies: typedoc: 0.24.x || 0.25.x - typedoc-plugin-zod@1.4.0: - resolution: {integrity: sha512-Mr4hoEfjIR1xjp0RqtEyfba03NDUE4jLvgErg0VQz9L60eCVLcUrV0x+71+B7rykDMexrTx0I9Yk6SS0PuSbKw==} + typedoc-plugin-zod@1.4.2: + resolution: {integrity: sha512-DERrqbKyW1DAWgs+L3sgCTxrVJQuHg4whj0FZcXWIVdwtoYYSnxK2XSS9gepBwyRwlojjVux1ZjSPwDsWz9ulg==} peerDependencies: typedoc: 0.23.x || 0.24.x || 0.25.x || 0.26.x || 0.27.x || 0.28.x @@ -8763,8 +9202,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -8788,14 +9227,8 @@ packages: underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -8813,10 +9246,6 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -8840,8 +9269,8 @@ packages: unquote@1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - unrs-resolver@1.3.2: - resolution: {integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==} + unrs-resolver@1.9.2: + resolution: {integrity: sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==} upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} @@ -8899,8 +9328,13 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.3: - resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -8939,6 +9373,46 @@ packages: yaml: optional: true + vite@7.0.0: + resolution: {integrity: sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@3.0.9: resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8967,6 +9441,34 @@ packages: jsdom: optional: true + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vlq@2.0.4: resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} @@ -8981,6 +9483,7 @@ packages: w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. w3c-xmlserializer@2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} @@ -8989,8 +9492,8 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -9013,18 +9516,15 @@ packages: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} + webpack-cli@6.0.1: + resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} + engines: {node: '>=18.12.0'} hasBin: true peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x + webpack: ^5.82.0 webpack-bundle-analyzer: '*' webpack-dev-server: '*' peerDependenciesMeta: - '@webpack-cli/generators': - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: @@ -9036,6 +9536,15 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-dev-server@4.15.2: resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} engines: {node: '>= 12.13.0'} @@ -9049,15 +9558,28 @@ packages: webpack-cli: optional: true + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + webpack-manifest-plugin@4.1.1: resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} @@ -9066,12 +9588,12 @@ packages: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} engines: {node: '>=10.13.0'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack@5.98.0: - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} + webpack@5.99.9: + resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9166,6 +9688,7 @@ packages: workbox-cacheable-response@6.6.0: resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 workbox-core@6.6.0: resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} @@ -9175,6 +9698,7 @@ packages: workbox-google-analytics@6.6.0: resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@6.6.0: resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} @@ -9251,8 +9775,8 @@ packages: utf-8-validate: optional: true - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9263,6 +9787,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -9287,9 +9815,9 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@20.2.9: @@ -9312,8 +9840,13 @@ packages: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} engines: {node: '>=10'} - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@3.25.67: + resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} snapshots: @@ -9335,9 +9868,9 @@ snapshots: dependencies: commander: 12.1.0 - '@aptos-labs/aptos-client@1.1.0(axios@1.8.4)(got@11.8.6)': + '@aptos-labs/aptos-client@1.2.0(axios@1.10.0)(got@11.8.6)': dependencies: - axios: 1.8.4 + axios: 1.10.0 got: 11.8.6 '@aptos-labs/aptos-dynamic-transaction-composer@0.1.3': {} @@ -9346,17 +9879,17 @@ snapshots: dependencies: '@aptos-labs/aptos-dynamic-transaction-composer': 0.1.3 - '@aptos-labs/ts-sdk@1.37.1(axios@1.8.4)(got@11.8.6)': + '@aptos-labs/ts-sdk@1.39.0(axios@1.10.0)(got@11.8.6)': dependencies: '@aptos-labs/aptos-cli': 1.0.2 - '@aptos-labs/aptos-client': 1.1.0(axios@1.8.4)(got@11.8.6) + '@aptos-labs/aptos-client': 1.2.0(axios@1.10.0)(got@11.8.6) '@aptos-labs/script-composer-pack': 0.0.9 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 eventemitter3: 5.0.1 - form-data: 4.0.2 + form-data: 4.0.3 js-base64: 3.7.7 jwt-decode: 4.0.0 poseidon-lite: 0.2.1 @@ -9368,894 +9901,892 @@ snapshots: dependencies: static-eval: 2.0.2 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.5': {} - '@babel/core@7.26.10': + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.27.0(@babel/core@7.26.10)(eslint@8.57.1)': + '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@8.57.1)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.1 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.27.0': + '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.0': + '@babel/helpers@7.27.6': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - '@babel/parser@7.27.0': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.10)': + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': + '@babel/plugin-transform-runtime@7.27.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.43.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.6 esutils: 2.0.3 - '@babel/preset-react@7.26.3(@babel/core@7.26.10)': + '@babel/preset-react@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.6': {} - '@babel/template@7.27.0': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@babel/traverse@7.27.0': + '@babel/traverse@7.27.4': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.0': + '@babel/types@7.27.6': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.10': + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -10265,34 +10796,34 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.6': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.28.1': + '@changesets/cli@2.29.5': dependencies: - '@changesets/apply-release-plan': 7.0.10 - '@changesets/assemble-release-plan': 6.0.6 + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.8 - '@changesets/git': 3.0.2 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 + '@changesets/read': 0.6.5 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 @@ -10307,7 +10838,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -10330,20 +10861,20 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.1 + semver: 7.7.2 - '@changesets/get-release-plan@4.0.8': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.6 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 + '@changesets/read': 0.6.5 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -10367,9 +10898,9 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.3': + '@changesets/read@0.6.5': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.1 '@changesets/types': 6.1.0 @@ -10397,24 +10928,24 @@ snapshots: dependencies: commander: 12.1.0 - '@commitlint/config-validator@19.8.0': + '@commitlint/config-validator@19.8.1': dependencies: - '@commitlint/types': 19.8.0 + '@commitlint/types': 19.8.1 ajv: 8.17.1 optional: true - '@commitlint/execute-rule@19.8.0': + '@commitlint/execute-rule@19.8.1': optional: true - '@commitlint/load@19.8.0(@types/node@22.13.14)(typescript@5.8.2)': + '@commitlint/load@19.8.1(@types/node@24.3.0)(typescript@5.8.3)': dependencies: - '@commitlint/config-validator': 19.8.0 - '@commitlint/execute-rule': 19.8.0 - '@commitlint/resolve-extends': 19.8.0 - '@commitlint/types': 19.8.0 + '@commitlint/config-validator': 19.8.1 + '@commitlint/execute-rule': 19.8.1 + '@commitlint/resolve-extends': 19.8.1 + '@commitlint/types': 19.8.1 chalk: 5.4.1 - cosmiconfig: 9.0.0(typescript@5.8.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.13.14)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -10423,17 +10954,17 @@ snapshots: - typescript optional: true - '@commitlint/resolve-extends@19.8.0': + '@commitlint/resolve-extends@19.8.1': dependencies: - '@commitlint/config-validator': 19.8.0 - '@commitlint/types': 19.8.0 + '@commitlint/config-validator': 19.8.1 + '@commitlint/types': 19.8.1 global-directory: 4.0.1 import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 optional: true - '@commitlint/types@19.8.0': + '@commitlint/types@19.8.1': dependencies: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 @@ -10445,98 +10976,98 @@ snapshots: '@csstools/normalize.css@12.1.1': {} - '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.3)': + '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.6)': dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - '@csstools/postcss-color-function@1.1.1(postcss@8.5.3)': + '@csstools/postcss-color-function@1.1.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - postcss: 8.5.3 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.3)': + '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.3)': + '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.3)': + '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - postcss: 8.5.3 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.3)': + '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.6)': dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.3)': + '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.3)': + '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.3)': + '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.6)': dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - postcss: 8.5.3 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.3)': + '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.3)': + '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.5.3)': + '@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.5.3)': + '@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - '@csstools/postcss-unset-value@1.0.2(postcss@8.5.3)': + '@csstools/postcss-unset-value@1.0.2(postcss@8.5.6)': dependencies: - postcss: 8.5.3 + postcss: 8.5.6 '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': dependencies: postcss-selector-parser: 6.1.2 - '@discoveryjs/json-ext@0.5.7': {} + '@discoveryjs/json-ext@0.6.3': {} - '@emnapi/core@1.4.0': + '@emnapi/core@1.4.3': dependencies: - '@emnapi/wasi-threads': 1.0.1 + '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.0': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.1': + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 optional: true @@ -10544,7 +11075,7 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.5': optional: true '@esbuild/android-arm64@0.16.17': @@ -10553,7 +11084,7 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm64@0.25.5': optional: true '@esbuild/android-arm@0.16.17': @@ -10562,7 +11093,7 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm@0.25.5': optional: true '@esbuild/android-x64@0.16.17': @@ -10571,7 +11102,7 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-x64@0.25.5': optional: true '@esbuild/darwin-arm64@0.16.17': @@ -10580,7 +11111,7 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.5': optional: true '@esbuild/darwin-x64@0.16.17': @@ -10589,7 +11120,7 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/darwin-x64@0.25.5': optional: true '@esbuild/freebsd-arm64@0.16.17': @@ -10598,7 +11129,7 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-arm64@0.25.5': optional: true '@esbuild/freebsd-x64@0.16.17': @@ -10607,7 +11138,7 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/freebsd-x64@0.25.5': optional: true '@esbuild/linux-arm64@0.16.17': @@ -10616,7 +11147,7 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm64@0.25.5': optional: true '@esbuild/linux-arm@0.16.17': @@ -10625,7 +11156,7 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-arm@0.25.5': optional: true '@esbuild/linux-ia32@0.16.17': @@ -10634,7 +11165,7 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-ia32@0.25.5': optional: true '@esbuild/linux-loong64@0.16.17': @@ -10643,7 +11174,7 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-loong64@0.25.5': optional: true '@esbuild/linux-mips64el@0.16.17': @@ -10652,7 +11183,7 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-mips64el@0.25.5': optional: true '@esbuild/linux-ppc64@0.16.17': @@ -10661,7 +11192,7 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-ppc64@0.25.5': optional: true '@esbuild/linux-riscv64@0.16.17': @@ -10670,7 +11201,7 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-riscv64@0.25.5': optional: true '@esbuild/linux-s390x@0.16.17': @@ -10679,7 +11210,7 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-s390x@0.25.5': optional: true '@esbuild/linux-x64@0.16.17': @@ -10688,10 +11219,10 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-arm64@0.25.5': optional: true '@esbuild/netbsd-x64@0.16.17': @@ -10700,10 +11231,10 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-arm64@0.25.5': optional: true '@esbuild/openbsd-x64@0.16.17': @@ -10712,7 +11243,7 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openbsd-x64@0.25.5': optional: true '@esbuild/sunos-x64@0.16.17': @@ -10721,7 +11252,7 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.25.5': optional: true '@esbuild/win32-arm64@0.16.17': @@ -10730,7 +11261,7 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.25.5': optional: true '@esbuild/win32-ia32@0.16.17': @@ -10739,7 +11270,7 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.25.5': optional: true '@esbuild/win32-x64@0.16.17': @@ -10748,15 +11279,15 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.5.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -10766,7 +11297,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10832,7 +11363,7 @@ snapshots: dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 '@ethersproject/bytes@5.8.0': dependencies: @@ -10965,7 +11496,7 @@ snapshots: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 '@ethersproject/properties': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 elliptic: 6.6.1 hash.js: 1.1.7 @@ -11039,7 +11570,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11047,7 +11578,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11058,26 +11589,112 @@ snapshots: '@hutson/parse-repository-url@3.0.2': {} + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.4.5 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + + '@img/sharp-win32-ia32@0.34.3': + optional: true + + '@img/sharp-win32-x64@0.34.3': + optional: true + '@irys/arweave@0.0.2': dependencies: asn1.js: 5.4.1 async-retry: 1.3.3 - axios: 1.8.4 + axios: 1.15.0 base64-js: 1.5.1 - bignumber.js: 9.1.2 + bignumber.js: 9.3.0 transitivePeerDependencies: - debug '@irys/query@0.0.8': dependencies: async-retry: 1.3.3 - axios: 1.8.4 + axios: 1.15.0 transitivePeerDependencies: - debug - '@irys/sdk@0.1.24(arweave@1.15.0)(bufferutil@4.0.9)(got@11.8.6)(utf-8-validate@5.0.10)': + '@irys/sdk@0.1.24(arweave@1.15.7)(bufferutil@4.0.9)(got@11.8.6)(typescript@4.9.5)(utf-8-validate@5.0.10)': dependencies: - '@aptos-labs/ts-sdk': 1.37.1(axios@1.8.4)(got@11.8.6) + '@aptos-labs/ts-sdk': 1.39.0(axios@1.10.0)(got@11.8.6) '@ethersproject/bignumber': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -11087,14 +11704,14 @@ snapshots: '@near-js/keystores-browser': 0.0.3 '@near-js/providers': 0.0.4 '@near-js/transactions': 0.1.1 - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) '@supercharge/promise-pool': 3.2.0 algosdk: 1.24.1 - arbundles: 0.10.1(arweave@1.15.0)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + arbundles: 0.10.1(arweave@1.15.7)(bufferutil@4.0.9)(utf-8-validate@5.0.10) async-retry: 1.3.3 - axios: 1.8.4 + axios: 1.10.0 base64url: 3.0.1 - bignumber.js: 9.1.2 + bignumber.js: 9.3.0 bs58: 5.0.0 commander: 8.3.0 csv: 5.5.3 @@ -11109,6 +11726,7 @@ snapshots: - debug - encoding - got + - typescript - utf-8-validate '@isaacs/cliui@8.0.2': @@ -11133,7 +11751,7 @@ snapshots: '@jest/console@27.5.1': dependencies: '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -11142,27 +11760,27 @@ snapshots: '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 slash: 3.0.0 - '@jest/core@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10)': + '@jest/core@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -11189,14 +11807,14 @@ snapshots: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 jest-mock: 27.5.1 '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.17.28 + '@types/node': 24.3.0 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -11214,7 +11832,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -11272,7 +11890,7 @@ snapshots: '@jest/transform@27.5.1': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -11294,7 +11912,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -11303,7 +11921,7 @@ snapshots: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -11334,18 +11952,34 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.4.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.8.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.8.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@leichtgewicht/ip-codec@2.0.5': {} '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -11354,10 +11988,10 @@ snapshots: '@metamask/detect-provider@2.0.0': {} - '@napi-rs/wasm-runtime@0.2.7': + '@napi-rs/wasm-runtime@0.2.11': dependencies: - '@emnapi/core': 1.4.0 - '@emnapi/runtime': 1.4.0 + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.9.0 optional: true @@ -11457,50 +12091,47 @@ snapshots: depd: 2.0.0 mustache: 4.2.0 - '@next/env@14.2.10': {} + '@next/env@15.5.14': {} '@next/eslint-plugin-next@14.0.4': dependencies: glob: 7.1.7 - '@next/swc-darwin-arm64@14.2.10': + '@next/swc-darwin-arm64@15.5.14': optional: true - '@next/swc-darwin-x64@14.2.10': + '@next/swc-darwin-x64@15.5.14': optional: true - '@next/swc-linux-arm64-gnu@14.2.10': + '@next/swc-linux-arm64-gnu@15.5.14': optional: true - '@next/swc-linux-arm64-musl@14.2.10': + '@next/swc-linux-arm64-musl@15.5.14': optional: true - '@next/swc-linux-x64-gnu@14.2.10': + '@next/swc-linux-x64-gnu@15.5.14': optional: true - '@next/swc-linux-x64-musl@14.2.10': + '@next/swc-linux-x64-musl@15.5.14': optional: true - '@next/swc-win32-arm64-msvc@14.2.10': + '@next/swc-win32-arm64-msvc@15.5.14': optional: true - '@next/swc-win32-ia32-msvc@14.2.10': - optional: true - - '@next/swc-win32-x64-msvc@14.2.10': + '@next/swc-win32-x64-msvc@15.5.14': optional: true '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 - '@noble/curves@1.8.1': + '@noble/curves@1.9.2': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 - '@noble/ed25519@1.7.3': {} + '@noble/ed25519@1.7.5': {} - '@noble/hashes@1.7.1': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -11518,19 +12149,21 @@ snapshots: '@nucypher/nucypher-contracts@0.25.0': {} - '@nucypher/nucypher-core@0.14.5': {} + '@nucypher/nucypher-contracts@0.26.0-alpha.3': {} + + '@nucypher/nucypher-core@0.16.0': {} '@nucypher/shared@0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nucypher/nucypher-contracts': 0.25.0 - '@nucypher/nucypher-core': 0.14.5 - axios: 1.8.4 + '@nucypher/nucypher-core': 0.16.0 + axios: 1.15.0 deep-equal: 2.2.3 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - qs: 6.14.0 - zod: 3.24.2 + qs: 6.15.1 + zod: 3.25.67 transitivePeerDependencies: - bufferutil - debug @@ -11540,8 +12173,8 @@ snapshots: dependencies: '@ethersproject/abstract-signer': 5.8.0 '@nucypher/shared': 0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - siwe: 3.0.0(ethers@5.8.0) - zod: 3.24.2 + siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + zod: 3.25.67 transitivePeerDependencies: - bufferutil - debug @@ -11551,12 +12184,12 @@ snapshots: '@nucypher/taco@0.6.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@astronautlabs/jsonpath': 1.1.2 - '@nucypher/nucypher-core': 0.14.5 + '@nucypher/nucypher-core': 0.16.0 '@nucypher/shared': 0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nucypher/taco-auth': 0.3.0(bufferutil@4.0.9)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - semver: 7.7.1 - zod: 3.24.2 + semver: 7.7.2 + zod: 3.25.67 transitivePeerDependencies: - bufferutil - debug @@ -11565,35 +12198,34 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.98.0))(webpack@5.98.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9))(webpack@5.99.9)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.41.0 + core-js-pure: 3.43.0 error-stack-parser: 2.1.4 - html-entities: 2.5.3 + html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.0 + schema-utils: 4.3.2 source-map: 0.7.4 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.98.0) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4))': + '@pmmmwh/react-refresh-webpack-plugin@0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.41.0 + anser: 2.3.2 + core-js-pure: 3.43.0 error-stack-parser: 2.1.4 - html-entities: 2.5.3 - loader-utils: 2.0.4 - react-refresh: 0.14.2 - schema-utils: 4.3.0 + html-entities: 2.6.0 + react-refresh: 0.17.0 + schema-utils: 4.3.2 source-map: 0.7.4 - webpack: 5.98.0(webpack-cli@5.1.4) + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) '@randlabs/communication-bridge@1.0.1': optional: true @@ -11603,10 +12235,10 @@ snapshots: '@randlabs/communication-bridge': 1.0.1 optional: true - '@rollup/plugin-babel@5.3.1(@babel/core@7.26.10)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.27.4)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) rollup: 2.79.2 optionalDependencies: @@ -11637,89 +12269,87 @@ snapshots: picomatch: 2.3.1 rollup: 2.79.2 - '@rollup/rollup-android-arm-eabi@4.37.0': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.37.0': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.37.0': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.37.0': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.37.0': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.37.0': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.37.0': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.37.0': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.37.0': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.37.0': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.37.0': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.37.0': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.37.0': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.37.0': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.37.0': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.37.0': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.37.0': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.37.0': + '@rollup/rollup-win32-ia32-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.37.0': + '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.11.0': {} - '@scure/base@1.2.4': {} + '@scure/base@1.2.6': {} - '@scure/bip32@1.6.2': + '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 - '@scure/bip39@1.5.4': + '@scure/bip39@1.6.0': dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@sinclair/typebox@0.24.51': {} '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -11737,31 +12367,49 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@solana/codecs-core@2.1.1(typescript@4.9.5)': + dependencies: + '@solana/errors': 2.1.1(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.1.1(typescript@4.9.5) + '@solana/errors': 2.1.1(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/errors@2.1.1(typescript@4.9.5)': + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + typescript: 4.9.5 + + '@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.27.0 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@babel/runtime': 7.27.6 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) agentkeepalive: 4.6.0 - bigint-buffer: 1.1.5 - bn.js: 5.2.1 + bn.js: 5.2.2 borsh: 0.7.0 bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) node-fetch: 2.7.0 rpc-websockets: 9.1.1 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil - encoding + - typescript - utf-8-validate '@spruceid/siwe-parser@3.0.0': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 apg-js: 4.4.0 '@stablelib/binary@1.0.1': @@ -11823,11 +12471,11 @@ snapshots: '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 '@svgr/plugin-jsx@5.5.0': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -11842,10 +12490,10 @@ snapshots: '@svgr/webpack@5.5.0': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/preset-react': 7.26.3(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/preset-react': 7.27.1(@babel/core@7.27.4) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -11853,15 +12501,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.5': + '@swc/helpers@0.5.17': dependencies: - '@swc/counter': 0.1.3 tslib: 2.8.1 '@szmarczak/http-timer@4.0.6': @@ -11885,124 +12530,128 @@ snapshots: tslib: 2.8.1 optional: true - '@typechain/ethers-v5@11.1.2(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.2))(typescript@5.8.2)': + '@typechain/ethers-v5@11.1.2(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.2) - typechain: 8.3.2(typescript@5.8.2) - typescript: 5.8.2 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/responselike': 1.0.3 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 optional: true + '@types/deep-eql@4.0.2': {} + '@types/deep-equal@1.0.4': {} '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/eslint@8.56.12': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@types/estree@0.0.39': {} - '@types/estree@1.0.6': {} - - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.13.14 - '@types/qs': 6.9.18 + '@types/node': 24.3.0 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.13.14 - '@types/qs': 6.9.18 + '@types/node': 24.3.0 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@4.17.21': + '@types/express@4.17.23': dependencies: - '@types/body-parser': 1.19.5 + '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/html-minifier-terser@6.1.0': {} '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -12020,9 +12669,9 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 - '@types/lodash@4.17.16': {} + '@types/lodash@4.17.19': {} '@types/mime@1.3.5': {} @@ -12030,23 +12679,15 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/node@11.11.6': {} '@types/node@12.20.55': {} - '@types/node@20.11.30': - dependencies: - undici-types: 5.26.5 - - '@types/node@20.17.28': + '@types/node@24.3.0': dependencies: - undici-types: 6.19.8 - - '@types/node@22.13.14': - dependencies: - undici-types: 6.20.0 + undici-types: 7.10.0 '@types/normalize-package-data@2.4.4': {} @@ -12054,66 +12695,68 @@ snapshots: '@types/prettier@2.7.3': {} - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.15': {} '@types/q@1.5.8': {} - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} '@types/react-copy-to-clipboard@5.0.7': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.23 - '@types/react-dom@18.3.5(@types/react@18.3.20)': + '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.23 - '@types/react@18.3.20': + '@types/react@18.3.23': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 csstype: 3.1.3 '@types/react@18.3.5': dependencies: - '@types/prop-types': 15.7.14 + '@types/prop-types': 15.7.15 csstype: 3.1.3 '@types/resolve@1.17.1': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/retry@0.12.0': {} + '@types/retry@0.12.2': {} + '@types/semver@7.7.0': {} - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/serve-index@1.9.4': dependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.23 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.13.14 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 24.3.0 + '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/stack-utils@2.0.3': {} @@ -12125,11 +12768,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 12.20.55 + '@types/node': 24.3.0 - '@types/ws@8.18.0': + '@types/ws@8.18.1': dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 '@types/yargs-parser@21.0.3': {} @@ -12141,62 +12784,62 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) - debug: 4.4.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.2) + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.8.2) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + debug: 4.4.1 eslint: 8.57.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12206,36 +12849,36 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.1 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12249,27 +12892,27 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1 eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.8.2) + tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.2) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.2) + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12277,17 +12920,17 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.2) + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12295,57 +12938,57 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.3(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.8.2) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.7.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.2)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.7.0 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) eslint: 8.57.1 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript @@ -12364,51 +13007,63 @@ snapshots: '@uniswap/token-lists@1.0.0-beta.34': {} - '@unrs/resolver-binding-darwin-arm64@1.3.2': + '@unrs/resolver-binding-android-arm-eabi@1.9.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.9.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.9.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.9.2': optional: true - '@unrs/resolver-binding-darwin-x64@1.3.2': + '@unrs/resolver-binding-freebsd-x64@1.9.2': optional: true - '@unrs/resolver-binding-freebsd-x64@1.3.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.3.2': + '@unrs/resolver-binding-linux-arm64-musl@1.9.2': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.3.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.3.2': + '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.3.2': + '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.3.2': + '@unrs/resolver-binding-linux-x64-gnu@1.9.2': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.3.2': + '@unrs/resolver-binding-linux-x64-musl@1.9.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.9.2': dependencies: - '@napi-rs/wasm-runtime': 0.2.7 + '@napi-rs/wasm-runtime': 0.2.11 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.3.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.3.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.3.2': + '@unrs/resolver-binding-win32-x64-msvc@1.9.2': optional: true '@usedapp/core@1.2.16(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(node-fetch@2.7.0)(react@18.3.1)': @@ -12425,21 +13080,22 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.1.1(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.17 magicast: 0.3.5 - std-env: 3.8.1 + std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -12450,45 +13106,79 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.0.9(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) - '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.0.9 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) '@vitest/pretty-format@3.0.9': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/runner@3.0.9': dependencies: '@vitest/utils': 3.0.9 pathe: 2.0.3 + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + '@vitest/snapshot@3.0.9': dependencies: '@vitest/pretty-format': 3.0.9 magic-string: 0.30.17 pathe: 2.0.3 + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + '@vitest/spy@3.0.9': dependencies: tinyspy: 3.0.2 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + '@vitest/utils@3.0.9': dependencies: '@vitest/pretty-format': 3.0.9 - loupe: 3.1.3 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 '@webassemblyjs/ast@1.14.1': @@ -12567,22 +13257,22 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4))': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: - webpack: 5.98.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4))': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: - webpack: 5.98.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4))': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: - webpack: 5.98.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) optionalDependencies: - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) '@xtuc/ieee754@1.2.0': {} @@ -12605,19 +13295,19 @@ snapshots: acorn: 7.4.1 acorn-walk: 7.2.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@7.2.0: {} acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn@7.4.1: {} - acorn@8.14.1: {} + acorn@8.15.0: {} add-stream@1.0.0: {} @@ -12632,7 +13322,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -12684,6 +13374,8 @@ snapshots: transitivePeerDependencies: - encoding + anser@2.3.2: {} + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -12721,7 +13413,7 @@ snapshots: apg-js@4.4.0: {} - arbundles@0.10.1(arweave@1.15.0)(bufferutil@4.0.9)(utf-8-validate@5.0.10): + arbundles@0.10.1(arweave@1.15.7)(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/hash': 5.8.0 @@ -12730,7 +13422,7 @@ snapshots: '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 '@irys/arweave': 0.0.2 - '@noble/ed25519': 1.7.3 + '@noble/ed25519': 1.7.5 base64url: 3.0.1 bs58: 4.0.1 keccak: 3.0.4 @@ -12738,7 +13430,7 @@ snapshots: optionalDependencies: '@randlabs/myalgo-connect': 1.4.2 algosdk: 1.24.1 - arweave-stream-tx: 1.2.2(arweave@1.15.0) + arweave-stream-tx: 1.2.2(arweave@1.15.7) multistream: 4.1.0 tmp-promise: 3.0.3 transitivePeerDependencies: @@ -12750,7 +13442,7 @@ snapshots: arconnect@0.4.2: dependencies: - arweave: 1.15.0 + arweave: 1.15.7 optional: true arg@4.1.3: {} @@ -12778,14 +13470,16 @@ snapshots: array-ify@1.0.0: {} - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} @@ -12793,7 +13487,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -12803,7 +13497,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -12812,14 +13506,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.reduce@1.0.8: @@ -12827,7 +13521,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-array-method-boxes-properly: 1.0.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -12837,7 +13531,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -12846,38 +13540,38 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 arrify@1.0.1: {} - arweave-stream-tx@1.2.2(arweave@1.15.0): + arweave-stream-tx@1.2.2(arweave@1.15.7): dependencies: - arweave: 1.15.0 + arweave: 1.15.7 exponential-backoff: 3.1.2 optional: true - arweave@1.15.0: + arweave@1.15.7: dependencies: arconnect: 0.4.2 asn1.js: 5.4.1 base64-js: 1.5.1 - bignumber.js: 9.1.2 + bignumber.js: 9.3.0 optional: true asap@2.0.6: {} asn1.js@4.10.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 asn1.js@5.4.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -12886,6 +13580,12 @@ snapshots: ast-types-flow@0.0.8: {} + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + async-function@1.0.0: {} async-retry@1.3.3: @@ -12898,14 +13598,14 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.4.21(postcss@8.5.3): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001707 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001726 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12914,47 +13614,55 @@ snapshots: axe-core@4.10.3: {} - axios-retry@3.9.1: + axios-retry@4.5.0(axios@1.15.0): dependencies: - '@babel/runtime': 7.27.0 + axios: 1.15.0 is-retry-allowed: 2.2.0 - axios@1.8.4: + axios@1.10.0: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.2 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + axios@1.15.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} - babel-jest@27.5.1(@babel/core@7.26.10): + babel-jest@27.5.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.26.10) + babel-preset-jest: 27.5.1(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-loader@8.4.1(@babel/core@7.26.10)(webpack@5.98.0): + babel-loader@8.4.1(@babel/core@7.27.4)(webpack@5.99.9): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -12964,89 +13672,89 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.6 cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-named-asset-import@0.3.8(@babel/core@7.26.10): + babel-plugin-named-asset-import@0.3.8(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.43.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color babel-plugin-transform-react-remove-prop-types@0.4.24: {} - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) - - babel-preset-jest@27.5.1(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + + babel-preset-jest@27.5.1(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) babel-preset-react-app@10.1.0: dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.10) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.26.10) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) - '@babel/runtime': 7.27.0 + '@babel/core': 7.27.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-runtime': 7.27.4(@babel/core@7.27.4) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/preset-react': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/runtime': 7.27.6 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -13054,6 +13762,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -13082,28 +13792,20 @@ snapshots: big.js@5.2.2: {} - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} + bignumber.js@9.3.0: {} binary-extensions@2.3.0: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - bip39-light@1.0.7: dependencies: create-hash: 1.2.0 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 bip39@3.0.2: dependencies: '@types/node': 11.11.6 create-hash: 1.2.0 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 randombytes: 2.1.0 bl@4.1.0: @@ -13114,10 +13816,12 @@ snapshots: bluebird@3.7.2: {} - bn.js@4.12.1: {} + bn.js@4.12.2: {} bn.js@5.2.1: {} + bn.js@5.2.2: {} + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -13148,15 +13852,19 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -13193,13 +13901,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -13210,12 +13918,12 @@ snapshots: readable-stream: 2.3.8 safe-buffer: 5.2.1 - browserslist@4.24.4: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001707 - electron-to-chromium: 1.5.128 + caniuse-lite: 1.0.30001726 + electron-to-chromium: 1.5.176 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs58@4.0.1: dependencies: @@ -13250,34 +13958,35 @@ snapshots: builtin-modules@3.3.0: {} + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + bundle-require@4.2.1(esbuild@0.19.12): dependencies: esbuild: 0.19.12 load-tsconfig: 0.2.5 - bundlemon-utils@1.2.1: + bundlemon-utils@2.0.1: dependencies: bytes: 3.1.2 - bundlemon@2.1.0: + bundlemon@3.1.0(typescript@5.8.3): dependencies: - axios: 1.8.4 - axios-retry: 3.9.1 + axios: 1.15.0 + axios-retry: 4.5.0(axios@1.15.0) brotli-size: 4.0.0 - bundlemon-utils: 1.2.1 + bundlemon-utils: 2.0.1 bytes: 3.1.2 chalk: 4.1.2 - commander: 9.5.0 - cosmiconfig: 7.1.0 + commander: 11.1.0 + cosmiconfig: 8.3.6(typescript@5.8.3) gzip-size: 6.0.0 micromatch: 4.0.8 yup: 0.32.11 transitivePeerDependencies: - debug - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 + - typescript bytes@3.1.2: {} @@ -13289,7 +13998,7 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 @@ -13335,12 +14044,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001707 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001726 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001707: {} + caniuse-lite@1.0.30001726: {} case-sensitive-paths-webpack-plugin@2.4.0: {} @@ -13349,8 +14058,8 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + loupe: 3.1.4 + pathval: 2.0.1 chalk@2.4.2: dependencies: @@ -13363,8 +14072,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: - optional: true + chalk@5.4.1: {} char-regex@1.0.2: {} @@ -13453,6 +14161,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colord@2.9.3: {} colorette@2.0.20: {} @@ -13475,7 +14195,7 @@ snapshots: table-layout: 1.0.2 typical: 5.2.0 - commander@10.0.1: {} + commander@11.1.0: {} commander@12.1.0: {} @@ -13489,12 +14209,10 @@ snapshots: commander@8.3.0: {} - commander@9.5.0: {} - - commitizen@4.3.1(@types/node@22.13.14)(typescript@5.8.2): + commitizen@4.3.1(@types/node@24.3.0)(typescript@5.8.3): dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@22.13.14)(typescript@5.8.2) + cz-conventional-changelog: 3.3.0(@types/node@24.3.0)(typescript@5.8.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -13681,32 +14399,31 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.98.0(webpack-cli@5.1.4)): + copy-webpack-plugin@13.0.0(webpack@5.99.9): dependencies: - fast-glob: 3.3.3 glob-parent: 6.0.2 - globby: 14.1.0 normalize-path: 3.0.0 - schema-utils: 4.3.0 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.98.0(webpack-cli@5.1.4) + tinyglobby: 0.2.14 + webpack: 5.99.9(webpack-cli@6.0.1) - core-js-compat@3.41.0: + core-js-compat@3.43.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 - core-js-pure@3.41.0: {} + core-js-pure@3.43.0: {} - core-js@3.41.0: {} + core-js@3.43.0: {} core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@22.13.14)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2): + cosmiconfig-typescript-loader@6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 22.13.14 - cosmiconfig: 9.0.0(typescript@5.8.2) + '@types/node': 24.3.0 + cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.4.2 - typescript: 5.8.2 + typescript: 5.8.3 optional: true cosmiconfig@6.0.0: @@ -13725,21 +14442,37 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@5.8.2): + cosmiconfig@8.3.6(typescript@5.8.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.8.3 + + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 optional: true create-ecdh@4.0.4: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 elliptic: 6.6.1 + create-hash@1.1.3: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.11 + create-hash@1.2.0: dependencies: cipher-base: 1.0.6 @@ -13789,53 +14522,53 @@ snapshots: diffie-hellman: 5.0.3 hash-base: 3.0.5 inherits: 2.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 crypto-random-string@2.0.0: {} - css-blank-pseudo@3.0.3(postcss@8.5.3): + css-blank-pseudo@3.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - css-declaration-sorter@6.4.1(postcss@8.5.3): + css-declaration-sorter@6.4.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - css-has-pseudo@3.0.4(postcss@8.5.3): + css-has-pseudo@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - css-loader@6.11.0(webpack@5.98.0): + css-loader@6.11.0(webpack@5.99.9): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) - postcss-modules-scope: 3.2.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.1 + semver: 7.7.2 optionalDependencies: - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) - css-minimizer-webpack-plugin@3.4.1(webpack@5.98.0): + css-minimizer-webpack-plugin@3.4.1(webpack@5.99.9): dependencies: - cssnano: 5.1.15(postcss@8.5.3) + cssnano: 5.1.15(postcss@8.5.6) jest-worker: 27.5.1 - postcss: 8.5.3 - schema-utils: 4.3.0 + postcss: 8.5.6 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) - css-prefers-color-scheme@6.0.3(postcss@8.5.3): + css-prefers-color-scheme@6.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 css-select-base-adapter@0.1.1: {} @@ -13872,48 +14605,48 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@5.2.14(postcss@8.5.3): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.5.3) - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-calc: 8.2.4(postcss@8.5.3) - postcss-colormin: 5.3.1(postcss@8.5.3) - postcss-convert-values: 5.1.3(postcss@8.5.3) - postcss-discard-comments: 5.1.2(postcss@8.5.3) - postcss-discard-duplicates: 5.1.0(postcss@8.5.3) - postcss-discard-empty: 5.1.1(postcss@8.5.3) - postcss-discard-overridden: 5.1.0(postcss@8.5.3) - postcss-merge-longhand: 5.1.7(postcss@8.5.3) - postcss-merge-rules: 5.1.4(postcss@8.5.3) - postcss-minify-font-values: 5.1.0(postcss@8.5.3) - postcss-minify-gradients: 5.1.1(postcss@8.5.3) - postcss-minify-params: 5.1.4(postcss@8.5.3) - postcss-minify-selectors: 5.2.1(postcss@8.5.3) - postcss-normalize-charset: 5.1.0(postcss@8.5.3) - postcss-normalize-display-values: 5.1.0(postcss@8.5.3) - postcss-normalize-positions: 5.1.1(postcss@8.5.3) - postcss-normalize-repeat-style: 5.1.1(postcss@8.5.3) - postcss-normalize-string: 5.1.0(postcss@8.5.3) - postcss-normalize-timing-functions: 5.1.0(postcss@8.5.3) - postcss-normalize-unicode: 5.1.1(postcss@8.5.3) - postcss-normalize-url: 5.1.0(postcss@8.5.3) - postcss-normalize-whitespace: 5.1.1(postcss@8.5.3) - postcss-ordered-values: 5.1.3(postcss@8.5.3) - postcss-reduce-initial: 5.1.2(postcss@8.5.3) - postcss-reduce-transforms: 5.1.0(postcss@8.5.3) - postcss-svgo: 5.1.0(postcss@8.5.3) - postcss-unique-selectors: 5.1.1(postcss@8.5.3) - - cssnano-utils@3.1.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - cssnano@5.1.15(postcss@8.5.3): - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.5.3) + cssnano-preset-default@5.2.14(postcss@8.5.6): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.6) + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 8.2.4(postcss@8.5.6) + postcss-colormin: 5.3.1(postcss@8.5.6) + postcss-convert-values: 5.1.3(postcss@8.5.6) + postcss-discard-comments: 5.1.2(postcss@8.5.6) + postcss-discard-duplicates: 5.1.0(postcss@8.5.6) + postcss-discard-empty: 5.1.1(postcss@8.5.6) + postcss-discard-overridden: 5.1.0(postcss@8.5.6) + postcss-merge-longhand: 5.1.7(postcss@8.5.6) + postcss-merge-rules: 5.1.4(postcss@8.5.6) + postcss-minify-font-values: 5.1.0(postcss@8.5.6) + postcss-minify-gradients: 5.1.1(postcss@8.5.6) + postcss-minify-params: 5.1.4(postcss@8.5.6) + postcss-minify-selectors: 5.2.1(postcss@8.5.6) + postcss-normalize-charset: 5.1.0(postcss@8.5.6) + postcss-normalize-display-values: 5.1.0(postcss@8.5.6) + postcss-normalize-positions: 5.1.1(postcss@8.5.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) + postcss-normalize-string: 5.1.0(postcss@8.5.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) + postcss-normalize-unicode: 5.1.1(postcss@8.5.6) + postcss-normalize-url: 5.1.0(postcss@8.5.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) + postcss-ordered-values: 5.1.3(postcss@8.5.6) + postcss-reduce-initial: 5.1.2(postcss@8.5.6) + postcss-reduce-transforms: 5.1.0(postcss@8.5.6) + postcss-svgo: 5.1.0(postcss@8.5.6) + postcss-unique-selectors: 5.1.1(postcss@8.5.6) + + cssnano-utils@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@5.1.15(postcss@8.5.6): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.5.6) lilconfig: 2.1.0 - postcss: 8.5.3 + postcss: 8.5.6 yaml: 1.10.2 csso@4.2.0: @@ -13943,16 +14676,16 @@ snapshots: csv-stringify: 5.6.5 stream-transform: 2.1.3 - cz-conventional-changelog@3.3.0(@types/node@22.13.14)(typescript@5.8.2): + cz-conventional-changelog@3.3.0(@types/node@24.3.0)(typescript@5.8.3): dependencies: chalk: 2.4.2 - commitizen: 4.3.1(@types/node@22.13.14)(typescript@5.8.2) + commitizen: 4.3.1(@types/node@24.3.0)(typescript@5.8.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.8.0(@types/node@22.13.14)(typescript@5.8.2) + '@commitlint/load': 19.8.1(@types/node@24.3.0)(typescript@5.8.3) transitivePeerDependencies: - '@types/node' - typescript @@ -13995,7 +14728,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -14043,6 +14776,13 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + default-gateway@6.0.3: dependencies: execa: 5.1.1 @@ -14061,6 +14801,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -14088,6 +14830,9 @@ snapshots: detect-indent@7.0.1: {} + detect-libc@2.0.4: + optional: true + detect-newline@3.1.0: {} detect-newline@4.0.1: {} @@ -14109,7 +14854,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -14182,7 +14927,7 @@ snapshots: dotenv@10.0.0: {} - dotenv@16.4.7: {} + dotenv@16.5.0: {} dotgitignore@2.1.0: dependencies: @@ -14207,11 +14952,11 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.128: {} + electron-to-chromium@1.5.176: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -14235,14 +14980,14 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 enquirer@2.4.1: dependencies: @@ -14264,7 +15009,7 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -14293,7 +15038,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -14308,6 +15055,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -14341,7 +15089,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -14355,7 +15103,7 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -14384,14 +15132,14 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.98.0(webpack-cli@5.1.4)): + esbuild-loader@2.21.0(webpack@5.99.9): dependencies: esbuild: 0.16.17 joycon: 3.1.1 json5: 2.2.3 loader-utils: 2.0.4 - tapable: 2.2.1 - webpack: 5.98.0(webpack-cli@5.1.4) + tapable: 2.2.2 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 esbuild@0.16.17: @@ -14445,33 +15193,33 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.1: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -14507,10 +15255,10 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) - eslint-plugin-react: 7.37.4(eslint@8.57.0) + eslint-plugin-react: 7.37.5(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) optionalDependencies: typescript: 5.2.2 @@ -14519,20 +15267,20 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@14.0.4(eslint@8.57.0)(typescript@5.8.2): + eslint-config-next@14.0.4(eslint@8.57.0)(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 14.0.4 '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) - eslint-plugin-react: 7.37.4(eslint@8.57.0) + eslint-plugin-react: 7.37.5(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -14542,25 +15290,25 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10))(typescript@5.8.3): dependencies: - '@babel/core': 7.26.10 - '@babel/eslint-parser': 7.27.0(@babel/core@7.26.10)(eslint@8.57.1) + '@babel/core': 7.27.4 + '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@8.57.1) '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) babel-preset-react-app: 10.1.0 confusing-browser-globals: 1.0.11 eslint: 8.57.1 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10))(typescript@5.8.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.1)(typescript@5.8.2) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.1)(typescript@5.8.3) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -14569,10 +15317,10 @@ snapshots: - jest - supports-color - eslint-config-typestrict@1.0.5(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint-plugin-sonarjs@0.23.0(eslint@8.57.1)): + eslint-config-typestrict@1.0.5(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-sonarjs@3.0.3(eslint@8.57.1)): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - eslint-plugin-sonarjs: 0.23.0(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + eslint-plugin-sonarjs: 3.0.3(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -14582,57 +15330,47 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 - get-tsconfig: 4.10.0 + get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.12 - unrs-resolver: 1.3.2 + tinyglobby: 0.2.14 + unrs-resolver: 1.9.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -14644,18 +15382,18 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(eslint@8.57.1): dependencies: - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) eslint: 8.57.1 lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -14663,36 +15401,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14704,16 +15413,16 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -14721,7 +15430,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14733,16 +15442,16 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -14750,7 +15459,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14762,19 +15471,19 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10))(typescript@5.8.3): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -14782,7 +15491,7 @@ snapshots: eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.0): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.3 @@ -14801,7 +15510,7 @@ snapshots: eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.3 @@ -14827,9 +15536,9 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react@7.37.4(eslint@8.57.0): + eslint-plugin-react@7.37.5(eslint@8.57.0): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 @@ -14849,9 +15558,9 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.37.4(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 @@ -14875,26 +15584,32 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-sonarjs@0.23.0(eslint@8.57.1): + eslint-plugin-sonarjs@3.0.3(eslint@8.57.1): dependencies: + '@eslint-community/regexpp': 4.12.1 + builtin-modules: 3.3.0 + bytes: 3.1.2 eslint: 8.57.1 + functional-red-black-tree: 1.0.1 + jsx-ast-utils: 3.3.5 + minimatch: 9.0.5 + scslre: 0.3.0 + semver: 7.7.2 + typescript: 5.8.3 - eslint-plugin-testing-library@5.11.1(eslint@8.57.1)(typescript@5.8.2): + eslint-plugin-testing-library@5.11.1(eslint@8.57.1)(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - - eslint-rule-composer@0.3.0: {} + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) eslint-scope@5.1.1: dependencies: @@ -14910,19 +15625,19 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.98.0): + eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.99.9): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 jest-worker: 28.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 - schema-utils: 4.3.0 - webpack: 5.98.0 + schema-utils: 4.3.2 + webpack: 5.99.9(webpack-cli@6.0.1) eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 @@ -14933,7 +15648,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14965,7 +15680,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -14976,7 +15691,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15008,8 +15723,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@1.2.2: {} @@ -15032,7 +15747,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -15103,7 +15818,7 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 - expect-type@1.2.0: {} + expect-type@1.2.1: {} expect@27.5.1: dependencies: @@ -15193,16 +15908,16 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 fetch-mock@9.11.0(node-fetch@2.7.0): dependencies: - '@babel/core': 7.26.10 - '@babel/runtime': 7.27.0 - core-js: 3.41.0 - debug: 4.4.0 + '@babel/core': 7.27.4 + '@babel/runtime': 7.27.6 + core-js: 3.43.0 + debug: 4.4.1 glob-to-regexp: 0.4.1 is-subset: 0.1.1 lodash.isequal: 4.5.0 @@ -15222,19 +15937,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.98.0(webpack-cli@5.1.4)): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.98.0(webpack-cli@5.1.4) - - file-loader@6.2.0(webpack@5.98.0): + file-loader@6.2.0(webpack@5.99.9): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.98.0 - - file-uri-to-path@1.0.0: {} + webpack: 5.99.9(webpack-cli@6.0.1) filelist@1.0.4: dependencies: @@ -15320,6 +16027,8 @@ snapshots: follow-redirects@1.15.9: {} + follow-redirects@1.16.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -15329,9 +16038,9 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.8.2)(webpack@5.98.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.8.3)(webpack@5.99.9): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -15342,10 +16051,10 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.1 + semver: 7.7.2 tapable: 1.1.3 - typescript: 5.8.2 - webpack: 5.98.0 + typescript: 5.8.3 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -15356,11 +16065,20 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 forwarded@0.2.0: {} @@ -15418,6 +16136,8 @@ snapshots: hasown: 2.0.2 is-callable: 1.2.7 + functional-red-black-tree@1.0.1: {} + functions-have-names@1.2.3: {} gensync@1.0.0-beta.2: {} @@ -15457,7 +16177,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.2 + pump: 3.0.3 get-stream@6.0.1: {} @@ -15467,7 +16187,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -15524,11 +16244,11 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.1: + glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.0 - minimatch: 10.0.1 + jackspeak: 4.1.1 + minimatch: 10.2.5 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -15600,15 +16320,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.3 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - gopd@1.2.0: {} got@11.8.6: @@ -15668,6 +16379,10 @@ snapshots: dependencies: has-symbols: 1.1.0 + hash-base@2.0.2: + dependencies: + inherits: 2.0.4 + hash-base@3.0.5: dependencies: inherits: 2.0.4 @@ -15715,7 +16430,7 @@ snapshots: dependencies: whatwg-encoding: 1.0.5 - html-entities@2.5.3: {} + html-entities@2.6.0: {} html-escaper@2.0.2: {} @@ -15727,27 +16442,17 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.39.0 - - html-webpack-plugin@5.6.3(webpack@5.98.0(webpack-cli@5.1.4)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.98.0(webpack-cli@5.1.4) + terser: 5.43.1 - html-webpack-plugin@5.6.3(webpack@5.98.0): + html-webpack-plugin@5.6.3(webpack@5.99.9): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.1 + tapable: 2.2.2 optionalDependencies: - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -15756,7 +16461,7 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} @@ -15783,17 +16488,17 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-parser-js@0.5.9: {} + http-parser-js@0.5.10: {} http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.7(@types/express@4.17.21): + http-proxy-middleware@2.0.9(@types/express@4.17.23): dependencies: '@types/http-proxy': 1.17.16 http-proxy: 1.18.1 @@ -15801,14 +16506,14 @@ snapshots: is-plain-obj: 3.0.0 micromatch: 4.0.8 optionalDependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.23 transitivePeerDependencies: - debug http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9 + follow-redirects: 1.16.0 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15821,7 +16526,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -15833,6 +16538,8 @@ snapshots: dependencies: ms: 2.1.3 + hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -15841,9 +16548,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): + icss-utils@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 idb@7.1.1: {} @@ -15855,8 +16562,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.3: {} - immer@9.0.21: {} import-fresh@3.3.1: @@ -15951,6 +16656,9 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: + optional: true + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -15974,7 +16682,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -15995,6 +16703,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -16016,12 +16726,20 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@1.0.0: {} is-map@2.0.3: {} is-module@1.0.0: {} + is-negative-zero@2.0.3: {} + + is-network-error@1.1.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -16116,6 +16834,10 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isarray@2.0.5: {} @@ -16132,8 +16854,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -16148,7 +16870,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -16157,7 +16879,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -16182,7 +16904,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.0: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -16193,18 +16915,18 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jayson@4.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 '@types/ws': 7.4.7 - JSONStream: 1.3.5 commander: 2.20.3 delay: 5.0.0 es6-promisify: 5.0.0 eyes: 0.1.8 isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) json-stringify-safe: 5.0.1 + stream-json: 1.9.1 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -16222,7 +16944,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16241,16 +16963,16 @@ snapshots: transitivePeerDependencies: - supports-color - jest-cli@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10): + jest-cli@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -16262,12 +16984,12 @@ snapshots: - ts-node - utf-8-validate - jest-config@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10): + jest-config@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.26.10) + babel-jest: 27.5.1(@babel/core@7.27.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -16289,7 +17011,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@types/node@20.17.28)(typescript@5.8.2) + ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.8.3) transitivePeerDependencies: - bufferutil - canvas @@ -16320,7 +17042,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -16335,7 +17057,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -16345,7 +17067,7 @@ snapshots: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.28 + '@types/node': 24.3.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -16364,7 +17086,7 @@ snapshots: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -16394,7 +17116,7 @@ snapshots: jest-message-util@27.5.1: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -16406,7 +17128,7 @@ snapshots: jest-message-util@28.1.3: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 28.1.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -16419,7 +17141,7 @@ snapshots: jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): optionalDependencies: @@ -16457,7 +17179,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -16508,21 +17230,21 @@ snapshots: jest-serializer@27.5.1: dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 graceful-fs: 4.2.11 jest-snapshot@27.5.1: dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.7 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -16534,14 +17256,14 @@ snapshots: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color jest-util@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16550,7 +17272,7 @@ snapshots: jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 20.17.28 + '@types/node': 24.3.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16565,11 +17287,11 @@ snapshots: leven: 3.1.0 pretty-format: 27.5.1 - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10)): + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -16580,7 +17302,7 @@ snapshots: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.17.28 + '@types/node': 24.3.0 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -16590,7 +17312,7 @@ snapshots: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.17.28 + '@types/node': 24.3.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -16599,27 +17321,27 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@28.1.3: dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10): + jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) import-local: 3.2.0 - jest-cli: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-cli: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - canvas @@ -16644,6 +17366,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -16656,7 +17380,7 @@ snapshots: jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: abab: 2.0.6 - acorn: 8.14.1 + acorn: 8.15.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -16693,7 +17417,7 @@ snapshots: json-bigint@1.0.0: dependencies: - bignumber.js: 9.1.2 + bignumber.js: 9.3.0 json-buffer@3.0.1: {} @@ -16741,7 +17465,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -16775,7 +17499,7 @@ snapshots: launch-editor@2.10.0: dependencies: picocolors: 1.1.1 - shell-quote: 1.8.2 + shell-quote: 1.8.3 leven@3.1.0: {} @@ -16875,7 +17599,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.3: {} + loupe@3.1.4: {} lower-case@2.0.2: dependencies: @@ -16907,8 +17631,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 source-map-js: 1.2.1 make-dir@3.1.0: @@ -16917,7 +17641,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -16949,6 +17673,13 @@ snapshots: dependencies: fs-monkey: 1.0.6 + memfs@4.24.0: + dependencies: + '@jsonjoy.com/json-pack': 1.4.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.8.0(tslib@2.8.1) + tree-dump: 1.0.3(tslib@2.8.1) + tslib: 2.8.1 + memorystream@0.3.1: {} meow@8.1.2: @@ -16982,7 +17713,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 mime-db@1.52.0: {} @@ -17003,35 +17734,35 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.2(webpack@5.98.0): + mini-css-extract-plugin@2.9.2(webpack@5.99.9): dependencies: - schema-utils: 4.3.0 - tapable: 2.2.1 - webpack: 5.98.0 + schema-utils: 4.3.2 + tapable: 2.2.2 + webpack: 5.99.9(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} - minimatch@10.0.1: + minimatch@10.2.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.3: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist-options@4.1.0: dependencies: @@ -17053,14 +17784,14 @@ snapshots: mkdirp@1.0.4: {} - modified-zod2md@0.1.5-modified.4(zod@3.24.2): + modified-zod2md@0.1.5-modified.4(zod@3.25.67): dependencies: '@commander-js/extra-typings': 12.1.0(commander@12.1.0) bundle-require: 4.2.1(esbuild@0.19.12) commander: 12.1.0 esbuild: 0.19.12 modified-zod2md: 'link:' - zod: 3.24.2 + zod: 3.25.67 modify-values@1.0.1: {} @@ -17097,6 +17828,8 @@ snapshots: nanoid@3.3.4: {} + napi-postinstall@0.2.4: {} + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -17120,27 +17853,25 @@ snapshots: neo-async@2.6.2: {} - next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.10 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001707 - graceful-fs: 4.2.11 + '@next/env': 15.5.14 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001726 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.10 - '@next/swc-darwin-x64': 14.2.10 - '@next/swc-linux-arm64-gnu': 14.2.10 - '@next/swc-linux-arm64-musl': 14.2.10 - '@next/swc-linux-x64-gnu': 14.2.10 - '@next/swc-linux-x64-musl': 14.2.10 - '@next/swc-win32-arm64-msvc': 14.2.10 - '@next/swc-win32-ia32-msvc': 14.2.10 - '@next/swc-win32-x64-msvc': 14.2.10 + '@next/swc-darwin-arm64': 15.5.14 + '@next/swc-darwin-x64': 15.5.14 + '@next/swc-linux-arm64-gnu': 15.5.14 + '@next/swc-linux-arm64-musl': 15.5.14 + '@next/swc-linux-x64-gnu': 15.5.14 + '@next/swc-linux-x64-musl': 15.5.14 + '@next/swc-win32-arm64-msvc': 15.5.14 + '@next/swc-win32-x64-msvc': 15.5.14 + sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -17179,7 +17910,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -17197,7 +17928,7 @@ snapshots: minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.2 + shell-quote: 1.8.3 string.prototype.padend: 3.1.6 npm-run-path@4.0.1: @@ -17243,7 +17974,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.getownpropertydescriptors@2.1.8: @@ -17251,7 +17982,7 @@ snapshots: array.prototype.reduce: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 gopd: 1.2.0 safe-array-concat: 1.1.3 @@ -17260,7 +17991,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -17285,6 +18016,13 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@10.2.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -17372,6 +18110,12 @@ snapshots: '@types/retry': 0.12.0 retry: 0.13.1 + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + p-try@1.0.0: {} p-try@2.2.0: {} @@ -17397,7 +18141,7 @@ snapshots: browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 hash-base: 3.0.5 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 safe-buffer: 5.2.1 parse-json@4.0.0: @@ -17407,7 +18151,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -17455,19 +18199,18 @@ snapshots: path-type@4.0.0: {} - path-type@6.0.0: {} - pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} - pbkdf2@3.1.2: + pbkdf2@3.1.3: dependencies: - create-hash: 1.2.0 + create-hash: 1.1.3 create-hmac: 1.1.7 - ripemd160: 2.0.2 + ripemd160: 2.0.1 safe-buffer: 5.2.1 sha.js: 2.4.11 + to-buffer: 1.2.1 performance-now@2.1.0: {} @@ -17501,400 +18244,400 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-attribute-case-insensitive@5.0.2(postcss@8.5.3): + postcss-attribute-case-insensitive@5.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-browser-comments@4.0.0(browserslist@4.24.4)(postcss@8.5.3): + postcss-browser-comments@4.0.0(browserslist@4.25.1)(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 + browserslist: 4.25.1 + postcss: 8.5.6 - postcss-calc@8.2.4(postcss@8.5.3): + postcss-calc@8.2.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-clamp@4.1.0(postcss@8.5.3): + postcss-clamp@4.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@4.2.4(postcss@8.5.3): + postcss-color-functional-notation@4.2.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-hex-alpha@8.0.4(postcss@8.5.3): + postcss-color-hex-alpha@8.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@7.1.1(postcss@8.5.3): + postcss-color-rebeccapurple@7.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-colormin@5.3.1(postcss@8.5.3): + postcss-colormin@5.3.1(postcss@8.5.6): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-convert-values@5.1.3(postcss@8.5.3): + postcss-convert-values@5.1.3(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 + browserslist: 4.25.1 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-media@8.0.2(postcss@8.5.3): + postcss-custom-media@8.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-properties@12.1.11(postcss@8.5.3): + postcss-custom-properties@12.1.11(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-custom-selectors@6.0.3(postcss@8.5.3): + postcss-custom-selectors@6.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-dir-pseudo-class@6.0.5(postcss@8.5.3): + postcss-dir-pseudo-class@6.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-discard-comments@5.1.2(postcss@8.5.3): + postcss-discard-comments@5.1.2(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-discard-duplicates@5.1.0(postcss@8.5.3): + postcss-discard-duplicates@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-discard-empty@5.1.1(postcss@8.5.3): + postcss-discard-empty@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-discard-overridden@5.1.0(postcss@8.5.3): + postcss-discard-overridden@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-double-position-gradients@3.1.2(postcss@8.5.3): + postcss-double-position-gradients@3.1.2(postcss@8.5.6): dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - postcss: 8.5.3 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-env-function@4.0.6(postcss@8.5.3): + postcss-env-function@4.0.6(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-flexbugs-fixes@5.0.2(postcss@8.5.3): + postcss-flexbugs-fixes@5.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-focus-visible@6.0.4(postcss@8.5.3): + postcss-focus-visible@6.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-focus-within@5.0.4(postcss@8.5.3): + postcss-focus-within@5.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-font-variant@5.0.0(postcss@8.5.3): + postcss-font-variant@5.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-gap-properties@3.0.5(postcss@8.5.3): + postcss-gap-properties@3.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-image-set-function@4.0.7(postcss@8.5.3): + postcss-image-set-function@4.0.7(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-initial@4.0.1(postcss@8.5.3): + postcss-initial@4.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 + postcss: 8.5.6 - postcss-lab-function@4.2.1(postcss@8.5.3): + postcss-lab-function@4.2.1(postcss@8.5.6): dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - postcss: 8.5.3 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 - yaml: 2.7.0 + yaml: 2.8.0 optionalDependencies: - postcss: 8.5.3 - ts-node: 10.9.2(@types/node@20.17.28)(typescript@5.8.2) + postcss: 8.5.6 + ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.8.3) - postcss-loader@6.2.1(postcss@8.5.3)(webpack@5.98.0): + postcss-loader@6.2.1(postcss@8.5.6)(webpack@5.99.9): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 - postcss: 8.5.3 - semver: 7.7.1 - webpack: 5.98.0 + postcss: 8.5.6 + semver: 7.7.2 + webpack: 5.99.9(webpack-cli@6.0.1) - postcss-logical@5.0.4(postcss@8.5.3): + postcss-logical@5.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-media-minmax@5.0.0(postcss@8.5.3): + postcss-media-minmax@5.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-merge-longhand@5.1.7(postcss@8.5.3): + postcss-merge-longhand@5.1.7(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.5.3) + stylehacks: 5.1.1(postcss@8.5.6) - postcss-merge-rules@5.1.4(postcss@8.5.3): + postcss-merge-rules@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-minify-font-values@5.1.0(postcss@8.5.3): + postcss-minify-font-values@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-gradients@5.1.1(postcss@8.5.3): + postcss-minify-gradients@5.1.1(postcss@8.5.6): dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-params@5.1.4(postcss@8.5.3): + postcss-minify-params@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + browserslist: 4.25.1 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-selectors@5.2.1(postcss@8.5.3): + postcss-minify-selectors@5.2.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.3): + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-modules-local-by-default@4.2.0(postcss@8.5.3): + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.3): + postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.3): + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-nesting@10.2.0(postcss@8.5.3): + postcss-nesting@10.2.0(postcss@8.5.6): dependencies: '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-normalize-charset@5.1.0(postcss@8.5.3): + postcss-normalize-charset@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-normalize-display-values@5.1.0(postcss@8.5.3): + postcss-normalize-display-values@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-positions@5.1.1(postcss@8.5.3): + postcss-normalize-positions@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@5.1.1(postcss@8.5.3): + postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-string@5.1.0(postcss@8.5.3): + postcss-normalize-string@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@5.1.0(postcss@8.5.3): + postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@5.1.1(postcss@8.5.3): + postcss-normalize-unicode@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 + browserslist: 4.25.1 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-url@5.1.0(postcss@8.5.3): + postcss-normalize-url@5.1.0(postcss@8.5.6): dependencies: normalize-url: 6.1.0 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@5.1.1(postcss@8.5.3): + postcss-normalize-whitespace@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize@10.0.1(browserslist@4.24.4)(postcss@8.5.3): + postcss-normalize@10.0.1(browserslist@4.25.1)(postcss@8.5.6): dependencies: '@csstools/normalize.css': 12.1.1 - browserslist: 4.24.4 - postcss: 8.5.3 - postcss-browser-comments: 4.0.0(browserslist@4.24.4)(postcss@8.5.3) + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-browser-comments: 4.0.0(browserslist@4.25.1)(postcss@8.5.6) sanitize.css: 13.0.0 - postcss-opacity-percentage@1.1.3(postcss@8.5.3): + postcss-opacity-percentage@1.1.3(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-ordered-values@5.1.3(postcss@8.5.3): + postcss-ordered-values@5.1.3(postcss@8.5.6): dependencies: - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-overflow-shorthand@3.0.4(postcss@8.5.3): + postcss-overflow-shorthand@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.5.3): + postcss-page-break@3.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-place@7.0.5(postcss@8.5.3): + postcss-place@7.0.5(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-preset-env@7.8.3(postcss@8.5.3): - dependencies: - '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.5.3) - '@csstools/postcss-color-function': 1.1.1(postcss@8.5.3) - '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.3) - '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.3) - '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.3) - '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.3) - '@csstools/postcss-nested-calc': 1.0.0(postcss@8.5.3) - '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.3) - '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.3) - '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.3) - '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.3) - '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.3) - '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.3) - '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.3) - autoprefixer: 10.4.21(postcss@8.5.3) - browserslist: 4.24.4 - css-blank-pseudo: 3.0.3(postcss@8.5.3) - css-has-pseudo: 3.0.4(postcss@8.5.3) - css-prefers-color-scheme: 6.0.3(postcss@8.5.3) + postcss-preset-env@7.8.3(postcss@8.5.6): + dependencies: + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.5.6) + '@csstools/postcss-color-function': 1.1.1(postcss@8.5.6) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.6) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.6) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.6) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.6) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.5.6) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.6) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.6) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.6) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.6) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.6) + autoprefixer: 10.4.21(postcss@8.5.6) + browserslist: 4.25.1 + css-blank-pseudo: 3.0.3(postcss@8.5.6) + css-has-pseudo: 3.0.4(postcss@8.5.6) + css-prefers-color-scheme: 6.0.3(postcss@8.5.6) cssdb: 7.11.2 - postcss: 8.5.3 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.3) - postcss-clamp: 4.1.0(postcss@8.5.3) - postcss-color-functional-notation: 4.2.4(postcss@8.5.3) - postcss-color-hex-alpha: 8.0.4(postcss@8.5.3) - postcss-color-rebeccapurple: 7.1.1(postcss@8.5.3) - postcss-custom-media: 8.0.2(postcss@8.5.3) - postcss-custom-properties: 12.1.11(postcss@8.5.3) - postcss-custom-selectors: 6.0.3(postcss@8.5.3) - postcss-dir-pseudo-class: 6.0.5(postcss@8.5.3) - postcss-double-position-gradients: 3.1.2(postcss@8.5.3) - postcss-env-function: 4.0.6(postcss@8.5.3) - postcss-focus-visible: 6.0.4(postcss@8.5.3) - postcss-focus-within: 5.0.4(postcss@8.5.3) - postcss-font-variant: 5.0.0(postcss@8.5.3) - postcss-gap-properties: 3.0.5(postcss@8.5.3) - postcss-image-set-function: 4.0.7(postcss@8.5.3) - postcss-initial: 4.0.1(postcss@8.5.3) - postcss-lab-function: 4.2.1(postcss@8.5.3) - postcss-logical: 5.0.4(postcss@8.5.3) - postcss-media-minmax: 5.0.0(postcss@8.5.3) - postcss-nesting: 10.2.0(postcss@8.5.3) - postcss-opacity-percentage: 1.1.3(postcss@8.5.3) - postcss-overflow-shorthand: 3.0.4(postcss@8.5.3) - postcss-page-break: 3.0.4(postcss@8.5.3) - postcss-place: 7.0.5(postcss@8.5.3) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.3) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.3) - postcss-selector-not: 6.0.1(postcss@8.5.3) + postcss: 8.5.6 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.6) + postcss-clamp: 4.1.0(postcss@8.5.6) + postcss-color-functional-notation: 4.2.4(postcss@8.5.6) + postcss-color-hex-alpha: 8.0.4(postcss@8.5.6) + postcss-color-rebeccapurple: 7.1.1(postcss@8.5.6) + postcss-custom-media: 8.0.2(postcss@8.5.6) + postcss-custom-properties: 12.1.11(postcss@8.5.6) + postcss-custom-selectors: 6.0.3(postcss@8.5.6) + postcss-dir-pseudo-class: 6.0.5(postcss@8.5.6) + postcss-double-position-gradients: 3.1.2(postcss@8.5.6) + postcss-env-function: 4.0.6(postcss@8.5.6) + postcss-focus-visible: 6.0.4(postcss@8.5.6) + postcss-focus-within: 5.0.4(postcss@8.5.6) + postcss-font-variant: 5.0.0(postcss@8.5.6) + postcss-gap-properties: 3.0.5(postcss@8.5.6) + postcss-image-set-function: 4.0.7(postcss@8.5.6) + postcss-initial: 4.0.1(postcss@8.5.6) + postcss-lab-function: 4.2.1(postcss@8.5.6) + postcss-logical: 5.0.4(postcss@8.5.6) + postcss-media-minmax: 5.0.0(postcss@8.5.6) + postcss-nesting: 10.2.0(postcss@8.5.6) + postcss-opacity-percentage: 1.1.3(postcss@8.5.6) + postcss-overflow-shorthand: 3.0.4(postcss@8.5.6) + postcss-page-break: 3.0.4(postcss@8.5.6) + postcss-place: 7.0.5(postcss@8.5.6) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.6) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6) + postcss-selector-not: 6.0.1(postcss@8.5.6) postcss-value-parser: 4.2.0 - postcss-pseudo-class-any-link@7.1.6(postcss@8.5.3): + postcss-pseudo-class-any-link@7.1.6(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-reduce-initial@5.1.2(postcss@8.5.3): + postcss-reduce-initial@5.1.2(postcss@8.5.6): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 - postcss: 8.5.3 + postcss: 8.5.6 - postcss-reduce-transforms@5.1.0(postcss@8.5.3): + postcss-reduce-transforms@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-replace-overflow-wrap@4.0.0(postcss@8.5.3): + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-selector-not@6.0.1(postcss@8.5.3): + postcss-selector-not@6.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -17907,15 +18650,15 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@5.1.0(postcss@8.5.3): + postcss-svgo@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 svgo: 2.8.0 - postcss-unique-selectors@5.1.1(postcss@8.5.3): + postcss-unique-selectors@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-value-parser@4.2.0: {} @@ -17931,7 +18674,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -17941,14 +18684,14 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-organize-imports@3.2.4(prettier@3.5.3)(typescript@5.8.2): + prettier-plugin-organize-imports@3.2.4(prettier@3.6.1)(typescript@5.8.3): dependencies: - prettier: 3.5.3 - typescript: 5.8.2 + prettier: 3.6.1 + typescript: 5.8.3 prettier@2.8.8: {} - prettier@3.5.3: {} + prettier@3.6.1: {} pretty-bytes@5.6.0: {} @@ -17998,22 +18741,24 @@ snapshots: proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} + psl@1.15.0: dependencies: punycode: 2.3.1 public-encrypt@4.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 randombytes: 2.1.0 safe-buffer: 5.2.1 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} @@ -18024,7 +18769,7 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.14.0: + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -18064,7 +18809,7 @@ snapshots: react-app-polyfill@3.0.0: dependencies: - core-js: 3.41.0 + core-js: 3.43.0 object-assign: 4.1.1 promise: 8.3.0 raf: 3.4.1 @@ -18077,18 +18822,18 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.8.2)(webpack@5.98.0): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.8.3)(webpack@5.99.9): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 address: 1.2.2 - browserslist: 4.24.4 + browserslist: 4.25.1 chalk: 4.1.2 cross-spawn: 7.0.6 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.8.2)(webpack@5.98.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.8.3)(webpack@5.99.9) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -18100,12 +18845,12 @@ snapshots: prompts: 2.4.2 react-error-overlay: 6.1.0 recursive-readdir: 2.2.3 - shell-quote: 1.8.2 + shell-quote: 1.8.3 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - eslint - supports-color @@ -18127,61 +18872,61 @@ snapshots: react-refresh@0.11.0: {} - react-refresh@0.14.2: {} + react-refresh@0.17.0: {} - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(type-fest@0.21.3)(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.26.10 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.98.0))(webpack@5.98.0) + '@babel/core': 7.27.4 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9))(webpack@5.99.9) '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.10) - babel-loader: 8.4.1(@babel/core@7.26.10)(webpack@5.98.0) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.10) + babel-jest: 27.5.1(@babel/core@7.27.4) + babel-loader: 8.4.1(@babel/core@7.27.4)(webpack@5.99.9) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.27.4) babel-preset-react-app: 10.1.0 bfj: 7.1.0 - browserslist: 4.24.4 + browserslist: 4.25.1 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.98.0) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.98.0) + css-loader: 6.11.0(webpack@5.99.9) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.99.9) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.98.0) - file-loader: 6.2.0(webpack@5.98.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10))(typescript@5.8.3) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.99.9) + file-loader: 6.2.0(webpack@5.99.9) fs-extra: 10.1.0 - html-webpack-plugin: 5.6.3(webpack@5.98.0) + html-webpack-plugin: 5.6.3(webpack@5.99.9) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.9.2(webpack@5.98.0) - postcss: 8.5.3 - postcss-flexbugs-fixes: 5.0.2(postcss@8.5.3) - postcss-loader: 6.2.1(postcss@8.5.3)(webpack@5.98.0) - postcss-normalize: 10.0.1(browserslist@4.24.4)(postcss@8.5.3) - postcss-preset-env: 7.8.3(postcss@8.5.3) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.9.2(webpack@5.99.9) + postcss: 8.5.6 + postcss-flexbugs-fixes: 5.0.2(postcss@8.5.6) + postcss-loader: 6.2.1(postcss@8.5.6)(webpack@5.99.9) + postcss-normalize: 10.0.1(browserslist@4.25.1)(postcss@8.5.6) + postcss-preset-env: 7.8.3(postcss@8.5.6) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.8.2)(webpack@5.98.0) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.8.3)(webpack@5.99.9) react-refresh: 0.11.0 resolve: 1.22.10 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.98.0) - semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.98.0) - style-loader: 3.3.4(webpack@5.98.0) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.98.0) - webpack: 5.98.0 - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.98.0) - webpack-manifest-plugin: 4.1.1(webpack@5.98.0) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.98.0) + sass-loader: 12.6.0(webpack@5.99.9) + semver: 7.7.2 + source-map-loader: 3.0.2(webpack@5.99.9) + style-loader: 3.3.4(webpack@5.99.9) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) + webpack-manifest-plugin: 4.1.1(webpack@5.99.9) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) optionalDependencies: fsevents: 2.3.3 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -18295,11 +19040,15 @@ snapshots: reduce-flatten@2.0.0: {} + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -18314,13 +19063,12 @@ snapshots: regenerator-runtime@0.13.11: {} - regenerator-runtime@0.14.1: {} + regex-parser@2.3.1: {} - regenerator-transform@0.15.2: + regexp-ast-analysis@0.7.1: dependencies: - '@babel/runtime': 7.27.0 - - regex-parser@2.3.1: {} + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 regexp.prototype.flags@1.5.4: dependencies: @@ -18422,6 +19170,11 @@ snapshots: dependencies: glob: 10.4.5 + ripemd160@2.0.1: + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + ripemd160@2.0.2: dependencies: hash-base: 3.0.5 @@ -18429,55 +19182,57 @@ snapshots: rollup-plugin-terser@7.0.2(rollup@2.79.2): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 jest-worker: 26.6.2 rollup: 2.79.2 serialize-javascript: 4.0.0 - terser: 5.39.0 + terser: 5.43.1 rollup@2.79.2: optionalDependencies: fsevents: 2.3.3 - rollup@4.37.0: + rollup@4.44.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.37.0 - '@rollup/rollup-android-arm64': 4.37.0 - '@rollup/rollup-darwin-arm64': 4.37.0 - '@rollup/rollup-darwin-x64': 4.37.0 - '@rollup/rollup-freebsd-arm64': 4.37.0 - '@rollup/rollup-freebsd-x64': 4.37.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 - '@rollup/rollup-linux-arm-musleabihf': 4.37.0 - '@rollup/rollup-linux-arm64-gnu': 4.37.0 - '@rollup/rollup-linux-arm64-musl': 4.37.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 - '@rollup/rollup-linux-riscv64-gnu': 4.37.0 - '@rollup/rollup-linux-riscv64-musl': 4.37.0 - '@rollup/rollup-linux-s390x-gnu': 4.37.0 - '@rollup/rollup-linux-x64-gnu': 4.37.0 - '@rollup/rollup-linux-x64-musl': 4.37.0 - '@rollup/rollup-win32-arm64-msvc': 4.37.0 - '@rollup/rollup-win32-ia32-msvc': 4.37.0 - '@rollup/rollup-win32-x64-msvc': 4.37.0 + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 rpc-websockets@9.1.1: dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.17 '@types/uuid': 8.3.4 - '@types/ws': 8.18.0 + '@types/ws': 8.18.1 buffer: 6.0.3 eventemitter3: 5.0.1 uuid: 8.3.2 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + run-applescript@7.0.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: @@ -18515,11 +19270,11 @@ snapshots: sanitize.css@13.0.0: {} - sass-loader@12.6.0(webpack@5.98.0): + sass-loader@12.6.0(webpack@5.99.9): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) sax@1.2.4: {} @@ -18549,7 +19304,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.0: + schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -18558,6 +19313,12 @@ snapshots: scrypt-js@3.0.1: {} + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + secp256k1@5.0.1: dependencies: elliptic: 6.6.1 @@ -18575,7 +19336,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} send@0.19.0: dependencies: @@ -18659,6 +19420,36 @@ snapshots: dependencies: kind-of: 6.0.3 + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + optional: true + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -18671,7 +19462,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} + shell-quote@1.8.3: {} shiki@0.14.7: dependencies: @@ -18714,9 +19505,14 @@ snapshots: signal-exit@4.1.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + sisteransi@1.0.5: {} - siwe@3.0.0(ethers@5.8.0): + siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@spruceid/siwe-parser': 3.0.0 '@stablelib/random': 1.0.2 @@ -18726,8 +19522,6 @@ snapshots: slash@4.0.0: {} - slash@5.1.0: {} - sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -18743,20 +19537,20 @@ snapshots: get-stdin: 9.0.0 git-hooks-list: 3.2.0 is-plain-obj: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 sort-object-keys: 1.1.3 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 source-list-map@2.0.1: {} source-map-js@1.2.1: {} - source-map-loader@3.0.2(webpack@5.98.0): + source-map-loader@3.0.2(webpack@5.99.9): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -18794,7 +19588,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -18805,7 +19599,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -18848,7 +19642,7 @@ snapshots: figures: 3.2.0 find-up: 5.0.0 git-semver-tags: 4.1.1 - semver: 7.7.1 + semver: 7.7.2 stringify-package: 1.0.1 yargs: 16.2.0 @@ -18860,7 +19654,7 @@ snapshots: statuses@2.0.1: {} - std-env@3.8.1: {} + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -18872,12 +19666,16 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + stream-transform@2.1.3: dependencies: mixme: 0.5.10 - streamsearch@1.1.0: {} - string-format@2.0.0: {} string-length@4.0.2: @@ -18908,14 +19706,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -18930,13 +19728,13 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -18944,7 +19742,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -18999,23 +19797,27 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 - style-loader@3.3.4(webpack@5.98.0): + style-loader@3.3.4(webpack@5.99.9): dependencies: - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.6(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 - stylehacks@5.1.1(postcss@8.5.3): + stylehacks@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 + browserslist: 4.25.1 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 sucrase@3.35.0: @@ -19086,7 +19888,7 @@ snapshots: typical: 5.2.0 wordwrapjs: 4.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19102,11 +19904,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3)) + postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -19115,7 +19917,7 @@ snapshots: tapable@1.1.3: {} - tapable@2.2.1: {} + tapable@2.2.2: {} temp-dir@2.0.0: {} @@ -19133,28 +19935,19 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.98.0(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 4.3.0 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(webpack-cli@5.1.4) + terser: 5.43.1 + webpack: 5.99.9(webpack-cli@6.0.1) - terser-webpack-plugin@5.3.14(webpack@5.98.0): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0 - - terser@5.39.0: + terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19184,6 +19977,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + throat@6.0.2: {} through2@2.0.5: @@ -19203,17 +20000,19 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} + tinyspy@4.0.3: {} + tmp-promise@3.0.3: dependencies: tmp: 0.2.3 @@ -19228,6 +20027,12 @@ snapshots: tmpl@1.0.5: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -19255,6 +20060,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.0.3(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + trim-newlines@3.0.1: {} trim-repeated@1.0.0: @@ -19267,9 +20076,9 @@ snapshots: dependencies: typescript: 5.2.2 - ts-api-utils@1.4.3(typescript@5.8.2): + ts-api-utils@1.4.3(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-command-line-args@2.5.1: dependencies: @@ -19278,35 +20087,35 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 - ts-essentials@7.0.3(typescript@5.8.2): + ts-essentials@7.0.3(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2): + ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.28 - acorn: 8.14.1 + '@types/node': 24.3.0 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.2 + typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-unused-exports@10.1.0(typescript@5.8.2): + ts-unused-exports@10.1.0(typescript@5.8.3): dependencies: chalk: 4.1.2 tsconfig-paths: 3.15.0 - typescript: 5.8.2 + typescript: 5.8.3 tsconfig-paths@3.15.0: dependencies: @@ -19319,10 +20128,10 @@ snapshots: tslib@2.8.1: {} - tsutils@3.21.0(typescript@5.8.2): + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 - typescript: 5.8.2 + typescript: 5.8.3 tweetnacl@1.0.3: {} @@ -19353,10 +20162,10 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typechain@8.3.2(typescript@5.8.2): + typechain@8.3.2(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.0 + debug: 4.4.1 fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -19364,8 +20173,8 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.8.2) - typescript: 5.8.2 + ts-essentials: 7.0.3(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -19408,31 +20217,31 @@ snapshots: typedarray@0.0.6: {} - typedoc-plugin-coverage@2.2.0(typedoc@0.25.13(typescript@5.8.2)): + typedoc-plugin-coverage@3.4.1(typedoc@0.25.13(typescript@5.8.3)): dependencies: - typedoc: 0.25.13(typescript@5.8.2) + typedoc: 0.25.13(typescript@5.8.3) - typedoc-plugin-missing-exports@2.3.0(typedoc@0.25.13(typescript@5.8.2)): + typedoc-plugin-missing-exports@2.3.0(typedoc@0.25.13(typescript@5.8.3)): dependencies: - typedoc: 0.25.13(typescript@5.8.2) + typedoc: 0.25.13(typescript@5.8.3) - typedoc-plugin-zod@1.4.0(typedoc@0.25.13(typescript@5.8.2)): + typedoc-plugin-zod@1.4.2(typedoc@0.25.13(typescript@5.8.3)): dependencies: - typedoc: 0.25.13(typescript@5.8.2) + typedoc: 0.25.13(typescript@5.8.3) - typedoc@0.25.13(typescript@5.8.2): + typedoc@0.25.13(typescript@5.8.3): dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.5 shiki: 0.14.7 - typescript: 5.8.2 + typescript: 5.8.3 typescript@4.9.5: {} typescript@5.2.2: {} - typescript@5.8.2: {} + typescript@5.8.3: {} typical@4.0.0: {} @@ -19450,11 +20259,7 @@ snapshots: underscore@1.12.1: {} - undici-types@5.26.5: {} - - undici-types@6.19.8: {} - - undici-types@6.20.0: {} + undici-types@7.10.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -19467,8 +20272,6 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} - unicorn-magic@0.3.0: {} - unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -19483,29 +20286,35 @@ snapshots: unquote@1.1.1: {} - unrs-resolver@1.3.2: + unrs-resolver@1.9.2: + dependencies: + napi-postinstall: 0.2.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.3.2 - '@unrs/resolver-binding-darwin-x64': 1.3.2 - '@unrs/resolver-binding-freebsd-x64': 1.3.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.3.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.3.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.3.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.3.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.3.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.3.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.3.2 - '@unrs/resolver-binding-linux-x64-musl': 1.3.2 - '@unrs/resolver-binding-wasm32-wasi': 1.3.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.3.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.3.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.3.2 + '@unrs/resolver-binding-android-arm-eabi': 1.9.2 + '@unrs/resolver-binding-android-arm64': 1.9.2 + '@unrs/resolver-binding-darwin-arm64': 1.9.2 + '@unrs/resolver-binding-darwin-x64': 1.9.2 + '@unrs/resolver-binding-freebsd-x64': 1.9.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.9.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.9.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.9.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-x64-musl': 1.9.2 + '@unrs/resolver-binding-wasm32-wasi': 1.9.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.9.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.9.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.9.2 upath@1.2.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -19528,7 +20337,7 @@ snapshots: util.promisify@1.0.1: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 has-symbols: 1.1.0 object.getownpropertydescriptors: 2.1.8 @@ -19553,13 +20362,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.1 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19574,13 +20383,13 @@ snapshots: - tsx - yaml - vite-node@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.1 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19595,54 +20404,60 @@ snapshots: - tsx - yaml - vite@6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0): dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.37.0 + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.4.2 - terser: 5.39.0 - yaml: 2.7.0 + terser: 5.43.1 + yaml: 2.8.0 - vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite@7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0): dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.37.0 + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.4.2 - terser: 5.39.0 - yaml: 2.7.0 + terser: 5.43.1 + yaml: 2.8.0 - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.9 + '@vitest/mocker': 3.0.9(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 '@vitest/spy': 3.0.9 '@vitest/utils': 3.0.9 chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 + debug: 4.4.1 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.1 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) + vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -19658,30 +20473,33 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.2.4(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(yaml@2.8.0): dependencies: - '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.9 - '@vitest/runner': 3.0.9 - '@vitest/snapshot': 3.0.9 - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 + debug: 4.4.1 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.1 + picomatch: 4.0.2 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 7.0.0(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -19717,7 +20535,7 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.2: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -19738,52 +20556,54 @@ snapshots: webidl-conversions@6.1.0: {} - webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0): + webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9): dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0))(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0))(webpack@5.98.0(webpack-cli@5.1.4)) + '@discoveryjs/json-ext': 0.6.3 + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) colorette: 2.0.20 - commander: 10.0.1 + commander: 12.1.0 cross-spawn: 7.0.6 envinfo: 7.14.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.98.0(webpack-cli@5.1.4) - webpack-merge: 5.10.0 + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0) + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9) - webpack-dev-middleware@5.3.4(webpack@5.98.0(webpack-cli@5.1.4)): + webpack-dev-middleware@5.3.4(webpack@5.99.9): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.0 - webpack: 5.98.0(webpack-cli@5.1.4) + schema-utils: 4.3.2 + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-middleware@5.3.4(webpack@5.98.0): + webpack-dev-middleware@7.4.2(webpack@5.99.9): dependencies: colorette: 2.0.20 - memfs: 3.5.3 + memfs: 4.24.0 mime-types: 2.1.35 + on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.0 - webpack: 5.98.0 + schema-utils: 4.3.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.98.0): + webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.7 + '@types/serve-static': 1.15.8 '@types/sockjs': 0.3.36 - '@types/ws': 8.18.0 + '@types/ws': 8.18.1 ansi-html-community: 0.0.8 bonjour-service: 1.3.0 chokidar: 3.6.0 @@ -19793,76 +20613,74 @@ snapshots: default-gateway: 6.0.3 express: 4.21.2 graceful-fs: 4.2.11 - html-entities: 2.5.3 - http-proxy-middleware: 2.0.7(@types/express@4.17.21) + html-entities: 2.6.0 + http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 launch-editor: 2.10.0 open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 - schema-utils: 4.3.0 + schema-utils: 4.3.2 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.98.0(webpack-cli@5.1.4)) - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + webpack-dev-middleware: 5.3.4(webpack@5.99.9) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.98.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + webpack: 5.99.9(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.98.0): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.23 + '@types/express-serve-static-core': 4.19.6 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.7 + '@types/serve-static': 1.15.8 '@types/sockjs': 0.3.36 - '@types/ws': 8.18.0 + '@types/ws': 8.18.1 ansi-html-community: 0.0.8 bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 compression: 1.8.0 connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 express: 4.21.2 graceful-fs: 4.2.11 - html-entities: 2.5.3 - http-proxy-middleware: 2.0.7(@types/express@4.17.21) + http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 launch-editor: 2.10.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.3.0 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.2 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.98.0) - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + webpack-dev-middleware: 7.4.2(webpack@5.99.9) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.98.0): + webpack-manifest-plugin@4.1.1(webpack@5.99.9): dependencies: - tapable: 2.2.1 - webpack: 5.98.0 + tapable: 2.2.2 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 2.3.1 - webpack-merge@5.10.0: + webpack-merge@6.0.1: dependencies: clone-deep: 4.0.1 flat: 5.0.2 @@ -19878,50 +20696,21 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} - webpack@5.98.0: + webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.98.0) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.98.0(webpack-cli@5.1.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 + acorn: 8.15.0 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 + enhanced-resolve: 5.18.2 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -19930,13 +20719,13 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.98.0(webpack-cli@5.1.4)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 + schema-utils: 4.3.2 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + watchpack: 2.4.4 + webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.98.0) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19944,7 +20733,7 @@ snapshots: websocket-driver@0.7.4: dependencies: - http-parser-js: 0.5.9 + http-parser-js: 0.5.10 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 @@ -20058,10 +20847,10 @@ snapshots: workbox-build@6.6.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.26.10 - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/runtime': 7.27.0 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.10)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@babel/core': 7.27.4 + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/runtime': 7.27.6 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.4)(@types/babel__core@7.20.5)(rollup@2.79.2) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -20154,12 +20943,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.98.0): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.98.0 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -20208,11 +20997,15 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xml-name-validator@3.0.0: {} xmlchars@2.2.0: {} @@ -20227,7 +21020,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.7.0: {} + yaml@2.8.0: {} yargs-parser@20.2.9: {} @@ -20247,12 +21040,16 @@ snapshots: yup@0.32.11: dependencies: - '@babel/runtime': 7.27.0 - '@types/lodash': 4.17.16 + '@babel/runtime': 7.27.6 + '@types/lodash': 4.17.19 lodash: 4.17.21 lodash-es: 4.17.21 nanoclone: 0.2.1 property-expr: 2.0.6 toposort: 2.0.2 - zod@3.24.2: {} + zod-to-json-schema@3.25.2(zod@3.25.67): + dependencies: + zod: 3.25.67 + + zod@3.25.67: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 58ec23e7a..3f746d1c1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,6 @@ packages: - 'demos/**/*' - 'examples/**/*' - 'packages/**/*' + - '!packages/*/dist/**' + - '!packages/*/node_modules/**' - 'scripts/**/*'