diff --git a/.nvmrc b/.nvmrc index 0828ab79..92f279e3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18 \ No newline at end of file +v22 \ No newline at end of file diff --git a/packages/common/package.json b/packages/common/package.json index 104f572f..ab728e53 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -6,7 +6,6 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, - "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -21,6 +20,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index 058a857b..b102f033 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -1,29 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "checkJs": false, - "declaration": true, - "declarationMap": true, - "esModuleInterop": false, - "exactOptionalPropertyTypes": true, - "forceConsistentCasingInFileNames": true, - "importHelpers": true, - "incremental": true, - "lib": ["ES2022"], - "module": "ES2022", - "moduleResolution": "Bundler", - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "outDir": "./dist", - "rootDir": "./src", - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "target": "ES2022" - }, - "include": ["./src/**/*"] -} + "outDir": "./dist" + } +} \ No newline at end of file diff --git a/packages/executor/Dockerfile b/packages/executor/Dockerfile index 9c01c83b..029a2b2c 100644 --- a/packages/executor/Dockerfile +++ b/packages/executor/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app @@ -9,7 +9,6 @@ COPY ../../package.json ../../yarn.lock ./ COPY ./packages/common ./packages/common COPY ./packages/executor ./packages/executor - # Install dependencies at root level RUN yarn install @@ -20,4 +19,4 @@ RUN yarn compile WORKDIR /usr/src/app/packages/executor RUN yarn compile -CMD ["yarn", "start"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/executor/nodemon.json b/packages/executor/nodemon.json index b5fabeb4..094036ef 100644 --- a/packages/executor/nodemon.json +++ b/packages/executor/nodemon.json @@ -1,5 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/executor/package.json b/packages/executor/package.json index 39e31722..038a6f99 100644 --- a/packages/executor/package.json +++ b/packages/executor/package.json @@ -2,7 +2,6 @@ "name": "@gnosis/hashi-executor", "private": true, "version": "0.1.0", - "type": "module", "author": { "name": "gnosis", "url": "https://github.com/gnosis" @@ -13,6 +12,7 @@ "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { @@ -23,6 +23,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/executor/src/index.ts b/packages/executor/src/index.ts index 668b89ae..c3c5aa81 100644 --- a/packages/executor/src/index.ts +++ b/packages/executor/src/index.ts @@ -1,187 +1,189 @@ import "dotenv/config" -import { createWalletClient, http, Chain, publicActions, Log, createPublicClient } from "viem" +import { createWalletClient, http, Chain, publicActions, Log } from "viem" import { privateKeyToAccount } from "viem/accounts" import * as chains from "viem/chains" import { MongoClient } from "mongodb" import { adapterAbi, Batcher, logger, Message, Watcher, yahoAbi, yaruAbi } from "@gnosis/hashi-common" -const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) -await mongoClient.connect() -const db = mongoClient.db("hashi") +;(async () => { + const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) + await mongoClient.connect() + const db = mongoClient.db("hashi") -const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) -if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") -const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) -if (!targetChain) throw new Error("Invalid TARGET_CHAIN_ID") + const sourceChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.SOURCE_CHAIN_ID as string)) + if (!sourceChain) throw new Error("Invalid SOURCE_CHAIN_ID") + const targetChain = Object.values(chains).find(({ id }) => id.toString() === (process.env.TARGET_CHAIN_ID as string)) + if (!targetChain) throw new Error("Invalid TARGET_CHAIN_ID") -const sourceClient = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: sourceChain as Chain | undefined, - transport: http(process.env.SOURCE_RPC as string), -}).extend(publicActions) + const sourceClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: sourceChain as Chain | undefined, + transport: http(process.env.SOURCE_RPC as string), + }).extend(publicActions) -const targetClient = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: targetChain as Chain | undefined, - transport: http(process.env.TARGET_RPC as string), -}).extend(publicActions) + const targetClient = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: targetChain as Chain | undefined, + transport: http(process.env.TARGET_RPC as string), + }).extend(publicActions) -const adapters = (process.env.ADAPTERS as string).split(",") as `0x${string}`[] -const watchers = adapters.map( - (_adapter) => - new Watcher({ - abi: adapterAbi, - client: targetClient, - contractAddress: _adapter as `0x${string}`, - eventName: "HashStored", - logger, - service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, - watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), - onLogs: async (_logs: Log[]) => { - const messageIds = _logs - .map((_log) => _log.topics[1]) - .filter((id): id is `0x${string}` => id !== undefined) // Filter out undefined values - .map((id) => BigInt(id)) // Convert each string to bigint + const adapters = (process.env.ADAPTERS as string).split(",") as `0x${string}`[] + const watchers = adapters.map( + (_adapter) => + new Watcher({ + abi: adapterAbi, + client: targetClient, + contractAddress: _adapter as `0x${string}`, + eventName: "HashStored", + logger, + service: `ExecutorWatcher:${_adapter.slice(0, 6)}${_adapter.slice(_adapter.length - 4, _adapter.length)}`, + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + const messageIds = _logs + .map((_log) => _log.topics[1]) + .filter((id): id is `0x${string}` => id !== undefined) // Filter out undefined values + .map((id) => BigInt(id)) // Convert each string to bigint - // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents - const blockNumber = await sourceClient.getBlockNumber() - const messageDispatchedLogs = await sourceClient.getContractEvents({ - abi: yahoAbi, - address: process.env.SOURCE_YAHO_ADDRESS as `0x${string}`, - eventName: "MessageDispatched", - args: { - messageId: messageIds, - }, - fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), - toBlock: blockNumber, - strict: true, - }) - logger.info(`Found corresponding ${messageDispatchedLogs.length} message dispatch logs`) - const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) - for (const message of messages) { - const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log + // NOTE: without setting fromBlock and toBlock, it's not possible to getContractEvents + const blockNumber = await sourceClient.getBlockNumber() + const messageDispatchedLogs = await sourceClient.getContractEvents({ + abi: yahoAbi, + address: process.env.SOURCE_YAHO_ADDRESS as `0x${string}`, + eventName: "MessageDispatched", + args: { + messageId: messageIds, + }, + fromBlock: blockNumber - BigInt(process.env.BLOCKS_WINDOW as string), + toBlock: blockNumber, + strict: true, + }) + logger.info(`Found corresponding ${messageDispatchedLogs.length} message dispatch logs`) + const messages = messageDispatchedLogs.map((_log) => Message.fromLog(_log)) + for (const message of messages) { + const hashStoredLog = _logs.find((_log) => _log.topics[1] === message.id) as Log - await db.collection("executedMessages").findOneAndUpdate( - { id: message.id }, - { - $addToSet: { - confirmedBy: hashStoredLog.address, - }, - $setOnInsert: { - chainId: targetClient?.chain?.id as number, - storeHashTransactionHash: hashStoredLog.transactionHash, - status: "waitingForConfirmations", - data: { - ...message.toJSON(), + await db.collection("executedMessages").findOneAndUpdate( + { id: message.id }, + { + $addToSet: { + confirmedBy: hashStoredLog.address, + }, + $setOnInsert: { + chainId: targetClient?.chain?.id as number, + storeHashTransactionHash: hashStoredLog.transactionHash, + status: "waitingForConfirmations", + data: { + ...message.toJSON(), + }, }, }, - }, - { upsert: true, returnDocument: "after" }, - ) - } - }, - }), -) -watchers.map((_watcher) => _watcher.start()) - -const batcher = new Batcher({ - createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), - logger, - minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), - service: "ExecutorBatcher", - onGetValues: async () => { - const values = await db - .collection("executedMessages") - .find({ - chainId: targetClient?.chain?.id as number, - status: "waitingForConfirmations", - $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, - }) - .toArray() - - const messages = values.map( - (_val: any) => - new Message({ - id: _val.id, - ..._val.data, - }), - ) + { upsert: true, returnDocument: "after" }, + ) + } + }, + }), + ) + watchers.map((_watcher) => _watcher.start()) - const executed = await Promise.all( - messages.map((_message: Message) => - targetClient.readContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executed", - args: [_message.id], - }), - ), - ) - const messagesAlreadyExecuted = messages.filter((_, _index) => executed[_index]) - if (messagesAlreadyExecuted.length) { - logger - .child({ service: "Executor" }) - .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) - // TODO: find the transactionHash - await db + const batcher = new Batcher({ + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + service: "ExecutorBatcher", + onGetValues: async () => { + const values = await db .collection("executedMessages") - .updateMany( - { id: { $in: messages.map((_message: Message) => _message.id) } }, - { $set: { status: "alreadyExecuted" } }, - ) - } + .find({ + chainId: targetClient?.chain?.id as number, + status: "waitingForConfirmations", + $expr: { $gte: [{ $size: "$confirmedBy" }, "$threshold"] }, + }) + .toArray() - const messageToBeExecuted = messages.filter((_, _index) => !executed[_index]) + const messages = values.map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), + ) - // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts - const messagesToBeExecuteWithoutRevert = [] - for (const message of messageToBeExecuted) { - try { - await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [[message.serialize()]], - }) - messagesToBeExecuteWithoutRevert.push(message) - } catch (_err) { + const executed = await Promise.all( + messages.map((_message: Message) => + targetClient.readContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executed", + args: [_message.id], + }), + ), + ) + const messagesAlreadyExecuted = messages.filter((_, _index) => executed[_index]) + if (messagesAlreadyExecuted.length) { logger .child({ service: "Executor" }) - .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) + .info(`Found ${messagesAlreadyExecuted.length} messages already executed. Processing them ...`) + // TODO: find the transactionHash + await db + .collection("executedMessages") + .updateMany( + { id: { $in: messages.map((_message: Message) => _message.id) } }, + { $set: { status: "alreadyExecuted" } }, + ) } - } - return messagesToBeExecuteWithoutRevert - }, - onBatch: async (_messages: Message[]) => { - logger.child({ service: "Executor" }).info(`Executing ${_messages.length} messages ...`) - const { request } = await targetClient.simulateContract({ - address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, - abi: yaruAbi, - functionName: "executeMessages", - args: [_messages.map((_message: Message) => _message.serialize())], - }) - const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) - logger.child({ service: "Executor" }).info(`${_messages.length} messages executed: ${transactionHash}`) + const messageToBeExecuted = messages.filter((_, _index) => !executed[_index]) - return { - transactionHash, - messages: _messages, - } - }, - onResult: (_result: any) => { - const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + // NOTE: need to try one by one all messages in order to filter those that cannot be executed because the receiver contract reverts + const messagesToBeExecuteWithoutRevert = [] + for (const message of messageToBeExecuted) { + try { + await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [[message.serialize()]], + }) + messagesToBeExecuteWithoutRevert.push(message) + } catch (_err) { + logger + .child({ service: "Executor" }) + .info(`Message ${message.id} cannot be executed because it reverts. Skipping it ...`) + } + } + return messagesToBeExecuteWithoutRevert + }, + onBatch: async (_messages: Message[]) => { + logger.child({ service: "Executor" }).info(`Executing ${_messages.length} messages ...`) + const { request } = await targetClient.simulateContract({ + address: process.env.TARGET_YARU_ADDRESS as `0x${string}`, + abi: yaruAbi, + functionName: "executeMessages", + args: [_messages.map((_message: Message) => _message.serialize())], + }) - return Promise.all( - messages.map(({ id }) => - db.collection("executedMessages").updateOne( - { id }, - { - $set: { executeTransactionHash: transactionHash, status: "executed" }, - }, + const transactionHash = await targetClient.writeContract({ ...request, gas: 1000000n }) + logger.child({ service: "Executor" }).info(`${_messages.length} messages executed: ${transactionHash}`) + + return { + transactionHash, + messages: _messages, + } + }, + onResult: (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + + return Promise.all( + messages.map(({ id }) => + db.collection("executedMessages").updateOne( + { id }, + { + $set: { executeTransactionHash: transactionHash, status: "executed" }, + }, + ), ), - ), - ) - }, -}) -batcher.start() + ) + }, + }) + batcher.start() +})() diff --git a/packages/executor/tsconfig.json b/packages/executor/tsconfig.json index 974c23aa..b102f033 100644 --- a/packages/executor/tsconfig.json +++ b/packages/executor/tsconfig.json @@ -1,36 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } } \ No newline at end of file diff --git a/packages/relayer/Dockerfile b/packages/relayer/Dockerfile index aec8ea25..7fe640de 100644 --- a/packages/relayer/Dockerfile +++ b/packages/relayer/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app @@ -9,7 +9,6 @@ COPY ../../package.json ../../yarn.lock ./ COPY ./packages/common ./packages/common COPY ./packages/relayer ./packages/relayer - # Install dependencies at root level RUN yarn install @@ -20,4 +19,4 @@ RUN yarn compile WORKDIR /usr/src/app/packages/relayer RUN yarn compile -CMD ["yarn", "start"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/relayer/nodemon.json b/packages/relayer/nodemon.json index b5fabeb4..094036ef 100644 --- a/packages/relayer/nodemon.json +++ b/packages/relayer/nodemon.json @@ -1,5 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/relayer/package.json b/packages/relayer/package.json index fbc166b2..26616bae 100644 --- a/packages/relayer/package.json +++ b/packages/relayer/package.json @@ -2,7 +2,6 @@ "name": "@gnosis/hashi-relayer", "private": true, "version": "0.1.0", - "type": "module", "author": { "name": "gnosis", "url": "https://github.com/gnosis" @@ -13,6 +12,7 @@ "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { @@ -23,6 +23,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/parser": "^6.7.5", diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts index e9cf5938..950a68ed 100644 --- a/packages/relayer/src/index.ts +++ b/packages/relayer/src/index.ts @@ -5,139 +5,141 @@ import * as chains from "viem/chains" import { MongoClient, Document } from "mongodb" import { Batcher, logger, Message, Watcher, yahoAbi } from "@gnosis/hashi-common" -const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) -if (!chain) throw new Error("Invalid CHAIN_ID") +;(async () => { + const chain = Object.values(chains).find(({ id }) => id.toString() === (process.env.CHAIN_ID as string)) + if (!chain) throw new Error("Invalid CHAIN_ID") -const client = createWalletClient({ - account: privateKeyToAccount(process.env.PK as `0x${string}`), - chain: chain as Chain | undefined, - transport: http(process.env.RPC as string), -}).extend(publicActions) + const client = createWalletClient({ + account: privateKeyToAccount(process.env.PK as `0x${string}`), + chain: chain as Chain | undefined, + transport: http(process.env.RPC as string), + }).extend(publicActions) -const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) -await mongoClient.connect() -const db = mongoClient.db("hashi") + const mongoClient = new MongoClient(process.env.MONGO_DB_URI as string) + await mongoClient.connect() + const db = mongoClient.db("hashi") -const whitelistedSenderAddresses = process.env.WHITELISTED_SENDER_ADDRESSES?.split(",").map((_address: string) => - _address.toLowerCase(), -) as string[] + const whitelistedSenderAddresses = process.env.WHITELISTED_SENDER_ADDRESSES?.split(",").map((_address: string) => + _address.toLowerCase(), + ) as string[] -const watcher = new Watcher({ - service: "RelayerWatcher", - logger, - client, - contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - eventName: "MessageDispatched", - watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), - onLogs: async (_logs: Log[]) => { - let messages = _logs.map((_log: Log) => Message.fromLog(_log)) - if (whitelistedSenderAddresses?.length) { - logger.child({ service: "Relayer" }).info(`Filtering messages ...`) - messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) - } + const watcher = new Watcher({ + service: "RelayerWatcher", + logger, + client, + contractAddress: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + eventName: "MessageDispatched", + watchIntervalTimeMs: Number(process.env.WATCH_INTERVAL_TIME_MS as string), + onLogs: async (_logs: Log[]) => { + let messages = _logs.map((_log: Log) => Message.fromLog(_log)) + if (whitelistedSenderAddresses?.length) { + logger.child({ service: "Relayer" }).info(`Filtering messages ...`) + messages = messages.filter((_message) => whitelistedSenderAddresses.includes(_message.sender.toLowerCase())) + } - await Promise.all( - messages.map((_message: Message, _index: number) => - db.collection("relayedMessages").updateOne( - { id: _message.id }, - { - $set: { - address: process.env.YAHO_ADDRESS as `0x${string}`, - chainId: client?.chain?.id as number, - data: _message.toJSON(), - dispatchTransactionHash: _logs[_index].transactionHash, - status: "dispatched", + await Promise.all( + messages.map((_message: Message, _index: number) => + db.collection("relayedMessages").updateOne( + { id: _message.id }, + { + $set: { + address: process.env.YAHO_ADDRESS as `0x${string}`, + chainId: client?.chain?.id as number, + data: _message.toJSON(), + dispatchTransactionHash: _logs[_index].transactionHash, + status: "dispatched", + }, + }, + { + upsert: true, }, - }, - { - upsert: true, - }, + ), ), - ), - ) - }, -}) -watcher.start() + ) + }, + }) + watcher.start() -const batcher = new Batcher({ - service: "RelayerBatcher", - createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), - logger, - minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), - onGetValues: () => { - return db - .collection("relayedMessages") - .find({ - status: "dispatched", - address: process.env.YAHO_ADDRESS as `0x${string}`, - }) - .toArray() - }, - onBatch: async (_batch: Document[]) => { - const messages = _batch.map( - (_val: any) => - new Message({ - id: _val.id, - ..._val.data, - }), - ) + const batcher = new Batcher({ + service: "RelayerBatcher", + createBatchIntervalTimeMs: Number(process.env.CREATE_BATCH_INTERVAL_TIME_MS as string), + logger, + minBatchSize: Number(process.env.MIN_BATCH_SIZE as string), + onGetValues: () => { + return db + .collection("relayedMessages") + .find({ + status: "dispatched", + address: process.env.YAHO_ADDRESS as `0x${string}`, + }) + .toArray() + }, + onBatch: async (_batch: Document[]) => { + const messages = _batch.map( + (_val: any) => + new Message({ + id: _val.id, + ..._val.data, + }), + ) - const executableMessages = [] - for (const message of messages) { - const hash = await client.readContract({ - address: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - functionName: "getPendingMessageHash", - args: [message.id], - }) - if (hash != "0x0000000000000000000000000000000000000000000000000000000000000000") { - executableMessages.push(message) - } else { - logger.child({ service: "Relayer" }).info(`${message.id} already relayed. Filtering it ...`) - await db.collection("relayedMessages").updateOne( - { id: message.id }, - { - $set: { status: "alreadyRelayed" }, - }, - ) + const executableMessages = [] + for (const message of messages) { + const hash = await client.readContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "getPendingMessageHash", + args: [message.id], + }) + if (hash != "0x0000000000000000000000000000000000000000000000000000000000000000") { + executableMessages.push(message) + } else { + logger.child({ service: "Relayer" }).info(`${message.id} already relayed. Filtering it ...`) + await db.collection("relayedMessages").updateOne( + { id: message.id }, + { + $set: { status: "alreadyRelayed" }, + }, + ) + } } - } - let transactionHash = null - if (executableMessages.length) { - const serializedMessages = executableMessages.map((_message: Message) => _message.serialize()) + let transactionHash = null + if (executableMessages.length) { + const serializedMessages = executableMessages.map((_message: Message) => _message.serialize()) - logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) - const { request } = await client.simulateContract({ - address: process.env.YAHO_ADDRESS as `0x${string}`, - abi: yahoAbi, - functionName: "relayMessagesToAdapters", - args: [serializedMessages], - }) - transactionHash = await client.writeContract(request) - logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) - } + logger.child({ service: "Relayer" }).info(`Relaying ${serializedMessages.length} messages ...`) + const { request } = await client.simulateContract({ + address: process.env.YAHO_ADDRESS as `0x${string}`, + abi: yahoAbi, + functionName: "relayMessagesToAdapters", + args: [serializedMessages], + }) + transactionHash = await client.writeContract(request) + logger.child({ service: "Relayer" }).info(`${serializedMessages.length} messages relayed: ${transactionHash}`) + } - return { - messages: executableMessages, - transactionHash, - } - }, - onResult: async (_result: any) => { - const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } - if (!messages.length) return null + return { + messages: executableMessages, + transactionHash, + } + }, + onResult: async (_result: any) => { + const { messages, transactionHash } = _result as { messages: Message[]; transactionHash: string } + if (!messages.length) return null - return Promise.all( - messages.map(({ id }) => - db.collection("relayedMessages").updateOne( - { id }, - { - $set: { relayTransactionHash: transactionHash, status: "relayed" }, - }, + return Promise.all( + messages.map(({ id }) => + db.collection("relayedMessages").updateOne( + { id }, + { + $set: { relayTransactionHash: transactionHash, status: "relayed" }, + }, + ), ), - ), - ) - }, -}) -batcher.start() + ) + }, + }) + batcher.start() +})() diff --git a/packages/relayer/tsconfig.json b/packages/relayer/tsconfig.json index 652aa407..e6d845c2 100644 --- a/packages/relayer/tsconfig.json +++ b/packages/relayer/tsconfig.json @@ -1,35 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } -} \ No newline at end of file +} diff --git a/packages/reporter/.nvmrc b/packages/reporter/.nvmrc deleted file mode 100644 index 0828ab79..00000000 --- a/packages/reporter/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18 \ No newline at end of file diff --git a/packages/reporter/Dockerfile b/packages/reporter/Dockerfile index cdca8796..9e9ac48a 100644 --- a/packages/reporter/Dockerfile +++ b/packages/reporter/Dockerfile @@ -1,10 +1,11 @@ -FROM node:18-alpine +FROM node:22-alpine WORKDIR /usr/src/app # Copy root package.json and yarn.lock for dependency resolution COPY ../../package.json ../../yarn.lock ./ +COPY ./packages/common ./packages/common COPY ./packages/reporter ./packages/reporter RUN yarn install @@ -12,4 +13,4 @@ RUN yarn install WORKDIR /usr/src/app/packages/reporter RUN yarn compile -CMD ["node", "dist/index.js"] \ No newline at end of file +CMD ["yarn", "start:prod"] \ No newline at end of file diff --git a/packages/reporter/README.md b/packages/reporter/README.md index 4a171633..9e6bc32c 100644 --- a/packages/reporter/README.md +++ b/packages/reporter/README.md @@ -38,7 +38,7 @@ On the root's `docker-compose.yml`, run the following command: ```sh cd ../.. # To the root level -docker-compose up -d --build --no-deps hashi_reporter +docker compose up --build mongodb hashi_reporter ``` ### Viewing Logs diff --git a/packages/reporter/nodemon.json b/packages/reporter/nodemon.json index 06dbc7b5..094036ef 100644 --- a/packages/reporter/nodemon.json +++ b/packages/reporter/nodemon.json @@ -1,6 +1,5 @@ { "watch": ["src"], "ext": "ts,json", - "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node --esm ./src/index.ts" + "exec": "ts-node ./src/index.ts" } diff --git a/packages/reporter/package.json b/packages/reporter/package.json index e4eee5a3..9b71af68 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -5,23 +5,17 @@ "name": "gnosis", "url": "https://github.com/gnosis" }, - "type": "module", "scripts": { "compile": "tsc", "lint": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "start": "node --loader ts-node/esm ./src/index.ts", + "start:prod": "node ./dist/index.js", "start:dev": "nodemon" }, "dependencies": { - "@chainsafe/persistent-merkle-tree": "^0.6.1", - "@chainsafe/ssz": "^0.14.0", - "@ethereumjs/rlp": "^5.0.1", - "@ethereumjs/trie": "^6.0.1", - "@ethereumjs/util": "^9.0.1", - "@ethereumjs/vm": "^7.1.0", - "@lodestar/types": "^1.12.0", + "@gnosis/hashi-common": "0.1.0", "async-mutex": "^0.4.0", "axios": "^1.5.1", "dotenv": "^16.3.1", @@ -29,6 +23,7 @@ "winston": "^3.11.0" }, "devDependencies": { + "@tsconfig/node22": "^22.0.0", "@types/node": "^20.8.9", "@types/node-cron": "^3.0.9", "@typescript-eslint/eslint-plugin": "^6.7.5", diff --git a/packages/reporter/src/ABIs/StandardReporterContractABI.json b/packages/reporter/src/ABIs/StandardReporterContractABI.json deleted file mode 100644 index c89a25b3..00000000 --- a/packages/reporter/src/ABIs/StandardReporterContractABI.json +++ /dev/null @@ -1,169 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeABI.json b/packages/reporter/src/ABIs/WormholeABI.json deleted file mode 100644 index d1b59b6a..00000000 --- a/packages/reporter/src/ABIs/WormholeABI.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "emitter", "type": "address" }], - "name": "nextSequence", - "outputs": [{ "internalType": "uint64", "name": "", "type": "uint64" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeAdapterABI.json b/packages/reporter/src/ABIs/WormholeAdapterABI.json deleted file mode 100644 index dc59d307..00000000 --- a/packages/reporter/src/ABIs/WormholeAdapterABI.json +++ /dev/null @@ -1,375 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "wormhole", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "storedBlockHash", - "type": "bytes32" - } - ], - "name": "ConflictingBlockHeader", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "InvalidBlockHeaderLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlockHeaderRLP", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint8", - "name": "version", - "type": "uint8" - }, - { - "internalType": "uint32", - "name": "timestamp", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "nonce", - "type": "uint32" - }, - { - "internalType": "uint16", - "name": "emitterChainId", - "type": "uint16" - }, - { - "internalType": "bytes32", - "name": "emitterAddress", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "sequence", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "consistencyLevel", - "type": "uint8" - }, - { - "internalType": "bytes", - "name": "payload", - "type": "bytes" - }, - { - "internalType": "uint32", - "name": "guardianSetIndex", - "type": "uint32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "guardianIndex", - "type": "uint8" - } - ], - "internalType": "struct Signature[]", - "name": "signatures", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "internalType": "struct VM", - "name": "vm", - "type": "tuple" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "InvalidMessage", - "type": "error" - }, - { - "inputs": [], - "name": "UnauthorizedWormholeReceive", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "HashStored", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "endpointId", - "type": "uint16" - }, - { - "indexed": true, - "internalType": "address", - "name": "reporter", - "type": "address" - } - ], - "name": "ReporterSet", - "type": "event" - }, - { - "inputs": [], - "name": "WORMHOLE", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "name": "chainIds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "name": "enabledReporters", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "domain", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "bytes[]", - "name": "blockHeaders", - "type": "bytes[]" - } - ], - "name": "proveAncestralBlockHashes", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "wormholeChainId", - "type": "uint16" - }, - { - "internalType": "address", - "name": "reporter", - "type": "address" - } - ], - "name": "setReporterByChain", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "encodedVM", - "type": "bytes" - } - ], - "name": "storeHashesByEncodedVM", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/packages/reporter/src/ABIs/WormholeReporterABI.json b/packages/reporter/src/ABIs/WormholeReporterABI.json deleted file mode 100644 index 454cd261..00000000 --- a/packages/reporter/src/ABIs/WormholeReporterABI.json +++ /dev/null @@ -1,216 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "headerStorage", - "type": "address" - }, - { - "internalType": "address", - "name": "yaho", - "type": "address" - }, - { - "internalType": "address", - "name": "wormhole", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedYaho", - "type": "address" - } - ], - "name": "NotYaho", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "blockHeader", - "type": "bytes32" - } - ], - "name": "BlockDispatched", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "messageId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDispatched", - "type": "event" - }, - { - "inputs": [], - "name": "HEADER_STORAGE", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVIDER", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WOMRHOLE", - "outputs": [ - { - "internalType": "contract IWormhole", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YAHO", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "blockNumbers", - "type": "uint256[]" - } - ], - "name": "dispatchBlocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetChainId", - "type": "uint256" - }, - { - "internalType": "contract IAdapter", - "name": "adapter", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "messageIds", - "type": "uint256[]" - }, - { - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "dispatchMessages", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - } -] diff --git a/packages/reporter/src/Coordinator.ts b/packages/reporter/src/Coordinator.ts index 4a5be932..5f4e48dc 100644 --- a/packages/reporter/src/Coordinator.ts +++ b/packages/reporter/src/Coordinator.ts @@ -2,8 +2,8 @@ import { Chain } from "viem" import winston from "winston" import { Mutex } from "async-mutex" -import Multiclient from "./MultiClient.js" -import BaseController from "./controllers/BaseController.js" +import Multiclient from "./MultiClient" +import BaseController from "./controllers/BaseController" interface BlockListenerConfigs { controllers: any[] diff --git a/packages/reporter/src/abi/standardReporter.ts b/packages/reporter/src/abi/standardReporter.ts new file mode 100644 index 00000000..ee98167c --- /dev/null +++ b/packages/reporter/src/abi/standardReporter.ts @@ -0,0 +1,169 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "expectedYaho", + type: "address", + }, + ], + name: "NotYaho", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHeader", + type: "bytes32", + }, + ], + name: "BlockDispatched", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "MessageDispatched", + type: "event", + }, + { + inputs: [], + name: "HEADER_STORAGE", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "YAHO", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "blockNumbers", + type: "uint256[]", + }, + ], + name: "dispatchBlocks", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "messageIds", + type: "uint256[]", + }, + { + internalType: "bytes32[]", + name: "messageHashes", + type: "bytes32[]", + }, + ], + name: "dispatchMessages", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormhole.ts b/packages/reporter/src/abi/wormhole.ts new file mode 100644 index 00000000..3b24449c --- /dev/null +++ b/packages/reporter/src/abi/wormhole.ts @@ -0,0 +1,9 @@ +export default [ + { + inputs: [{ internalType: "address", name: "emitter", type: "address" }], + name: "nextSequence", + outputs: [{ internalType: "uint64", name: "", type: "uint64" }], + stateMutability: "view", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormholeAdapter.ts b/packages/reporter/src/abi/wormholeAdapter.ts new file mode 100644 index 00000000..e6dfeb70 --- /dev/null +++ b/packages/reporter/src/abi/wormholeAdapter.ts @@ -0,0 +1,375 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "wormhole", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "storedBlockHash", + type: "bytes32", + }, + ], + name: "ConflictingBlockHeader", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "length", + type: "uint256", + }, + ], + name: "InvalidBlockHeaderLength", + type: "error", + }, + { + inputs: [], + name: "InvalidBlockHeaderRLP", + type: "error", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint8", + name: "version", + type: "uint8", + }, + { + internalType: "uint32", + name: "timestamp", + type: "uint32", + }, + { + internalType: "uint32", + name: "nonce", + type: "uint32", + }, + { + internalType: "uint16", + name: "emitterChainId", + type: "uint16", + }, + { + internalType: "bytes32", + name: "emitterAddress", + type: "bytes32", + }, + { + internalType: "uint64", + name: "sequence", + type: "uint64", + }, + { + internalType: "uint8", + name: "consistencyLevel", + type: "uint8", + }, + { + internalType: "bytes", + name: "payload", + type: "bytes", + }, + { + internalType: "uint32", + name: "guardianSetIndex", + type: "uint32", + }, + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "uint8", + name: "guardianIndex", + type: "uint8", + }, + ], + internalType: "struct Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + internalType: "struct VM", + name: "vm", + type: "tuple", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + name: "InvalidMessage", + type: "error", + }, + { + inputs: [], + name: "UnauthorizedWormholeReceive", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "id", + type: "uint256", + }, + { + indexed: true, + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + name: "HashStored", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + indexed: true, + internalType: "uint16", + name: "endpointId", + type: "uint16", + }, + { + indexed: true, + internalType: "address", + name: "reporter", + type: "address", + }, + ], + name: "ReporterSet", + type: "event", + }, + { + inputs: [], + name: "WORMHOLE", + outputs: [ + { + internalType: "contract IWormhole", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + name: "chainIds", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + name: "enabledReporters", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "domain", + type: "uint256", + }, + { + internalType: "uint256", + name: "id", + type: "uint256", + }, + ], + name: "getHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "bytes[]", + name: "blockHeaders", + type: "bytes[]", + }, + ], + name: "proveAncestralBlockHashes", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "uint16", + name: "wormholeChainId", + type: "uint16", + }, + { + internalType: "address", + name: "reporter", + type: "address", + }, + ], + name: "setReporterByChain", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "encodedVM", + type: "bytes", + }, + ], + name: "storeHashesByEncodedVM", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] diff --git a/packages/reporter/src/abi/wormholeReporter.ts b/packages/reporter/src/abi/wormholeReporter.ts new file mode 100644 index 00000000..531168da --- /dev/null +++ b/packages/reporter/src/abi/wormholeReporter.ts @@ -0,0 +1,216 @@ +export default [ + { + inputs: [ + { + internalType: "address", + name: "headerStorage", + type: "address", + }, + { + internalType: "address", + name: "yaho", + type: "address", + }, + { + internalType: "address", + name: "wormhole", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "address", + name: "expectedYaho", + type: "address", + }, + ], + name: "NotYaho", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHeader", + type: "bytes32", + }, + ], + name: "BlockDispatched", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + indexed: false, + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "messageId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "messageHash", + type: "bytes32", + }, + ], + name: "MessageDispatched", + type: "event", + }, + { + inputs: [], + name: "HEADER_STORAGE", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PROVIDER", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "WOMRHOLE", + outputs: [ + { + internalType: "contract IWormhole", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "YAHO", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "blockNumbers", + type: "uint256[]", + }, + ], + name: "dispatchBlocks", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "targetChainId", + type: "uint256", + }, + { + internalType: "contract IAdapter", + name: "adapter", + type: "address", + }, + { + internalType: "uint256[]", + name: "messageIds", + type: "uint256[]", + }, + { + internalType: "bytes32[]", + name: "messageHashes", + type: "bytes32[]", + }, + ], + name: "dispatchMessages", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, +] diff --git a/packages/reporter/src/controllers/StandardReporterController.ts b/packages/reporter/src/controllers/StandardReporterController.ts index 345774d3..c203f196 100644 --- a/packages/reporter/src/controllers/StandardReporterController.ts +++ b/packages/reporter/src/controllers/StandardReporterController.ts @@ -1,9 +1,9 @@ -import { Chain, formatEther } from "viem" -import ABI from "../ABIs/StandardReporterContractABI.json" assert { type: "json" } +import { Chain } from "viem" -import BaseController from "./BaseController.js" +import standardReporterAbi from "../abi/standardReporter" +import BaseController from "./BaseController" -import { BaseControllerConfigs } from "./BaseController.js" +import { BaseControllerConfigs } from "./BaseController" interface StandardReporterControllerConfigs extends BaseControllerConfigs { name: string @@ -34,7 +34,7 @@ class StandardReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} on ${chain.name} ...`) const { request } = await client.simulateContract({ address: this.reporterAddresses[chain.name], - abi: ABI, + abi: standardReporterAbi, functionName: "dispatchBlocks", args: [chain.id, this.adapterAddresses[chain.name], [blockNumber]], value: this._reportHeadersValue, diff --git a/packages/reporter/src/controllers/WormholeReporterController.ts b/packages/reporter/src/controllers/WormholeReporterController.ts index 5bbff0ba..44d2beda 100644 --- a/packages/reporter/src/controllers/WormholeReporterController.ts +++ b/packages/reporter/src/controllers/WormholeReporterController.ts @@ -2,13 +2,13 @@ import axios, { AxiosInstance } from "axios" import { Mutex } from "async-mutex" import { Chain } from "viem" -import BaseController from "./BaseController.js" -import sleep from "../utils/sleep.js" -import ReporterABI from "../ABIs/WormholeReporterABI.json" assert { type: "json" } -import AdapterABI from "../ABIs/WormholeAdapterABI.json" assert { type: "json" } -import WormholeABI from "../ABIs/WormholeABI.json" assert { type: "json" } +import BaseController from "./BaseController" +import sleep from "../utils/sleep" +import wormholeReporterAbi from "../abi/wormholeReporter" +import wormholeAdapterAbi from "../abi/wormholeAdapter" +import wormholeAbi from "../abi/wormhole" -import { BaseControllerConfigs } from "./BaseController.js" +import { BaseControllerConfigs } from "./BaseController" interface WormholeReporterControllerConfigs extends BaseControllerConfigs { wormholeScanBaseUrl: string @@ -40,7 +40,7 @@ class WormholeReporterController extends BaseController { const nextSequence = await client.readContract({ address: this._wormholeAddress as `0x${string}`, - abi: WormholeABI, + abi: wormholeAbi, functionName: "nextSequence", args: [this.reporterAddress], }) @@ -48,7 +48,7 @@ class WormholeReporterController extends BaseController { this.logger.info(`reporting block header for block ${blockNumber} ...`) const { request } = await client.simulateContract({ address: this.reporterAddress as `0x${string}`, - abi: ReporterABI, + abi: wormholeReporterAbi, functionName: "dispatchBlocks", // targetChainId & adapter are not used in _dispatch(), here set to 0 args: [0, "0x0000000000000000000000000000000000000000", [blockNumber]], @@ -85,7 +85,7 @@ class WormholeReporterController extends BaseController { this.logger.info(`Storing header on ${chain.name} ...`) const { request } = await destinationChainClient.simulateContract({ address: this.adapterAddresses[chain.name], - abi: AdapterABI, + abi: wormholeAdapterAbi, functionName: "storeHashesByEncodedVM", args: [vaaBytes], }) diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 0cdc7b67..a3262f8d 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -10,22 +10,20 @@ import { goerli, optimism, optimismGoerli, - optimismSepolia, polygon, mainnet, sepolia, } from "viem/chains" import { Chain } from "viem" +import { logger } from "@gnosis/hashi-common" -import Multiclient from "./MultiClient.js" -import StandardReporterController from "./controllers/StandardReporterController.js" -import WormholeReporterController from "./controllers/WormholeReporterController.js" +import Multiclient from "./MultiClient" +import StandardReporterController from "./controllers/StandardReporterController" +import WormholeReporterController from "./controllers/WormholeReporterController" -import Coordinator from "./Coordinator.js" -import { settings } from "./settings/index.js" -import logger from "./utils/logger.js" - -const main = () => { +import Coordinator from "./Coordinator" +import { settings } from "./settings/index" +;(async () => { const controllersEnabled = process.env.REPORTERS_ENABLED?.split(",") const sourceChainId = Number(process.env.SOURCE_CHAIN_ID) @@ -260,6 +258,4 @@ const main = () => { }) coordinator.start() -} - -main() +})() diff --git a/packages/reporter/src/utils/logger.ts b/packages/reporter/src/utils/logger.ts deleted file mode 100644 index 54055ed2..00000000 --- a/packages/reporter/src/utils/logger.ts +++ /dev/null @@ -1,28 +0,0 @@ -import winston from "winston" - -const colors = { - error: "red", - warn: "yellow", - info: "cyan", - debug: "blue", - service: "magenta", -} - -const logger = winston.createLogger({ - level: "info", - format: winston.format.combine( - winston.format.colorize({ - colors, - }), - winston.format.timestamp(), - winston.format.printf(({ timestamp, level, message, service }) => { - const colorize = winston.format.colorize() - return `${timestamp} [${level}] ${colorize.colorize("service", `${service}`)}: ${message}` - }), - ), - transports: [new winston.transports.Console(), new winston.transports.File({ filename: "./logs/application.log" })], -}) - -winston.addColors(colors) - -export default logger diff --git a/packages/reporter/src/utils/proofs.ts b/packages/reporter/src/utils/proofs.ts deleted file mode 100644 index 77c17251..00000000 --- a/packages/reporter/src/utils/proofs.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { AxiosInstance } from "axios" -import { capella, ssz, phase0 } from "@lodestar/types" -import { ProofType, createProof, SingleProof } from "@chainsafe/persistent-merkle-tree" -import { TransactionType } from "@ethereumjs/tx" -import { hexToBytes, concatBytes, bigIntToBytes, intToBytes } from "@ethereumjs/util" -import { TxReceipt, PostByzantiumTxReceipt, PreByzantiumTxReceipt } from "@ethereumjs/vm" -import { toHexString, fromHexString } from "@chainsafe/ssz" -import { RLP } from "@ethereumjs/rlp" -import { WalletClient, PublicClient, TransactionReceipt, Log } from "viem" -import { Trie } from "@ethereumjs/trie" - -const SLOTS_PER_HISTORICAL_ROOT = 8192 - -export type BeaconId = number | Uint8Array | string - -export const toStringFromBeaconId = (identifier: BeaconId) => { - if (identifier instanceof Uint8Array) { - return toHexString(identifier) - } - return identifier.toString() -} - -export const getState = async (_stateId: BeaconId, _client: AxiosInstance): Promise => { - const { data } = await _client.get(`/eth/v2/debug/beacon/states/${toStringFromBeaconId(_stateId)}`) - return ssz.capella.BeaconState.fromJson(data.data) as capella.BeaconState -} - -export const getHeader = async (_blockId: BeaconId, _client: AxiosInstance): Promise => { - const { data } = await _client.get(`/eth/v1/beacon/headers/${toStringFromBeaconId(_blockId)}`) - return ssz.phase0.BeaconBlockHeader.fromJson(data.data.header.message) -} - -export const getReceiptsRootProof = async (_srcBlockId: BeaconId, _targetBlockId: BeaconId, _client: AxiosInstance) => { - const srcState = await getState(toStringFromBeaconId(_srcBlockId), _client) - const targetState = await getState(toStringFromBeaconId(_targetBlockId), _client) - - const srcView = ssz.capella.BeaconState.toView(srcState as capella.BeaconState) - const targetView = ssz.capella.BeaconState.toView(targetState as capella.BeaconState) - const srcSlot = srcState.slot - const targetSlot = targetState.slot - - const srcHeader = await getHeader(_srcBlockId, _client) - const srcHeaderView = ssz.phase0.BeaconBlockHeader.toView(srcHeader as phase0.BeaconBlockHeader) - - let receiptsRootProof - let receiptsRoot - if (srcSlot == targetSlot) { - const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex - const receiptProof = createProof(targetView.node, { - type: ProofType.single, - gindex: receiptGindex, - }) as SingleProof - receiptsRootProof = receiptProof.witnesses.map(toHexString) - receiptsRoot = toHexString(receiptProof.leaf) - } else if (srcSlot - targetSlot < 8192) { - const headerGindex = ssz.phase0.BeaconBlockHeader.getPathInfo(["stateRoot"]).gindex - const headerProof = createProof(srcHeaderView.node, { - type: ProofType.single, - gindex: headerGindex, - }) as SingleProof - - const stateRootGindex = ssz.capella.BeaconState.getPathInfo([ - "stateRoots", - targetSlot % SLOTS_PER_HISTORICAL_ROOT, - ]).gindex - const proof = createProof(srcView.node, { - type: ProofType.single, - gindex: stateRootGindex, - }) as SingleProof - - const receiptGindex = ssz.capella.BeaconState.getPathInfo(["latestExecutionPayloadHeader", "receiptsRoot"]).gindex - const receiptProof = createProof(targetView.node, { - type: ProofType.single, - gindex: receiptGindex, - }) as SingleProof - receiptsRootProof = receiptProof.witnesses.concat(proof.witnesses).concat(headerProof.witnesses).map(toHexString) - receiptsRoot = toHexString(receiptProof.leaf) - } else { - throw Error("slots are too far") - } - return { receiptsRootProof, receiptsRoot } -} - -// copied from here: https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/runBlock.ts -export const encodeReceipt = (receipt: TxReceipt, txType: TransactionType) => { - const encoded = RLP.encode([ - (receipt as PreByzantiumTxReceipt).stateRoot ?? - ((receipt as PostByzantiumTxReceipt).status === 0 ? Uint8Array.from([]) : hexToBytes("0x01")), - bigIntToBytes(receipt.cumulativeBlockGasUsed), - receipt.bitvector, - receipt.logs, - ]) - - if (txType === TransactionType.Legacy) { - return encoded - } - - // Serialize receipt according to EIP-2718: - // `typed-receipt = tx-type || receipt-data` - return concatBytes(intToBytes(txType), encoded) -} - -export const getReceiptProof = async (_hash: `0x${string}`, _client: PublicClient & WalletClient) => { - const receipt = await _client.getTransactionReceipt({ hash: _hash }) - const block = await _client.getBlock({ blockNumber: receipt.blockNumber }) - const receipts = [] as TransactionReceipt[] - for (const hash of block.transactions) { - receipts.push(await _client.getTransactionReceipt({ hash })) - } - - const trie = new Trie() - const encodedReceipts = receipts.map((_receipt) => { - let type = 0 - if (_receipt.type == "eip2930") { - type = 1 - } else if (_receipt.type == "eip1559") { - type = 2 - } else if (_receipt.type != "legacy") { - throw Error(`Unknown receipt type ${_receipt.type}`) - } - - return encodeReceipt( - { - bitvector: fromHexString(_receipt.logsBloom), - cumulativeBlockGasUsed: BigInt(_receipt.cumulativeGasUsed), - logs: _receipt.logs.map((_log: Log) => { - return [ - fromHexString(_log.address), - _log.topics.map((_topic: `0x${string}`) => fromHexString(_topic)), - fromHexString(_log.data), - ] - }), - status: _receipt.status === "success" ? 1 : 0, - } as TxReceipt, - type, - ) - }) - - await Promise.all( - receipts.map((_receipt, _index) => trie.put(RLP.encode(_receipt.transactionIndex), encodedReceipts[_index])), - ) - const receiptKey = RLP.encode(receipt.transactionIndex) - - const root = toHexString(trie.root()) - if (root !== block.receiptsRoot) { - throw Error("The trie.root() and block.receiptsRoot do not match") - } - - return { receiptProof: await trie.createProof(receiptKey), receiptsRoot: block.receiptsRoot } -} diff --git a/packages/reporter/tsconfig.json b/packages/reporter/tsconfig.json index 974c23aa..e6d845c2 100644 --- a/packages/reporter/tsconfig.json +++ b/packages/reporter/tsconfig.json @@ -1,36 +1,6 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "lib": [ - "es6", - "ESNext", - "DOM" - ], - "module": "ESNext", - "moduleResolution": "node", - "noImplicitAny": true, - "outDir": "./dist", - "rootDir": "./src", - "removeComments": true, - "resolveJsonModule": true, - "sourceMap": true, - "strict": true, - "target": "ESNext", - "skipLibCheck": true, - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node" + "outDir": "./dist" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 9d8c7d3b..d155c39b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,54 +52,11 @@ "@openzeppelin/contracts-upgradeable-4.7.3" "npm:@openzeppelin/contracts-upgradeable@v4.7.3" "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" -"@chainsafe/as-sha256@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.5.0.tgz#2523fbef2b80b5000f9aa71f4a76e5c2c5c076bb" - integrity sha512-dTIY6oUZNdC5yDTVP5Qc9hAlKAsn0QTQ2DnQvvsbTnKSTbYs3p5RPN0aIUqN0liXei/9h24c7V0dkV44cnWIQA== - "@chainsafe/as-sha256@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== -"@chainsafe/as-sha256@^0.4.1": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.4.2.tgz#21ad1371e2245e430c1a554a05f10d333c6f42cc" - integrity sha512-HJ8GZBRjLeWtRsAXf3EbNsNzmTGpzTFjfpSf4yHkLYC+E52DhT6hwz+7qpj6I/EmFzSUm5tYYvT9K8GZokLQCQ== - -"@chainsafe/hashtree-darwin-arm64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-darwin-arm64/-/hashtree-darwin-arm64-1.0.1.tgz#e2c60090c56a1c8dc8bdff329856184ad32e4cd5" - integrity sha512-+KmEgQMpO7FDL3klAcpXbQ4DPZvfCe0qSaBBrtT4vLF8V1JGm3sp+j7oibtxtOsLKz7nJMiK1pZExi7vjXu8og== - -"@chainsafe/hashtree-linux-arm64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-arm64-gnu/-/hashtree-linux-arm64-gnu-1.0.1.tgz#49d2604a6c9106219448af3eaf76f4da6e44daca" - integrity sha512-p1hnhGq2aFY+Zhdn1Q6L/6yLYNKjqXfn/Pc8jiM0e3+Lf/hB+yCdqYVu1pto26BrZjugCFZfupHaL4DjUTDttw== - -"@chainsafe/hashtree-linux-x64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree-linux-x64-gnu/-/hashtree-linux-x64-gnu-1.0.1.tgz#31c5a2bb196b78f04f2bf4bfb5c1bf1f3331f071" - integrity sha512-uCIGuUWuWV0LiB4KLMy6JFa7Jp6NmPl3hKF5BYWu8TzUBe7vSXMZfqTzGxXPggFYN2/0KymfRdG9iDCOJfGRqg== - -"@chainsafe/hashtree@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@chainsafe/hashtree/-/hashtree-1.0.1.tgz#587666a261e1da6a37904095ce875fddc53c7c89" - integrity sha512-bleu9FjqBeR/l6W1u2Lz+HsS0b0LLJX2eUt3hOPBN7VqOhidx8wzkVh2S7YurS+iTQtfdK4K5QU9tcTGNrGwDg== - optionalDependencies: - "@chainsafe/hashtree-darwin-arm64" "1.0.1" - "@chainsafe/hashtree-linux-arm64-gnu" "1.0.1" - "@chainsafe/hashtree-linux-x64-gnu" "1.0.1" - -"@chainsafe/persistent-merkle-tree@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.8.0.tgz#18e2f0a5de3a0b59c6e5be8797a78e0d209dd7dc" - integrity sha512-hh6C1JO6SKlr0QGNTNtTLqgGVMA/Bc20wD6CeMHp+wqbFKCULRJuBUxhF4WDx/7mX8QlqF3nFriF/Eo8oYJ4/A== - dependencies: - "@chainsafe/as-sha256" "0.5.0" - "@chainsafe/hashtree" "1.0.1" - "@noble/hashes" "^1.3.0" - "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" @@ -114,14 +71,6 @@ dependencies: "@chainsafe/as-sha256" "^0.3.1" -"@chainsafe/persistent-merkle-tree@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.6.1.tgz#37bde25cf6cbe1660ad84311aa73157dc86ec7f2" - integrity sha512-gcENLemRR13+1MED2NeZBMA7FRS0xQPM7L2vhMqvKkjqtFT4YfjSVADq5U0iLuQLhFUJEMVuA8fbv5v+TN6O9A== - dependencies: - "@chainsafe/as-sha256" "^0.4.1" - "@noble/hashes" "^1.3.0" - "@chainsafe/ssz@^0.10.0": version "0.10.2" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" @@ -130,22 +79,6 @@ "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree" "^0.5.0" -"@chainsafe/ssz@^0.14.0": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.14.3.tgz#caae48ae2670b2f8b6febed22b0e0619a636f316" - integrity sha512-ldOx4Rk9OC8YMvFdwvHKtRc7KpFRLcXlb9ATCdQ5fHtLT438LRQyxdWFufC9+M8jFHSZcgq31h2BJsSva6sZ0w== - dependencies: - "@chainsafe/as-sha256" "^0.4.1" - "@chainsafe/persistent-merkle-tree" "^0.6.1" - -"@chainsafe/ssz@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.17.1.tgz#7986afbcad5e6971006d596fdb7dfa34bc195131" - integrity sha512-1ay46QqYcVTBvUnDXTPTi5WTiENu7tIxpZGMDpUWps1/nYBmh/We/UoCF/jO+o/fkcDD3p8xQPlHbcCfy+jyjA== - dependencies: - "@chainsafe/as-sha256" "0.5.0" - "@chainsafe/persistent-merkle-tree" "0.8.0" - "@chainsafe/ssz@^0.9.2": version "0.9.4" resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" @@ -423,113 +356,16 @@ bufio "^1.0.7" chai "^4.3.4" -"@ethereumjs/block@^5.1.1", "@ethereumjs/block@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-5.3.0.tgz#a22d615f825a3aa123189434263a6c1d43d4ac8f" - integrity sha512-cyphdEB/ywIERqWLRHdAS6muTkAcd6BibMOp6XmGbeWgvtIhe4ArxcMDI78MVstJzT/faihvRI4rKQKy+MpdKQ== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/tx" "^5.4.0" - "@ethereumjs/util" "^9.1.0" - ethereum-cryptography "^2.2.1" - -"@ethereumjs/blockchain@^7.1.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-7.3.0.tgz#87049c61b51a0870f3c23b5390b6ff9f3e3ae7f0" - integrity sha512-UZXFb6JFeXDHobKhXGAiKf+m5n2ynCtqpgHWCl2nQ3Tol9W7C3By4UFMpAl2E6EyaFhC26Maig9kqCWxfsQ6bQ== - dependencies: - "@ethereumjs/block" "^5.3.0" - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/ethash" "^3.0.4" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/tx" "^5.4.0" - "@ethereumjs/util" "^9.1.0" - debug "^4.3.3" - ethereum-cryptography "^2.2.1" - lru-cache "10.1.0" - -"@ethereumjs/common@^4.2.0", "@ethereumjs/common@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.4.0.tgz#fba41612f527a815bf304e98653d6b5fc5d6d4de" - integrity sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w== - dependencies: - "@ethereumjs/util" "^9.1.0" - -"@ethereumjs/ethash@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-3.0.4.tgz#663524abbc2f5ef6fa9813067eb33808fd8a0309" - integrity sha512-dDc9h4RxEIWr38DxzeFyWlTmc++WeAFysFT6Ru0opoQ8WSM/hM3KH1VfHMPwx6JaqQT89Q/xtHV3CEvWrbwLKw== - dependencies: - "@ethereumjs/block" "^5.3.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - bigint-crypto-utils "^3.2.2" - ethereum-cryptography "^2.2.1" - -"@ethereumjs/evm@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/evm/-/evm-2.2.1.tgz#07dd48152bb19277980b295a149b0936d2ff67b3" - integrity sha512-equF3QqssDgfZyVDEoMqJUsMCjO9SwgFdpUTc7yHFOU74X43l/MHM+Cqdey+wcBhdU2yOwD9S2AbW6wh7tDYfQ== - dependencies: - "@ethereumjs/common" "^4.2.0" - "@ethereumjs/statemanager" "^2.2.2" - "@ethereumjs/tx" "^5.2.1" - "@ethereumjs/util" "^9.0.2" - "@types/debug" "^4.1.9" - debug "^4.3.3" - ethereum-cryptography "^2.1.3" - rustbn-wasm "^0.2.0" - "@ethereumjs/rlp@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== -"@ethereumjs/rlp@^5.0.1", "@ethereumjs/rlp@^5.0.2": +"@ethereumjs/rlp@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== -"@ethereumjs/statemanager@^2.2.2": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/statemanager/-/statemanager-2.4.0.tgz#105feb0653942118758b3522ef05c8901d7924b3" - integrity sha512-IBe5kMGsDWlSvNg7QCERwO3BQE1c9hzVIZ9ktZF7xyifFEfA4VNhTMMEpwLuiAIy0l/ZzZiZ17/Iqar+SawMYA== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/trie" "^6.2.1" - "@ethereumjs/util" "^9.1.0" - debug "^4.3.3" - ethereum-cryptography "^2.2.1" - js-sdsl "^4.1.4" - lru-cache "10.1.0" - -"@ethereumjs/trie@^6.0.1", "@ethereumjs/trie@^6.1.1", "@ethereumjs/trie@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-6.2.1.tgz#11d3e91ffd7d565f468a62c0e3d7952063991fa9" - integrity sha512-MguABMVi/dPtgagK+SuY57rpXFP+Ghr2x+pBDy+e3VmMqUY+WGzFu1QWjBb5/iJ7lINk4CI2Uwsih07Nu9sTSg== - dependencies: - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - "@types/readable-stream" "^2.3.13" - debug "^4.3.4" - ethereum-cryptography "^2.2.1" - lru-cache "10.1.0" - readable-stream "^3.6.0" - -"@ethereumjs/tx@^5.2.1", "@ethereumjs/tx@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.4.0.tgz#6f47894cc3e2d4e63d87c62b41ed7e8180a1de58" - integrity sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - ethereum-cryptography "^2.2.1" - "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -539,7 +375,7 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethereumjs/util@^9.0.1", "@ethereumjs/util@^9.0.2", "@ethereumjs/util@^9.1.0": +"@ethereumjs/util@^9.0.3": version "9.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== @@ -547,23 +383,6 @@ "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.2.1" -"@ethereumjs/vm@^7.1.0": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-7.2.1.tgz#c53610a8c327aabfdd0a5dedfe32eb3aebb17665" - integrity sha512-exmyhDPlfiBtV/nIPY7gE5iu3QC62F7hf/fALLgQaUS8ezxmJQG2MRaFI1eqYwvsAhfNBfst7K6KcCE4jbGbhw== - dependencies: - "@ethereumjs/block" "^5.1.1" - "@ethereumjs/blockchain" "^7.1.0" - "@ethereumjs/common" "^4.2.0" - "@ethereumjs/evm" "^2.2.1" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/statemanager" "^2.2.2" - "@ethereumjs/trie" "^6.1.1" - "@ethereumjs/tx" "^5.2.1" - "@ethereumjs/util" "^9.0.2" - debug "^4.3.3" - ethereum-cryptography "^2.1.3" - "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -983,20 +802,6 @@ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.42.tgz#171e2332aa83e5d30ebdb64c1b1158d204139153" integrity sha512-my4tWF57jtwth/oLz3X1hYljPDDZM9wKzU498yk+6FgBtKg6J4uZIUoNh3p3GgUJ+Lde8pVpxqJ5pNchPICxmQ== -"@lodestar/params@^1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@lodestar/params/-/params-1.22.0.tgz#e2d436da9ceb742e7ae088a6474468e8e8756a1b" - integrity sha512-wbbeQAG+4YOl1ATsSDJnx7wBk5FXsRl2OrmLkMnJXI67wqvRwWk8WQBx7wjx2hnWWrk0in4/8bTtHz3At1GydQ== - -"@lodestar/types@^1.12.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@lodestar/types/-/types-1.22.0.tgz#5178c5edfaefe8875533545d95707957fa59f80a" - integrity sha512-BB0zgiqmIYmpg1ifDJ4VW0Ka2vkdmM7ju7lAQLk1O666iGWLObhfrLzQ+LbZ8/0h+PnjpDMB55MJSffmnqCkGg== - dependencies: - "@chainsafe/ssz" "^0.17.1" - "@lodestar/params" "^1.22.0" - ethereum-cryptography "^2.0.0" - "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -1058,7 +863,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@1.5.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== @@ -1399,7 +1204,7 @@ "@openzeppelin/contracts" "^4.4.1" "@openzeppelin/contracts-upgradeable" "^4.7.3" -"@scure/base@^1.1.1", "@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6", "@scure/base@~1.1.8": +"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.6", "@scure/base@~1.1.8": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== @@ -1605,6 +1410,11 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tsconfig/node22@^22.0.0": + version "22.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node22/-/node22-22.0.0.tgz#0bdaf702f2b7594383d24d7b2b8d557dcfdca1ed" + integrity sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg== + "@typechain/ethers-v5@^10.1.1": version "10.2.1" resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" @@ -1634,6 +1444,14 @@ dependencies: "@types/node" "*" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/chai-as-promised@^7.1.3": version "7.1.8" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" @@ -1653,19 +1471,32 @@ dependencies: "@types/node" "*" -"@types/connect@^3.4.33": +"@types/connect@*", "@types/connect@^3.4.33": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" -"@types/debug@^4.1.9": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== +"@types/express-serve-static-core@^4.17.33": + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: - "@types/ms" "*" + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" "@types/form-data@0.0.33": version "0.0.33" @@ -1682,6 +1513,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -1692,6 +1528,11 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -1714,11 +1555,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.8.tgz#a7eff5816e070c3b4d803f1d3cd780c4e42934a1" integrity sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw== -"@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - "@types/node-cron@^3.0.9": version "3.0.11" resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344" @@ -1782,11 +1618,16 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/qs@^6.2.31", "@types/qs@^6.9.7": +"@types/qs@*", "@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.16" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + "@types/readable-stream@^2.3.13": version "2.3.15" resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" @@ -1814,6 +1655,23 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + "@types/sinon-chai@3.2.12": version "3.2.12" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.12.tgz#c7cb06bee44a534ec84f3a5534c3a3a46fd779b6" @@ -2091,6 +1949,14 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-le module-error "^1.0.1" queue-microtask "^1.2.3" +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2177,6 +2043,13 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" @@ -2187,6 +2060,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2201,6 +2079,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + antlr4@^4.11.0: version "4.13.2" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" @@ -2246,6 +2129,11 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -2358,7 +2246,7 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bigint-crypto-utils@^3.0.23, bigint-crypto-utils@^3.2.2: +bigint-crypto-utils@^3.0.23: version "3.3.0" resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== @@ -2400,6 +2288,24 @@ bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +body-parser@1.20.3, body-parser@^1.20.2: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + borsh@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" @@ -2613,6 +2519,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2674,6 +2585,13 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2684,6 +2602,14 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2742,6 +2668,11 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2802,6 +2733,11 @@ commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@~12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2825,6 +2761,18 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + conventional-changelog-angular@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" @@ -2849,6 +2797,16 @@ conventional-commits-parser@^4.0.0: meow "^8.1.2" split2 "^3.2.2" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -2931,7 +2889,14 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@~4.3.6: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -2997,6 +2962,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -3044,6 +3014,11 @@ dotenv@^16.0.3, dotenv@^16.3.1: version "1.0.0" resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -3070,6 +3045,11 @@ elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3085,6 +3065,16 @@ encode-utf8@^1.0.2: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + enquirer@^2.3.0, enquirer@^2.3.6: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -3098,6 +3088,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3134,6 +3129,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3284,6 +3284,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + eth-gas-reporter@^0.2.25: version "0.2.27" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" @@ -3341,7 +3346,7 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptography@^2.1.3, ethereum-cryptography@^2.2.1: +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptography@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== @@ -3463,6 +3468,58 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@~8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +express@^4.19.2: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -3540,6 +3597,19 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -3636,6 +3706,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -3646,6 +3721,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -3733,6 +3813,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -3759,6 +3844,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -4166,6 +4256,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4178,6 +4273,11 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +husky@^9.0.11: + version "9.1.6" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.6.tgz#e23aa996b6203ab33534bdc82306b0cf2cb07d6c" + integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4258,6 +4358,11 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4307,6 +4412,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4349,6 +4466,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -4456,6 +4578,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-rpc-2.0@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/json-rpc-2.0/-/json-rpc-2.0-1.7.0.tgz#840deb0bc168463e12bceb462f7fe225e793fc17" + integrity sha512-asnLgC1qD5ytP+fvBP8uL0rvj+l8P6iYICbzZ8dVxCpESffVjzA7KkYkbKCIbavs7cllwH1ZUaNtJwphdeRqpg== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4602,11 +4729,44 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^15.2.7: + version "15.2.10" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.10.tgz#92ac222f802ba911897dcf23671da5bb80643cd2" + integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== + dependencies: + chalk "~5.3.0" + commander "~12.1.0" + debug "~4.3.6" + execa "~8.0.1" + lilconfig "~3.1.2" + listr2 "~8.2.4" + micromatch "~4.0.8" + pidtree "~0.6.0" + string-argv "~0.3.2" + yaml "~2.5.0" + +listr2@~8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" + integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4702,6 +4862,17 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + logform@^2.6.0, logform@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" @@ -4721,11 +4892,6 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" -lru-cache@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4784,6 +4950,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -4820,6 +4991,11 @@ meow@^8.0.0, meow@^8.1.2: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -4830,12 +5006,17 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + micro-ftch@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@~4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -4848,18 +5029,33 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -4977,7 +5173,12 @@ mongodb@6.5.0: bson "^6.4.0" mongodb-connection-string-url "^3.0.0" -ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5006,6 +5207,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -5095,6 +5301,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -5123,6 +5336,13 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -5144,6 +5364,20 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -5272,6 +5506,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" @@ -5313,11 +5552,21 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5349,6 +5598,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -5389,7 +5643,7 @@ prettier@^2.1.2, prettier@^2.3.1, prettier@^2.8.3, prettier@^2.8.7: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.0.3, prettier@^3.3.3: +prettier@^3.0.3, prettier@^3.3.2, prettier@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== @@ -5406,6 +5660,14 @@ promise@^8.0.0: dependencies: asap "~2.0.6" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -5421,7 +5683,7 @@ punycode@^2.1.0, punycode@^2.3.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.4.0, qs@^6.9.4: +qs@6.13.0, qs@^6.4.0, qs@^6.9.4: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== @@ -5445,7 +5707,12 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -raw-body@^2.4.1: +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2, raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -5607,11 +5874,24 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -5671,19 +5951,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rustbn-wasm@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" - integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== - dependencies: - "@scure/base" "^1.1.1" - rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5759,6 +6032,25 @@ semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" @@ -5766,6 +6058,16 @@ serialize-javascript@^6.0.2: dependencies: randombytes "^2.1.0" +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -5840,6 +6142,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -5873,6 +6180,22 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -6040,6 +6363,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +string-argv@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -6062,6 +6390,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6090,11 +6427,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -6424,6 +6773,14 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typechain@^8.1.1: version "8.3.2" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" @@ -6507,7 +6864,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6536,6 +6893,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -6554,6 +6916,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + viem@2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/viem/-/viem-2.20.0.tgz#abff4c2cf733bcc20978e662ea17db117a2881ef" @@ -6583,7 +6950,7 @@ viem@^1.16.5: isows "1.0.3" ws "8.13.0" -viem@^2.9.28: +viem@^2.17.5, viem@^2.9.28: version "2.21.14" resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.14.tgz#2ce78d52d43dd97103102fcb0852b973a911f478" integrity sha512-uM6XmY9Q/kJRVSopJAGsakmtNDpk/EswqXUzwOp9DzhGuwgpWtw2MgwpfFdIyqBDFIw+TTypCIUTcwJSgEYSzA== @@ -6669,7 +7036,7 @@ winston-transport@^4.7.0: readable-stream "^3.6.2" triple-beam "^1.3.0" -winston@^3.11.0: +winston@^3.11.0, winston@^3.13.1: version "3.14.2" resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== @@ -6718,6 +7085,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6763,7 +7139,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.2: +yaml@^2.2.2, yaml@~2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==