From fcc5880b284fd41c97d4215cb7d397f160d4f328 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 13:15:18 -0700 Subject: [PATCH 01/41] Move Defender action files to src/js/tasks/actions/ as TypeScript Rename 26 Defender action files from src/js/actions/*.js to src/js/tasks/actions/*.ts in preparation for converting them from OpenZeppelin Defender handlers to the action() builder pattern. --- .../allocateEthena.js => tasks/actions/allocateEthena.ts} | 0 .../allocateEtherFi.js => tasks/actions/allocateEtherFi.ts} | 0 src/js/{actions/allocateLido.js => tasks/actions/allocateLido.ts} | 0 src/js/{actions/allocateOETH.js => tasks/actions/allocateOETH.ts} | 0 .../{actions/allocateSonic.js => tasks/actions/allocateSonic.ts} | 0 .../actions/autoClaimEthenaWithdraw.ts} | 0 .../actions/autoClaimEtherFiWithdraw.ts} | 0 .../actions/autoClaimLidoWithdraw.ts} | 0 .../autoClaimWithdraw.js => tasks/actions/autoClaimWithdraw.ts} | 0 .../actions/autoClaimWithdrawSonic.ts} | 0 .../actions/autoRequestEthenaWithdraw.ts} | 0 .../actions/autoRequestEtherFiWithdraw.ts} | 0 .../actions/autoRequestLidoWithdraw.ts} | 0 .../actions/autoRequestWithdraw.ts} | 0 .../actions/autoRequestWithdrawSonic.ts} | 0 .../collectEthenaFees.js => tasks/actions/collectEthenaFees.ts} | 0 .../collectEtherFiFees.js => tasks/actions/collectEtherFiFees.ts} | 0 .../collectFeesSonic.js => tasks/actions/collectFeesSonic.ts} | 0 .../collectLidoFees.js => tasks/actions/collectLidoFees.ts} | 0 .../collectOETHFees.js => tasks/actions/collectOETHFees.ts} | 0 .../actions/collectRewardsSonic.ts} | 0 .../actions/setOSSiloPriceAction.ts} | 0 .../setPricesEthena.js => tasks/actions/setPricesEthena.ts} | 0 .../setPricesEtherFi.js => tasks/actions/setPricesEtherFi.ts} | 0 .../{actions/setPricesLido.js => tasks/actions/setPricesLido.ts} | 0 .../{actions/setPricesOETH.js => tasks/actions/setPricesOETH.ts} | 0 26 files changed, 0 insertions(+), 0 deletions(-) rename src/js/{actions/allocateEthena.js => tasks/actions/allocateEthena.ts} (100%) rename src/js/{actions/allocateEtherFi.js => tasks/actions/allocateEtherFi.ts} (100%) rename src/js/{actions/allocateLido.js => tasks/actions/allocateLido.ts} (100%) rename src/js/{actions/allocateOETH.js => tasks/actions/allocateOETH.ts} (100%) rename src/js/{actions/allocateSonic.js => tasks/actions/allocateSonic.ts} (100%) rename src/js/{actions/autoClaimEthenaWithdraw.js => tasks/actions/autoClaimEthenaWithdraw.ts} (100%) rename src/js/{actions/autoClaimEtherFiWithdraw.js => tasks/actions/autoClaimEtherFiWithdraw.ts} (100%) rename src/js/{actions/autoClaimLidoWithdraw.js => tasks/actions/autoClaimLidoWithdraw.ts} (100%) rename src/js/{actions/autoClaimWithdraw.js => tasks/actions/autoClaimWithdraw.ts} (100%) rename src/js/{actions/autoClaimWithdrawSonic.js => tasks/actions/autoClaimWithdrawSonic.ts} (100%) rename src/js/{actions/autoRequestEthenaWithdraw.js => tasks/actions/autoRequestEthenaWithdraw.ts} (100%) rename src/js/{actions/autoRequestEtherFiWithdraw.js => tasks/actions/autoRequestEtherFiWithdraw.ts} (100%) rename src/js/{actions/autoRequestLidoWithdraw.js => tasks/actions/autoRequestLidoWithdraw.ts} (100%) rename src/js/{actions/autoRequestWithdraw.js => tasks/actions/autoRequestWithdraw.ts} (100%) rename src/js/{actions/autoRequestWithdrawSonic.js => tasks/actions/autoRequestWithdrawSonic.ts} (100%) rename src/js/{actions/collectEthenaFees.js => tasks/actions/collectEthenaFees.ts} (100%) rename src/js/{actions/collectEtherFiFees.js => tasks/actions/collectEtherFiFees.ts} (100%) rename src/js/{actions/collectFeesSonic.js => tasks/actions/collectFeesSonic.ts} (100%) rename src/js/{actions/collectLidoFees.js => tasks/actions/collectLidoFees.ts} (100%) rename src/js/{actions/collectOETHFees.js => tasks/actions/collectOETHFees.ts} (100%) rename src/js/{actions/collectRewardsSonic.js => tasks/actions/collectRewardsSonic.ts} (100%) rename src/js/{actions/setOSSiloPriceAction.js => tasks/actions/setOSSiloPriceAction.ts} (100%) rename src/js/{actions/setPricesEthena.js => tasks/actions/setPricesEthena.ts} (100%) rename src/js/{actions/setPricesEtherFi.js => tasks/actions/setPricesEtherFi.ts} (100%) rename src/js/{actions/setPricesLido.js => tasks/actions/setPricesLido.ts} (100%) rename src/js/{actions/setPricesOETH.js => tasks/actions/setPricesOETH.ts} (100%) diff --git a/src/js/actions/allocateEthena.js b/src/js/tasks/actions/allocateEthena.ts similarity index 100% rename from src/js/actions/allocateEthena.js rename to src/js/tasks/actions/allocateEthena.ts diff --git a/src/js/actions/allocateEtherFi.js b/src/js/tasks/actions/allocateEtherFi.ts similarity index 100% rename from src/js/actions/allocateEtherFi.js rename to src/js/tasks/actions/allocateEtherFi.ts diff --git a/src/js/actions/allocateLido.js b/src/js/tasks/actions/allocateLido.ts similarity index 100% rename from src/js/actions/allocateLido.js rename to src/js/tasks/actions/allocateLido.ts diff --git a/src/js/actions/allocateOETH.js b/src/js/tasks/actions/allocateOETH.ts similarity index 100% rename from src/js/actions/allocateOETH.js rename to src/js/tasks/actions/allocateOETH.ts diff --git a/src/js/actions/allocateSonic.js b/src/js/tasks/actions/allocateSonic.ts similarity index 100% rename from src/js/actions/allocateSonic.js rename to src/js/tasks/actions/allocateSonic.ts diff --git a/src/js/actions/autoClaimEthenaWithdraw.js b/src/js/tasks/actions/autoClaimEthenaWithdraw.ts similarity index 100% rename from src/js/actions/autoClaimEthenaWithdraw.js rename to src/js/tasks/actions/autoClaimEthenaWithdraw.ts diff --git a/src/js/actions/autoClaimEtherFiWithdraw.js b/src/js/tasks/actions/autoClaimEtherFiWithdraw.ts similarity index 100% rename from src/js/actions/autoClaimEtherFiWithdraw.js rename to src/js/tasks/actions/autoClaimEtherFiWithdraw.ts diff --git a/src/js/actions/autoClaimLidoWithdraw.js b/src/js/tasks/actions/autoClaimLidoWithdraw.ts similarity index 100% rename from src/js/actions/autoClaimLidoWithdraw.js rename to src/js/tasks/actions/autoClaimLidoWithdraw.ts diff --git a/src/js/actions/autoClaimWithdraw.js b/src/js/tasks/actions/autoClaimWithdraw.ts similarity index 100% rename from src/js/actions/autoClaimWithdraw.js rename to src/js/tasks/actions/autoClaimWithdraw.ts diff --git a/src/js/actions/autoClaimWithdrawSonic.js b/src/js/tasks/actions/autoClaimWithdrawSonic.ts similarity index 100% rename from src/js/actions/autoClaimWithdrawSonic.js rename to src/js/tasks/actions/autoClaimWithdrawSonic.ts diff --git a/src/js/actions/autoRequestEthenaWithdraw.js b/src/js/tasks/actions/autoRequestEthenaWithdraw.ts similarity index 100% rename from src/js/actions/autoRequestEthenaWithdraw.js rename to src/js/tasks/actions/autoRequestEthenaWithdraw.ts diff --git a/src/js/actions/autoRequestEtherFiWithdraw.js b/src/js/tasks/actions/autoRequestEtherFiWithdraw.ts similarity index 100% rename from src/js/actions/autoRequestEtherFiWithdraw.js rename to src/js/tasks/actions/autoRequestEtherFiWithdraw.ts diff --git a/src/js/actions/autoRequestLidoWithdraw.js b/src/js/tasks/actions/autoRequestLidoWithdraw.ts similarity index 100% rename from src/js/actions/autoRequestLidoWithdraw.js rename to src/js/tasks/actions/autoRequestLidoWithdraw.ts diff --git a/src/js/actions/autoRequestWithdraw.js b/src/js/tasks/actions/autoRequestWithdraw.ts similarity index 100% rename from src/js/actions/autoRequestWithdraw.js rename to src/js/tasks/actions/autoRequestWithdraw.ts diff --git a/src/js/actions/autoRequestWithdrawSonic.js b/src/js/tasks/actions/autoRequestWithdrawSonic.ts similarity index 100% rename from src/js/actions/autoRequestWithdrawSonic.js rename to src/js/tasks/actions/autoRequestWithdrawSonic.ts diff --git a/src/js/actions/collectEthenaFees.js b/src/js/tasks/actions/collectEthenaFees.ts similarity index 100% rename from src/js/actions/collectEthenaFees.js rename to src/js/tasks/actions/collectEthenaFees.ts diff --git a/src/js/actions/collectEtherFiFees.js b/src/js/tasks/actions/collectEtherFiFees.ts similarity index 100% rename from src/js/actions/collectEtherFiFees.js rename to src/js/tasks/actions/collectEtherFiFees.ts diff --git a/src/js/actions/collectFeesSonic.js b/src/js/tasks/actions/collectFeesSonic.ts similarity index 100% rename from src/js/actions/collectFeesSonic.js rename to src/js/tasks/actions/collectFeesSonic.ts diff --git a/src/js/actions/collectLidoFees.js b/src/js/tasks/actions/collectLidoFees.ts similarity index 100% rename from src/js/actions/collectLidoFees.js rename to src/js/tasks/actions/collectLidoFees.ts diff --git a/src/js/actions/collectOETHFees.js b/src/js/tasks/actions/collectOETHFees.ts similarity index 100% rename from src/js/actions/collectOETHFees.js rename to src/js/tasks/actions/collectOETHFees.ts diff --git a/src/js/actions/collectRewardsSonic.js b/src/js/tasks/actions/collectRewardsSonic.ts similarity index 100% rename from src/js/actions/collectRewardsSonic.js rename to src/js/tasks/actions/collectRewardsSonic.ts diff --git a/src/js/actions/setOSSiloPriceAction.js b/src/js/tasks/actions/setOSSiloPriceAction.ts similarity index 100% rename from src/js/actions/setOSSiloPriceAction.js rename to src/js/tasks/actions/setOSSiloPriceAction.ts diff --git a/src/js/actions/setPricesEthena.js b/src/js/tasks/actions/setPricesEthena.ts similarity index 100% rename from src/js/actions/setPricesEthena.js rename to src/js/tasks/actions/setPricesEthena.ts diff --git a/src/js/actions/setPricesEtherFi.js b/src/js/tasks/actions/setPricesEtherFi.ts similarity index 100% rename from src/js/actions/setPricesEtherFi.js rename to src/js/tasks/actions/setPricesEtherFi.ts diff --git a/src/js/actions/setPricesLido.js b/src/js/tasks/actions/setPricesLido.ts similarity index 100% rename from src/js/actions/setPricesLido.js rename to src/js/tasks/actions/setPricesLido.ts diff --git a/src/js/actions/setPricesOETH.js b/src/js/tasks/actions/setPricesOETH.ts similarity index 100% rename from src/js/actions/setPricesOETH.js rename to src/js/tasks/actions/setPricesOETH.ts From ae9b6148f5b46052156021cde9c76d386ec4866c Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 13:42:45 -0700 Subject: [PATCH 02/41] ts, cron, and docker setup --- cron/cron-entrypoint.sh | 4 + cron/cron-jobs.json | 166 ++++ cron/cron-supervisor.ts | 342 +++++++++ cron/render-crontab.ts | 107 +++ docker-compose.yml | 21 + dockerfile-actions | 55 ++ hardhat.config.js | 26 + package.json | 7 +- src/js/actions/rollup.config.cjs | 73 -- src/js/tasks/lib/action.ts | 78 ++ src/js/tasks/lib/env.ts | 14 + src/js/tasks/lib/logger.ts | 59 ++ src/js/utils/signers.js | 28 + tsconfig.json | 22 + yarn.lock | 1239 ++++++++++++++---------------- 15 files changed, 1485 insertions(+), 756 deletions(-) create mode 100755 cron/cron-entrypoint.sh create mode 100644 cron/cron-jobs.json create mode 100644 cron/cron-supervisor.ts create mode 100644 cron/render-crontab.ts create mode 100644 docker-compose.yml create mode 100644 dockerfile-actions delete mode 100644 src/js/actions/rollup.config.cjs create mode 100644 src/js/tasks/lib/action.ts create mode 100644 src/js/tasks/lib/env.ts create mode 100644 src/js/tasks/lib/logger.ts create mode 100644 tsconfig.json diff --git a/cron/cron-entrypoint.sh b/cron/cron-entrypoint.sh new file mode 100755 index 00000000..60c072e9 --- /dev/null +++ b/cron/cron-entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu + +exec node -r ts-node/register /app/cron/cron-supervisor.ts diff --git a/cron/cron-jobs.json b/cron/cron-jobs.json new file mode 100644 index 00000000..63d3cbfb --- /dev/null +++ b/cron/cron-jobs.json @@ -0,0 +1,166 @@ +{ + "jobs": [ + { + "name": "healthcheck", + "schedule": "*/5 * * * *", + "enabled": true, + "command": "cd /app && npx hardhat healthcheck" + }, + { + "name": "mainnet_auto_request_withdraw", + "schedule": "2 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoRequestWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_claim_withdraw", + "schedule": "7 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoClaimWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_request_lido_withdraw", + "schedule": "12 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoRequestLidoWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_claim_lido_withdraw", + "schedule": "17 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoClaimLidoWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_request_etherfi_withdraw", + "schedule": "22 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoRequestEtherFiWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_claim_etherfi_withdraw", + "schedule": "27 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoClaimEtherFiWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_request_ethena_withdraw", + "schedule": "32 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoRequestEthenaWithdraw --network mainnet" + }, + { + "name": "mainnet_auto_claim_ethena_withdraw", + "schedule": "37 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoClaimEthenaWithdraw --network mainnet" + }, + { + "name": "mainnet_collect_oeth_fees", + "schedule": "3 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectOETHFees --network mainnet" + }, + { + "name": "mainnet_collect_lido_fees", + "schedule": "8 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectLidoFees --network mainnet" + }, + { + "name": "mainnet_collect_etherfi_fees", + "schedule": "13 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectEtherFiFees --network mainnet" + }, + { + "name": "mainnet_collect_ethena_fees", + "schedule": "18 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectEthenaFees --network mainnet" + }, + { + "name": "mainnet_allocate_oeth", + "schedule": "42 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat allocateOETH --network mainnet" + }, + { + "name": "mainnet_allocate_lido", + "schedule": "47 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat allocateLido --network mainnet" + }, + { + "name": "mainnet_allocate_etherfi", + "schedule": "52 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat allocateEtherFi --network mainnet" + }, + { + "name": "mainnet_allocate_ethena", + "schedule": "57 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat allocateEthena --network mainnet" + }, + { + "name": "mainnet_set_prices_oeth", + "schedule": "*/10 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat setPricesOETH --network mainnet" + }, + { + "name": "mainnet_set_prices_lido", + "schedule": "1,11,21,31,41,51 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat setPricesLido --network mainnet" + }, + { + "name": "mainnet_set_prices_etherfi", + "schedule": "2,12,22,32,42,52 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat setPricesEtherFi --network mainnet" + }, + { + "name": "mainnet_set_prices_ethena", + "schedule": "3,13,23,33,43,53 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat setPricesEthena --network mainnet" + }, + { + "name": "sonic_auto_request_withdraw", + "schedule": "5 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoRequestWithdrawSonic --network sonic" + }, + { + "name": "sonic_auto_claim_withdraw", + "schedule": "10 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat autoClaimWithdrawSonic --network sonic" + }, + { + "name": "sonic_collect_fees", + "schedule": "23 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectFeesSonic --network sonic" + }, + { + "name": "sonic_allocate", + "schedule": "15 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat allocateSonic --network sonic" + }, + { + "name": "sonic_set_os_silo_price", + "schedule": "4,14,24,34,44,54 * * * *", + "enabled": false, + "command": "cd /app && npx hardhat setOSSiloPriceAction --network sonic" + }, + { + "name": "sonic_collect_rewards", + "schedule": "28 0 * * *", + "enabled": false, + "command": "cd /app && npx hardhat collectRewardsSonic --network sonic" + } + ] +} diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts new file mode 100644 index 00000000..d75b1fed --- /dev/null +++ b/cron/cron-supervisor.ts @@ -0,0 +1,342 @@ +import { spawn } from "node:child_process"; +import { randomUUID, timingSafeEqual } from "node:crypto"; +import fs from "node:fs"; +import http from "node:http"; +import { type CronJob, renderCrontab } from "./render-crontab"; + +// --- Configuration --- +const host = process.env.HOST || "0.0.0.0"; +const port = Number.parseInt(process.env.PORT || "8080", 10); +const cronConfigPath = + process.env.CRON_CONFIG_PATH || "/app/cron/cron-jobs.json"; +const cronOutputPath = process.env.CRON_OUTPUT_PATH || "/app/cron/cronjob"; +const supercronicBin = process.env.SUPERCRONIC_BIN || "supercronic"; +const runHistoryLimit = Number.parseInt( + process.env.ACTION_RUN_HISTORY_LIMIT || "500", + 10 +); +const actionApiToken = process.env.ACTION_API_BEARER_TOKEN; +const configuredActionWorkdir = process.env.ACTION_WORKDIR || "/app"; + +if (!Number.isInteger(port) || port < 1 || port > 65535) { + console.error(`[cron-supervisor] Invalid PORT value "${process.env.PORT}"`); + process.exit(1); +} +if (!actionApiToken || actionApiToken.trim().length === 0) { + console.error( + "[cron-supervisor] ACTION_API_BEARER_TOKEN must be set and non-empty" + ); + process.exit(1); +} +if (!Number.isInteger(runHistoryLimit) || runHistoryLimit < 1) { + console.error( + `[cron-supervisor] Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"` + ); + process.exit(1); +} + +const nowIso = () => new Date().toISOString(); +const actionWorkdir = fs.existsSync(configuredActionWorkdir) + ? configuredActionWorkdir + : process.cwd(); + +if (!fs.existsSync(configuredActionWorkdir)) { + console.warn( + `[cron-supervisor] ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead` + ); +} + +// --- HTTP helpers --- + +function json( + res: http.ServerResponse, + statusCode: number, + payload: any, + extraHeaders: Record = {} +) { + res.writeHead(statusCode, { + "Content-Type": "application/json", + ...extraHeaders, + }); + res.end(JSON.stringify(payload)); +} + +const expectedTokenBuffer = Buffer.from(actionApiToken); +function isAuthorized(headerValue: string | string[] | undefined): boolean { + if (typeof headerValue !== "string") return false; + if (!headerValue.startsWith("Bearer ")) return false; + const providedBuffer = Buffer.from(headerValue.slice(7).trim()); + if (providedBuffer.length !== expectedTokenBuffer.length) return false; + return timingSafeEqual(providedBuffer, expectedTokenBuffer); +} + +// --- Run tracking --- + +interface ActionRun { + runId: string; + action: string; + schedule: string; + enabled: boolean; + command?: string; + status: "queued" | "running" | "succeeded" | "failed"; + queuedAt: string; + startedAt: string; + finishedAt: string | null; + exitCode: number | null; + signal: string | null; + pid: number | null; + error?: string; +} + +const runStore = new Map(); +const runOrder: string[] = []; + +function storeRun(run: ActionRun) { + runStore.set(run.runId, run); + runOrder.push(run.runId); + while (runOrder.length > runHistoryLimit) { + runStore.delete(runOrder.shift()!); + } +} + +// --- Cron setup --- + +function initCron() { + try { + const result = renderCrontab({ + configPath: cronConfigPath, + outputPath: cronOutputPath, + }); + return result; + } catch (e: any) { + console.error(`[cron-supervisor] ${e.message}`); + process.exit(1); + } +} + +const { config: renderedConfig, enabledJobs } = initCron(); + +console.log( + `[cron-supervisor] Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}` +); +console.log(`[cron-supervisor] Generated ${cronOutputPath}:`); +console.log(fs.readFileSync(cronOutputPath, "utf8")); + +const jobsByName = new Map( + renderedConfig.jobs.map((job) => [job.name, job]) +); + +// --- Action execution --- + +function runAction(action: CronJob, run: ActionRun) { + run.status = "running"; + run.startedAt = nowIso(); + run.command = action.command; + + console.log( + `[cron-supervisor] Starting run ${run.runId} for action "${action.name}"` + ); + + const child = spawn("/bin/sh", ["-lc", action.command], { + cwd: actionWorkdir, + env: process.env, + stdio: "inherit", + }); + run.pid = child.pid ?? null; + + child.on("error", (err) => { + run.status = "failed"; + run.finishedAt = nowIso(); + run.exitCode = null; + run.signal = null; + run.error = err.message; + console.error( + `[cron-supervisor] Run ${run.runId} failed to start: ${err.message}` + ); + }); + + child.on("exit", (code, signal) => { + run.finishedAt = nowIso(); + run.exitCode = code; + run.signal = signal; + run.status = code === 0 ? "succeeded" : "failed"; + console.log( + `[cron-supervisor] Run ${run.runId} for "${action.name}" finished with status=${run.status}, code=${code}, signal=${signal}` + ); + }); +} + +function triggerAction(actionName: string): ActionRun | undefined { + const action = jobsByName.get(actionName); + if (!action) return undefined; + + const run: ActionRun = { + runId: randomUUID(), + action: action.name, + schedule: action.schedule, + enabled: action.enabled, + status: "queued", + queuedAt: nowIso(), + startedAt: nowIso(), + finishedAt: null, + exitCode: null, + signal: null, + pid: null, + }; + + storeRun(run); + setImmediate(() => runAction(action, run)); + return run; +} + +// --- Supercronic process --- + +const supercronic = spawn(supercronicBin, [cronOutputPath], { + env: process.env, + stdio: "inherit", +}); +let supercronicAlive = true; + +supercronic.on("error", (err) => { + console.error(`[cron-supervisor] supercronic start error: ${err.message}`); + process.exit(1); +}); + +let shuttingDown = false; +let serverClosed = false; +let supercronicClosed = false; + +function maybeExit() { + if (shuttingDown && serverClosed && supercronicClosed) process.exit(0); +} + +supercronic.on("exit", (code, signal) => { + supercronicAlive = false; + supercronicClosed = true; + if (!shuttingDown) { + console.error( + `[cron-supervisor] supercronic exited unexpectedly (code=${code}, signal=${signal})` + ); + process.exit(typeof code === "number" ? code : 1); + } + maybeExit(); +}); + +// --- HTTP API --- + +const server = http.createServer((req, res) => { + const method = req.method || "GET"; + const forwardedProto = req.headers["x-forwarded-proto"]; + const proto = + typeof forwardedProto === "string" && forwardedProto.length > 0 + ? forwardedProto.split(",")[0].trim() + : "http"; + const reqHost = req.headers.host || `${host}:${port}`; + const origin = `${proto}://${reqHost}`; + const url = new URL(req.url || "/", origin); + + // Health check (unauthenticated) + if (method === "GET" && url.pathname === "/healthz") { + return json(res, 200, { + status: "ok", + api: "up", + supercronic: { running: supercronicAlive, pid: supercronic.pid ?? null }, + }); + } + + // Auth gate for /api/v1/* + if ( + url.pathname.startsWith("/api/v1/") && + !isAuthorized(req.headers.authorization) + ) { + return json(res, 401, { error: "Unauthorized" }); + } + + // List actions + if (method === "GET" && url.pathname === "/api/v1/actions") { + return json(res, 200, { + actions: renderedConfig.jobs.map((job) => ({ + name: job.name, + schedule: job.schedule, + enabled: job.enabled, + })), + }); + } + + // Trigger action run + const triggerMatch = url.pathname.match( + /^\/api\/v1\/actions\/([^/]+)\/runs$/ + ); + if (method === "POST" && triggerMatch) { + const run = triggerAction(decodeURIComponent(triggerMatch[1])); + if (!run) + return json(res, 404, { error: `Unknown action "${triggerMatch[1]}"` }); + const statusUrl = `${origin}/api/v1/runs/${encodeURIComponent(run.runId)}`; + return json( + res, + 202, + { + runId: run.runId, + action: run.action, + status: run.status, + statusUrl, + startedAt: run.startedAt, + }, + { Location: statusUrl } + ); + } + + // Get run status + const statusMatch = url.pathname.match(/^\/api\/v1\/runs\/([^/]+)$/); + if (method === "GET" && statusMatch) { + const run = runStore.get(decodeURIComponent(statusMatch[1])); + if (!run) return json(res, 404, { error: `Run not found` }); + return json(res, 200, { + runId: run.runId, + action: run.action, + status: run.status, + startedAt: run.startedAt, + finishedAt: run.finishedAt, + exitCode: run.exitCode, + signal: run.signal, + }); + } + + json(res, 404, { error: "Not found" }); +}); + +server.on("error", (err) => { + console.error(`[cron-supervisor] HTTP server error: ${err.message}`); + process.exit(1); +}); + +server.on("close", () => { + serverClosed = true; + maybeExit(); +}); + +// --- Graceful shutdown --- + +function shutdown(signal: string) { + if (shuttingDown) return; + shuttingDown = true; + + console.log(`[cron-supervisor] Shutting down (signal=${signal})`); + server.close(); + + if (supercronicAlive && supercronic.exitCode === null) { + supercronic.kill("SIGTERM"); + setTimeout(() => { + if (supercronic.exitCode === null) supercronic.kill("SIGKILL"); + }, 10_000).unref(); + } + + setTimeout(() => process.exit(0), 12_000).unref(); +} + +process.on("SIGTERM", () => shutdown("SIGTERM")); +process.on("SIGINT", () => shutdown("SIGINT")); + +server.listen(port, host, () => { + console.log(`[cron-supervisor] API listening on ${host}:${port}`); +}); diff --git a/cron/render-crontab.ts b/cron/render-crontab.ts new file mode 100644 index 00000000..1cc15adf --- /dev/null +++ b/cron/render-crontab.ts @@ -0,0 +1,107 @@ +import fs from "node:fs"; +import path from "node:path"; + +const DEFAULT_CONFIG_PATH = + process.env.CRON_CONFIG_PATH || "./cron/cron-jobs.json"; +const DEFAULT_OUTPUT_PATH = process.env.CRON_OUTPUT_PATH || "./cron/cronjob"; + +export class RenderCrontabError extends Error {} + +export interface CronJob { + name: string; + schedule: string; + enabled: boolean; + command: string; +} + +export interface CronConfig { + jobs: CronJob[]; +} + +function assertCronConfig(data: any): asserts data is CronConfig { + if (!data || typeof data !== "object" || Array.isArray(data)) { + throw new RenderCrontabError("config root must be an object"); + } + if (!Array.isArray(data.jobs)) { + throw new RenderCrontabError('config must include a "jobs" array'); + } + const names = new Set(); + for (let i = 0; i < data.jobs.length; i++) { + const job = data.jobs[i]; + if (!job || typeof job !== "object" || Array.isArray(job)) { + throw new RenderCrontabError(`jobs[${i}] must be an object`); + } + if (typeof job.name !== "string" || !job.name.trim()) { + throw new RenderCrontabError( + `jobs[${i}].name must be a non-empty string` + ); + } + if (names.has(job.name)) { + throw new RenderCrontabError(`duplicate job name "${job.name}"`); + } + names.add(job.name); + if ( + typeof job.schedule !== "string" || + job.schedule.trim().split(/\s+/).length !== 5 + ) { + throw new RenderCrontabError( + `jobs[${i}].schedule must be a valid 5-field cron expression` + ); + } + if (typeof job.enabled !== "boolean") { + throw new RenderCrontabError(`jobs[${i}].enabled must be a boolean`); + } + if (typeof job.command !== "string" || !job.command.trim()) { + throw new RenderCrontabError( + `jobs[${i}].command must be a non-empty string` + ); + } + } +} + +export function loadCronConfig(configPath = DEFAULT_CONFIG_PATH): CronConfig { + let parsed: any; + try { + parsed = JSON.parse(fs.readFileSync(configPath, "utf8")); + } catch (e: any) { + throw new RenderCrontabError( + `failed to read or parse config "${configPath}": ${e.message}` + ); + } + assertCronConfig(parsed); + return parsed; +} + +export function renderCrontab({ + configPath = DEFAULT_CONFIG_PATH, + outputPath = DEFAULT_OUTPUT_PATH, +} = {}) { + const config = loadCronConfig(configPath); + const enabledJobs = config.jobs.filter((job) => job.enabled); + if (enabledJobs.length === 0) { + throw new RenderCrontabError("config has zero enabled jobs"); + } + + const lines: string[] = []; + for (const job of enabledJobs) { + lines.push(`# ${job.name}`); + lines.push(`${job.schedule} ${job.command}`); + } + + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, `${lines.join("\n")}\n`, "utf8"); + + return { config, enabledJobs, outputPath }; +} + +if (require.main === module) { + try { + const result = renderCrontab(); + console.log( + `[render-crontab] wrote ${result.enabledJobs.length} enabled jobs to ${result.outputPath}` + ); + } catch (e: any) { + console.error(`[render-crontab] ${e.message}`); + process.exit(1); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..d526ff3c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + actions: + build: + context: . + dockerfile: dockerfile-actions + ports: + - "8080:8080" + environment: + - MAINNET_URL=${MAINNET_URL:-} + - SONIC_URL=${SONIC_URL:-} + - HOLESKY_URL=${HOLESKY_URL:-} + - HARDHAT_NETWORK=${HARDHAT_NETWORK:-mainnet} + - ACTION_API_BEARER_TOKEN=${ACTION_API_BEARER_TOKEN:-test-token} + - LOKI_URL=${LOKI_URL:-} + - LOKI_USER=${LOKI_USER:-} + - LOKI_API_KEY=${LOKI_API_KEY:-} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} + - CRON_CONFIG_PATH=./cron/cron-jobs.json + - CRON_OUTPUT_PATH=./cron/cronjob + - DEBUG=arm* diff --git a/dockerfile-actions b/dockerfile-actions new file mode 100644 index 00000000..5b3f2648 --- /dev/null +++ b/dockerfile-actions @@ -0,0 +1,55 @@ +FROM node:20 + +ENV DEBIAN_FRONTEND=noninteractive \ + DEBUG=arm* \ + DEBUG_HIDE_DATE=true + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + openssh-client \ + build-essential \ + python3 \ + bsdutils \ + && rm -rf /var/lib/apt/lists/* + +RUN mkdir -p /root/.ssh \ + && ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts + +RUN git config --global url."https://github.com/".insteadOf "git@github.com:" + +ARG TARGETARCH +ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.39/supercronic-linux-${TARGETARCH} \ + SUPERCRONIC=supercronic-linux-${TARGETARCH} + +# sha1sums from https://github.com/aptible/supercronic/releases/tag/v0.2.39 +COPY <<'EOF' /tmp/supercronic-checksums.txt +c98bbf82c5f648aaac8708c182cc83046fe48423 supercronic-linux-amd64 +5ef4ccc3d43f12d0f6c3763758bc37cc4e5af76e supercronic-linux-arm64 +EOF + +RUN curl -fsSLO "$SUPERCRONIC_URL" \ + && grep "$SUPERCRONIC" /tmp/supercronic-checksums.txt | sha1sum -c - \ + && chmod +x "$SUPERCRONIC" \ + && mv "$SUPERCRONIC" /usr/local/bin/supercronic \ + && rm /tmp/supercronic-checksums.txt + +WORKDIR /app + +# Install dependencies first for better caching. +COPY yarn.lock package.json ./ +RUN yarn install --frozen-lockfile + +# Copy the rest of the workspace. +COPY . . + +ENV MAINNET_URL="" \ + SONIC_URL="" \ + HOLESKY_URL="" \ + HARDHAT_NETWORK="" + +RUN chmod +x /app/cron/cron-entrypoint.sh + +ENTRYPOINT ["/app/cron/cron-entrypoint.sh"] diff --git a/hardhat.config.js b/hardhat.config.js index 8673ad42..35b8fcb4 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -2,6 +2,21 @@ require("dotenv").config(); +require("ts-node").register({ + transpileOnly: true, + // Use inline compilerOptions instead of tsconfig.json to avoid + // interfering with ESM-only packages. + skipProject: true, + compilerOptions: { + module: "CommonJS", + target: "ES2020", + esModuleInterop: true, + allowSyntheticDefaultImports: true, + resolveJsonModule: true, + strict: false, + }, +}); + require("@nomicfoundation/hardhat-ethers"); require("@nomicfoundation/hardhat-foundry"); @@ -54,6 +69,17 @@ internalTask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction( require("./src/js/tasks/tasks"); +// Auto-load TypeScript action files +const fs = require("fs"); +const actionsDir = path.join(__dirname, "src/js/tasks/actions"); +if (fs.existsSync(actionsDir)) { + for (const file of fs.readdirSync(actionsDir)) { + if (file.endsWith(".ts")) { + require(path.join(actionsDir, file)); + } + } +} + module.exports = { networks: { mainnet: { diff --git a/package.json b/package.json index 1cdee3d9..b676b3a6 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "lint": "eslint \"src/**/*.js\"", "prettier": "prettier --write \"*.js\" \"src/js/**/*.js\" \"src/abis/**/*.json\"", "prettier:check": "prettier -c \"src/js/**/*.js\" \"src/abis/**/*.json\"", + "typecheck": "tsc --noEmit", "test": "forge test --fork-url=$MAINNET_URL --gas-report", "snap": "npx hardhat snap --network mainnet --amount 100" }, @@ -37,6 +38,10 @@ "node-fetch": "^2.6.7", "prettier": "^3.6.2", "rollup": "^4.9.1", - "rollup-plugin-visualizer": "^5.12.0" + "rollup-plugin-visualizer": "^5.12.0", + "ts-node": "^10.9.2", + "typescript": "^5.7.0", + "winston": "^3.17.0", + "winston-loki": "^6.1.3" } } diff --git a/src/js/actions/rollup.config.cjs b/src/js/actions/rollup.config.cjs deleted file mode 100644 index 7fc0dd2e..00000000 --- a/src/js/actions/rollup.config.cjs +++ /dev/null @@ -1,73 +0,0 @@ -const path = require("path"); -const resolve = require("@rollup/plugin-node-resolve"); -const commonjs = require("@rollup/plugin-commonjs"); -const json = require("@rollup/plugin-json"); -const builtins = require("builtin-modules"); -const { visualizer } = require("rollup-plugin-visualizer"); - -const commonConfig = { - plugins: [ - resolve({ preferBuiltins: true }), - commonjs(), - json({ compact: true }), - // Generates a stats.html file in the actions folder. - // This is a visual of the Action dependencies for the last Action in the rollup config. - visualizer(), - ], - // Do not bundle these packages. - // ethers is required to be bundled as we need v6 and not v5 that is packaged with Defender Actions. - external: [ - ...builtins, - "axios", - "chai", - "node-fetch", - /^defender-relay-client(\/.*)?$/, - "@openzeppelin/defender-relay-client/lib/ethers", - "@openzeppelin/defender-sdk", - "@openzeppelin/defender-autotask-client", - "@openzeppelin/defender-kvstore-client", - "@openzeppelin/defender-relay-client/lib/ethers", - "@nomicfoundation/solidity-analyzer-darwin-arm64", - "@nomicfoundation/solidity-analyzer-darwin-x64", - /^@nomicfoundation\/edr-.*$/, - "fsevents", - ], -}; - -const actions = [ - "autoRequestWithdraw", - "autoClaimWithdraw", - "autoRequestWithdrawSonic", - "autoClaimWithdrawSonic", - "autoRequestLidoWithdraw", - "autoClaimLidoWithdraw", - "autoRequestEtherFiWithdraw", - "autoClaimEtherFiWithdraw", - "autoRequestEthenaWithdraw", - "autoClaimEthenaWithdraw", - "collectLidoFees", - "collectFeesSonic", - "collectEtherFiFees", - "collectEthenaFees", - "collectOETHFees", - "collectRewardsSonic", - "allocateLido", - "allocateEtherFi", - "allocateEthena", - "allocateOETH", - "allocateSonic", - "setOSSiloPriceAction", - "setPricesLido", - "setPricesEtherFi", - "setPricesEthena", - "setPricesOETH", -]; - -module.exports = actions.map((action) => ({ - input: path.resolve(__dirname, `${action}.js`), - output: { - file: path.resolve(__dirname, `dist/${action}/index.js`), - format: "cjs", - }, - ...commonConfig, -})); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts new file mode 100644 index 00000000..5d25c44d --- /dev/null +++ b/src/js/tasks/lib/action.ts @@ -0,0 +1,78 @@ +import type { ethers } from "ethers"; +import { subtask, task } from "hardhat/config"; +import type { ConfigurableTaskDefinition } from "hardhat/types"; +import type { Logger } from "winston"; + +import { getSigner } from "../../utils/signers"; +import logger, { flushLogger } from "./logger"; + +export interface ActionContext { + signer: ethers.Signer; + chainId: number; + networkName: string; + log: Logger; + args: Record; +} + +interface ActionConfig { + name: string; + description: string; + chains?: number[]; + params?: (t: ConfigurableTaskDefinition) => void; + run: (ctx: ActionContext) => Promise; +} + +const CHAIN_NAMES: Record = { + 1: "mainnet", + 146: "sonic", + 17000: "holesky", +}; + +export function action(config: ActionConfig) { + const { name, description, chains, params, run } = config; + + const definition = subtask(name, description); + + if (params) { + params(definition); + } + + definition.setAction(async (taskArgs: Record) => { + const log = logger.child({ action: name }); + const startTime = Date.now(); + + log.info("Starting"); + + const signer = await getSigner(); + const network = await signer.provider!.getNetwork(); + const chainId = Number(network.chainId); + const networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; + + if (chains && !chains.includes(chainId)) { + const valid = chains + .map((id) => `${CHAIN_NAMES[id] ?? id} (${id})`) + .join(", "); + throw new Error( + `${name} only supports ${valid}, not ${networkName} (${chainId})` + ); + } + + log.info(`Running on ${networkName} (${chainId})`); + + try { + await run({ signer, chainId, networkName, log, args: taskArgs }); + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + log.info(`Completed in ${elapsed}s`); + } catch (err: any) { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + log.error(`Failed after ${elapsed}s: ${err.message}`); + throw err; + } finally { + await flushLogger(); + } + }); + + task(name).setAction(async (_, __, runSuper) => { + return runSuper(); + }); +} diff --git a/src/js/tasks/lib/env.ts b/src/js/tasks/lib/env.ts new file mode 100644 index 00000000..7e46bcf9 --- /dev/null +++ b/src/js/tasks/lib/env.ts @@ -0,0 +1,14 @@ +export function requireEnv(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Required environment variable ${name} is not set`); + } + return value; +} + +export function optionalEnv( + name: string, + fallback?: string +): string | undefined { + return process.env[name] ?? fallback; +} diff --git a/src/js/tasks/lib/logger.ts b/src/js/tasks/lib/logger.ts new file mode 100644 index 00000000..904302bf --- /dev/null +++ b/src/js/tasks/lib/logger.ts @@ -0,0 +1,59 @@ +import { createLogger, format, transports } from "winston"; +import LokiTransport from "winston-loki"; + +const lokiUrl = process.env.LOKI_URL; +const lokiUser = process.env.LOKI_USER; +const lokiApiKey = process.env.LOKI_API_KEY; + +const consoleFormat = format.combine( + format.timestamp(), + format.errors({ stack: true }), + format.printf(({ timestamp, level, message, action, ...rest }) => { + const prefix = action ? `[${action}] ` : ""; + const extra = Object.keys(rest).length ? ` ${JSON.stringify(rest)}` : ""; + return `${timestamp} ${level}: ${prefix}${message}${extra}`; + }) +); + +const logTransports: InstanceType< + typeof transports.Console | typeof LokiTransport +>[] = [new transports.Console({ format: consoleFormat })]; + +let lokiTransport: LokiTransport | undefined; +if (lokiUrl) { + lokiTransport = new LokiTransport({ + host: lokiUrl, + basicAuth: lokiUrl && lokiApiKey ? `${lokiUser}:${lokiApiKey}` : undefined, + labels: { app: "arm-oeth" }, + json: true, + format: format.combine( + // Promote "action" from metadata to a Loki label + format((info) => { + if (info.action) { + info.labels = { ...(info.labels || {}), action: info.action }; + } + return info; + })(), + format.json() + ), + replaceTimestamp: true, + batching: true, + interval: 5, + onConnectionError: (err: unknown) => { + console.error("Loki connection error:", err); + }, + }); + logTransports.push(lokiTransport); +} + +const logger = createLogger({ + level: process.env.LOG_LEVEL ?? "info", + format: format.combine(format.timestamp(), format.errors({ stack: true })), + transports: logTransports, +}); + +export async function flushLogger(): Promise { + await lokiTransport?.flush(); +} + +export default logger; diff --git a/src/js/utils/signers.js b/src/js/utils/signers.js index d6e27358..45b3e3be 100644 --- a/src/js/utils/signers.js +++ b/src/js/utils/signers.js @@ -6,6 +6,30 @@ const { ethereumAddress, privateKey } = require("./regex"); const log = require("./logger")("utils:signers"); +// KMS configuration +const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; +const AWS_KMS_REGION = "us-east-1"; + +const hasAwsKmsCredentials = () => { + return ( + !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY + ); +}; + +const getKmsSigner = async () => { + const { DirectKmsTransactionSigner } = require("@lastdotnet/purrikey"); + const relayerId = process.env.KMS_RELAYER_ID || DEFAULT_KMS_RELAYER_ID; + const signer = new DirectKmsTransactionSigner( + relayerId, + hre.ethers.provider, + AWS_KMS_REGION, + ); + log( + `Using KMS signer ${await signer.getAddress()} from relayer-id "${relayerId}"`, + ); + return signer; +}; + /** * Signer factory that gets a signer for a hardhat test or task * If address is passed, use that address as signer. @@ -32,6 +56,10 @@ async function getSigner(address = undefined) { return wallet; } + if (hasAwsKmsCredentials()) { + return await getKmsSigner(); + } + if (process.env.IMPERSONATE) { let address = process.env.IMPERSONATE; if (!address.match(ethereumAddress)) { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..5a38aa41 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "outDir": "dist", + "types": ["node"] + }, + "include": [ + "src/js/tasks/actions/**/*.ts", + "src/js/tasks/lib/**/*.ts", + "cron/cron-supervisor.ts", + "cron/render-crontab.ts" + ], + "exclude": ["node_modules", "dist"] +} diff --git a/yarn.lock b/yarn.lock index 236c2d34..72d54134 100644 --- a/yarn.lock +++ b/yarn.lock @@ -501,10 +501,26 @@ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz#f1137f56209ccc69c15f826242cbf37f828617dd" integrity sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e" + integrity sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q== + dependencies: + "@so-ric/colorspace" "^1.1.6" + enabled "2.0.x" + kuler "^2.0.0" "@eslint-community/eslint-utils@^4.2.0": version "4.9.1" @@ -551,7 +567,7 @@ "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.2.1" -"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@^5.8.0": +"@ethersproject/abi@^5.1.2": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== @@ -566,7 +582,7 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": +"@ethersproject/abstract-provider@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== @@ -579,7 +595,7 @@ "@ethersproject/transactions" "^5.8.0" "@ethersproject/web" "^5.8.0" -"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@^5.8.0": +"@ethersproject/abstract-signer@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== @@ -590,7 +606,7 @@ "@ethersproject/logger" "^5.8.0" "@ethersproject/properties" "^5.8.0" -"@ethersproject/address@5.8.0", "@ethersproject/address@^5.7.0", "@ethersproject/address@^5.8.0": +"@ethersproject/address@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== @@ -601,14 +617,14 @@ "@ethersproject/logger" "^5.8.0" "@ethersproject/rlp" "^5.8.0" -"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": +"@ethersproject/base64@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== dependencies: "@ethersproject/bytes" "^5.8.0" -"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": +"@ethersproject/basex@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== @@ -616,7 +632,7 @@ "@ethersproject/bytes" "^5.8.0" "@ethersproject/properties" "^5.8.0" -"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@^5.8.0": +"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== @@ -625,37 +641,21 @@ "@ethersproject/logger" "^5.8.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@^5.8.0": +"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== dependencies: "@ethersproject/logger" "^5.8.0" -"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.7.0", "@ethersproject/constants@^5.8.0": +"@ethersproject/constants@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== dependencies: "@ethersproject/bignumber" "^5.8.0" -"@ethersproject/contracts@5.8.0", "@ethersproject/contracts@^5.7.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" - integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== - dependencies: - "@ethersproject/abi" "^5.8.0" - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - -"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": +"@ethersproject/hash@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== @@ -670,44 +670,7 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" - integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/basex" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/pbkdf2" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/wordlists" "^5.8.0" - -"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" - integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hdnode" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/pbkdf2" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": +"@ethersproject/keccak256@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== @@ -715,34 +678,26 @@ "@ethersproject/bytes" "^5.8.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.7.0", "@ethersproject/logger@^5.8.0": +"@ethersproject/logger@^5.7.0", "@ethersproject/logger@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== -"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.7.1", "@ethersproject/networks@^5.8.0": +"@ethersproject/networks@^5.7.1", "@ethersproject/networks@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== dependencies: "@ethersproject/logger" "^5.8.0" -"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" - integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - -"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.7.0", "@ethersproject/properties@^5.8.0": +"@ethersproject/properties@^5.7.0", "@ethersproject/properties@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== dependencies: "@ethersproject/logger" "^5.8.0" -"@ethersproject/providers@5.8.0", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@^5.7.2": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== @@ -768,7 +723,7 @@ bech32 "1.1.4" ws "8.18.0" -"@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": +"@ethersproject/random@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== @@ -776,7 +731,7 @@ "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": +"@ethersproject/rlp@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== @@ -784,7 +739,7 @@ "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": +"@ethersproject/sha2@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== @@ -793,7 +748,7 @@ "@ethersproject/logger" "^5.8.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": +"@ethersproject/signing-key@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== @@ -805,19 +760,7 @@ elliptic "6.6.1" hash.js "1.1.7" -"@ethersproject/solidity@5.8.0", "@ethersproject/solidity@^5.7.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" - integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.7.0", "@ethersproject/strings@^5.8.0": +"@ethersproject/strings@^5.7.0", "@ethersproject/strings@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== @@ -826,7 +769,7 @@ "@ethersproject/constants" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@^5.8.0": +"@ethersproject/transactions@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== @@ -841,37 +784,7 @@ "@ethersproject/rlp" "^5.8.0" "@ethersproject/signing-key" "^5.8.0" -"@ethersproject/units@5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" - integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/wallet@5.8.0", "@ethersproject/wallet@^5.7.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" - integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/hdnode" "^5.8.0" - "@ethersproject/json-wallets" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/wordlists" "^5.8.0" - -"@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": +"@ethersproject/web@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== @@ -882,17 +795,6 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" - integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" @@ -946,11 +848,123 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jridgewell/sourcemap-codec@^1.5.5": +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@napi-rs/snappy-android-arm-eabi@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.3.3.tgz#5d02f180548bcf50bb85744309cd33a532b835e9" + integrity sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA== + +"@napi-rs/snappy-android-arm64@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.3.3.tgz#36e94d9b6e78b6d25b42a9e421fd03470f56f7f9" + integrity sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg== + +"@napi-rs/snappy-darwin-arm64@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.3.3.tgz#e5f42a2364a002bc3200c104dbc3b11df9099df4" + integrity sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw== + +"@napi-rs/snappy-darwin-x64@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.3.3.tgz#262b18ac224d067ecbd6f374e1a7ddfce1a51851" + integrity sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA== + +"@napi-rs/snappy-freebsd-x64@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.3.3.tgz#7aedacf6378e227bb9954073e6f32e5418fb3f6e" + integrity sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g== + +"@napi-rs/snappy-linux-arm-gnueabihf@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.3.3.tgz#ea21c6b0f1132de0c247aefe500cf67f58e7506d" + integrity sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA== + +"@napi-rs/snappy-linux-arm64-gnu@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.3.3.tgz#381a0ff8818b94c0b242236bc3592edd91d9a1e6" + integrity sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA== + +"@napi-rs/snappy-linux-arm64-musl@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.3.3.tgz#b96eeb6b6930f30009e282c1e4a7fab5edd9074d" + integrity sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q== + +"@napi-rs/snappy-linux-ppc64-gnu@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-ppc64-gnu/-/snappy-linux-ppc64-gnu-7.3.3.tgz#b8d24c435baaebf041502d8f7ee8a64510a8085b" + integrity sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA== + +"@napi-rs/snappy-linux-riscv64-gnu@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-riscv64-gnu/-/snappy-linux-riscv64-gnu-7.3.3.tgz#24d0281dc3ef72626225f1456fd0a3c8c0b0de13" + integrity sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q== + +"@napi-rs/snappy-linux-s390x-gnu@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-s390x-gnu/-/snappy-linux-s390x-gnu-7.3.3.tgz#c5d2a07c0abfe4562da358dc7642a527db337e23" + integrity sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg== + +"@napi-rs/snappy-linux-x64-gnu@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.3.3.tgz#2d2cbb3983b663d60432fc60c25a3bc2233575e4" + integrity sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ== + +"@napi-rs/snappy-linux-x64-musl@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.3.3.tgz#c874e068c4d8c2c21c13b59b01652e035fe4acbb" + integrity sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg== + +"@napi-rs/snappy-openharmony-arm64@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-openharmony-arm64/-/snappy-openharmony-arm64-7.3.3.tgz#da8596bc9341030faebbb57dd8cd19eb49831376" + integrity sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw== + +"@napi-rs/snappy-wasm32-wasi@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-wasm32-wasi/-/snappy-wasm32-wasi-7.3.3.tgz#bc51055793f8c00bc8c0c79647941ba5a4d37e81" + integrity sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q== + dependencies: + "@napi-rs/wasm-runtime" "^1.0.3" + +"@napi-rs/snappy-win32-arm64-msvc@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.3.3.tgz#3a29b6d2c8e048c81ae71bcd7139dab231d53e0d" + integrity sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ== + +"@napi-rs/snappy-win32-ia32-msvc@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.3.3.tgz#ccef21e323784a74619a43a12c0fb37f68eb44b0" + integrity sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA== + +"@napi-rs/snappy-win32-x64-msvc@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.3.3.tgz#b9bbe529c38477744a8dc6b2ee47f5b53dd3b00c" + integrity sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q== + +"@napi-rs/wasm-runtime@^1.0.3": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" + integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== + dependencies: + "@tybys/wasm-util" "^0.10.1" + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -1141,11 +1155,6 @@ "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" -"@nomiclabs/hardhat-ethers@^2.1.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" - integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== - "@openzeppelin/defender-sdk-account-client@^2.7.0": version "2.7.0" resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-account-client/-/defender-sdk-account-client-2.7.0.tgz#99092ce243cc22f58c4a18aefe86a171b288b3ab" @@ -1307,6 +1316,59 @@ "@openzeppelin/defender-sdk-relay-group-client" "^2.7.0" "@openzeppelin/defender-sdk-relay-signer-client" "^2.7.0" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@rollup/plugin-commonjs@^25.0.7": version "25.0.8" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" @@ -2040,25 +2102,45 @@ dependencies: tslib "^2.6.2" +"@so-ric/colorspace@^1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@so-ric/colorspace/-/colorspace-1.1.6.tgz#62515d8b9f27746b76950a83bde1af812d91923b" + integrity sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw== + dependencies: + color "^5.0.2" + text-hex "1.0.x" + "@solidity-parser/parser@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== -"@tenderly/hardhat-tenderly@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.8.0.tgz#3c77f3a8bba4d801cd3d6a98dfec2abc9359fbc2" - integrity sha512-HzyYsFZEXVALz+vDn1XesvaqrSDr3vYqlMd/A+r6pi6er1dFRlbUPW5mdalPQsbPOsBIO+PXjOlrM7mGgBdYEQ== +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@tybys/wasm-util@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@nomiclabs/hardhat-ethers" "^2.1.1" - axios "^0.27.2" - ethers "^5.7.0" - fs-extra "^10.1.0" - hardhat-deploy "^0.11.14" - js-yaml "^4.1.0" - tenderly "^0.6.0" - tslog "^4.3.1" + tslib "^2.4.0" "@types/bn.js@^5.1.0": version "5.2.0" @@ -2091,6 +2173,13 @@ dependencies: undici-types "~6.19.2" +"@types/node@>=13.7.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== + dependencies: + undici-types "~7.18.0" + "@types/pbkdf2@^3.0.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" @@ -2098,11 +2187,6 @@ dependencies: "@types/node" "*" -"@types/qs@^6.9.7": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" - integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== - "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" @@ -2115,6 +2199,11 @@ dependencies: "@types/node" "*" +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@ungap/structured-clone@^1.2.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" @@ -2148,19 +2237,23 @@ dependencies: tslib "^2.3.0" -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" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + acorn@^8.9.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" @@ -2171,11 +2264,6 @@ adm-zip@^0.4.16: resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - aes-js@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" @@ -2266,21 +2354,26 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -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== - assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +async-exit-hook@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + async-retry@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" @@ -2288,6 +2381,11 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2300,21 +2398,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - axios@^1.7.4, axios@^1.9.0: version "1.13.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" @@ -2366,24 +2449,6 @@ 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.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== -body-parser@~1.20.3: - version "1.20.4" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" - integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== - 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.1" - iconv-lite "~0.4.24" - on-finished "~2.4.1" - qs "~6.14.0" - raw-body "~2.5.3" - type-is "~1.6.18" - unpipe "~1.0.0" - bowser@^2.11.0: version "2.13.1" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.13.1.tgz#5a4c652de1d002f847dd011819f5fc729f308a7e" @@ -2463,6 +2528,11 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2510,7 +2580,7 @@ call-bind@^1.0.8: get-intrinsic "^1.2.4" set-function-length "^1.2.2" -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: +call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== @@ -2541,7 +2611,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2556,7 +2626,7 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -chokidar@^3.5.2, chokidar@^3.5.3: +chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -2602,15 +2672,6 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-table3@^0.6.2: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2636,11 +2697,38 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-convert@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.3.tgz#db6627b97181cb8facdfce755ae26f97ab0711f1" + integrity sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg== + dependencies: + color-name "^2.0.0" + +color-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.1.0.tgz#0b677385c1c4b4edfdeaf77e38fa338e3a40b693" + integrity sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.4.tgz#9dcf566ff976e23368c8bd673f5c35103ab41058" + integrity sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg== + dependencies: + color-name "^2.0.0" + +color@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/color/-/color-5.0.3.tgz#f79390b1b778e222ffbb54304d3dbeaef633f97f" + integrity sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA== + dependencies: + color-convert "^3.1.3" + color-string "^2.1.3" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2658,11 +2746,6 @@ commander@^8.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@^9.4.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2673,33 +2756,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -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== - -cookie-signature@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" - integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== - cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookie@~0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2728,6 +2789,11 @@ create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" @@ -2742,13 +2808,6 @@ dayjs@^1.11.12: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938" integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw== -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.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" @@ -2797,15 +2856,15 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@~2.0.0: +depd@~2.0.0: version "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, 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.4" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== diff@^5.2.0: version "5.2.2" @@ -2838,11 +2897,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -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.6.1, elliptic@^6.5.7: version "6.6.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" @@ -2866,17 +2920,12 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encode-utf8@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -encodeurl@~2.0.0: +enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -enquirer@^2.3.0, enquirer@^2.3.6: +enquirer@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== @@ -2921,11 +2970,6 @@ 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@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -3026,11 +3070,6 @@ 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== - ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -3096,42 +3135,6 @@ ethers@6.13.2: tslib "2.4.0" ws "8.17.1" -ethers@^5.7.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" - integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== - dependencies: - "@ethersproject/abi" "5.8.0" - "@ethersproject/abstract-provider" "5.8.0" - "@ethersproject/abstract-signer" "5.8.0" - "@ethersproject/address" "5.8.0" - "@ethersproject/base64" "5.8.0" - "@ethersproject/basex" "5.8.0" - "@ethersproject/bignumber" "5.8.0" - "@ethersproject/bytes" "5.8.0" - "@ethersproject/constants" "5.8.0" - "@ethersproject/contracts" "5.8.0" - "@ethersproject/hash" "5.8.0" - "@ethersproject/hdnode" "5.8.0" - "@ethersproject/json-wallets" "5.8.0" - "@ethersproject/keccak256" "5.8.0" - "@ethersproject/logger" "5.8.0" - "@ethersproject/networks" "5.8.0" - "@ethersproject/pbkdf2" "5.8.0" - "@ethersproject/properties" "5.8.0" - "@ethersproject/providers" "5.8.0" - "@ethersproject/random" "5.8.0" - "@ethersproject/rlp" "5.8.0" - "@ethersproject/sha2" "5.8.0" - "@ethersproject/signing-key" "5.8.0" - "@ethersproject/solidity" "5.8.0" - "@ethersproject/strings" "5.8.0" - "@ethersproject/transactions" "5.8.0" - "@ethersproject/units" "5.8.0" - "@ethersproject/wallet" "5.8.0" - "@ethersproject/web" "5.8.0" - "@ethersproject/wordlists" "5.8.0" - ethers@^6.9.0: version "6.16.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.16.0.tgz#fff9b4f05d7a359c774ad6e91085a800f7fccf65" @@ -3153,43 +3156,6 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -express@^4.18.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" - integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== - 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.7.1" - 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.12" - proxy-addr "~2.0.7" - qs "~6.14.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" - fast-base64-decode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" @@ -3229,6 +3195,11 @@ fdir@^6.5.0: resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -3243,19 +3214,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" - integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== - 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.2" - unpipe "~1.0.0" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -3283,14 +3241,12 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -fmix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== - dependencies: - imul "^1.0.0" +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.6: +follow-redirects@^1.12.1, follow-redirects@^1.15.6: version "1.15.11" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== @@ -3310,7 +3266,7 @@ foreground-child@^3.3.1: cross-spawn "^7.0.6" signal-exit "^4.0.1" -form-data@^4.0.0, form-data@^4.0.4: +form-data@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== @@ -3321,11 +3277,6 @@ form-data@^4.0.0, form-data@^4.0.4: hasown "^2.0.2" 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" @@ -3336,20 +3287,6 @@ 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@^10.0.0, fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^11.2.0: version "11.3.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" @@ -3393,7 +3330,7 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -3500,36 +3437,6 @@ graphql@^16.9.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.12.0.tgz#28cc2462435b1ac3fdc6976d030cef83a0c13ac7" integrity sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ== -hardhat-deploy@^0.11.14: - version "0.11.45" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz#bed86118175a38a03bb58aba2ce1ed5e80a20bc8" - integrity sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/contracts" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/solidity" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" - "@types/qs" "^6.9.7" - axios "^0.21.1" - chalk "^4.1.2" - chokidar "^3.5.2" - debug "^4.3.2" - enquirer "^2.3.6" - ethers "^5.7.0" - form-data "^4.0.0" - fs-extra "^10.0.0" - match-all "^1.2.6" - murmur-128 "^0.2.1" - qs "^6.9.4" - zksync-web3 "^0.14.3" - hardhat@^2.22.9: version "2.28.3" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.28.3.tgz#f6f337cf99266a22de9dff0d45588ad7d7503586" @@ -3645,7 +3552,7 @@ hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" -http-errors@~2.0.0, http-errors@~2.0.1: +http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -3664,11 +3571,6 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -hyperlinker@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" - integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== - iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3704,11 +3606,6 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -imul@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3739,11 +3636,6 @@ 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-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -3812,6 +3704,11 @@ is-reference@1.2.1: dependencies: "@types/estree" "*" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-typed-array@^1.1.14: version "1.1.15" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" @@ -3945,10 +3842,10 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== levn@^0.4.1: version "0.4.1" @@ -3995,6 +3892,23 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +long@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4026,10 +3940,10 @@ magic-string@^0.30.3: dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" -match-all@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.7.tgz#3c03b7f7ee372ae177aac5eca08c3ad6af59633a" - integrity sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw== +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== math-intrinsics@^1.1.0: version "1.1.0" @@ -4045,26 +3959,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== - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -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== - -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-eth-signer@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" @@ -4086,18 +3985,13 @@ 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.24, mime-types@~2.1.34: +mime-types@^2.1.12: 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== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -4167,35 +4061,16 @@ mocha@^10.0.0: yargs-parser "^20.2.9" yargs-unparser "^2.0.0" -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.1.3: +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== -murmur-128@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" - integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== - dependencies: - encode-utf8 "^1.0.2" - fmix "^0.1.0" - imul "^1.0.0" - natural-compare@^1.4.0: version "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== - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -4228,23 +4103,11 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - obliterator@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== -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.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4252,6 +4115,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -4326,11 +4196,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -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== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4359,11 +4224,6 @@ path-scurry@^2.0.0: lru-cache "^11.0.0" minipass "^7.1.2" -path-to-regexp@~0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" - integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== - pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -4416,14 +4276,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -4433,13 +4285,23 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.13.1" -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" +protobufjs@^7.2.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" + integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" proxy-from-env@^1.1.0: version "1.1.0" @@ -4451,20 +4313,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.9.4: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - -qs@~6.14.0: - version "6.14.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" - integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== - dependencies: - side-channel "^1.1.0" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4477,12 +4325,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -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.4.1, raw-body@~2.5.3: +raw-body@^2.4.1: version "2.5.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== @@ -4510,7 +4353,7 @@ readable-stream@^2.3.8, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4645,7 +4488,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -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.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, 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== @@ -4655,12 +4498,17 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -4684,25 +4532,6 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -send@~0.19.0, send@~0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" - integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "~0.5.2" - http-errors "~2.0.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.4.1" - range-parser "~1.2.1" - statuses "~2.0.2" - serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" @@ -4710,16 +4539,6 @@ serialize-javascript@^6.0.2: dependencies: randombytes "^2.1.0" -serve-static@~1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" - integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "~0.19.1" - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -4737,7 +4556,7 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -setprototypeof@1.2.0, setprototypeof@~1.2.0: +setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -4763,55 +4582,34 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +snappy@^7.2.2: + version "7.3.3" + resolved "https://registry.yarnpkg.com/snappy/-/snappy-7.3.3.tgz#cbc3793f03b019eb1ccecfa24a371ef87ef6b469" + integrity sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ== + optionalDependencies: + "@napi-rs/snappy-android-arm-eabi" "7.3.3" + "@napi-rs/snappy-android-arm64" "7.3.3" + "@napi-rs/snappy-darwin-arm64" "7.3.3" + "@napi-rs/snappy-darwin-x64" "7.3.3" + "@napi-rs/snappy-freebsd-x64" "7.3.3" + "@napi-rs/snappy-linux-arm-gnueabihf" "7.3.3" + "@napi-rs/snappy-linux-arm64-gnu" "7.3.3" + "@napi-rs/snappy-linux-arm64-musl" "7.3.3" + "@napi-rs/snappy-linux-ppc64-gnu" "7.3.3" + "@napi-rs/snappy-linux-riscv64-gnu" "7.3.3" + "@napi-rs/snappy-linux-s390x-gnu" "7.3.3" + "@napi-rs/snappy-linux-x64-gnu" "7.3.3" + "@napi-rs/snappy-linux-x64-musl" "7.3.3" + "@napi-rs/snappy-openharmony-arm64" "7.3.3" + "@napi-rs/snappy-wasm32-wasi" "7.3.3" + "@napi-rs/snappy-win32-arm64-msvc" "7.3.3" + "@napi-rs/snappy-win32-ia32-msvc" "7.3.3" + "@napi-rs/snappy-win32-x64-msvc" "7.3.3" solc@0.8.26: version "0.8.26" @@ -4844,6 +4642,11 @@ source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stacktrace-parser@^0.1.10: version "0.1.11" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" @@ -4851,13 +4654,21 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -statuses@~2.0.1, statuses@~2.0.2: +statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4889,8 +4700,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4938,20 +4755,10 @@ symbol-observable@^4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== -tenderly@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tenderly/-/tenderly-0.6.0.tgz#fb74e672a3b6dcfe66c8fd44c79ab91a9233f3eb" - integrity sha512-uPnR5ujR1j0Aay4nuqymTY2nu3e0yDjl6dHBqkTTIYEDzyzaDLx2+PkVxjT5RWseAbWORsa6GYetletATf1zmQ== - dependencies: - axios "^0.27.2" - cli-table3 "^0.6.2" - commander "^9.4.0" - express "^4.18.1" - hyperlinker "^1.0.0" - js-yaml "^4.1.0" - open "^8.4.0" - prompts "^2.4.2" - tslog "^4.4.0" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== text-table@^0.2.0: version "0.2.0" @@ -4999,6 +4806,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-invariant@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" @@ -5006,6 +4818,25 @@ ts-invariant@^0.10.3: dependencies: tslib "^2.1.0" +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -5021,16 +4852,11 @@ tslib@^1.11.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.6.2: +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslog@^4.3.1, tslog@^4.4.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/tslog/-/tslog-4.10.2.tgz#45c870d7fe9558d59ce288eeb86ba49eaaf25e1e" - integrity sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g== - tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -5063,14 +4889,6 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -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" - typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" @@ -5080,6 +4898,11 @@ typed-array-buffer@^1.0.3: es-errors "^1.3.0" is-typed-array "^1.1.14" +typescript@^5.7.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" @@ -5090,6 +4913,11 @@ undici-types@~7.16.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== + undici@^5.14.0: version "5.29.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" @@ -5124,25 +4952,25 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-polyfill@^1.1.12: + version "1.1.14" + resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.14.tgz#26497c1302408af05ea548e3370f0d0c68aafc40" + integrity sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -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" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -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== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== webidl-conversions@^3.0.0: version "3.0.1" @@ -5184,6 +5012,45 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +winston-loki@^6.1.3: + version "6.1.4" + resolved "https://registry.yarnpkg.com/winston-loki/-/winston-loki-6.1.4.tgz#a1ced672d96be70a27718206fb192a8b0e407a1c" + integrity sha512-/j/Zf7TGLjgSBck29BkPnpJlEnGQr5xqlx8A0N6LZnXYYYvyK7lFk6FPpWiD+VMO8xjaxOu1KNF9SzWaRDsigA== + dependencies: + async-exit-hook "2.0.1" + btoa "^1.2.1" + protobufjs "^7.2.4" + url-polyfill "^1.1.12" + winston-transport "^4.3.0" + optionalDependencies: + snappy "^7.2.2" + +winston-transport@^4.3.0, winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.17.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.19.0.tgz#cc1d1262f5f45946904085cfffe73efb4b7a581d" + integrity sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.8" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -5194,8 +5061,16 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -5284,6 +5159,11 @@ yargs@^17.5.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -5300,8 +5180,3 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - -zksync-web3@^0.14.3: - version "0.14.4" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f" - integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== From 8ac4c7882011c7e47c28ce881e3e175e6996bb0b Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 13:44:00 -0700 Subject: [PATCH 03/41] turn actions into new format --- src/js/tasks/actions/allocateEthena.ts | 50 +++--- src/js/tasks/actions/allocateEtherFi.ts | 50 +++--- src/js/tasks/actions/allocateLido.ts | 50 +++--- src/js/tasks/actions/allocateOETH.ts | 50 +++--- src/js/tasks/actions/allocateSonic.ts | 52 +++--- .../tasks/actions/autoClaimEthenaWithdraw.ts | 42 ++--- .../tasks/actions/autoClaimEtherFiWithdraw.ts | 43 ++--- src/js/tasks/actions/autoClaimLidoWithdraw.ts | 56 +++---- src/js/tasks/actions/autoClaimWithdraw.ts | 64 ++++--- .../tasks/actions/autoClaimWithdrawSonic.ts | 96 +++++------ .../actions/autoRequestEthenaWithdraw.ts | 56 +++---- .../actions/autoRequestEtherFiWithdraw.ts | 56 +++---- .../tasks/actions/autoRequestLidoWithdraw.ts | 58 +++---- src/js/tasks/actions/autoRequestWithdraw.ts | 50 +++--- .../tasks/actions/autoRequestWithdrawSonic.ts | 50 +++--- src/js/tasks/actions/collectEthenaFees.ts | 43 ++--- src/js/tasks/actions/collectEtherFiFees.ts | 43 ++--- src/js/tasks/actions/collectFeesSonic.ts | 43 ++--- src/js/tasks/actions/collectLidoFees.ts | 43 ++--- src/js/tasks/actions/collectOETHFees.ts | 43 ++--- src/js/tasks/actions/collectRewardsSonic.ts | 53 +++--- src/js/tasks/actions/healthcheck.ts | 9 + src/js/tasks/actions/setOSSiloPriceAction.ts | 158 +++++++++--------- src/js/tasks/actions/setPricesEthena.ts | 74 ++++---- src/js/tasks/actions/setPricesEtherFi.ts | 72 ++++---- src/js/tasks/actions/setPricesLido.ts | 72 ++++---- src/js/tasks/actions/setPricesOETH.ts | 72 ++++---- 27 files changed, 635 insertions(+), 913 deletions(-) create mode 100644 src/js/tasks/actions/healthcheck.ts diff --git a/src/js/tasks/actions/allocateEthena.ts b/src/js/tasks/actions/allocateEthena.ts index 80f44112..594705d2 100644 --- a/src/js/tasks/actions/allocateEthena.ts +++ b/src/js/tasks/actions/allocateEthena.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { allocate } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { allocate } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "allocateEthena", + description: "Allocate liquidity for Ethena ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.ethenaARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.ethenaARM, armAbi, signer); - - await allocate({ - signer, - arm, - threshold: 5000, - maxGasPrice: 5, - }); -}; - -module.exports = { handler }; + log.info("Allocating liquidity for Ethena ARM"); + await allocate({ + signer, + arm, + threshold: 5000, + maxGasPrice: 5, + }); + }, +}); diff --git a/src/js/tasks/actions/allocateEtherFi.ts b/src/js/tasks/actions/allocateEtherFi.ts index c2d06745..12296fa1 100644 --- a/src/js/tasks/actions/allocateEtherFi.ts +++ b/src/js/tasks/actions/allocateEtherFi.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { allocate } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { allocate } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "allocateEtherFi", + description: "Allocate liquidity for EtherFi ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.etherfiARM, armAbi, signer); - - await allocate({ - signer, - arm, - threshold: 20, - maxGasPrice: 5, - }); -}; - -module.exports = { handler }; + log.info("Allocating liquidity for EtherFi ARM"); + await allocate({ + signer, + arm, + threshold: 20, + maxGasPrice: 5, + }); + }, +}); diff --git a/src/js/tasks/actions/allocateLido.ts b/src/js/tasks/actions/allocateLido.ts index 7694a62c..1a0b21f0 100644 --- a/src/js/tasks/actions/allocateLido.ts +++ b/src/js/tasks/actions/allocateLido.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { allocate } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { allocate } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const lidoARMAbi = require("../../../abis/LidoARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "allocateLido", + description: "Allocate liquidity for Lido ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.lidoARM, armAbi, signer); - - await allocate({ - signer, - arm, - threshold: 200, - maxGasPrice: 5, - }); -}; - -module.exports = { handler }; + log.info("Allocating liquidity for Lido ARM"); + await allocate({ + signer, + arm, + threshold: 200, + maxGasPrice: 5, + }); + }, +}); diff --git a/src/js/tasks/actions/allocateOETH.ts b/src/js/tasks/actions/allocateOETH.ts index 3a97466a..dd7f5f3d 100644 --- a/src/js/tasks/actions/allocateOETH.ts +++ b/src/js/tasks/actions/allocateOETH.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { allocate } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/OriginARM.json"); +import { action } from "../lib/action"; +import { allocate } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const armAbi = require("../../../abis/OriginARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "allocateOETH", + description: "Allocate liquidity for OETH ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.OethARM, armAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.OethARM, armAbi, signer); - - await allocate({ - signer, - arm, - threshold: 10000, - maxGasPrice: 500, - }); -}; - -module.exports = { handler }; + log.info("Allocating liquidity for OETH ARM"); + await allocate({ + signer, + arm, + threshold: 10000, + maxGasPrice: 500, + }); + }, +}); diff --git a/src/js/tasks/actions/allocateSonic.ts b/src/js/tasks/actions/allocateSonic.ts index 24c16ca1..520eec45 100644 --- a/src/js/tasks/actions/allocateSonic.ts +++ b/src/js/tasks/actions/allocateSonic.ts @@ -1,34 +1,24 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { allocate } = require("../tasks/admin"); -const { sonic } = require("../utils/addresses"); -const armAbi = require("../../abis/OriginARM.json"); +import { action } from "../lib/action"; +import { allocate } from "../admin"; +import { sonic } from "../../utils/addresses"; +const armAbi = require("../../../abis/OriginARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "allocateSonic", + description: "Allocate liquidity for Origin ARM on Sonic", + chains: [146], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - - await allocate({ - signer, - arm, - threshold: 10000, - maxGasPrice: 500, - armContractVersion: "v1", - }); -}; - -module.exports = { handler }; + log.info("Allocating liquidity for Origin ARM on Sonic"); + await allocate({ + signer, + arm, + threshold: 10000, + maxGasPrice: 500, + armContractVersion: "v1", + }); + }, +}); diff --git a/src/js/tasks/actions/autoClaimEthenaWithdraw.ts b/src/js/tasks/actions/autoClaimEthenaWithdraw.ts index 241287c8..88ceaeda 100644 --- a/src/js/tasks/actions/autoClaimEthenaWithdraw.ts +++ b/src/js/tasks/actions/autoClaimEthenaWithdraw.ts @@ -1,30 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); -const { claimEthenaWithdrawals } = require("../tasks/ethenaQueue"); -const { mainnet } = require("../utils/addresses"); -const ethenaARMAbi = require("../../abis/EthenaARM.json"); +import { ethers } from "ethers"; -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +import { action } from "../lib/action"; +import { claimEthenaWithdrawals } from "../ethenaQueue"; +import { mainnet } from "../../utils/addresses"; +const ethenaARMAbi = require("../../../abis/EthenaARM.json"); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); +action({ + name: "autoClaimEthenaWithdraw", + description: "Claim Ethena withdrawals from Ethena ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - // References to contracts - const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - - await claimEthenaWithdrawals({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Claiming Ethena withdrawals"); + await claimEthenaWithdrawals({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/autoClaimEtherFiWithdraw.ts b/src/js/tasks/actions/autoClaimEtherFiWithdraw.ts index cd53383a..c073addc 100644 --- a/src/js/tasks/actions/autoClaimEtherFiWithdraw.ts +++ b/src/js/tasks/actions/autoClaimEtherFiWithdraw.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { claimEtherFiWithdrawals } = require("../tasks/etherfiQueue"); -const { mainnet } = require("../utils/addresses"); -const etherFiARMAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { claimEtherFiWithdrawals } from "../etherfiQueue"; +import { mainnet } from "../../utils/addresses"; +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoClaimEtherFiWithdraw", + description: "Claim EtherFi withdrawals from EtherFi ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - - await claimEtherFiWithdrawals({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Claiming EtherFi withdrawals"); + await claimEtherFiWithdrawals({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/autoClaimLidoWithdraw.ts b/src/js/tasks/actions/autoClaimLidoWithdraw.ts index 1d42a0f3..50ca84e2 100644 --- a/src/js/tasks/actions/autoClaimLidoWithdraw.ts +++ b/src/js/tasks/actions/autoClaimLidoWithdraw.ts @@ -1,38 +1,24 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { claimLidoWithdrawals } = require("../tasks/lidoQueue"); -const { mainnet } = require("../utils/addresses"); -const lidoWithdrawalQueueAbi = require("../../abis/LidoWithdrawQueue.json"); -const lidoARMAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { claimLidoWithdrawals } from "../lidoQueue"; +import { mainnet } from "../../utils/addresses"; +const lidoARMAbi = require("../../../abis/LidoARM.json"); +const lidoWithdrawQueueAbi = require("../../../abis/LidoWithdrawQueue.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoClaimLidoWithdraw", + description: "Claim Lido withdrawals from Lido ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); + const withdrawalQueue = new ethers.Contract( + mainnet.lidoWithdrawalQueue, + lidoWithdrawQueueAbi, + signer + ); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - const withdrawalQueue = new ethers.Contract( - mainnet.lidoWithdrawalQueue, - lidoWithdrawalQueueAbi, - signer, - ); - - await claimLidoWithdrawals({ - signer, - arm, - withdrawalQueue, - }); -}; - -module.exports = { handler }; + log.info("Claiming Lido withdrawals"); + await claimLidoWithdrawals({ signer, arm, withdrawalQueue }); + }, +}); diff --git a/src/js/tasks/actions/autoClaimWithdraw.ts b/src/js/tasks/actions/autoClaimWithdraw.ts index ead83d29..4ffb506c 100644 --- a/src/js/tasks/actions/autoClaimWithdraw.ts +++ b/src/js/tasks/actions/autoClaimWithdraw.ts @@ -1,38 +1,32 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { autoClaimWithdraw } = require("../tasks/liquidityAutomation"); -const { mainnet } = require("../utils/addresses"); -const erc20Abi = require("../../abis/ERC20.json"); -const oethARMAbi = require("../../abis/OethARM.json"); -const vaultAbi = require("../../abis/vault.json"); +import { action } from "../lib/action"; +import { autoClaimWithdraw } from "../liquidityAutomation"; +import { mainnet } from "../../utils/addresses"; +const erc20Abi = require("../../../abis/ERC20.json"); +const oethARMAbi = require("../../../abis/OethARM.json"); +const vaultAbi = require("../../../abis/vault.json"); -// Entrypoint for the Autotask -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoClaimWithdraw", + description: "Claim withdrawals from OETH ARM", + chains: [1], + run: async ({ signer, log }) => { + const liquidityAsset = new ethers.Contract(mainnet.WETH, erc20Abi, signer); + const vault = new ethers.Contract( + mainnet.OETHVaultProxy, + vaultAbi, + signer + ); + const arm = new ethers.Contract(mainnet.OethARM, oethARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const liquidityAsset = new ethers.Contract(mainnet.WETH, erc20Abi, signer); - const vault = new ethers.Contract(mainnet.OETHVaultProxy, vaultAbi, signer); - const arm = new ethers.Contract(mainnet.OethARM, oethARMAbi, signer); - - await autoClaimWithdraw({ - signer, - liquidityAsset, - arm, - vault, - confirm: true, - }); -}; - -module.exports = { handler }; + log.info("Claiming withdrawals from OETH ARM"); + await autoClaimWithdraw({ + signer, + liquidityAsset, + arm, + vault, + confirm: true, + }); + }, +}); diff --git a/src/js/tasks/actions/autoClaimWithdrawSonic.ts b/src/js/tasks/actions/autoClaimWithdrawSonic.ts index f6a4e46f..e4cd458f 100644 --- a/src/js/tasks/actions/autoClaimWithdrawSonic.ts +++ b/src/js/tasks/actions/autoClaimWithdrawSonic.ts @@ -1,52 +1,44 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); - -const { autoClaimWithdraw } = require("../tasks/liquidityAutomation"); -const { sonic } = require("../utils/addresses"); -const { logTxDetails } = require("../utils/txLogger"); -const erc20Abi = require("../../abis/ERC20.json"); -const armAbi = require("../../abis/OriginARM.json"); -const vaultAbi = require("../../abis/vault.json"); - -// Entrypoint for the Autotask -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); - - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const liquidityAsset = new ethers.Contract(sonic.WS, erc20Abi, signer); - const vault = new ethers.Contract(sonic.OSonicVaultProxy, vaultAbi, signer); - const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - - const requestIds = await autoClaimWithdraw({ - signer, - liquidityAsset, - arm, - vault, - confirm: true, - }); - - console.log(`Claimed requests "${requestIds}"`); - - // If any requests were claimed - if (requestIds?.length > 0) { - // Add 10% buffer to gas limit - let gasLimit = await arm.connect(signer).allocate.estimateGas(); - gasLimit = (gasLimit * 12n) / 10n; - - // Allocate any excess liquidity to the lending market - const tx = await arm.allocate({ gasLimit }); - await logTxDetails(tx, "allocate"); - } -}; - -module.exports = { handler }; +import { ethers } from "ethers"; + +import { action } from "../lib/action"; +import { autoClaimWithdraw } from "../liquidityAutomation"; +import { logTxDetails } from "../../utils/txLogger"; +import { sonic } from "../../utils/addresses"; +const erc20Abi = require("../../../abis/ERC20.json"); +const armAbi = require("../../../abis/OriginARM.json"); +const vaultAbi = require("../../../abis/vault.json"); + +action({ + name: "autoClaimWithdrawSonic", + description: "Claim withdrawals from Origin ARM on Sonic and allocate", + chains: [146], + run: async ({ signer, log }) => { + const liquidityAsset = new ethers.Contract(sonic.WS, erc20Abi, signer); + const vault = new ethers.Contract( + sonic.OSonicVaultProxy, + vaultAbi, + signer + ); + const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); + + log.info("Claiming withdrawals from Origin ARM on Sonic"); + const requestIds = await autoClaimWithdraw({ + signer, + liquidityAsset, + arm, + vault, + confirm: true, + }); + + log.info(`Claimed requests "${requestIds}"`); + + // If any requests were claimed, allocate excess liquidity to the lending market + if (requestIds?.length > 0) { + let gasLimit = await (arm as any).connect(signer).allocate.estimateGas(); + gasLimit = (gasLimit * 12n) / 10n; + + const tx = await (arm as any).allocate({ gasLimit }); + await logTxDetails(tx, "allocate"); + } + }, +}); diff --git a/src/js/tasks/actions/autoRequestEthenaWithdraw.ts b/src/js/tasks/actions/autoRequestEthenaWithdraw.ts index 38611e20..acc7faea 100644 --- a/src/js/tasks/actions/autoRequestEthenaWithdraw.ts +++ b/src/js/tasks/actions/autoRequestEthenaWithdraw.ts @@ -1,36 +1,26 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { requestEthenaWithdrawals } = require("../tasks/ethenaQueue"); -const { mainnet } = require("../utils/addresses"); -const erc20Abi = require("../../abis/ERC20.json"); -const ethenaARMAbi = require("../../abis/EthenaARM.json"); +import { action } from "../lib/action"; +import { requestEthenaWithdrawals } from "../ethenaQueue"; +import { mainnet } from "../../utils/addresses"; +const erc20Abi = require("../../../abis/ERC20.json"); +const ethenaARMAbi = require("../../../abis/EthenaARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoRequestEthenaWithdraw", + description: "Request Ethena withdrawals from Ethena ARM", + chains: [1], + run: async ({ signer, log }) => { + const susde = new ethers.Contract(mainnet.sUSDe, erc20Abi, signer); + const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const susde = new ethers.Contract(mainnet.sUSDe, erc20Abi, signer); - const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - - await requestEthenaWithdrawals({ - signer, - susde, - arm, - minAmount: "100", - thresholdAmount: 1000, - }); -}; - -module.exports = { handler }; + log.info("Requesting Ethena withdrawals"); + await requestEthenaWithdrawals({ + signer, + susde, + arm, + minAmount: "100", + thresholdAmount: 1000, + }); + }, +}); diff --git a/src/js/tasks/actions/autoRequestEtherFiWithdraw.ts b/src/js/tasks/actions/autoRequestEtherFiWithdraw.ts index 4d05cd57..e8572662 100644 --- a/src/js/tasks/actions/autoRequestEtherFiWithdraw.ts +++ b/src/js/tasks/actions/autoRequestEtherFiWithdraw.ts @@ -1,36 +1,26 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { requestEtherFiWithdrawals } = require("../tasks/etherfiQueue"); -const { mainnet } = require("../utils/addresses"); -const erc20Abi = require("../../abis/ERC20.json"); -const etherFiARMAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { requestEtherFiWithdrawals } from "../etherfiQueue"; +import { mainnet } from "../../utils/addresses"; +const erc20Abi = require("../../../abis/ERC20.json"); +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoRequestEtherFiWithdraw", + description: "Request EtherFi withdrawals from EtherFi ARM", + chains: [1], + run: async ({ signer, log }) => { + const eeth = new ethers.Contract(mainnet.eETH, erc20Abi, signer); + const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const eeth = new ethers.Contract(mainnet.eETH, erc20Abi, signer); - const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - - await requestEtherFiWithdrawals({ - signer, - eeth, - arm, - minAmount: "0.1", - thresholdAmount: 10, - }); -}; - -module.exports = { handler }; + log.info("Requesting EtherFi withdrawals"); + await requestEtherFiWithdrawals({ + signer, + eeth, + arm, + minAmount: "0.1", + thresholdAmount: 10, + }); + }, +}); diff --git a/src/js/tasks/actions/autoRequestLidoWithdraw.ts b/src/js/tasks/actions/autoRequestLidoWithdraw.ts index be8bb242..4182cd70 100644 --- a/src/js/tasks/actions/autoRequestLidoWithdraw.ts +++ b/src/js/tasks/actions/autoRequestLidoWithdraw.ts @@ -1,37 +1,27 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { requestLidoWithdrawals } = require("../tasks/lidoQueue"); -const { mainnet } = require("../utils/addresses"); -const erc20Abi = require("../../abis/ERC20.json"); -const lidoARMAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { requestLidoWithdrawals } from "../lidoQueue"; +import { mainnet } from "../../utils/addresses"; +const erc20Abi = require("../../../abis/ERC20.json"); +const lidoARMAbi = require("../../../abis/LidoARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoRequestLidoWithdraw", + description: "Request Lido withdrawals from Lido ARM", + chains: [1], + run: async ({ signer, log }) => { + const steth = new ethers.Contract(mainnet.stETH, erc20Abi, signer); + const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const steth = new ethers.Contract(mainnet.stETH, erc20Abi, signer); - const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - - await requestLidoWithdrawals({ - signer, - steth, - arm, - minAmount: "0.1", - thresholdAmount: 120, - maxAmount: 300, - }); -}; - -module.exports = { handler }; + log.info("Requesting Lido withdrawals"); + await requestLidoWithdrawals({ + signer, + steth, + arm, + minAmount: "0.1", + thresholdAmount: 120, + maxAmount: 300, + }); + }, +}); diff --git a/src/js/tasks/actions/autoRequestWithdraw.ts b/src/js/tasks/actions/autoRequestWithdraw.ts index 7327376d..e77e1028 100644 --- a/src/js/tasks/actions/autoRequestWithdraw.ts +++ b/src/js/tasks/actions/autoRequestWithdraw.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { autoRequestWithdraw } = require("../tasks/liquidityAutomation"); -const { mainnet } = require("../utils/addresses"); -const oethARMAbi = require("../../abis/OethARM.json"); +import { action } from "../lib/action"; +import { autoRequestWithdraw } from "../liquidityAutomation"; +import { mainnet } from "../../utils/addresses"; +const oethARMAbi = require("../../../abis/OethARM.json"); -// Entrypoint for the Autotask -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoRequestWithdraw", + description: "Request withdrawals from OETH ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.OethARM, oethARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.OethARM, oethARMAbi, signer); - - await autoRequestWithdraw({ - signer, - arm, - minAmount: "0.1", - thresholdAmount: 10, - }); -}; - -module.exports = { handler }; + log.info("Requesting withdrawals from OETH ARM"); + await autoRequestWithdraw({ + signer, + arm, + minAmount: "0.1", + thresholdAmount: 10, + }); + }, +}); diff --git a/src/js/tasks/actions/autoRequestWithdrawSonic.ts b/src/js/tasks/actions/autoRequestWithdrawSonic.ts index cdb461f5..43c1d800 100644 --- a/src/js/tasks/actions/autoRequestWithdrawSonic.ts +++ b/src/js/tasks/actions/autoRequestWithdrawSonic.ts @@ -1,33 +1,23 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { autoRequestWithdraw } = require("../tasks/liquidityAutomation"); -const { sonic } = require("../utils/addresses"); -const armAbi = require("../../abis/OriginARM.json"); +import { action } from "../lib/action"; +import { autoRequestWithdraw } from "../liquidityAutomation"; +import { sonic } from "../../utils/addresses"; +const armAbi = require("../../../abis/OriginARM.json"); -// Entrypoint for the Autotask -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "autoRequestWithdrawSonic", + description: "Request withdrawals from Origin ARM on Sonic", + chains: [146], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - - await autoRequestWithdraw({ - signer, - arm, - minAmount: "300", - thresholdAmount: 10000, - }); -}; - -module.exports = { handler }; + log.info("Requesting withdrawals from Origin ARM on Sonic"); + await autoRequestWithdraw({ + signer, + arm, + minAmount: "300", + thresholdAmount: 10000, + }); + }, +}); diff --git a/src/js/tasks/actions/collectEthenaFees.ts b/src/js/tasks/actions/collectEthenaFees.ts index 5e062495..609377b4 100644 --- a/src/js/tasks/actions/collectEthenaFees.ts +++ b/src/js/tasks/actions/collectEthenaFees.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectFees } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const ethenaARMAbi = require("../../abis/EthenaARM.json"); +import { action } from "../lib/action"; +import { collectFees } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const ethenaARMAbi = require("../../../abis/EthenaARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectEthenaFees", + description: "Collect fees from Ethena ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - - await collectFees({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Collecting fees from Ethena ARM"); + await collectFees({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/collectEtherFiFees.ts b/src/js/tasks/actions/collectEtherFiFees.ts index e1883c50..c6c6d5b3 100644 --- a/src/js/tasks/actions/collectEtherFiFees.ts +++ b/src/js/tasks/actions/collectEtherFiFees.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectFees } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { collectFees } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectEtherFiFees", + description: "Collect fees from EtherFi ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.etherfiARM, armAbi, signer); - - await collectFees({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Collecting fees from EtherFi ARM"); + await collectFees({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/collectFeesSonic.ts b/src/js/tasks/actions/collectFeesSonic.ts index 92894692..8a49bdde 100644 --- a/src/js/tasks/actions/collectFeesSonic.ts +++ b/src/js/tasks/actions/collectFeesSonic.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectFees } = require("../tasks/admin"); -const { sonic } = require("../utils/addresses"); -const lidoARMAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { collectFees } from "../admin"; +import { sonic } from "../../utils/addresses"; +const lidoARMAbi = require("../../../abis/LidoARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectFeesSonic", + description: "Collect fees from Origin ARM on Sonic", + chains: [146], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(sonic.OriginARM, lidoARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(sonic.OriginARM, lidoARMAbi, signer); - - await collectFees({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Collecting fees from Origin ARM on Sonic"); + await collectFees({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/collectLidoFees.ts b/src/js/tasks/actions/collectLidoFees.ts index c05bd9ae..b8fa1781 100644 --- a/src/js/tasks/actions/collectLidoFees.ts +++ b/src/js/tasks/actions/collectLidoFees.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectFees } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const lidoARMAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { collectFees } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const lidoARMAbi = require("../../../abis/LidoARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectLidoFees", + description: "Collect fees from Lido ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - - await collectFees({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Collecting fees from Lido ARM"); + await collectFees({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/collectOETHFees.ts b/src/js/tasks/actions/collectOETHFees.ts index 200d8938..7742e149 100644 --- a/src/js/tasks/actions/collectOETHFees.ts +++ b/src/js/tasks/actions/collectOETHFees.ts @@ -1,31 +1,18 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectFees } = require("../tasks/admin"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/OriginARM.json"); +import { action } from "../lib/action"; +import { collectFees } from "../admin"; +import { mainnet } from "../../utils/addresses"; +const armAbi = require("../../../abis/OriginARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectOETHFees", + description: "Collect fees from OETH ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.OethARM, armAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.OethARM, armAbi, signer); - - await collectFees({ - signer, - arm, - }); -}; - -module.exports = { handler }; + log.info("Collecting fees from OETH ARM"); + await collectFees({ signer, arm }); + }, +}); diff --git a/src/js/tasks/actions/collectRewardsSonic.ts b/src/js/tasks/actions/collectRewardsSonic.ts index d968418e..5f09fe7b 100644 --- a/src/js/tasks/actions/collectRewardsSonic.ts +++ b/src/js/tasks/actions/collectRewardsSonic.ts @@ -1,33 +1,26 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { collectRewards } = require("../tasks/sonicHarvest"); -const { sonic } = require("../utils/addresses"); -const harvesterAbi = require("../../abis/SonicHarvester.json"); +import { action } from "../lib/action"; +import { collectRewards } from "../sonicHarvest"; +import { sonic } from "../../utils/addresses"; +const harvesterAbi = require("../../../abis/SonicHarvester.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "collectRewardsSonic", + description: "Collect rewards from Sonic harvester", + chains: [146], + run: async ({ signer, log }) => { + const harvester = new ethers.Contract( + sonic.harvester, + harvesterAbi, + signer + ); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - const harvester = new ethers.Contract(sonic.harvester, harvesterAbi, signer); - - await collectRewards({ - signer, - harvester, - strategies: [sonic.siloVarlamoreMarket], - }); - - // TODO do Silo, beS and wOS swaps with FlyTrade -}; - -module.exports = { handler }; + log.info("Collecting rewards from Sonic harvester"); + await collectRewards({ + signer, + harvester, + strategies: [sonic.siloVarlamoreMarket], + }); + }, +}); diff --git a/src/js/tasks/actions/healthcheck.ts b/src/js/tasks/actions/healthcheck.ts new file mode 100644 index 00000000..bea0f4d7 --- /dev/null +++ b/src/js/tasks/actions/healthcheck.ts @@ -0,0 +1,9 @@ +import { action } from "../lib/action"; + +action({ + name: "healthcheck", + description: "Simple health check to verify the action system works", + run: async ({ log, chainId, networkName }) => { + log.info(`Health check passed on ${networkName} (${chainId})`); + }, +}); diff --git a/src/js/tasks/actions/setOSSiloPriceAction.ts b/src/js/tasks/actions/setOSSiloPriceAction.ts index e1bd9f27..383c3224 100644 --- a/src/js/tasks/actions/setOSSiloPriceAction.ts +++ b/src/js/tasks/actions/setOSSiloPriceAction.ts @@ -1,89 +1,83 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers, parseUnits } = require("ethers"); +import { ethers, parseUnits } from "ethers"; -const { setOSSiloPrice } = require("../tasks/osSiloPrice"); +import { action } from "../lib/action"; +import { setOSSiloPrice } from "../osSiloPrice"; -// Entrypoint for the Defender Action -const handler = async (credentials) => { - // Initialize defender relayer provider and signer - const client = new Defender(credentials); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "setOSSiloPriceAction", + description: "Set OS/Silo price on Sonic ARM", + chains: [146], + run: async ({ signer, log }) => { + const armAddress = "0x2F872623d1E1Af5835b08b0E49aAd2d81d649D30"; + const arm = new ethers.Contract( + armAddress, + [ + "function traderate0() external view returns (uint256)", + "function traderate1() external view returns (uint256)", + "function activeMarket() external view returns (address)", + "function setPrices(uint256, uint256) external", + "function vault() external view returns (address)", + "function token0() external view returns (address)", + "function token1() external view returns (address)", + "function withdrawsQueued() external view returns (uint256)", + "function withdrawsClaimed() external view returns (uint256)", + ], + signer + ); - const armAddress = "0x2F872623d1E1Af5835b08b0E49aAd2d81d649D30"; - const arm = new ethers.Contract( - armAddress, - [ - "function traderate0() external view returns (uint256)", - "function traderate1() external view returns (uint256)", - "function activeMarket() external view returns (address)", - "function setPrices(uint256, uint256) external", - "function vault() external view returns (address)", - "function token0() external view returns (address)", - "function token1() external view returns (address)", - "function withdrawsQueued() external view returns (uint256)", - "function withdrawsClaimed() external view returns (uint256)", - ], - signer, - ); + // Get the SiloMarketWrapper contract + const activeMarket = await arm.activeMarket(); + const siloMarketWrapper = + activeMarket === ethers.ZeroAddress + ? undefined + : new ethers.Contract( + activeMarket, + ["function market() external view returns (address)"], + signer + ); - // Get the SiloMarketWrapper contract - const activeMarket = await arm.activeMarket(); - const siloMarketWrapper = - activeMarket === ethers.ZeroAddress - ? undefined - : new ethers.Contract( - activeMarket, - ["function market() external view returns (address)"], - signer, - ); + // Get the WS and OS token contracts + const wSAddress = await arm.token0(); + const wS = new ethers.Contract( + wSAddress, + ["function balanceOf(address) external view returns (uint256)"], + signer + ); - // Get the WS and OS token contracts - const wSAddress = await arm.token0(); - const wS = new ethers.Contract( - wSAddress, - ["function balanceOf(address) external view returns (uint256)"], - signer, - ); + const oSAddress = await arm.token1(); + const oS = new ethers.Contract( + oSAddress, + ["function balanceOf(address) external view returns (uint256)"], + signer + ); - const oSAddress = await arm.token1(); - const oS = new ethers.Contract( - oSAddress, - ["function balanceOf(address) external view returns (uint256)"], - signer, - ); + // Get the OS Vault contract + const vaultAddress = await arm.vault(); + const vault = new ethers.Contract( + vaultAddress, + [ + "function withdrawalQueueMetadata() external view returns (uint128,uint128,uint128,uint128)", + "function withdrawalRequests(uint256) external view returns (address,bool,uint40,uint128,uint128)", + ], + signer + ); - // Get the OS Vault contract - const vaultAddress = await arm.vault(); - const vault = new ethers.Contract( - vaultAddress, - [ - "function withdrawalQueueMetadata() external view returns (uint128,uint128,uint128,uint128)", - "function withdrawalRequests(uint256) external view returns (address,bool,uint40,uint128,uint128)", - ], - signer, - ); - - await setOSSiloPrice({ - signer, - arm, - siloMarketWrapper, - execute: true, - wS, - oS, - vault, - blockTag: "latest", - marketPremium: 1, // basis points. Negative value reduces the price - lendPremium: 200, // basis points added to lending APY (100 = 1%) - tolerance: 0.3, // basis points - market: "1inch", - minSwapAmount: parseUnits("16000", 18), - minBuyPrice: 0.99, - // maxBuyPrice: 0.995, - }); -}; - -module.exports = { handler }; + log.info("Setting OS/Silo price on Sonic ARM"); + await setOSSiloPrice({ + signer, + arm, + siloMarketWrapper, + execute: true, + wS, + oS, + vault, + blockTag: "latest", + marketPremium: 1, + lendPremium: 200, + tolerance: 0.3, + market: "1inch", + minSwapAmount: parseUnits("16000", 18), + minBuyPrice: 0.99, + }); + }, +}); diff --git a/src/js/tasks/actions/setPricesEthena.ts b/src/js/tasks/actions/setPricesEthena.ts index 26e3b643..7cb5dfa5 100644 --- a/src/js/tasks/actions/setPricesEthena.ts +++ b/src/js/tasks/actions/setPricesEthena.ts @@ -1,47 +1,33 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { setPrices } = require("../tasks/armPrices"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/EthenaARM.json"); +import { action } from "../lib/action"; +import { setPrices } from "../armPrices"; +import { mainnet } from "../../utils/addresses"; +const ethenaARMAbi = require("../../../abis/EthenaARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "setPricesEthena", + description: "Set prices for Ethena ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.ethenaARM, ethenaARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.ethenaARM, armAbi, signer); - - await setPrices({ - signer, - arm, - // sellPrice: 0.9998, - // buyPrice: 0.9997, - maxSellPrice: 0.99999, - minSellPrice: 0.99996, - maxBuyPrice: 0.999, - minBuyPrice: 0.995, - // inch: true, - // curve: true, - kyber: true, - amount: 2000, - tolerance: 0.3, - fee: 2, - offset: 0.4, - priceOffset: true, - blockTag: "latest", - wrapped: true, - }); -}; - -module.exports = { handler }; + log.info("Setting prices for Ethena ARM"); + await setPrices({ + signer, + arm, + maxSellPrice: 0.99999, + minSellPrice: 0.99996, + maxBuyPrice: 0.999, + minBuyPrice: 0.995, + kyber: true, + amount: 2000, + tolerance: 0.3, + fee: 2, + offset: 0.4, + priceOffset: true, + blockTag: "latest", + wrapped: true, + }); + }, +}); diff --git a/src/js/tasks/actions/setPricesEtherFi.ts b/src/js/tasks/actions/setPricesEtherFi.ts index a6b6c007..5e87bbbb 100644 --- a/src/js/tasks/actions/setPricesEtherFi.ts +++ b/src/js/tasks/actions/setPricesEtherFi.ts @@ -1,46 +1,32 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { setPrices } = require("../tasks/armPrices"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/EtherFiARM.json"); +import { action } from "../lib/action"; +import { setPrices } from "../armPrices"; +import { mainnet } from "../../utils/addresses"; +const etherFiARMAbi = require("../../../abis/EtherFiARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "setPricesEtherFi", + description: "Set prices for EtherFi ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.etherfiARM, etherFiARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.etherfiARM, armAbi, signer); - - await setPrices({ - signer, - arm, - // sellPrice: 0.9998, - // buyPrice: 0.9997, - maxSellPrice: 1.0, - minSellPrice: 0.99996, - maxBuyPrice: 0.9996, - minBuyPrice: 0.9985, - // inch: true, - // curve: true, - kyber: true, - amount: 10, - tolerance: 0.2, - fee: 0.5, - offset: 0.3, - priceOffset: true, - blockTag: "latest", - }); -}; - -module.exports = { handler }; + log.info("Setting prices for EtherFi ARM"); + await setPrices({ + signer, + arm, + maxSellPrice: 1.0, + minSellPrice: 0.99996, + maxBuyPrice: 0.9996, + minBuyPrice: 0.9985, + kyber: true, + amount: 10, + tolerance: 0.2, + fee: 0.5, + offset: 0.3, + priceOffset: true, + blockTag: "latest", + }); + }, +}); diff --git a/src/js/tasks/actions/setPricesLido.ts b/src/js/tasks/actions/setPricesLido.ts index 224d5732..2179949a 100644 --- a/src/js/tasks/actions/setPricesLido.ts +++ b/src/js/tasks/actions/setPricesLido.ts @@ -1,46 +1,32 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { setPrices } = require("../tasks/armPrices"); -const { mainnet } = require("../utils/addresses"); -const lidoARMAbi = require("../../abis/LidoARM.json"); +import { action } from "../lib/action"; +import { setPrices } from "../armPrices"; +import { mainnet } from "../../utils/addresses"; +const lidoARMAbi = require("../../../abis/LidoARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "setPricesLido", + description: "Set prices for Lido ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.lidoARM, lidoARMAbi, signer); - - await setPrices({ - signer, - arm, - // sellPrice: 0.9998, - // buyPrice: 0.9997, - maxSellPrice: 1.0, - minSellPrice: 0.9999, - maxBuyPrice: 0.999, - minBuyPrice: 0.998, - // inch: true, - // curve: true, - kyber: true, - amount: 100, - tolerance: 0.1, - fee: 0.5, - offset: 0.1, - priceOffset: true, - blockTag: "latest", - }); -}; - -module.exports = { handler }; + log.info("Setting prices for Lido ARM"); + await setPrices({ + signer, + arm, + maxSellPrice: 1.0, + minSellPrice: 0.9999, + maxBuyPrice: 0.999, + minBuyPrice: 0.998, + kyber: true, + amount: 100, + tolerance: 0.1, + fee: 0.5, + offset: 0.1, + priceOffset: true, + blockTag: "latest", + }); + }, +}); diff --git a/src/js/tasks/actions/setPricesOETH.ts b/src/js/tasks/actions/setPricesOETH.ts index d65a9c5c..6c70024e 100644 --- a/src/js/tasks/actions/setPricesOETH.ts +++ b/src/js/tasks/actions/setPricesOETH.ts @@ -1,46 +1,32 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { ethers } = require("ethers"); +import { ethers } from "ethers"; -const { setPrices } = require("../tasks/armPrices"); -const { mainnet } = require("../utils/addresses"); -const armAbi = require("../../abis/OriginARM.json"); +import { action } from "../lib/action"; +import { setPrices } from "../armPrices"; +import { mainnet } from "../../utils/addresses"; +const armAbi = require("../../../abis/OriginARM.json"); -// Entrypoint for the Defender Action -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v6", - }); +action({ + name: "setPricesOETH", + description: "Set prices for OETH ARM", + chains: [1], + run: async ({ signer, log }) => { + const arm = new ethers.Contract(mainnet.etherfiARM, armAbi, signer); - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"`, - ); - - // References to contracts - const arm = new ethers.Contract(mainnet.etherfiARM, armAbi, signer); - - await setPrices({ - signer, - arm, - // sellPrice: 0.9998, - // buyPrice: 0.9997, - maxSellPrice: 0.9999, - minSellPrice: 0.9995, - maxBuyPrice: 0.9995, - minBuyPrice: 0.996, - // inch: true, - // curve: true, - kyber: true, - amount: 10, - tolerance: 0.3, - fee: 5, - offset: 1.0, - priceOffset: true, - blockTag: "latest", - }); -}; - -module.exports = { handler }; + log.info("Setting prices for OETH ARM"); + await setPrices({ + signer, + arm, + maxSellPrice: 0.9999, + minSellPrice: 0.9995, + maxBuyPrice: 0.9995, + minBuyPrice: 0.996, + kyber: true, + amount: 10, + tolerance: 0.3, + fee: 5, + offset: 1.0, + priceOffset: true, + blockTag: "latest", + }); + }, +}); From 4427dc186c5a7eb63bd5da9ae7408697cae768f9 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 16:03:04 -0700 Subject: [PATCH 04/41] rename signers.ts --- src/js/utils/{signers.js => signers.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/js/utils/{signers.js => signers.ts} (100%) diff --git a/src/js/utils/signers.js b/src/js/utils/signers.ts similarity index 100% rename from src/js/utils/signers.js rename to src/js/utils/signers.ts From f5ab3e7c101454b2a36154ea53c46733d4b79930 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 16:07:19 -0700 Subject: [PATCH 05/41] Add .dockerignore and update Docker setup --- .dockerignore | 21 ++++ docker-compose.yml | 1 - dockerfile-actions | 11 +- src/js/tasks/actions/healthcheck.ts | 4 +- src/js/tasks/lib/action.ts | 34 +++--- src/js/utils/signers.ts | 165 ++++++++++++++++------------ tsconfig.json | 3 +- 7 files changed, 143 insertions(+), 96 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..d1e8b830 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Foundry build artifacts +out/ +cache/ +dependencies/ + +# Git +.git/ + +# Node modules (rebuilt in Docker) +node_modules/ + +# Test and deploy scripts (not needed in actions container) +test/ +script/ +src/contracts/ + +# Misc +.env +.env.* +coverage/ +lcov.info diff --git a/docker-compose.yml b/docker-compose.yml index d526ff3c..865d76da 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,6 @@ services: - MAINNET_URL=${MAINNET_URL:-} - SONIC_URL=${SONIC_URL:-} - HOLESKY_URL=${HOLESKY_URL:-} - - HARDHAT_NETWORK=${HARDHAT_NETWORK:-mainnet} - ACTION_API_BEARER_TOKEN=${ACTION_API_BEARER_TOKEN:-test-token} - LOKI_URL=${LOKI_URL:-} - LOKI_USER=${LOKI_USER:-} diff --git a/dockerfile-actions b/dockerfile-actions index 5b3f2648..c52bb589 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -20,6 +20,14 @@ RUN mkdir -p /root/.ssh \ RUN git config --global url."https://github.com/".insteadOf "git@github.com:" +# Install Foundry and symlink binaries to /usr/local/bin so they're available +# in all shell modes (login shells reset PATH, dropping ~/.foundry/bin). +RUN curl -L https://foundry.paradigm.xyz | bash \ + && /root/.foundry/bin/foundryup \ + && ln -s /root/.foundry/bin/forge /usr/local/bin/forge \ + && ln -s /root/.foundry/bin/cast /usr/local/bin/cast \ + && ln -s /root/.foundry/bin/anvil /usr/local/bin/anvil + ARG TARGETARCH ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.39/supercronic-linux-${TARGETARCH} \ SUPERCRONIC=supercronic-linux-${TARGETARCH} @@ -47,8 +55,7 @@ COPY . . ENV MAINNET_URL="" \ SONIC_URL="" \ - HOLESKY_URL="" \ - HARDHAT_NETWORK="" + HOLESKY_URL="" RUN chmod +x /app/cron/cron-entrypoint.sh diff --git a/src/js/tasks/actions/healthcheck.ts b/src/js/tasks/actions/healthcheck.ts index bea0f4d7..33bd85f4 100644 --- a/src/js/tasks/actions/healthcheck.ts +++ b/src/js/tasks/actions/healthcheck.ts @@ -3,7 +3,7 @@ import { action } from "../lib/action"; action({ name: "healthcheck", description: "Simple health check to verify the action system works", - run: async ({ log, chainId, networkName }) => { - log.info(`Health check passed on ${networkName} (${chainId})`); + run: async ({ signer, log }) => { + log.info(`Health check passed. Signer: ${await signer.getAddress()}`); }, }); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 5d25c44d..48dadc22 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -1,4 +1,4 @@ -import type { ethers } from "ethers"; +import type { Signer } from "ethers"; import { subtask, task } from "hardhat/config"; import type { ConfigurableTaskDefinition } from "hardhat/types"; import type { Logger } from "winston"; @@ -7,7 +7,7 @@ import { getSigner } from "../../utils/signers"; import logger, { flushLogger } from "./logger"; export interface ActionContext { - signer: ethers.Signer; + signer: Signer; chainId: number; networkName: string; log: Logger; @@ -43,24 +43,24 @@ export function action(config: ActionConfig) { log.info("Starting"); - const signer = await getSigner(); - const network = await signer.provider!.getNetwork(); - const chainId = Number(network.chainId); - const networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; - - if (chains && !chains.includes(chainId)) { - const valid = chains - .map((id) => `${CHAIN_NAMES[id] ?? id} (${id})`) - .join(", "); - throw new Error( - `${name} only supports ${valid}, not ${networkName} (${chainId})` - ); - } + try { + const signer = await getSigner(); + const network = await signer.provider!.getNetwork(); + const chainId = Number(network.chainId); + const networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; - log.info(`Running on ${networkName} (${chainId})`); + if (chains && !chains.includes(chainId)) { + const valid = chains + .map((id) => `${CHAIN_NAMES[id] ?? id} (${id})`) + .join(", "); + throw new Error( + `${name} only supports ${valid}, not ${networkName} (${chainId})` + ); + } - try { + log.info(`Running on ${networkName} (${chainId})`); await run({ signer, chainId, networkName, log, args: taskArgs }); + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); log.info(`Completed in ${elapsed}s`); } catch (err: any) { diff --git a/src/js/utils/signers.ts b/src/js/utils/signers.ts index 45b3e3be..17e2341d 100644 --- a/src/js/utils/signers.ts +++ b/src/js/utils/signers.ts @@ -1,22 +1,35 @@ -const { Wallet } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const hhHelpers = require("@nomicfoundation/hardhat-network-helpers"); +import { JsonRpcProvider, Signer, Wallet } from "ethers"; +import { Defender } from "@openzeppelin/defender-sdk"; +import * as hhHelpers from "@nomicfoundation/hardhat-network-helpers"; -const { ethereumAddress, privateKey } = require("./regex"); +import { ethereumAddress, privateKey } from "./regex"; +// eslint-disable-next-line @typescript-eslint/no-var-requires const log = require("./logger")("utils:signers"); -// KMS configuration +// Use `hre` global injected by Hardhat at runtime. +declare const hre: { + ethers: { + provider: JsonRpcProvider; + getSigners: () => Promise; + }; +}; +declare const ethers: { provider: JsonRpcProvider }; + +// --------------------------------------------------------------------------- +// KMS signer +// --------------------------------------------------------------------------- + const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; const AWS_KMS_REGION = "us-east-1"; -const hasAwsKmsCredentials = () => { - return ( - !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY - ); -}; +function hasAwsKmsCredentials(): boolean { + return !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY; +} -const getKmsSigner = async () => { +async function getKmsSigner(): Promise { + // Dynamic require so we don't pull in the AWS SDK when it's not needed. + // eslint-disable-next-line @typescript-eslint/no-var-requires const { DirectKmsTransactionSigner } = require("@lastdotnet/purrikey"); const relayerId = process.env.KMS_RELAYER_ID || DEFAULT_KMS_RELAYER_ID; const signer = new DirectKmsTransactionSigner( @@ -27,29 +40,74 @@ const getKmsSigner = async () => { log( `Using KMS signer ${await signer.getAddress()} from relayer-id "${relayerId}"`, ); - return signer; -}; + return signer as Signer; +} + +// --------------------------------------------------------------------------- +// Defender relayer signer +// --------------------------------------------------------------------------- + +type DefenderSpeed = "safeLow" | "average" | "fast" | "fastest"; + +async function getDefenderSigner(): Promise { + const speed = (process.env.SPEED || "fastest") as string; + const validSpeeds: DefenderSpeed[] = [ + "safeLow", + "average", + "fast", + "fastest", + ]; + if (!validSpeeds.includes(speed as DefenderSpeed)) { + console.error( + `Defender Relay Speed param must be either 'safeLow', 'average', 'fast' or 'fastest'. Not "${speed}"`, + ); + process.exit(2); + } + const credentials = { + relayerApiKey: process.env.DEFENDER_RELAYER_KEY, + relayerApiSecret: process.env.DEFENDER_RELAYER_SECRET, + }; + const client = new Defender(credentials); + const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); + + const signer = await client.relaySigner.getSigner(provider, { + speed: speed as DefenderSpeed, + ethersVersion: "v6", + }); + log( + `Using Defender Relayer account ${await signer.getAddress()} from env vars DEFENDER_RELAYER_KEY and DEFENDER_RELAYER_SECRET`, + ); + return signer as unknown as Signer; +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- /** - * Signer factory that gets a signer for a hardhat test or task - * If address is passed, use that address as signer. - * If DEPLOYER_PK or GOVERNOR_PK is set, use that private key as signer. - * If a fork and IMPERSONATE is set, impersonate that account. - * else get the first signer from the hardhat node. - * @param {*} address optional address of the signer - * @returns + * Signer factory — resolves a signer based on available credentials. + * + * Resolution order: + * 1. Explicit `address` parameter (returns provider signer for that address) + * 2. `DEPLOYER_PRIVATE_KEY` env var (Wallet from private key) + * 3. AWS KMS credentials (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`) + * 4. `IMPERSONATE` env var (impersonate + fund on a fork) + * 5. Defender Relayer (`DEFENDER_RELAYER_KEY` + `DEFENDER_RELAYER_SECRET`) + * 6. First hardhat signer (from the configured network) + * 7. Random wallet (last resort) */ -async function getSigner(address = undefined) { +export async function getSigner(address?: string): Promise { if (address) { if (!address.match(ethereumAddress)) { - throw Error(`Invalid format of address`); + throw new Error("Invalid format of address"); } return await hre.ethers.provider.getSigner(address); } + const pk = process.env.DEPLOYER_PRIVATE_KEY; if (pk) { if (!pk.match(privateKey)) { - throw Error(`Invalid format of private key`); + throw new Error("Invalid format of private key"); } const wallet = new Wallet(pk, hre.ethers.provider); log(`Using signer ${await wallet.getAddress()} from private key`); @@ -61,19 +119,19 @@ async function getSigner(address = undefined) { } if (process.env.IMPERSONATE) { - let address = process.env.IMPERSONATE; - if (!address.match(ethereumAddress)) { - throw Error( - `Environment variable IMPERSONATE is an invalid Ethereum address or contract name`, + const impersonateAddr = process.env.IMPERSONATE; + if (!impersonateAddr.match(ethereumAddress)) { + throw new Error( + "Environment variable IMPERSONATE is an invalid Ethereum address or contract name", ); } log( - `Impersonating account ${address} from IMPERSONATE environment variable`, + `Impersonating account ${impersonateAddr} from IMPERSONATE environment variable`, ); - return await impersonateAndFund(address); + return await impersonateAndFund(impersonateAddr); } - // If using Defender Relayer + // Defender Relayer if (process.env.DEFENDER_RELAYER_KEY && process.env.DEFENDER_RELAYER_SECRET) { return await getDefenderSigner(); } @@ -87,63 +145,26 @@ async function getSigner(address = undefined) { const signer = Wallet.createRandom().connect(hre.ethers.provider); log(`Using random signer ${await signer.getAddress()}`); - return signer; } -const getDefenderSigner = async () => { - const speed = process.env.SPEED || "fastest"; - if (!["safeLow", "average", "fast", "fastest"].includes(speed)) { - console.error( - `Defender Relay Speed param must be either 'safeLow', 'average', 'fast' or 'fastest'. Not "${speed}"`, - ); - process.exit(2); - } - const credentials = { - relayerApiKey: process.env.DEFENDER_RELAYER_KEY, - relayerApiSecret: process.env.DEFENDER_RELAYER_SECRET, - }; - const client = new Defender(credentials); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - - const signer = await client.relaySigner.getSigner(provider, { - speed, - ethersVersion: "v6", - }); - log( - `Using Defender Relayer account ${await signer.getAddress()} from env vars DEFENDER_RELAYER_KEY and DEFENDER_RELAYER_SECRET`, - ); - return signer; -}; - /** * Impersonate an account when connecting to a forked node. - * @param {*} account the address of the contract or externally owned account to impersonate - * @returns an Ethers.js Signer object */ -async function impersonateAccount(account) { +export async function impersonateAccount(account: string): Promise { await hhHelpers.impersonateAccount(account); - return await ethers.provider.getSigner(account); } /** * Impersonate an account and fund it with Ether when connecting to a forked node. - * @param {*} account the address of the contract or externally owned account to impersonate - * @amount the amount of Ether to fund the account with. This will be converted to wei. - * @returns an Ethers.js Signer object */ -async function impersonateAndFund(account, amount = BigInt(10e18)) { +export async function impersonateAndFund( + account: string, + amount: bigint = BigInt(10e18), +): Promise { const signer = await impersonateAccount(account); - log(`Funding account ${account} with ${amount} ETH`); await hhHelpers.setBalance(account, amount); - return signer; } - -module.exports = { - getSigner, - impersonateAccount, - impersonateAndFund, -}; diff --git a/tsconfig.json b/tsconfig.json index 5a38aa41..29021d81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,8 +13,7 @@ "types": ["node"] }, "include": [ - "src/js/tasks/actions/**/*.ts", - "src/js/tasks/lib/**/*.ts", + "src/js/**/*.ts", "cron/cron-supervisor.ts", "cron/render-crontab.ts" ], From 62412167d085028e8b6dcba0fd6441a85e745361 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 16:07:52 -0700 Subject: [PATCH 06/41] build actions image on automation branch --- .github/workflows/actions-image.yml | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/actions-image.yml diff --git a/.github/workflows/actions-image.yml b/.github/workflows/actions-image.yml new file mode 100644 index 00000000..c8bcb714 --- /dev/null +++ b/.github/workflows/actions-image.yml @@ -0,0 +1,42 @@ +name: Actions Image + +on: + push: + branches: + - automation + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Prepare image metadata + id: prep + run: | + IMAGE_NAME="ghcr.io/${{ github.repository_owner }}/arm-actions" + IMAGE_NAME="$(echo "${IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')" + echo "image_name=${IMAGE_NAME}" >> "${GITHUB_OUTPUT}" + + - name: Build and push image + uses: docker/build-push-action@v5 + with: + context: . + file: ./dockerfile-actions + push: true + tags: | + ${{ steps.prep.outputs.image_name }}:latest + ${{ steps.prep.outputs.image_name }}:${{ github.sha }} From 622e26ef699e7dd93f3339f6339f3fe78abd303d Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 31 Mar 2026 16:17:39 -0700 Subject: [PATCH 07/41] add loki logging section --- .env.example | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 4c0f4141..05001038 100644 --- a/.env.example +++ b/.env.example @@ -50,4 +50,12 @@ FORK_BLOCK_NUMBER_SONIC= # Used with: npx hardhat setActionVars, npx defender-autotask update-code # Note: Different from Relayer credentials # DEFENDER_TEAM_KEY= -# DEFENDER_TEAM_SECRET= \ No newline at end of file +# DEFENDER_TEAM_SECRET= + +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LOKI LOGGING ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ + +# LOKI_URL= +# LOKI_USER= +# LOKI_API_KEY= From 9577ff08ae546fd379b51862b6090e19457e8388 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Thu, 2 Apr 2026 11:58:49 -0700 Subject: [PATCH 08/41] update cron by going through todo links --- cron/TODO.md | 26 +++++++ cron/cron-jobs.json | 76 +++++++++---------- ...OSSiloPriceAction.ts => setPricesSonic.ts} | 4 +- 3 files changed, 66 insertions(+), 40 deletions(-) create mode 100644 cron/TODO.md rename src/js/tasks/actions/{setOSSiloPriceAction.ts => setPricesSonic.ts} (96%) diff --git a/cron/TODO.md b/cron/TODO.md new file mode 100644 index 00000000..e629fe4b --- /dev/null +++ b/cron/TODO.md @@ -0,0 +1,26 @@ +# TODO List + +## Defender Actions which use compiled code: + +https://defender.openzeppelin.com/#/actions/automatic/002c2b0d-9522-4d5f-a340-9713ee43a1c3 +https://defender.openzeppelin.com/#/actions/automatic/062cfee1-c34e-43ae-beb0-de62bc668bbd +https://defender.openzeppelin.com/#/actions/automatic/127171fd-7b85-497e-8335-fd7907c08386 +https://defender.openzeppelin.com/#/actions/automatic/12977d51-d107-45eb-ac20-45942009ab01 +https://defender.openzeppelin.com/#/actions/automatic/32dbc67b-89f3-4856-8f3d-ad4dc5a09322 +https://defender.openzeppelin.com/#/actions/automatic/3a49c165-62d9-43a2-bef0-901ce1d59bef // was every 190m -> using cron of 180m +https://defender.openzeppelin.com/#/actions/automatic/641e73f8-6792-41c8-bda9-930681d94ada +https://defender.openzeppelin.com/#/actions/automatic/6c52f3a9-85d8-4c7f-8aee-90a95b13965c +https://defender.openzeppelin.com/#/actions/automatic/6d148f26-54a6-4377-92f2-3148d572eea3 +https://defender.openzeppelin.com/#/actions/automatic/6e26641e-4132-4824-bb80-7c891fd31455 +https://defender.openzeppelin.com/#/actions/automatic/6ec46510-0b8e-48b4-a4c8-de759aad0ba4 +https://defender.openzeppelin.com/#/actions/automatic/80565995-9bb2-42a0-bbd5-e15297b67050 +https://defender.openzeppelin.com/#/actions/automatic/82ead29e-88f1-43bc-a5ed-503fadb3e491 +https://defender.openzeppelin.com/#/actions/automatic/84b5f134-8351-4402-8f6a-fb4376034bc4 +https://defender.openzeppelin.com/#/actions/automatic/89658c5f-3857-4972-bef8-a5e914e13c56 +https://defender.openzeppelin.com/#/actions/automatic/a9fc4c86-0506-4809-afbc-93b5e558cb68 +https://defender.openzeppelin.com/#/actions/automatic/acfbb7d6-5ea6-4ffc-a758-fa4b4f584dd1 +https://defender.openzeppelin.com/#/actions/automatic/b362885c-a023-4fb5-8c04-1c33147465eb +https://defender.openzeppelin.com/#/actions/automatic/c010fb76-ea63-409d-9981-69322d27993a +https://defender.openzeppelin.com/#/actions/automatic/ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 + +Every ARM defender action used compiled code - so likely all the actions we have in here are all that we need. diff --git a/cron/cron-jobs.json b/cron/cron-jobs.json index 63d3cbfb..105b1293 100644 --- a/cron/cron-jobs.json +++ b/cron/cron-jobs.json @@ -20,38 +20,38 @@ }, { "name": "mainnet_auto_request_lido_withdraw", - "schedule": "12 * * * *", - "enabled": false, + "schedule": "29,58 12-23,0-8 * * *", + "enabled": true, "command": "cd /app && npx hardhat autoRequestLidoWithdraw --network mainnet" }, { "name": "mainnet_auto_claim_lido_withdraw", - "schedule": "17 * * * *", - "enabled": false, + "schedule": "32 12/24 * * *", + "enabled": true, "command": "cd /app && npx hardhat autoClaimLidoWithdraw --network mainnet" }, { "name": "mainnet_auto_request_etherfi_withdraw", - "schedule": "22 * * * *", - "enabled": false, + "schedule": "10,40 * * * *", + "enabled": true, "command": "cd /app && npx hardhat autoRequestEtherFiWithdraw --network mainnet" }, { "name": "mainnet_auto_claim_etherfi_withdraw", - "schedule": "27 * * * *", - "enabled": false, + "schedule": "40 * * * *", + "enabled": true, "command": "cd /app && npx hardhat autoClaimEtherFiWithdraw --network mainnet" }, { "name": "mainnet_auto_request_ethena_withdraw", - "schedule": "32 * * * *", - "enabled": false, + "schedule": "0 */3 * * *", + "enabled": true, "command": "cd /app && npx hardhat autoRequestEthenaWithdraw --network mainnet" }, { "name": "mainnet_auto_claim_ethena_withdraw", - "schedule": "37 * * * *", - "enabled": false, + "schedule": "40 * * * *", + "enabled": true, "command": "cd /app && npx hardhat autoClaimEthenaWithdraw --network mainnet" }, { @@ -62,20 +62,20 @@ }, { "name": "mainnet_collect_lido_fees", - "schedule": "8 0 * * *", - "enabled": false, + "schedule": "30 12 * * *", + "enabled": true, "command": "cd /app && npx hardhat collectLidoFees --network mainnet" }, { "name": "mainnet_collect_etherfi_fees", - "schedule": "13 0 * * *", - "enabled": false, + "schedule": "45 23 * * *", + "enabled": true, "command": "cd /app && npx hardhat collectEtherFiFees --network mainnet" }, { "name": "mainnet_collect_ethena_fees", - "schedule": "18 0 * * *", - "enabled": false, + "schedule": "45 23 * * *", + "enabled": true, "command": "cd /app && npx hardhat collectEthenaFees --network mainnet" }, { @@ -86,8 +86,8 @@ }, { "name": "mainnet_allocate_lido", - "schedule": "47 * * * *", - "enabled": false, + "schedule": "38,08 * * * *", + "enabled": true, "command": "cd /app && npx hardhat allocateLido --network mainnet" }, { @@ -98,8 +98,8 @@ }, { "name": "mainnet_allocate_ethena", - "schedule": "57 * * * *", - "enabled": false, + "schedule": "28 * * * *", + "enabled": true, "command": "cd /app && npx hardhat allocateEthena --network mainnet" }, { @@ -110,26 +110,26 @@ }, { "name": "mainnet_set_prices_lido", - "schedule": "1,11,21,31,41,51 * * * *", - "enabled": false, + "schedule": "*/30 * * * *", + "enabled": true, "command": "cd /app && npx hardhat setPricesLido --network mainnet" }, { "name": "mainnet_set_prices_etherfi", - "schedule": "2,12,22,32,42,52 * * * *", - "enabled": false, + "schedule": "2,32 * * * *", + "enabled": true, "command": "cd /app && npx hardhat setPricesEtherFi --network mainnet" }, { "name": "mainnet_set_prices_ethena", - "schedule": "3,13,23,33,43,53 * * * *", - "enabled": false, + "schedule": "0 * * * *", + "enabled": true, "command": "cd /app && npx hardhat setPricesEthena --network mainnet" }, { "name": "sonic_auto_request_withdraw", - "schedule": "5 * * * *", - "enabled": false, + "schedule": "48,18 * * * *", + "enabled": true, "command": "cd /app && npx hardhat autoRequestWithdrawSonic --network sonic" }, { @@ -140,8 +140,8 @@ }, { "name": "sonic_collect_fees", - "schedule": "23 0 * * *", - "enabled": false, + "schedule": "55 23 * * *", + "enabled": true, "command": "cd /app && npx hardhat collectFeesSonic --network sonic" }, { @@ -151,15 +151,15 @@ "command": "cd /app && npx hardhat allocateSonic --network sonic" }, { - "name": "sonic_set_os_silo_price", - "schedule": "4,14,24,34,44,54 * * * *", - "enabled": false, - "command": "cd /app && npx hardhat setOSSiloPriceAction --network sonic" + "name": "sonic_set_prices", + "schedule": "*/30 * * * *", + "enabled": true, + "command": "cd /app && npx hardhat setPricesSonic --network sonic" }, { "name": "sonic_collect_rewards", - "schedule": "28 0 * * *", - "enabled": false, + "schedule": "45 23 * * *", + "enabled": true, "command": "cd /app && npx hardhat collectRewardsSonic --network sonic" } ] diff --git a/src/js/tasks/actions/setOSSiloPriceAction.ts b/src/js/tasks/actions/setPricesSonic.ts similarity index 96% rename from src/js/tasks/actions/setOSSiloPriceAction.ts rename to src/js/tasks/actions/setPricesSonic.ts index 383c3224..544cf9f0 100644 --- a/src/js/tasks/actions/setOSSiloPriceAction.ts +++ b/src/js/tasks/actions/setPricesSonic.ts @@ -4,8 +4,8 @@ import { action } from "../lib/action"; import { setOSSiloPrice } from "../osSiloPrice"; action({ - name: "setOSSiloPriceAction", - description: "Set OS/Silo price on Sonic ARM", + name: "setPricesSonic", + description: "Set prices on Sonic ARM", chains: [146], run: async ({ signer, log }) => { const armAddress = "0x2F872623d1E1Af5835b08b0E49aAd2d81d649D30"; From 4aaf03fb056b6805fb3e16e1a41aab19605ec1dd Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Thu, 2 Apr 2026 12:06:05 -0700 Subject: [PATCH 09/41] update cron - missed some --- cron/TODO.md | 2 ++ cron/cron-jobs.json | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cron/TODO.md b/cron/TODO.md index e629fe4b..7f862882 100644 --- a/cron/TODO.md +++ b/cron/TODO.md @@ -22,5 +22,7 @@ https://defender.openzeppelin.com/#/actions/automatic/acfbb7d6-5ea6-4ffc-a758-fa https://defender.openzeppelin.com/#/actions/automatic/b362885c-a023-4fb5-8c04-1c33147465eb https://defender.openzeppelin.com/#/actions/automatic/c010fb76-ea63-409d-9981-69322d27993a https://defender.openzeppelin.com/#/actions/automatic/ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 +https://defender.openzeppelin.com/#/actions/automatic/f92ea662-fc34-433b-8beb-b34e9ab74685 +https://defender.openzeppelin.com/#/actions/automatic/7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 Every ARM defender action used compiled code - so likely all the actions we have in here are all that we need. diff --git a/cron/cron-jobs.json b/cron/cron-jobs.json index 105b1293..ae7ec6ee 100644 --- a/cron/cron-jobs.json +++ b/cron/cron-jobs.json @@ -8,13 +8,13 @@ }, { "name": "mainnet_auto_request_withdraw", - "schedule": "2 * * * *", + "schedule": "5 */3 * * *", "enabled": false, "command": "cd /app && npx hardhat autoRequestWithdraw --network mainnet" }, { "name": "mainnet_auto_claim_withdraw", - "schedule": "7 * * * *", + "schedule": "20 */3 * * *", "enabled": false, "command": "cd /app && npx hardhat autoClaimWithdraw --network mainnet" }, @@ -134,8 +134,8 @@ }, { "name": "sonic_auto_claim_withdraw", - "schedule": "10 * * * *", - "enabled": false, + "schedule": "58 */2 * * *", + "enabled": true, "command": "cd /app && npx hardhat autoClaimWithdrawSonic --network sonic" }, { @@ -146,8 +146,8 @@ }, { "name": "sonic_allocate", - "schedule": "15 * * * *", - "enabled": false, + "schedule": "1,31 * * * *", + "enabled": true, "command": "cd /app && npx hardhat allocateSonic --network sonic" }, { From 3b625a57ac52f8e4c2a1cfa67985b34f711e052a Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Fri, 3 Apr 2026 17:22:27 -0700 Subject: [PATCH 10/41] Replace cron-jobs.json with TypeScript module and import config directly --- cron/cron-jobs.json | 166 ------------------------------------- cron/cron-jobs.ts | 177 ++++++++++++++++++++++++++++++++++++++++ cron/cron-supervisor.ts | 3 - cron/render-crontab.ts | 21 ++--- docker-compose.yml | 1 - 5 files changed, 183 insertions(+), 185 deletions(-) delete mode 100644 cron/cron-jobs.json create mode 100644 cron/cron-jobs.ts diff --git a/cron/cron-jobs.json b/cron/cron-jobs.json deleted file mode 100644 index ae7ec6ee..00000000 --- a/cron/cron-jobs.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "jobs": [ - { - "name": "healthcheck", - "schedule": "*/5 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat healthcheck" - }, - { - "name": "mainnet_auto_request_withdraw", - "schedule": "5 */3 * * *", - "enabled": false, - "command": "cd /app && npx hardhat autoRequestWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_claim_withdraw", - "schedule": "20 */3 * * *", - "enabled": false, - "command": "cd /app && npx hardhat autoClaimWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_request_lido_withdraw", - "schedule": "29,58 12-23,0-8 * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoRequestLidoWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_claim_lido_withdraw", - "schedule": "32 12/24 * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoClaimLidoWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_request_etherfi_withdraw", - "schedule": "10,40 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoRequestEtherFiWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_claim_etherfi_withdraw", - "schedule": "40 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoClaimEtherFiWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_request_ethena_withdraw", - "schedule": "0 */3 * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoRequestEthenaWithdraw --network mainnet" - }, - { - "name": "mainnet_auto_claim_ethena_withdraw", - "schedule": "40 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoClaimEthenaWithdraw --network mainnet" - }, - { - "name": "mainnet_collect_oeth_fees", - "schedule": "3 0 * * *", - "enabled": false, - "command": "cd /app && npx hardhat collectOETHFees --network mainnet" - }, - { - "name": "mainnet_collect_lido_fees", - "schedule": "30 12 * * *", - "enabled": true, - "command": "cd /app && npx hardhat collectLidoFees --network mainnet" - }, - { - "name": "mainnet_collect_etherfi_fees", - "schedule": "45 23 * * *", - "enabled": true, - "command": "cd /app && npx hardhat collectEtherFiFees --network mainnet" - }, - { - "name": "mainnet_collect_ethena_fees", - "schedule": "45 23 * * *", - "enabled": true, - "command": "cd /app && npx hardhat collectEthenaFees --network mainnet" - }, - { - "name": "mainnet_allocate_oeth", - "schedule": "42 * * * *", - "enabled": false, - "command": "cd /app && npx hardhat allocateOETH --network mainnet" - }, - { - "name": "mainnet_allocate_lido", - "schedule": "38,08 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat allocateLido --network mainnet" - }, - { - "name": "mainnet_allocate_etherfi", - "schedule": "52 * * * *", - "enabled": false, - "command": "cd /app && npx hardhat allocateEtherFi --network mainnet" - }, - { - "name": "mainnet_allocate_ethena", - "schedule": "28 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat allocateEthena --network mainnet" - }, - { - "name": "mainnet_set_prices_oeth", - "schedule": "*/10 * * * *", - "enabled": false, - "command": "cd /app && npx hardhat setPricesOETH --network mainnet" - }, - { - "name": "mainnet_set_prices_lido", - "schedule": "*/30 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat setPricesLido --network mainnet" - }, - { - "name": "mainnet_set_prices_etherfi", - "schedule": "2,32 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat setPricesEtherFi --network mainnet" - }, - { - "name": "mainnet_set_prices_ethena", - "schedule": "0 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat setPricesEthena --network mainnet" - }, - { - "name": "sonic_auto_request_withdraw", - "schedule": "48,18 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoRequestWithdrawSonic --network sonic" - }, - { - "name": "sonic_auto_claim_withdraw", - "schedule": "58 */2 * * *", - "enabled": true, - "command": "cd /app && npx hardhat autoClaimWithdrawSonic --network sonic" - }, - { - "name": "sonic_collect_fees", - "schedule": "55 23 * * *", - "enabled": true, - "command": "cd /app && npx hardhat collectFeesSonic --network sonic" - }, - { - "name": "sonic_allocate", - "schedule": "1,31 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat allocateSonic --network sonic" - }, - { - "name": "sonic_set_prices", - "schedule": "*/30 * * * *", - "enabled": true, - "command": "cd /app && npx hardhat setPricesSonic --network sonic" - }, - { - "name": "sonic_collect_rewards", - "schedule": "45 23 * * *", - "enabled": true, - "command": "cd /app && npx hardhat collectRewardsSonic --network sonic" - } - ] -} diff --git a/cron/cron-jobs.ts b/cron/cron-jobs.ts new file mode 100644 index 00000000..6d18d36d --- /dev/null +++ b/cron/cron-jobs.ts @@ -0,0 +1,177 @@ +import type { CronConfig } from "./render-crontab"; + +const cronConfig: CronConfig = { + jobs: [ + { + name: "healthcheck", + schedule: "*/5 * * * *", + enabled: true, + command: "cd /app && npx hardhat healthcheck", + }, + { + name: "mainnet_auto_request_withdraw", + schedule: "5 */3 * * *", + enabled: false, + command: "cd /app && npx hardhat autoRequestWithdraw --network mainnet", + }, + { + name: "mainnet_auto_claim_withdraw", + schedule: "20 */3 * * *", + enabled: false, + command: "cd /app && npx hardhat autoClaimWithdraw --network mainnet", + }, + { + name: "mainnet_auto_request_lido_withdraw", + schedule: "29,58 12-23,0-8 * * *", + enabled: true, + command: + "cd /app && npx hardhat autoRequestLidoWithdraw --network mainnet", + }, + { + name: "mainnet_auto_claim_lido_withdraw", + schedule: "32 0,12 * * *", + enabled: true, + command: + "cd /app && npx hardhat autoClaimLidoWithdraw --network mainnet", + }, + { + name: "mainnet_auto_request_etherfi_withdraw", + schedule: "10,40 * * * *", + enabled: true, + command: + "cd /app && npx hardhat autoRequestEtherFiWithdraw --network mainnet", + }, + { + name: "mainnet_auto_claim_etherfi_withdraw", + schedule: "40 * * * *", + enabled: true, + command: + "cd /app && npx hardhat autoClaimEtherFiWithdraw --network mainnet", + }, + { + name: "mainnet_auto_request_ethena_withdraw", + schedule: "0 */3 * * *", + enabled: true, + command: + "cd /app && npx hardhat autoRequestEthenaWithdraw --network mainnet", + }, + { + name: "mainnet_auto_claim_ethena_withdraw", + schedule: "40 * * * *", + enabled: true, + command: + "cd /app && npx hardhat autoClaimEthenaWithdraw --network mainnet", + }, + { + name: "mainnet_collect_oeth_fees", + schedule: "3 0 * * *", + enabled: false, + command: "cd /app && npx hardhat collectOETHFees --network mainnet", + }, + { + name: "mainnet_collect_lido_fees", + schedule: "30 12 * * *", + enabled: true, + command: "cd /app && npx hardhat collectLidoFees --network mainnet", + }, + { + name: "mainnet_collect_etherfi_fees", + schedule: "45 23 * * *", + enabled: true, + command: "cd /app && npx hardhat collectEtherFiFees --network mainnet", + }, + { + name: "mainnet_collect_ethena_fees", + schedule: "45 23 * * *", + enabled: true, + command: "cd /app && npx hardhat collectEthenaFees --network mainnet", + }, + { + name: "mainnet_allocate_oeth", + schedule: "42 * * * *", + enabled: false, + command: "cd /app && npx hardhat allocateOETH --network mainnet", + }, + { + name: "mainnet_allocate_lido", + schedule: "38,08 * * * *", + enabled: true, + command: "cd /app && npx hardhat allocateLido --network mainnet", + }, + { + name: "mainnet_allocate_etherfi", + schedule: "52 * * * *", + enabled: false, + command: "cd /app && npx hardhat allocateEtherFi --network mainnet", + }, + { + name: "mainnet_allocate_ethena", + schedule: "28 * * * *", + enabled: true, + command: "cd /app && npx hardhat allocateEthena --network mainnet", + }, + { + name: "mainnet_set_prices_oeth", + schedule: "*/10 * * * *", + enabled: false, + command: "cd /app && npx hardhat setPricesOETH --network mainnet", + }, + { + name: "mainnet_set_prices_lido", + schedule: "*/30 * * * *", + enabled: true, + command: "cd /app && npx hardhat setPricesLido --network mainnet", + }, + { + name: "mainnet_set_prices_etherfi", + schedule: "2,32 * * * *", + enabled: true, + command: "cd /app && npx hardhat setPricesEtherFi --network mainnet", + }, + { + name: "mainnet_set_prices_ethena", + schedule: "0 * * * *", + enabled: true, + command: "cd /app && npx hardhat setPricesEthena --network mainnet", + }, + { + name: "sonic_auto_request_withdraw", + schedule: "48,18 * * * *", + enabled: true, + command: + "cd /app && npx hardhat autoRequestWithdrawSonic --network sonic", + }, + { + name: "sonic_auto_claim_withdraw", + schedule: "58 */2 * * *", + enabled: true, + command: "cd /app && npx hardhat autoClaimWithdrawSonic --network sonic", + }, + { + name: "sonic_collect_fees", + schedule: "55 23 * * *", + enabled: true, + command: "cd /app && npx hardhat collectFeesSonic --network sonic", + }, + { + name: "sonic_allocate", + schedule: "1,31 * * * *", + enabled: true, + command: "cd /app && npx hardhat allocateSonic --network sonic", + }, + { + name: "sonic_set_prices", + schedule: "*/30 * * * *", + enabled: true, + command: "cd /app && npx hardhat setPricesSonic --network sonic", + }, + { + name: "sonic_collect_rewards", + schedule: "45 23 * * *", + enabled: true, + command: "cd /app && npx hardhat collectRewardsSonic --network sonic", + }, + ], +}; + +export default cronConfig; diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts index d75b1fed..43ae8bee 100644 --- a/cron/cron-supervisor.ts +++ b/cron/cron-supervisor.ts @@ -7,8 +7,6 @@ import { type CronJob, renderCrontab } from "./render-crontab"; // --- Configuration --- const host = process.env.HOST || "0.0.0.0"; const port = Number.parseInt(process.env.PORT || "8080", 10); -const cronConfigPath = - process.env.CRON_CONFIG_PATH || "/app/cron/cron-jobs.json"; const cronOutputPath = process.env.CRON_OUTPUT_PATH || "/app/cron/cronjob"; const supercronicBin = process.env.SUPERCRONIC_BIN || "supercronic"; const runHistoryLimit = Number.parseInt( @@ -104,7 +102,6 @@ function storeRun(run: ActionRun) { function initCron() { try { const result = renderCrontab({ - configPath: cronConfigPath, outputPath: cronOutputPath, }); return result; diff --git a/cron/render-crontab.ts b/cron/render-crontab.ts index 1cc15adf..30a924f3 100644 --- a/cron/render-crontab.ts +++ b/cron/render-crontab.ts @@ -1,8 +1,8 @@ import fs from "node:fs"; import path from "node:path"; -const DEFAULT_CONFIG_PATH = - process.env.CRON_CONFIG_PATH || "./cron/cron-jobs.json"; +import cronConfig from "./cron-jobs"; + const DEFAULT_OUTPUT_PATH = process.env.CRON_OUTPUT_PATH || "./cron/cronjob"; export class RenderCrontabError extends Error {} @@ -59,24 +59,15 @@ function assertCronConfig(data: any): asserts data is CronConfig { } } -export function loadCronConfig(configPath = DEFAULT_CONFIG_PATH): CronConfig { - let parsed: any; - try { - parsed = JSON.parse(fs.readFileSync(configPath, "utf8")); - } catch (e: any) { - throw new RenderCrontabError( - `failed to read or parse config "${configPath}": ${e.message}` - ); - } - assertCronConfig(parsed); - return parsed; +export function loadCronConfig(): CronConfig { + assertCronConfig(cronConfig); + return cronConfig; } export function renderCrontab({ - configPath = DEFAULT_CONFIG_PATH, outputPath = DEFAULT_OUTPUT_PATH, } = {}) { - const config = loadCronConfig(configPath); + const config = loadCronConfig(); const enabledJobs = config.jobs.filter((job) => job.enabled); if (enabledJobs.length === 0) { throw new RenderCrontabError("config has zero enabled jobs"); diff --git a/docker-compose.yml b/docker-compose.yml index 865d76da..6362fc38 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,5 @@ services: - LOKI_API_KEY=${LOKI_API_KEY:-} - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} - - CRON_CONFIG_PATH=./cron/cron-jobs.json - CRON_OUTPUT_PATH=./cron/cronjob - DEBUG=arm* From 1c043ae510e22a664ad508816481d117d9e12759 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Sat, 11 Apr 2026 17:08:47 +0800 Subject: [PATCH 11/41] Add structured logging, observability docs, and action runner integration test --- cron/README.md | 60 +++++++++ cron/action-runner.snapshot.jsonl | 13 ++ cron/action-runner.test.ts | 196 ++++++++++++++++++++++++++++++ cron/cron-supervisor.ts | 71 ++++++++--- cron/log-events.ts | 74 +++++++++++ cron/test-action.ts | 42 +++++++ docs/automaton-observability.md | 126 +++++++++++++++++++ src/js/tasks/lib/action.ts | 29 +++-- src/js/tasks/lib/logger.ts | 13 +- tsconfig.json | 6 +- 10 files changed, 595 insertions(+), 35 deletions(-) create mode 100644 cron/README.md create mode 100644 cron/action-runner.snapshot.jsonl create mode 100644 cron/action-runner.test.ts create mode 100644 cron/log-events.ts create mode 100644 cron/test-action.ts create mode 100644 docs/automaton-observability.md diff --git a/cron/README.md b/cron/README.md new file mode 100644 index 00000000..935ff4e8 --- /dev/null +++ b/cron/README.md @@ -0,0 +1,60 @@ +# Automaton + +The cron + supervisor system that runs scheduled hardhat tasks for arm-oeth. A long-running container renders a crontab from a TypeScript registry, executes jobs via [supercronic](https://github.com/aptible/supercronic), exposes a small HTTP API for manual triggers and run inspection, and ships structured logs to Loki for Grafana. + +A sibling Automaton with the same shape and log schema lives in the `origin-dollar` repo. Keep field names (`event`, `source`, `action`, `run_id`, `duration_ms`, `error_*`) in sync across both so a single Grafana dashboard can serve both. + +## Components + +| File | Purpose | +|---|---| +| `cron/cron-jobs.ts` | Job registry — `name`, `schedule` (5-field cron), `enabled`, `command`. Single source of truth. | +| `cron/render-crontab.ts` | Validates the registry (unique names, valid schedules) and writes the supercronic crontab file. | +| `cron/cron-supervisor.ts` | Express HTTP server + supercronic child process. Spawns jobs, tracks runs in memory, exposes `/api/v1/actions`, `/api/v1/actions/:name/runs`, `/api/v1/runs/:id`, `/healthz`. **Owns the canonical Loki run-lifecycle events.** | +| `cron/cron-entrypoint.sh` | Container entrypoint — boots the supervisor under `ts-node`. | +| `src/js/tasks/lib/action.ts` | Wrapper used by every hardhat task. Inherits `AUTOMATON_RUN_ID` from the supervisor, attaches it to a child logger, and emits `action.error` (with stack) on failure. | +| `src/js/tasks/lib/logger.ts` | Winston + winston-loki. Promotes `action`, `event`, `source` to Loki labels. | + +## Adding / enabling / disabling a job + +1. Append (or edit) an entry in `cron/cron-jobs.ts`. Names must be unique; schedules must be valid 5-field cron expressions. +2. Make sure the underlying hardhat task is built on the `action(...)` wrapper from `src/js/tasks/lib/action.ts` — that's where the run-id correlation and error reporting come from. +3. Flip `enabled` to toggle without removing the entry. +4. Redeploy the container (the GitHub Action on the `automation` branch builds and pushes the image). + +`render-crontab.ts` will fail loudly at boot if the registry is malformed — the container won't start with a broken config. + +## Local dev + +Required env vars: + +- `PROVIDER_URL`, `SONIC_URL` — RPC endpoints (same as the rest of the repo) +- `LOKI_URL`, `LOKI_USER`, `LOKI_API_KEY` — optional; if unset, logs only go to stdout +- `ACTION_API_BEARER_TOKEN` — required to start the supervisor (auth for `/api/v1/*`) +- `AUTOMATON_RUN_ID` — set automatically by the supervisor when spawning a job; can be set manually when running a single task standalone if you want it correlated in Loki + +Run a single action without the supervisor: +``` +npx hardhat --network mainnet +``` + +Run the full supervisor locally: +``` +ACTION_API_BEARER_TOKEN=dev npx ts-node cron/cron-supervisor.ts +``` + +## Observability + +Every scheduled invocation produces exactly one `action.start` and exactly one terminal event (`action.success` or `action.failure`) from the supervisor, plus an `action.error` (with stack, chain, network) from the task wrapper if it threw. All four events share a `run_id` for correlation. + +See [`docs/automaton-observability.md`](../docs/automaton-observability.md) for the field schema, the LogQL cookbook, and the recipe for debugging a single failed run end-to-end. + +## Future: Prometheus + +For SLO-grade metrics — p99 latency panels, alert rules with cheap evaluation, "no successful run in N hours" alarms, long-retention dashboards — the right next step is a Prometheus endpoint on the supervisor exposing: + +- `automaton_runs_total{action,status}` — counter +- `automaton_run_duration_seconds{action}` — histogram +- `automaton_last_success_timestamp_seconds{action}` — gauge + +Out of scope for now; logs are sufficient until we want recording rules or sub-second-cost alerting. diff --git a/cron/action-runner.snapshot.jsonl b/cron/action-runner.snapshot.jsonl new file mode 100644 index 00000000..a4d812b6 --- /dev/null +++ b/cron/action-runner.snapshot.jsonl @@ -0,0 +1,13 @@ +{"event":"action.start","source":"supervisor","action":"test_action","run_id":"11111111-1111-1111-1111-111111111111","schedule":"*/5 * * * *","command":"npx ts-node ","level":"info","message":"Started run 11111111-1111-1111-1111-111111111111"} +{"level":"info","action":"test_action","message":"Running on testnet (31337)","run_id":"11111111-1111-1111-1111-111111111111"} +{"level":"info","action":"test_action","message":"Checking balances","run_id":"11111111-1111-1111-1111-111111111111"} +{"level":"info","action":"test_action","message":"Balance: 1000000000000000000 wei","run_id":"11111111-1111-1111-1111-111111111111"} +{"level":"info","action":"test_action","message":"Test action passed","run_id":"11111111-1111-1111-1111-111111111111"} +{"event":"action.success","source":"supervisor","action":"test_action","run_id":"11111111-1111-1111-1111-111111111111","duration_ms":42,"exit_code":0,"signal":null,"level":"info","message":"Completed in 0.0s"} +{"event":"action.start","source":"supervisor","action":"test_action","run_id":"22222222-2222-2222-2222-222222222222","schedule":"0 0 * * *","command":"npx ts-node --fail","level":"info","message":"Started run 22222222-2222-2222-2222-222222222222"} +{"level":"info","action":"test_action","message":"Running on testnet (31337)","run_id":"22222222-2222-2222-2222-222222222222"} +{"level":"info","action":"test_action","message":"Checking balances","run_id":"22222222-2222-2222-2222-222222222222"} +{"level":"info","action":"test_action","message":"Balance: 1000000000000000000 wei","run_id":"22222222-2222-2222-2222-222222222222"} +{"level":"error","action":"test_action","message":"Error: Simulated failure for testing","run_id":"22222222-2222-2222-2222-222222222222","event":"action.error","source":"task","chain_id":31337,"network":"testnet","duration_ms":"","error_name":"Error","error_message":"Simulated failure for testing"} +{"event":"action.failure","source":"supervisor","action":"test_action","run_id":"22222222-2222-2222-2222-222222222222","duration_ms":11398,"exit_code":1,"signal":null,"level":"error","message":"Failed after 11.4s (exit=1)"} +{"event":"action.failure","source":"supervisor","action":"test_action","run_id":"33333333-3333-3333-3333-333333333333","duration_ms":5,"spawn_failed":true,"error_message":"ENOENT: no such file or directory, posix_spawn '/bin/sh'","level":"error","message":"Failed to spawn: ENOENT: no such file or directory, posix_spawn '/bin/sh'"} diff --git a/cron/action-runner.test.ts b/cron/action-runner.test.ts new file mode 100644 index 00000000..a5be5cea --- /dev/null +++ b/cron/action-runner.test.ts @@ -0,0 +1,196 @@ +// Integration test for the supervisor's action execution + structured logging. +// +// Spawns a real test action (cron/test-action.ts) through the same code path +// the supervisor uses. Captures both supervisor-level events and the action's +// own log output, then compares the combined stream against a golden snapshot. +// +// Run with: npx ts-node cron/action-runner.test.ts +// Update snapshot: npx ts-node cron/action-runner.test.ts --update + +import { spawn } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import { format, transports } from "winston"; +import logger from "../src/js/tasks/lib/logger"; +import { + emitActionExit, + emitActionStart, + emitSpawnFailure, +} from "./log-events"; + +const SNAPSHOT_PATH = path.join(__dirname, "action-runner.snapshot.jsonl"); +const updateSnapshot = process.argv.includes("--update"); +const testActionScript = path.join(__dirname, "test-action.ts"); + +// --- Winston capture --------------------------------------------------------- + +const captured: Record[] = []; +const captureFormat = format((info) => { + captured.push({ ...info }); + return false; +}); +logger.add(new transports.Console({ format: captureFormat() })); + +/** Strip volatile fields for stable comparison. */ +function stabilize(record: Record): Record { + const isTaskRecord = record.source === "task"; + const out: Record = {}; + for (const [k, v] of Object.entries(record)) { + if (k === "timestamp") continue; + if (k === "duration_ms" && isTaskRecord) { + out[k] = ""; + continue; + } + if (k === "command" && typeof v === "string") { + out[k] = v.replace(testActionScript, ""); + continue; + } + out[k] = v; + } + return out; +} + +/** + * Parse a console log line from the action child process. + * Format: ` : [] {json}` + */ +function parseLogLine(line: string): Record | null { + const match = line.match( + /^\S+\s+(\w+):\s+(?:\[(\w+)\]\s+)?(.+?)(?:\s+(\{.+\}))?$/ + ); + if (!match) return null; + const [, level, action, message, jsonStr] = match; + const extra = jsonStr ? JSON.parse(jsonStr) : {}; + return { level, action, message, ...extra }; +} + +// --- Helpers ----------------------------------------------------------------- + +const RUN_IDS = { + success: "11111111-1111-1111-1111-111111111111", + failure: "22222222-2222-2222-2222-222222222222", + spawnFail: "33333333-3333-3333-3333-333333333333", +}; + +function spawnTestAction( + args: string[], + runId: string +): Promise<{ + exitCode: number | null; + signal: NodeJS.Signals | null; + logs: Record[]; +}> { + return new Promise((resolve) => { + const child = spawn("npx", ["ts-node", testActionScript, ...args], { + env: { ...process.env, AUTOMATON_RUN_ID: runId }, + stdio: ["ignore", "pipe", "pipe"], + }); + + let stdout = ""; + let stderr = ""; + child.stdout.on("data", (d: Buffer) => (stdout += d)); + child.stderr.on("data", (d: Buffer) => (stderr += d)); + + child.on("exit", (code, signal) => { + const allOutput = (stdout + stderr).trim(); + const logs: Record[] = []; + for (const line of allOutput.split("\n")) { + if (!line.trim()) continue; + const parsed = parseLogLine(line.trim()); + if (parsed) logs.push(parsed); + } + resolve({ exitCode: code, signal, logs }); + }); + }); +} + +// --- Scenarios --------------------------------------------------------------- + +async function runSuccessScenario() { + const action = "test_action"; + const runId = RUN_IDS.success; + const schedule = "*/5 * * * *"; + const command = `npx ts-node ${testActionScript}`; + + emitActionStart({ action, runId, schedule, command }); + const result = await spawnTestAction([], runId); + for (const log of result.logs) captured.push(log); + emitActionExit({ + action, + runId, + durationMs: 42, + exitCode: result.exitCode, + signal: result.signal, + }); +} + +async function runFailureScenario() { + const action = "test_action"; + const runId = RUN_IDS.failure; + const schedule = "0 0 * * *"; + const command = `npx ts-node ${testActionScript} --fail`; + + emitActionStart({ action, runId, schedule, command }); + const result = await spawnTestAction(["--fail"], runId); + for (const log of result.logs) captured.push(log); + emitActionExit({ + action, + runId, + durationMs: 11398, + exitCode: result.exitCode, + signal: result.signal, + }); +} + +async function runSpawnFailureScenario() { + emitSpawnFailure({ + action: "test_action", + runId: RUN_IDS.spawnFail, + durationMs: 5, + errorMessage: "ENOENT: no such file or directory, posix_spawn '/bin/sh'", + }); +} + +// --- Main -------------------------------------------------------------------- + +async function main() { + await runSuccessScenario(); + await runFailureScenario(); + await runSpawnFailureScenario(); + + const stable = captured.map(stabilize); + const actualJsonl = stable.map((r) => JSON.stringify(r)).join("\n") + "\n"; + + if (updateSnapshot) { + fs.writeFileSync(SNAPSHOT_PATH, actualJsonl, "utf8"); + console.log(`Snapshot updated: ${SNAPSHOT_PATH}`); + console.log(actualJsonl); + return; + } + + if (!fs.existsSync(SNAPSHOT_PATH)) { + console.error( + "No snapshot found. Run with --update to create it:\n" + + " npx ts-node cron/action-runner.test.ts --update" + ); + process.exit(1); + } + + const expected = fs.readFileSync(SNAPSHOT_PATH, "utf8"); + if (actualJsonl === expected) { + console.log("OK — log output matches snapshot"); + console.log(` ${stable.length} records across 3 scenarios`); + } else { + console.error("FAIL — log output does not match snapshot\n"); + console.error("Expected:"); + console.error(expected); + console.error("Actual:"); + console.error(actualJsonl); + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts index 43ae8bee..1c2df746 100644 --- a/cron/cron-supervisor.ts +++ b/cron/cron-supervisor.ts @@ -2,6 +2,12 @@ import { spawn } from "node:child_process"; import { randomUUID, timingSafeEqual } from "node:crypto"; import fs from "node:fs"; import http from "node:http"; +import { flushLogger } from "../src/js/tasks/lib/logger"; +import { + emitActionExit, + emitActionStart, + emitSpawnFailure, +} from "./log-events"; import { type CronJob, renderCrontab } from "./render-crontab"; // --- Configuration --- @@ -11,7 +17,7 @@ const cronOutputPath = process.env.CRON_OUTPUT_PATH || "/app/cron/cronjob"; const supercronicBin = process.env.SUPERCRONIC_BIN || "supercronic"; const runHistoryLimit = Number.parseInt( process.env.ACTION_RUN_HISTORY_LIMIT || "500", - 10 + 10, ); const actionApiToken = process.env.ACTION_API_BEARER_TOKEN; const configuredActionWorkdir = process.env.ACTION_WORKDIR || "/app"; @@ -22,13 +28,13 @@ if (!Number.isInteger(port) || port < 1 || port > 65535) { } if (!actionApiToken || actionApiToken.trim().length === 0) { console.error( - "[cron-supervisor] ACTION_API_BEARER_TOKEN must be set and non-empty" + "[cron-supervisor] ACTION_API_BEARER_TOKEN must be set and non-empty", ); process.exit(1); } if (!Number.isInteger(runHistoryLimit) || runHistoryLimit < 1) { console.error( - `[cron-supervisor] Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"` + `[cron-supervisor] Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"`, ); process.exit(1); } @@ -40,7 +46,7 @@ const actionWorkdir = fs.existsSync(configuredActionWorkdir) if (!fs.existsSync(configuredActionWorkdir)) { console.warn( - `[cron-supervisor] ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead` + `[cron-supervisor] ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead`, ); } @@ -50,7 +56,7 @@ function json( res: http.ServerResponse, statusCode: number, payload: any, - extraHeaders: Record = {} + extraHeaders: Record = {}, ) { res.writeHead(statusCode, { "Content-Type": "application/json", @@ -114,13 +120,13 @@ function initCron() { const { config: renderedConfig, enabledJobs } = initCron(); console.log( - `[cron-supervisor] Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}` + `[cron-supervisor] Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}`, ); console.log(`[cron-supervisor] Generated ${cronOutputPath}:`); console.log(fs.readFileSync(cronOutputPath, "utf8")); const jobsByName = new Map( - renderedConfig.jobs.map((job) => [job.name, job]) + renderedConfig.jobs.map((job) => [job.name, job]), ); // --- Action execution --- @@ -129,14 +135,21 @@ function runAction(action: CronJob, run: ActionRun) { run.status = "running"; run.startedAt = nowIso(); run.command = action.command; + const startMs = Date.now(); console.log( - `[cron-supervisor] Starting run ${run.runId} for action "${action.name}"` + `[cron-supervisor] Starting run ${run.runId} for action "${action.name}"`, ); + emitActionStart({ + action: action.name, + runId: run.runId, + schedule: action.schedule, + command: action.command, + }); const child = spawn("/bin/sh", ["-lc", action.command], { cwd: actionWorkdir, - env: process.env, + env: { ...process.env, AUTOMATON_RUN_ID: run.runId }, stdio: "inherit", }); run.pid = child.pid ?? null; @@ -148,8 +161,15 @@ function runAction(action: CronJob, run: ActionRun) { run.signal = null; run.error = err.message; console.error( - `[cron-supervisor] Run ${run.runId} failed to start: ${err.message}` + `[cron-supervisor] Run ${run.runId} failed to start: ${err.message}`, ); + emitSpawnFailure({ + action: action.name, + runId: run.runId, + durationMs: Date.now() - startMs, + errorMessage: err.message, + }); + void flushLogger(); }); child.on("exit", (code, signal) => { @@ -158,8 +178,16 @@ function runAction(action: CronJob, run: ActionRun) { run.signal = signal; run.status = code === 0 ? "succeeded" : "failed"; console.log( - `[cron-supervisor] Run ${run.runId} for "${action.name}" finished with status=${run.status}, code=${code}, signal=${signal}` + `[cron-supervisor] Run ${run.runId} for "${action.name}" finished with status=${run.status}, code=${code}, signal=${signal}`, ); + emitActionExit({ + action: action.name, + runId: run.runId, + durationMs: Date.now() - startMs, + exitCode: code, + signal, + }); + void flushLogger(); }); } @@ -212,7 +240,7 @@ supercronic.on("exit", (code, signal) => { supercronicClosed = true; if (!shuttingDown) { console.error( - `[cron-supervisor] supercronic exited unexpectedly (code=${code}, signal=${signal})` + `[cron-supervisor] supercronic exited unexpectedly (code=${code}, signal=${signal})`, ); process.exit(typeof code === "number" ? code : 1); } @@ -262,7 +290,7 @@ const server = http.createServer((req, res) => { // Trigger action run const triggerMatch = url.pathname.match( - /^\/api\/v1\/actions\/([^/]+)\/runs$/ + /^\/api\/v1\/actions\/([^/]+)\/runs$/, ); if (method === "POST" && triggerMatch) { const run = triggerAction(decodeURIComponent(triggerMatch[1])); @@ -279,7 +307,7 @@ const server = http.createServer((req, res) => { statusUrl, startedAt: run.startedAt, }, - { Location: statusUrl } + { Location: statusUrl }, ); } @@ -314,11 +342,16 @@ server.on("close", () => { // --- Graceful shutdown --- -function shutdown(signal: string) { +async function shutdown(signal: string) { if (shuttingDown) return; shuttingDown = true; console.log(`[cron-supervisor] Shutting down (signal=${signal})`); + try { + await flushLogger(); + } catch (err: any) { + console.error(`[cron-supervisor] flushLogger failed: ${err?.message}`); + } server.close(); if (supercronicAlive && supercronic.exitCode === null) { @@ -331,8 +364,12 @@ function shutdown(signal: string) { setTimeout(() => process.exit(0), 12_000).unref(); } -process.on("SIGTERM", () => shutdown("SIGTERM")); -process.on("SIGINT", () => shutdown("SIGINT")); +process.on("SIGTERM", () => { + void shutdown("SIGTERM"); +}); +process.on("SIGINT", () => { + void shutdown("SIGINT"); +}); server.listen(port, host, () => { console.log(`[cron-supervisor] API listening on ${host}:${port}`); diff --git a/cron/log-events.ts b/cron/log-events.ts new file mode 100644 index 00000000..dfd3064c --- /dev/null +++ b/cron/log-events.ts @@ -0,0 +1,74 @@ +// Structured log events emitted by the Automaton supervisor. +// +// These helpers exist as a separate module so the exact shape of every +// supervisor-side Loki record can be unit-tested in isolation, without +// having to spawn supercronic or stand up the HTTP server. +// +// Schema is documented in cron/README.md and docs/automaton-observability.md. +// The sibling Automaton in `origin-dollar` emits the same shapes. + +import logger, { flushLogger } from "../src/js/tasks/lib/logger"; + +export interface ActionStartFields { + action: string; + runId: string; + schedule: string; + command: string; +} + +export function emitActionStart(f: ActionStartFields): void { + logger.info(`Started run ${f.runId}`, { + event: "action.start", + source: "supervisor", + action: f.action, + run_id: f.runId, + schedule: f.schedule, + command: f.command, + }); +} + +export interface ActionExitFields { + action: string; + runId: string; + durationMs: number; + exitCode: number | null; + signal: NodeJS.Signals | null; +} + +export function emitActionExit(f: ActionExitFields): void { + const success = f.exitCode === 0; + const event = success ? "action.success" : "action.failure"; + const msg = success + ? `Completed in ${(f.durationMs / 1000).toFixed(1)}s` + : `Failed after ${(f.durationMs / 1000).toFixed(1)}s (exit=${f.exitCode}${f.signal ? `, signal=${f.signal}` : ""})`; + logger[success ? "info" : "error"](msg, { + event, + source: "supervisor", + action: f.action, + run_id: f.runId, + duration_ms: f.durationMs, + exit_code: f.exitCode, + signal: f.signal, + }); +} + +export interface SpawnFailureFields { + action: string; + runId: string; + durationMs: number; + errorMessage: string; +} + +export function emitSpawnFailure(f: SpawnFailureFields): void { + logger.error(`Failed to spawn: ${f.errorMessage}`, { + event: "action.failure", + source: "supervisor", + action: f.action, + run_id: f.runId, + duration_ms: f.durationMs, + spawn_failed: true, + error_message: f.errorMessage, + }); +} + +export { flushLogger }; diff --git a/cron/test-action.ts b/cron/test-action.ts new file mode 100644 index 00000000..434cc0f8 --- /dev/null +++ b/cron/test-action.ts @@ -0,0 +1,42 @@ +// Minimal test action that mimics the real action() wrapper's logging pattern. +// Used by action-runner.test.ts — no network or signer required. + +import logger, { flushLogger } from "../src/js/tasks/lib/logger"; + +const runId = process.env.AUTOMATON_RUN_ID; +const shouldFail = process.argv.includes("--fail"); + +const log = logger.child({ + action: "test_action", + ...(runId ? { run_id: runId } : {}), +}); + +async function main() { + const startTime = Date.now(); + try { + log.info("Running on testnet (31337)"); + log.info("Checking balances"); + log.info("Balance: 1000000000000000000 wei"); + + if (shouldFail) { + throw new Error("Simulated failure for testing"); + } + + log.info("Test action passed"); + } catch (err: any) { + log.error(`${err.name}: ${err.message}`, { + event: "action.error", + source: "task", + chain_id: 31337, + network: "testnet", + duration_ms: Date.now() - startTime, + error_name: err.name, + error_message: err.message, + }); + process.exitCode = 1; + } finally { + await flushLogger(); + } +} + +main(); diff --git a/docs/automaton-observability.md b/docs/automaton-observability.md new file mode 100644 index 00000000..28f4bb4f --- /dev/null +++ b/docs/automaton-observability.md @@ -0,0 +1,126 @@ +# Automaton observability cookbook + +How to answer operational questions about the [Automaton](../cron/README.md) using Loki + Grafana. The same schema is emitted by the sibling Automaton in `origin-dollar` — swap `app="arm-oeth"` for `app="origin-dollar"` and every query below works there too. + +## Event model + +Every scheduled invocation produces: + +1. **Exactly one `action.start`** from the supervisor, the moment the child is spawned. +2. **Exactly one terminal event** from the supervisor: `action.success` (exit 0) or `action.failure` (non-zero exit, signal, or spawn error). +3. **Optionally, one `action.error`** from the task wrapper if it threw — carries the error class, message, stack, chain, and network. +4. Any number of in-flight `info`/`debug` lines the task itself emitted. + +All events for one run share the same `run_id`. Use it as the join key when investigating. + +The supervisor owns events 1 and 2. **Even if the child crashes, OOMs, segfaults, or never starts**, the supervisor still produces both — counts and rates stay correct on the worst days. + +## Field schema + +| Field | Type | Label? | Appears on | Notes | +|---|---|---|---|---| +| `app` | string | **label** | all | Always `arm-oeth` (or `origin-dollar` in the sibling repo). | +| `action` | string | **label** | all | The job name from `cron-jobs.ts`. ~30 distinct values. | +| `event` | string | **label** | start/success/failure/error | One of `action.start`, `action.success`, `action.failure`, `action.error`. | +| `source` | string | **label** | start/success/failure/error | `supervisor` for run-lifecycle events, `task` for `action.error`. | +| `run_id` | UUID | field | all | Correlation key. Field, not label, to keep cardinality bounded. | +| `duration_ms` | number | field | success/failure/error | Wall-clock from supervisor spawn (or task wrapper start) to terminal event. | +| `exit_code` | number\|null | field | success/failure | From the child process. `null` on spawn failure. | +| `signal` | string\|null | field | success/failure | e.g. `SIGKILL` (often = OOM-killed when paired with code 137). | +| `spawn_failed` | bool | field | failure | Set when the child couldn't be spawned at all. | +| `schedule` | string | field | start | The cron expression for the job. | +| `command` | string | field | start | The shell command being executed. | +| `chain_id` | number | field | error | Resolved chain id, if signer setup got that far. | +| `network` | string | field | error | Human network name (`mainnet`, `sonic`, …). | +| `error_name` | string | field | error | Error class (`Error`, `ProviderError`, …). | +| `error_message` | string | field | error | The thrown message. | +| `error_stack` | string | field | error | Full JS stack trace. | + +**Why labels are restricted to `action`, `event`, `source`:** Loki indexes labels, so high-cardinality labels blow up the index. `run_id` (UUIDs), `error_message` (free text), and numeric fields like `duration_ms` would all be cardinality bombs. They're still queryable via `| json` extraction; you just can't use them in stream selectors. + +## Common questions → queries + +### How many runs of X happened this week? + +```logql +sum(count_over_time({app="arm-oeth", action="autoRequestLidoWithdraw", event="action.start"}[7d])) +``` + +### How many of those failed? + +```logql +sum(count_over_time({app="arm-oeth", action="autoRequestLidoWithdraw", event="action.failure"}[7d])) +``` + +### Why did a particular run fail? + +Find recent failures, then pivot on `run_id`: + +```logql +{app="arm-oeth", event="action.error"} + | json + | line_format "{{.action}} [{{.run_id}}] {{.error_name}}: {{.error_message}}" +``` + +Pick a `run_id` from the result, then: + +```logql +{app="arm-oeth"} | json | run_id="" +``` + +That returns the full breadcrumb in time order: `action.start` → in-flight info lines from the task → `action.error` (with stack) → supervisor's `action.failure` (with exit code/signal). Usually enough to fix without rerunning locally. + +### Average runtime per action + +```logql +avg by (action) ( + avg_over_time( + {app="arm-oeth", event=~"action.success|action.failure", source="supervisor"} + | json | unwrap duration_ms [7d] + ) +) +``` + +p95 instead: + +```logql +quantile_over_time(0.95, + {app="arm-oeth", event=~"action.success|action.failure", source="supervisor"} + | json | unwrap duration_ms [7d] +) by (action) +``` + +### Success rate per action + +```logql +sum by (action) (count_over_time({app="arm-oeth", event="action.success"}[7d])) +/ +sum by (action) (count_over_time({app="arm-oeth", event="action.start"}[7d])) +``` + +Using `action.start` as the denominator (rather than success+failure) catches the pathological case where a run started but no terminal event was ever emitted — the ratio drops below 1.0 and you notice. + +### Crashed-without-explanation runs + +Runs that produced an `action.failure` with **no** preceding `action.error`. These are the ones where the child died before reaching the task wrapper (OOM, parse error, missing env var, signal). Fewest moving parts: + +```logql +{app="arm-oeth", event="action.failure", source="supervisor"} | json | exit_code=137 +``` + +Code 137 + `SIGKILL` is almost always OOM. Code 1 with no `action.error` for the same `run_id` usually means the hardhat process failed before importing the task wrapper. + +## Known limitation: log loss on hard kill + +Log shipping is direct from the supervisor process to Loki via winston-loki's HTTP transport, batched on a 5ms interval. On graceful `SIGTERM` we `await flushLogger()` before exiting. On `SIGKILL` (OOM-killer, `kill -9`, container force-stop) the in-flight batch dies with the process and those events are lost. Fully fixing this would require a stdout-scraping sidecar (promtail / grafana-agent / alloy) — out of scope. In practice the gap is small: supervisor lifecycle events are emitted at job boundaries, not mid-job, so the window for loss is narrow. + +## When to graduate to Prometheus + +Symptoms that mean log queries have outgrown their usefulness: + +- Grafana panels are slow to render because they re-scan the log stream. +- You want recording rules so dashboards don't recompute on every refresh. +- You want alerts on "no successful run in the last N minutes" with cheap evaluation. +- You want long-retention metrics (months) without paying log-storage costs. + +When that happens, add a `/metrics` endpoint to `cron-supervisor.ts` exposing `automaton_runs_total{action,status}`, `automaton_run_duration_seconds{action}` (histogram), and `automaton_last_success_timestamp_seconds{action}` (gauge). The log schema stays as-is for debugging — metrics complement it, they don't replace it. diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 48dadc22..6d190a0b 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -38,16 +38,20 @@ export function action(config: ActionConfig) { } definition.setAction(async (taskArgs: Record) => { - const log = logger.child({ action: name }); + const runId = process.env.AUTOMATON_RUN_ID; + const log = logger.child({ + action: name, + ...(runId ? { run_id: runId } : {}), + }); const startTime = Date.now(); - - log.info("Starting"); + let chainId: number | undefined; + let networkName: string | undefined; try { const signer = await getSigner(); const network = await signer.provider!.getNetwork(); - const chainId = Number(network.chainId); - const networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; + chainId = Number(network.chainId); + networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; if (chains && !chains.includes(chainId)) { const valid = chains @@ -60,12 +64,17 @@ export function action(config: ActionConfig) { log.info(`Running on ${networkName} (${chainId})`); await run({ signer, chainId, networkName, log, args: taskArgs }); - - const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); - log.info(`Completed in ${elapsed}s`); } catch (err: any) { - const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); - log.error(`Failed after ${elapsed}s: ${err.message}`); + log.error(`${err?.name ?? "Error"}: ${err?.message ?? String(err)}`, { + event: "action.error", + source: "task", + chain_id: chainId, + network: networkName, + duration_ms: Date.now() - startTime, + error_name: err?.name ?? "Error", + error_message: err?.message ?? String(err), + error_stack: err?.stack, + }); throw err; } finally { await flushLogger(); diff --git a/src/js/tasks/lib/logger.ts b/src/js/tasks/lib/logger.ts index 904302bf..f142ae84 100644 --- a/src/js/tasks/lib/logger.ts +++ b/src/js/tasks/lib/logger.ts @@ -27,10 +27,17 @@ if (lokiUrl) { labels: { app: "arm-oeth" }, json: true, format: format.combine( - // Promote "action" from metadata to a Loki label + // Promote select low-cardinality fields from metadata to Loki labels. + // Keep high-cardinality fields (run_id, error_*, duration_ms, chain_id) + // as JSON fields — they're still queryable via `| json`. format((info) => { - if (info.action) { - info.labels = { ...(info.labels || {}), action: info.action }; + const LABEL_FIELDS = ["action", "event", "source"] as const; + const labels: Record = {}; + for (const k of LABEL_FIELDS) { + if (info[k]) labels[k] = String(info[k]); + } + if (Object.keys(labels).length) { + info.labels = { ...(info.labels || {}), ...labels }; } return info; })(), diff --git a/tsconfig.json b/tsconfig.json index 29021d81..4eef4a3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,10 +12,6 @@ "outDir": "dist", "types": ["node"] }, - "include": [ - "src/js/**/*.ts", - "cron/cron-supervisor.ts", - "cron/render-crontab.ts" - ], + "include": ["src/js/**/*.ts", "cron/**/*.ts"], "exclude": ["node_modules", "dist"] } From 63a6ed754961bdab08fd36b001ce0b8eef8fa7b5 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Sat, 11 Apr 2026 21:08:51 +0800 Subject: [PATCH 12/41] Add shared Postgres nonce queue for cross-repo transaction serialization Both origin-dollar and arm-oeth cron containers use the same KMS signer, risking nonce collisions when transactions are sent concurrently. This adds a Postgres-backed nonce lock that wraps the signer transparently via SELECT ... FOR UPDATE, holding the row lock for the full tx lifecycle. - nonceQueue.ts: withNonceLock + wrapWithNonceQueue signer wrapper - action.ts: conditionally wraps signer when DATABASE_URL is set - docker-compose.yml: adds postgres service for local dev - cron-supervisor.ts: pool cleanup on shutdown - Includes integration tests verifying lock serialization --- cron/cron-supervisor.ts | 7 + docker-compose.yml | 21 +++ package.json | 4 + src/js/tasks/lib/action.ts | 8 +- src/js/tasks/lib/nonceQueue.test.ts | 223 ++++++++++++++++++++++++++++ src/js/tasks/lib/nonceQueue.ts | 189 +++++++++++++++++++++++ yarn.lock | 97 ++++++++++++ 7 files changed, 546 insertions(+), 3 deletions(-) create mode 100644 src/js/tasks/lib/nonceQueue.test.ts create mode 100644 src/js/tasks/lib/nonceQueue.ts diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts index 1c2df746..f8f6bedd 100644 --- a/cron/cron-supervisor.ts +++ b/cron/cron-supervisor.ts @@ -3,6 +3,7 @@ import { randomUUID, timingSafeEqual } from "node:crypto"; import fs from "node:fs"; import http from "node:http"; import { flushLogger } from "../src/js/tasks/lib/logger"; +import { getNoncePool } from "../src/js/tasks/lib/nonceQueue"; import { emitActionExit, emitActionStart, @@ -352,6 +353,12 @@ async function shutdown(signal: string) { } catch (err: any) { console.error(`[cron-supervisor] flushLogger failed: ${err?.message}`); } + try { + const pool = getNoncePool(); + if (pool) await pool.end(); + } catch (err: any) { + console.error(`[cron-supervisor] noncePool close failed: ${err?.message}`); + } server.close(); if (supercronicAlive && supercronic.exitCode === null) { diff --git a/docker-compose.yml b/docker-compose.yml index 6362fc38..fb0edba8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,29 @@ services: + postgres: + image: postgres:16-alpine + environment: + POSTGRES_DB: nonce_queue + POSTGRES_USER: nonce + POSTGRES_PASSWORD: nonce + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U nonce -d nonce_queue"] + interval: 5s + timeout: 3s + retries: 5 + actions: build: context: . dockerfile: dockerfile-actions + depends_on: + postgres: + condition: service_healthy ports: - "8080:8080" environment: + - DATABASE_URL=${DATABASE_URL:-postgresql://nonce:nonce@postgres:5432/nonce_queue} - MAINNET_URL=${MAINNET_URL:-} - SONIC_URL=${SONIC_URL:-} - HOLESKY_URL=${HOLESKY_URL:-} @@ -17,3 +35,6 @@ services: - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} - CRON_OUTPUT_PATH=./cron/cronjob - DEBUG=arm* + +volumes: + pgdata: diff --git a/package.json b/package.json index b676b3a6..0903e73b 100644 --- a/package.json +++ b/package.json @@ -43,5 +43,9 @@ "typescript": "^5.7.0", "winston": "^3.17.0", "winston-loki": "^6.1.3" + }, + "dependencies": { + "@types/pg": "^8.20.0", + "pg": "^8.20.0" } } diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 6d190a0b..8a75bdc4 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -5,6 +5,7 @@ import type { Logger } from "winston"; import { getSigner } from "../../utils/signers"; import logger, { flushLogger } from "./logger"; +import { wrapWithNonceQueue } from "./nonceQueue"; export interface ActionContext { signer: Signer; @@ -48,9 +49,10 @@ export function action(config: ActionConfig) { let networkName: string | undefined; try { - const signer = await getSigner(); - const network = await signer.provider!.getNetwork(); + const rawSigner = await getSigner(); + const network = await rawSigner.provider!.getNetwork(); chainId = Number(network.chainId); + const signer = wrapWithNonceQueue(rawSigner, chainId); networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; if (chains && !chains.includes(chainId)) { @@ -58,7 +60,7 @@ export function action(config: ActionConfig) { .map((id) => `${CHAIN_NAMES[id] ?? id} (${id})`) .join(", "); throw new Error( - `${name} only supports ${valid}, not ${networkName} (${chainId})` + `${name} only supports ${valid}, not ${networkName} (${chainId})`, ); } diff --git a/src/js/tasks/lib/nonceQueue.test.ts b/src/js/tasks/lib/nonceQueue.test.ts new file mode 100644 index 00000000..5bda6f27 --- /dev/null +++ b/src/js/tasks/lib/nonceQueue.test.ts @@ -0,0 +1,223 @@ +/** + * Integration test for the Postgres nonce queue. + * + * Prerequisites: + * docker run -d --name nonce-test-pg -p 5433:5432 \ + * -e POSTGRES_DB=nonce_test -e POSTGRES_USER=test -e POSTGRES_PASSWORD=test \ + * postgres:16-alpine + * + * Run: + * DATABASE_URL=postgresql://test:test@localhost:5433/nonce_test \ + * npx ts-node src/js/tasks/lib/nonceQueue.test.ts + */ + +import { Pool } from "pg"; + +if (!process.env.DATABASE_URL) { + console.error( + "Set DATABASE_URL to run this test, e.g.:\n" + + " DATABASE_URL=postgresql://test:test@localhost:5433/nonce_test npx ts-node src/js/tasks/lib/nonceQueue.test.ts", + ); + process.exit(1); +} + +import { + wrapWithNonceQueue, + getNoncePool, + _resetForTesting, +} from "./nonceQueue"; + +// Minimal mock signer for testing (ethers v6 interface) +function createMockSigner( + address: string, + onSend: (nonce: number) => Promise, +) { + const signer: any = { + getAddress: async () => address, + getNonce: async () => 0, // ethers v6 uses getNonce instead of getTransactionCount + provider: { + getNetwork: async () => ({ chainId: 1n }), // v6 returns bigint + }, + sendTransaction: async (tx: any) => { + await onSend(tx.nonce); + return { + hash: "0x" + Math.random().toString(16).slice(2), + from: address, + nonce: tx.nonce, + wait: async () => ({ status: 1 }), + }; + }, + signMessage: async () => "0x", + signTransaction: async () => "0x", + connect: () => signer, + }; + return signer; +} + +/** Drop and recreate table, reset module state */ +async function resetAll() { + const existing = getNoncePool(); + if (existing) await existing.end(); + _resetForTesting(); + + const tmpPool = new Pool({ connectionString: process.env.DATABASE_URL }); + await tmpPool.query("DROP TABLE IF EXISTS nonce_queue"); + await tmpPool.end(); +} + +async function test() { + const results: { + id: number; + nonce: number; + startMs: number; + endMs: number; + }[] = []; + + // --- Test 1 --- + console.log("--- Test 1: Sequential nonce assignment ---"); + await resetAll(); + + const signer1 = createMockSigner("0xaaaa", async (nonce) => { + results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); + await new Promise((r) => setTimeout(r, 100)); + results[results.length - 1].endMs = Date.now(); + }); + + const wrapped1 = wrapWithNonceQueue(signer1, 1); + + for (let i = 0; i < 3; i++) { + await wrapped1.sendTransaction({ to: "0xbbbb", data: "0x" }); + } + + console.log("Results:", results.map((r) => `nonce=${r.nonce}`).join(", ")); + const nonces = results.map((r) => r.nonce); + console.assert( + nonces[0] === 0 && nonces[1] === 1 && nonces[2] === 2, + `Expected nonces [0,1,2] but got [${nonces}]`, + ); + console.log("PASS: Sequential nonces assigned correctly\n"); + + // --- Test 2 --- + console.log("--- Test 2: Concurrent processes block on lock ---"); + results.length = 0; + await resetAll(); + + const signer2a = createMockSigner("0xaaaa", async (nonce) => { + results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); + await new Promise((r) => setTimeout(r, 500)); // Hold lock for 500ms + results[results.length - 1].endMs = Date.now(); + }); + const signer2b = createMockSigner("0xaaaa", async (nonce) => { + results.push({ id: 2, nonce, startMs: Date.now(), endMs: 0 }); + await new Promise((r) => setTimeout(r, 100)); + results[results.length - 1].endMs = Date.now(); + }); + + const wrapped2a = wrapWithNonceQueue(signer2a, 1); + const wrapped2b = wrapWithNonceQueue(signer2b, 1); + + const p1 = wrapped2a.sendTransaction({ to: "0xbbbb", data: "0x" }); + // Small delay so both connections are open and racing for the lock + await new Promise((r) => setTimeout(r, 50)); + const p2 = wrapped2b.sendTransaction({ to: "0xbbbb", data: "0x" }); + + await Promise.all([p1, p2]); + + console.log( + "Results:", + results.map((r) => `id=${r.id} nonce=${r.nonce}`).join(", "), + ); + + const sortedNonces = results.map((r) => r.nonce).sort(); + console.assert( + sortedNonces[0] === 0 && sortedNonces[1] === 1, + `Expected nonces [0,1] but got [${sortedNonces}]`, + ); + + const sorted = [...results].sort((a, b) => a.startMs - b.startMs); + const gap = sorted[1].startMs - sorted[0].endMs; + console.log( + ` First tx: ${sorted[0].startMs}-${sorted[0].endMs} (${sorted[0].endMs - sorted[0].startMs}ms)`, + ); + console.log( + ` Second tx: ${sorted[1].startMs}-${sorted[1].endMs} (${sorted[1].endMs - sorted[1].startMs}ms)`, + ); + console.log(` Gap between first end and second start: ${gap}ms`); + console.assert( + gap >= -50, + `Second tx started ${-gap}ms BEFORE first finished — lock didn't serialize!`, + ); + console.log("PASS: Concurrent transactions serialized correctly\n"); + + // --- Test 3 --- + console.log("--- Test 3: Different chains have independent nonces ---"); + results.length = 0; + await resetAll(); + + const signer3a = createMockSigner("0xaaaa", async (nonce) => { + results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); + }); + const signer3b = createMockSigner("0xaaaa", async (nonce) => { + results.push({ id: 2, nonce, startMs: Date.now(), endMs: 0 }); + }); + + const wrappedMainnet = wrapWithNonceQueue(signer3a, 1); + const wrappedSonic = wrapWithNonceQueue(signer3b, 146); + + await wrappedMainnet.sendTransaction({ to: "0xbbbb", data: "0x" }); + await wrappedSonic.sendTransaction({ to: "0xbbbb", data: "0x" }); + + console.log( + "Results:", + results.map((r) => `chain=${r.id} nonce=${r.nonce}`).join(", "), + ); + console.assert( + results[0].nonce === 0 && results[1].nonce === 0, + `Expected both nonces to be 0 but got [${results.map((r) => r.nonce)}]`, + ); + console.log("PASS: Independent nonces per chain\n"); + + // --- Test 4 --- + console.log("--- Test 4: Rollback on failure keeps nonce ---"); + results.length = 0; + await resetAll(); + + let callCount = 0; + const signerFail = createMockSigner("0xaaaa", async (nonce) => { + callCount++; + results.push({ id: callCount, nonce, startMs: Date.now(), endMs: 0 }); + if (callCount === 1) { + throw new Error("Transaction reverted"); + } + }); + + const wrappedFail = wrapWithNonceQueue(signerFail, 1); + + try { + await wrappedFail.sendTransaction({ to: "0xbbbb", data: "0x" }); + } catch (e: any) { + console.log(`First tx failed as expected: ${e.message}`); + } + + await wrappedFail.sendTransaction({ to: "0xbbbb", data: "0x" }); + + console.log( + "Results:", + results.map((r) => `id=${r.id} nonce=${r.nonce}`).join(", "), + ); + console.assert( + results[0].nonce === 0 && results[1].nonce === 0, + `Expected both nonces to be 0 but got [${results.map((r) => r.nonce)}]`, + ); + console.log("PASS: Nonce preserved after rollback\n"); + + // --- Cleanup --- + const pool = getNoncePool(); + if (pool) await pool.end(); + console.log("All tests passed!"); +} + +test().catch((err) => { + console.error("TEST FAILED:", err); + process.exit(1); +}); diff --git a/src/js/tasks/lib/nonceQueue.ts b/src/js/tasks/lib/nonceQueue.ts new file mode 100644 index 00000000..ad904a22 --- /dev/null +++ b/src/js/tasks/lib/nonceQueue.ts @@ -0,0 +1,189 @@ +import type { Pool, PoolClient } from "pg"; +import type { Signer, TransactionResponse } from "ethers"; + +const log = require("../../utils/logger")("utils:nonceQueue"); + +let pool: Pool | null = null; +let tableEnsurePromise: Promise | null = null; + +export function getNoncePool(): Pool | null { + if (!process.env.DATABASE_URL) return null; + if (!pool) { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { Pool: PgPool } = require("pg"); + pool = new PgPool({ + connectionString: process.env.DATABASE_URL, + max: 5, + connectionTimeoutMillis: 120_000, + }); + } + return pool; +} + +function ensureNonceTable(p: Pool): Promise { + if (!tableEnsurePromise) { + tableEnsurePromise = p + .query( + ` + CREATE TABLE IF NOT EXISTS nonce_queue ( + signer_address TEXT NOT NULL, + chain_id INTEGER NOT NULL, + nonce INTEGER NOT NULL, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (signer_address, chain_id) + ) + `, + ) + .then(() => {}); + } + return tableEnsurePromise; +} + +async function ensureNonceRow( + client: PoolClient, + signerAddress: string, + chainId: number, + getOnChainNonce: () => Promise, +): Promise { + const { rows } = await client.query( + "SELECT 1 FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2", + [signerAddress, chainId], + ); + if (rows.length === 0) { + const onChainNonce = await getOnChainNonce(); + log( + `Initializing nonce row: address=${signerAddress} chain=${chainId} nonce=${onChainNonce}`, + ); + await client.query( + `INSERT INTO nonce_queue (signer_address, chain_id, nonce) + VALUES ($1, $2, $3) + ON CONFLICT DO NOTHING`, + [signerAddress, chainId, onChainNonce], + ); + } +} + +function isNonceMismatchError(err: any): boolean { + const msg = (err?.message ?? "").toLowerCase(); + return ( + msg.includes("nonce too low") || + msg.includes("nonce has already been used") || + msg.includes("replacement transaction underpriced") + ); +} + +async function withNonceLock( + p: Pool, + signerAddress: string, + chainId: number, + getOnChainNonce: () => Promise, + fn: (nonce: number) => Promise, + maxRetries = 3, +): Promise { + await ensureNonceTable(p); + + for (let attempt = 0; attempt < maxRetries; attempt++) { + const client = await p.connect(); + try { + await client.query("BEGIN"); + await ensureNonceRow(client, signerAddress, chainId, getOnChainNonce); + + const { rows } = await client.query( + "SELECT nonce FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2 FOR UPDATE", + [signerAddress, chainId], + ); + const nonce: number = rows[0].nonce; + + log( + `Acquired nonce lock: address=${signerAddress} chain=${chainId} nonce=${nonce}`, + ); + + const result = await fn(nonce); + + await client.query( + "UPDATE nonce_queue SET nonce = nonce + 1, updated_at = NOW() WHERE signer_address = $1 AND chain_id = $2", + [signerAddress, chainId], + ); + await client.query("COMMIT"); + + log( + `Released nonce lock: address=${signerAddress} chain=${chainId} nonce=${nonce} → ${nonce + 1}`, + ); + + return result; + } catch (err: any) { + await client.query("ROLLBACK").catch(() => {}); + + if (isNonceMismatchError(err)) { + log( + `Nonce mismatch (attempt ${attempt + 1}/${maxRetries}), recovering from chain…`, + ); + const onChainNonce = await getOnChainNonce(); + const recovery = await p.connect(); + try { + await recovery.query( + "UPDATE nonce_queue SET nonce = $1, updated_at = NOW() WHERE signer_address = $2 AND chain_id = $3", + [onChainNonce, signerAddress, chainId], + ); + log( + `Recovered nonce from chain: address=${signerAddress} chain=${chainId} nonce=${onChainNonce}`, + ); + } finally { + recovery.release(); + } + if (attempt < maxRetries - 1) continue; + } + + throw err; + } finally { + client.release(); + } + } + + throw new Error("withNonceLock: max retries exhausted"); +} + +/** Reset module state. Only for testing. */ +export function _resetForTesting() { + tableEnsurePromise = null; + pool = null; +} + +/** + * Wraps an ethers v6 Signer so that every `sendTransaction` call is + * serialized through a Postgres row lock. The nonce is managed by the + * database — not by the provider. The lock is held until the transaction + * is confirmed on-chain, so concurrent processes block rather than collide. + * + * If DATABASE_URL is not set, the signer is returned unmodified. + */ +export function wrapWithNonceQueue(signer: Signer, chainId: number): Signer { + const p = getNoncePool(); + if (!p) return signer; + + const originalSendTransaction = signer.sendTransaction.bind(signer); + const addressPromise = signer.getAddress().then((a) => a.toLowerCase()); + const getOnChainNonce = () => signer.getNonce("pending"); + + signer.sendTransaction = async function ( + transaction: Parameters[0], + ): Promise { + const signerAddress = await addressPromise; + return withNonceLock( + p, + signerAddress, + chainId, + getOnChainNonce, + async (nonce) => { + const response = await originalSendTransaction({ + ...transaction, + nonce, + }); + await response.wait(); + return response; + }, + ); + }; + + return signer; +} diff --git a/yarn.lock b/yarn.lock index 72d54134..3f32e172 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2187,6 +2187,15 @@ dependencies: "@types/node" "*" +"@types/pg@^8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.20.0.tgz#8bd03d3ac6b19143a8de7d66a9d13da32cd91526" + integrity sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" @@ -4241,6 +4250,62 @@ pbkdf2@^3.0.17: sha.js "^2.4.12" to-buffer "^1.2.1" +pg-cloudflare@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz#386035d4bfcf1a7045b026f8b21acf5353f14d65" + integrity sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ== + +pg-connection-string@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.12.0.tgz#4084f917902bb2daae3dc1376fe24ac7b4eaccf2" + integrity sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.13.0.tgz#416482e9700e8f80c685a6ae5681697a413c13a3" + integrity sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA== + +pg-protocol@*, pg-protocol@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.13.0.tgz#fdaf6d020bca590d58bb991b4b16fc448efe0511" + integrity sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w== + +pg-types@2.2.0, pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.20.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.20.0.tgz#1a274de944cb329fd6dd77a6d371a005ba6b136d" + integrity sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA== + dependencies: + pg-connection-string "^2.12.0" + pg-pool "^3.13.0" + pg-protocol "^1.13.0" + pg-types "2.2.0" + pgpass "1.0.5" + optionalDependencies: + pg-cloudflare "^1.3.0" + +pgpass@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4261,6 +4326,28 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.1.tgz#c40b3da0222c500ff1e51c5d7014b60b79697c7a" + integrity sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4642,6 +4729,11 @@ source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -5108,6 +5200,11 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" From 164a311646ce5a75b6d3c6c091eebbf4c9df06eb Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Mon, 13 Apr 2026 00:33:37 +0200 Subject: [PATCH 13/41] add KMS signer dependency --- .env.example | 8 + package.json | 1 + pnpm-lock.yaml | 6496 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 6505 insertions(+) create mode 100644 pnpm-lock.yaml diff --git a/.env.example b/.env.example index 05001038..9663161c 100644 --- a/.env.example +++ b/.env.example @@ -59,3 +59,11 @@ FORK_BLOCK_NUMBER_SONIC= # LOKI_URL= # LOKI_USER= # LOKI_API_KEY= + +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ AWS KMS SIGNER ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ +# needed for running Origin Automaton + +# AWS_ACCESS_KEY_ID= +# AWS_SECRET_ACCESS_KEY= \ No newline at end of file diff --git a/package.json b/package.json index b676b3a6..abb84060 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "devDependencies": { "@apollo/client": "^3.11.4", "@ethersproject/providers": "^5.7.2", + "@lastdotnet/purrikey": "github:OriginProtocol/purrikey#3d10b79b567c52c0c37e630800dae6c7059bd9b8", "@nomicfoundation/hardhat-ethers": "3.0.7", "@nomicfoundation/hardhat-foundry": "^1.1.1", "@nomicfoundation/hardhat-network-helpers": "^1.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..830350e1 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6496 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@apollo/client': + specifier: ^3.11.4 + version: 3.14.1(graphql@16.13.2) + '@ethersproject/providers': + specifier: ^5.7.2 + version: 5.8.0 + '@lastdotnet/purrikey': + specifier: github:OriginProtocol/purrikey#3d10b79b567c52c0c37e630800dae6c7059bd9b8 + version: git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2) + '@nomicfoundation/hardhat-ethers': + specifier: 3.0.7 + version: 3.0.7(ethers@6.13.2)(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3)) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.1.1 + version: 1.2.1(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3)) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.10 + version: 1.1.2(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3)) + '@openzeppelin/defender-sdk': + specifier: 2.7.0 + version: 2.7.0(web3-core@4.7.1)(web3-utils@4.3.3)(web3@4.16.0(typescript@5.9.3)(zod@3.25.76)) + '@rollup/plugin-commonjs': + specifier: ^25.0.7 + version: 25.0.8(rollup@4.60.1) + '@rollup/plugin-json': + specifier: ^6.1.0 + version: 6.1.0(rollup@4.60.1) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.3.1(rollup@4.60.1) + '@solidity-parser/parser': + specifier: ^0.18.0 + version: 0.18.0 + axios: + specifier: ^1.9.0 + version: 1.15.0 + builtin-modules: + specifier: ^3.3.0 + version: 3.3.0 + chai: + specifier: ^4.3.10 + version: 4.5.0 + dayjs: + specifier: ^1.11.12 + version: 1.11.20 + dotenv: + specifier: ^16.4.5 + version: 16.6.1 + eslint: + specifier: ^8.55.0 + version: 8.57.1 + ethers: + specifier: 6.13.2 + version: 6.13.2 + graphql: + specifier: ^16.9.0 + version: 16.13.2 + hardhat: + specifier: ^2.22.9 + version: 2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3) + node-fetch: + specifier: ^2.6.7 + version: 2.7.0 + prettier: + specifier: ^3.6.2 + version: 3.8.2 + rollup: + specifier: ^4.9.1 + version: 4.60.1 + rollup-plugin-visualizer: + specifier: ^5.12.0 + version: 5.14.0(rollup@4.60.1) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) + typescript: + specifier: ^5.7.0 + version: 5.9.3 + winston: + specifier: ^3.17.0 + version: 3.19.0 + winston-loki: + specifier: ^6.1.3 + version: 6.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@apollo/client@3.14.1': + resolution: {integrity: sha512-SgGX6E23JsZhUdG2anxiyHvEvvN6CUaI4ZfMsndZFeuHPXL3H0IsaiNAhLITSISbeyeYd+CBd9oERXQDdjXWZw==} + peerDependencies: + graphql: ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 || ^6.0.3 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-kms@3.1028.0': + resolution: {integrity: sha512-M3ahMP9HAuklAX3u3KvyotryrF/S+wr37hOE+P47EOM64XV85tRoy4+5x8hD5lUIEa1XMEtqrkC0VrXxdyFFBw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-lambda@3.1028.0': + resolution: {integrity: sha512-wAJT/1M5UT5d0Nw/7XTWzVO3nJpvghGxoiiKxR3KKIbOEIGPEY2FJpw5xZHFaLS7Du5sr9rCyqJ+0fiejID/gA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.27': + resolution: {integrity: sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.25': + resolution: {integrity: sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.27': + resolution: {integrity: sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.29': + resolution: {integrity: sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.29': + resolution: {integrity: sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.30': + resolution: {integrity: sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.25': + resolution: {integrity: sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.29': + resolution: {integrity: sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.29': + resolution: {integrity: sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.9': + resolution: {integrity: sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.9': + resolution: {integrity: sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.10': + resolution: {integrity: sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.29': + resolution: {integrity: sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.996.19': + resolution: {integrity: sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.11': + resolution: {integrity: sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1026.0': + resolution: {integrity: sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.7': + resolution: {integrity: sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.996.6': + resolution: {integrity: sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.5': + resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.9': + resolution: {integrity: sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==} + + '@aws-sdk/util-user-agent-node@3.973.15': + resolution: {integrity: sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@aws-sdk/xml-builder@3.972.17': + resolution: {integrity: sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.4': + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} + engines: {node: '>=18.0.0'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@lastdotnet/purrikey@git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8': + resolution: {commit: 3d10b79b567c52c0c37e630800dae6c7059bd9b8, repo: git@github.com:OriginProtocol/purrikey.git, type: git} + version: 1.0.0 + engines: {node: '>=14.0.0'} + peerDependencies: + ethers: ^6.13.0 + + '@napi-rs/snappy-android-arm-eabi@7.3.3': + resolution: {integrity: sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/snappy-android-arm64@7.3.3': + resolution: {integrity: sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/snappy-darwin-arm64@7.3.3': + resolution: {integrity: sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/snappy-darwin-x64@7.3.3': + resolution: {integrity: sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/snappy-freebsd-x64@7.3.3': + resolution: {integrity: sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': + resolution: {integrity: sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/snappy-linux-arm64-gnu@7.3.3': + resolution: {integrity: sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/snappy-linux-arm64-musl@7.3.3': + resolution: {integrity: sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': + resolution: {integrity: sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': + resolution: {integrity: sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/snappy-linux-s390x-gnu@7.3.3': + resolution: {integrity: sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/snappy-linux-x64-gnu@7.3.3': + resolution: {integrity: sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/snappy-linux-x64-musl@7.3.3': + resolution: {integrity: sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/snappy-openharmony-arm64@7.3.3': + resolution: {integrity: sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/snappy-wasm32-wasi@7.3.3': + resolution: {integrity: sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@napi-rs/snappy-win32-arm64-msvc@7.3.3': + resolution: {integrity: sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/snappy-win32-ia32-msvc@7.3.3': + resolution: {integrity: sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/snappy-win32-x64-msvc@7.3.3': + resolution: {integrity: sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.23': + resolution: {integrity: sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-darwin-x64@0.12.0-next.23': + resolution: {integrity: sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23': + resolution: {integrity: sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23': + resolution: {integrity: sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23': + resolution: {integrity: sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23': + resolution: {integrity: sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23': + resolution: {integrity: sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr@0.12.0-next.23': + resolution: {integrity: sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==} + engines: {node: '>= 20'} + + '@nomicfoundation/hardhat-ethers@3.0.7': + resolution: {integrity: sha512-pxLWpDiqC208shoz/lMbVFbxcVxE+qIs8qDrwdcubWH99UO1p6uwXakMa36ICRfB/IEToSLDJGSsKhwY84feCQ==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.22.92.0.0 + + '@nomicfoundation/hardhat-foundry@1.2.1': + resolution: {integrity: sha512-pH1KeyI0sysgi7I7uQKPLXWl895EkuS6V41rSi820Ipqp/FScIwDh27RbevgC9zJ4ufSsSz34njm9cvRMGMNVA==} + peerDependencies: + hardhat: ^2.26.0 + + '@nomicfoundation/hardhat-network-helpers@1.1.2': + resolution: {integrity: sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ==} + peerDependencies: + hardhat: ^2.26.0 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + + '@openzeppelin/defender-sdk-account-client@2.7.1': + resolution: {integrity: sha512-NHJyvEQk8XQ/NHsHqwX8tQ5napQuotb7uRltq0up5On5HM4t/YwMWXeCuSmVrkehs9mRMclu3a+TEZpPGwrnYw==} + + '@openzeppelin/defender-sdk-action-client@2.7.1': + resolution: {integrity: sha512-4HsmJs000xptiOoi9Kk8k1E4krUWGV6V7Nq+8RusGOGNOddfb1/U8igNaKXfG0HjshKDFqlpBlzXUpN1lcfwMg==} + hasBin: true + + '@openzeppelin/defender-sdk-address-book-client@2.7.1': + resolution: {integrity: sha512-B27p5AYcWpmwIMqplt/yWlVoe8UwJ+3oOcULYgHO9cnpiJ9jhA/4nGV+vIh3+tOEuROJrLdJzbRKoTE96TRSYA==} + + '@openzeppelin/defender-sdk-approval-process-client@2.7.1': + resolution: {integrity: sha512-KI3q6glPaPXaznay8iTbRHOjavZA4CJEQg9PfqCrAPesY0FdGb9hr3FaLKxP5IECQ/Ha1llnBkn/ZcBJoZ8Xyw==} + + '@openzeppelin/defender-sdk-base-client@2.7.1': + resolution: {integrity: sha512-7gFCteA+V3396A3McgqzmirwmbPXuHJYN896O3AbsHX9XcxInN74C5Zv3tFHld0GmIX/VlaIvILNMhOpdISZjA==} + + '@openzeppelin/defender-sdk-deploy-client@2.7.1': + resolution: {integrity: sha512-vFkDupn8ATW83KjZlY5U7UdsvSo9YZwOMQoVaHJO3S+Z6h0wa6cTzuQV9C0AKYq524quQkFsQ4AQq5CgsgdEkQ==} + + '@openzeppelin/defender-sdk-key-value-store-client@2.7.1': + resolution: {integrity: sha512-WHS0vk9htOF0h8XMhCDdEB5yhq9Xu17yfln2+zgX15lyrnLg56c71grjclhbZ+kXN3yBuy0AFGIYnaYmVV947Q==} + + '@openzeppelin/defender-sdk-monitor-client@2.7.1': + resolution: {integrity: sha512-s7QT3xiJxCha6XXmSts9U02dJHdWoutnaO4KJVz2WSTFb6pydiLwD8njvhLkclcHORrIcFSJ6CA8SCpjLRQ7Fg==} + + '@openzeppelin/defender-sdk-network-client@2.7.1': + resolution: {integrity: sha512-AWJKT9YKv9wH3/1AJZCztF3VIsg1sX+v8fjtyFLROqtVAzmhB8WKBRVt9GHAZ+PmsixAKDMOEbH6R1cipTIVHQ==} + + '@openzeppelin/defender-sdk-notification-channel-client@2.7.1': + resolution: {integrity: sha512-uvtXJ/dMexZC/3xBLCdhV6Z6Dg4uIErOBjlm+dFr8yBulUEioUo3/1OaivBIJ+mYICmQBpcRV91NmslyNOZLng==} + + '@openzeppelin/defender-sdk-proposal-client@2.7.1': + resolution: {integrity: sha512-hOkR9azX2e6U51suPIU5XyZNxVlGaDt3srCD55e8YsFYoXlbhVFJpgt5N2zd9kttv5a+rCSKtJR2hfJWxsvGsw==} + + '@openzeppelin/defender-sdk-relay-client@2.7.1': + resolution: {integrity: sha512-rAgURxg9F7n6oZletBGMWkvAOsvy9Ez/89UYjALc246w9BolfEc2v8KweUfCn3ebeY4n1KfIXnpkwZN59u3xXg==} + + '@openzeppelin/defender-sdk-relay-group-client@2.7.1': + resolution: {integrity: sha512-vUTdUvnIdRIpyIc8H+3chdy/j0G5m04l8uVYkq9X3n2Pt4dXZq/Auuj4Y2RinF+3uueUk0nnmBndFo20jjjUMQ==} + + '@openzeppelin/defender-sdk-relay-signer-client@2.7.1': + resolution: {integrity: sha512-05DixpVGbm+zeRSs3n6ptzmxqEweQPE5yYDugLcQrcffneLAbakeiXhCl/t0kCu0EmwdxMeQTGaaXN/Y9UlrPg==} + peerDependencies: + web3: ^4.14.0 + web3-core: ^4.7.0 + web3-utils: ^4.3.2 + + '@openzeppelin/defender-sdk@2.7.0': + resolution: {integrity: sha512-A7Lvte6+j6A0EQ/nYXtremP37JhW/x58C9AtD//4LS9o6OsSJuXE4R58L5E48cTxOT/I3xelYmgGh0KGQTao4A==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rollup/plugin-commonjs@25.0.8': + resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + cpu: [x64] + os: [win32] + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@smithy/config-resolver@4.4.14': + resolution: {integrity: sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.23.14': + resolution: {integrity: sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.13': + resolution: {integrity: sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.13': + resolution: {integrity: sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.13': + resolution: {integrity: sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.13': + resolution: {integrity: sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.13': + resolution: {integrity: sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.13': + resolution: {integrity: sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.16': + resolution: {integrity: sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.13': + resolution: {integrity: sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.13': + resolution: {integrity: sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.13': + resolution: {integrity: sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.29': + resolution: {integrity: sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.5.1': + resolution: {integrity: sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.17': + resolution: {integrity: sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.13': + resolution: {integrity: sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.13': + resolution: {integrity: sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.5.2': + resolution: {integrity: sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.13': + resolution: {integrity: sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.13': + resolution: {integrity: sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.13': + resolution: {integrity: sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.13': + resolution: {integrity: sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.13': + resolution: {integrity: sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.8': + resolution: {integrity: sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.13': + resolution: {integrity: sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.12.9': + resolution: {integrity: sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.14.0': + resolution: {integrity: sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.13': + resolution: {integrity: sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.45': + resolution: {integrity: sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.49': + resolution: {integrity: sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.3.4': + resolution: {integrity: sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.13': + resolution: {integrity: sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.3.1': + resolution: {integrity: sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.22': + resolution: {integrity: sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.15': + resolution: {integrity: sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} + engines: {node: '>=18.0.0'} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@solidity-parser/parser@0.18.0': + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/secp256k1@4.0.7': + resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/ws@8.5.3': + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@wry/caches@1.0.1': + resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} + engines: {node: '>=8'} + + '@wry/context@0.7.4': + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + + '@wry/equality@0.5.7': + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + + '@wry/trie@0.5.0': + resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} + engines: {node: '>=8'} + + abitype@0.7.1: + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: '>=4.9.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + amazon-cognito-identity-js@6.3.16: + resolution: {integrity: sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@4.12.3: + resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} + + bn.js@5.2.3: + resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} + engines: {node: '>=14.0.0'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + + fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + hasBin: true + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql@16.13.2: + resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + hardhat@2.28.6: + resolution: {integrity: sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@4.3.8: + resolution: {integrity: sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@11.3.3: + resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==} + engines: {node: 20 || >=22} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optimism@0.18.1: + resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.2: + resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rehackt@0.1.0: + resolution: {integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==} + peerDependencies: + '@types/react': '*' + react: '*' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + snappy@7.3.3: + resolution: {integrity: sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ==} + engines: {node: '>= 10'} + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@2.2.3: + resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-polyfill@1.1.14: + resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + web3-core@4.7.1: + resolution: {integrity: sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-errors@1.3.1: + resolution: {integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-abi@4.4.1: + resolution: {integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-accounts@4.3.1: + resolution: {integrity: sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-contract@4.7.2: + resolution: {integrity: sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-ens@4.4.0: + resolution: {integrity: sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-iban@4.0.7: + resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-personal@4.1.0: + resolution: {integrity: sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth@4.11.1: + resolution: {integrity: sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-net@4.1.0: + resolution: {integrity: sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-http@4.2.0: + resolution: {integrity: sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-ipc@4.0.7: + resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-ws@4.0.8: + resolution: {integrity: sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-rpc-methods@1.3.0: + resolution: {integrity: sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-rpc-providers@1.0.0-rc.4: + resolution: {integrity: sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-types@1.10.0: + resolution: {integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-utils@4.3.3: + resolution: {integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-validator@2.0.6: + resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3@4.16.0: + resolution: {integrity: sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==} + engines: {node: '>=14.0.0', npm: '>=6.12.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + winston-loki@6.1.4: + resolution: {integrity: sha512-/j/Zf7TGLjgSBck29BkPnpJlEnGQr5xqlx8A0N6LZnXYYYvyK7lFk6FPpWiD+VMO8xjaxOu1KNF9SzWaRDsigA==} + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + + zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.1': {} + + '@apollo/client@3.14.1(graphql@16.13.2)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) + '@wry/caches': 1.0.1 + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.13.2 + graphql-tag: 2.12.6(graphql@16.13.2) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.1 + prop-types: 15.8.1 + rehackt: 0.1.0 + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.8.1 + zen-observable-ts: 1.2.5 + transitivePeerDependencies: + - '@types/react' + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.7 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-locate-window': 3.965.5 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.973.7 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.7 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-kms@3.1028.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.27 + '@aws-sdk/credential-provider-node': 3.972.30 + '@aws-sdk/middleware-host-header': 3.972.9 + '@aws-sdk/middleware-logger': 3.972.9 + '@aws-sdk/middleware-recursion-detection': 3.972.10 + '@aws-sdk/middleware-user-agent': 3.972.29 + '@aws-sdk/region-config-resolver': 3.972.11 + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-endpoints': 3.996.6 + '@aws-sdk/util-user-agent-browser': 3.972.9 + '@aws-sdk/util-user-agent-node': 3.973.15 + '@smithy/config-resolver': 4.4.14 + '@smithy/core': 3.23.14 + '@smithy/fetch-http-handler': 5.3.16 + '@smithy/hash-node': 4.2.13 + '@smithy/invalid-dependency': 4.2.13 + '@smithy/middleware-content-length': 4.2.13 + '@smithy/middleware-endpoint': 4.4.29 + '@smithy/middleware-retry': 4.5.1 + '@smithy/middleware-serde': 4.2.17 + '@smithy/middleware-stack': 4.2.13 + '@smithy/node-config-provider': 4.3.13 + '@smithy/node-http-handler': 4.5.2 + '@smithy/protocol-http': 5.3.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.45 + '@smithy/util-defaults-mode-node': 4.2.49 + '@smithy/util-endpoints': 3.3.4 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-retry': 4.3.1 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-lambda@3.1028.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.27 + '@aws-sdk/credential-provider-node': 3.972.30 + '@aws-sdk/middleware-host-header': 3.972.9 + '@aws-sdk/middleware-logger': 3.972.9 + '@aws-sdk/middleware-recursion-detection': 3.972.10 + '@aws-sdk/middleware-user-agent': 3.972.29 + '@aws-sdk/region-config-resolver': 3.972.11 + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-endpoints': 3.996.6 + '@aws-sdk/util-user-agent-browser': 3.972.9 + '@aws-sdk/util-user-agent-node': 3.973.15 + '@smithy/config-resolver': 4.4.14 + '@smithy/core': 3.23.14 + '@smithy/eventstream-serde-browser': 4.2.13 + '@smithy/eventstream-serde-config-resolver': 4.3.13 + '@smithy/eventstream-serde-node': 4.2.13 + '@smithy/fetch-http-handler': 5.3.16 + '@smithy/hash-node': 4.2.13 + '@smithy/invalid-dependency': 4.2.13 + '@smithy/middleware-content-length': 4.2.13 + '@smithy/middleware-endpoint': 4.4.29 + '@smithy/middleware-retry': 4.5.1 + '@smithy/middleware-serde': 4.2.17 + '@smithy/middleware-stack': 4.2.13 + '@smithy/node-config-provider': 4.3.13 + '@smithy/node-http-handler': 4.5.2 + '@smithy/protocol-http': 5.3.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.45 + '@smithy/util-defaults-mode-node': 4.2.49 + '@smithy/util-endpoints': 3.3.4 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-retry': 4.3.1 + '@smithy/util-stream': 4.5.22 + '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.2.15 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.973.27': + dependencies: + '@aws-sdk/types': 3.973.7 + '@aws-sdk/xml-builder': 3.972.17 + '@smithy/core': 3.23.14 + '@smithy/node-config-provider': 4.3.13 + '@smithy/property-provider': 4.2.13 + '@smithy/protocol-http': 5.3.13 + '@smithy/signature-v4': 5.3.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.25': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.27': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/types': 3.973.7 + '@smithy/fetch-http-handler': 5.3.16 + '@smithy/node-http-handler': 4.5.2 + '@smithy/property-provider': 4.2.13 + '@smithy/protocol-http': 5.3.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/util-stream': 4.5.22 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.29': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/credential-provider-env': 3.972.25 + '@aws-sdk/credential-provider-http': 3.972.27 + '@aws-sdk/credential-provider-login': 3.972.29 + '@aws-sdk/credential-provider-process': 3.972.25 + '@aws-sdk/credential-provider-sso': 3.972.29 + '@aws-sdk/credential-provider-web-identity': 3.972.29 + '@aws-sdk/nested-clients': 3.996.19 + '@aws-sdk/types': 3.973.7 + '@smithy/credential-provider-imds': 4.2.13 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.972.29': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/nested-clients': 3.996.19 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/protocol-http': 5.3.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.30': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.25 + '@aws-sdk/credential-provider-http': 3.972.27 + '@aws-sdk/credential-provider-ini': 3.972.29 + '@aws-sdk/credential-provider-process': 3.972.25 + '@aws-sdk/credential-provider-sso': 3.972.29 + '@aws-sdk/credential-provider-web-identity': 3.972.29 + '@aws-sdk/types': 3.973.7 + '@smithy/credential-provider-imds': 4.2.13 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.972.25': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.29': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/nested-clients': 3.996.19 + '@aws-sdk/token-providers': 3.1026.0 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.29': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/nested-clients': 3.996.19 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-host-header@3.972.9': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.9': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.10': + dependencies: + '@aws-sdk/types': 3.973.7 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.29': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-endpoints': 3.996.6 + '@smithy/core': 3.23.14 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + '@smithy/util-retry': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.996.19': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.27 + '@aws-sdk/middleware-host-header': 3.972.9 + '@aws-sdk/middleware-logger': 3.972.9 + '@aws-sdk/middleware-recursion-detection': 3.972.10 + '@aws-sdk/middleware-user-agent': 3.972.29 + '@aws-sdk/region-config-resolver': 3.972.11 + '@aws-sdk/types': 3.973.7 + '@aws-sdk/util-endpoints': 3.996.6 + '@aws-sdk/util-user-agent-browser': 3.972.9 + '@aws-sdk/util-user-agent-node': 3.973.15 + '@smithy/config-resolver': 4.4.14 + '@smithy/core': 3.23.14 + '@smithy/fetch-http-handler': 5.3.16 + '@smithy/hash-node': 4.2.13 + '@smithy/invalid-dependency': 4.2.13 + '@smithy/middleware-content-length': 4.2.13 + '@smithy/middleware-endpoint': 4.4.29 + '@smithy/middleware-retry': 4.5.1 + '@smithy/middleware-serde': 4.2.17 + '@smithy/middleware-stack': 4.2.13 + '@smithy/node-config-provider': 4.3.13 + '@smithy/node-http-handler': 4.5.2 + '@smithy/protocol-http': 5.3.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.45 + '@smithy/util-defaults-mode-node': 4.2.49 + '@smithy/util-endpoints': 3.3.4 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-retry': 4.3.1 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.972.11': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/config-resolver': 4.4.14 + '@smithy/node-config-provider': 4.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1026.0': + dependencies: + '@aws-sdk/core': 3.973.27 + '@aws-sdk/nested-clients': 3.996.19 + '@aws-sdk/types': 3.973.7 + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.973.7': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.996.6': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-endpoints': 3.3.4 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.5': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.9': + dependencies: + '@aws-sdk/types': 3.973.7 + '@smithy/types': 4.14.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.973.15': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.29 + '@aws-sdk/types': 3.973.7 + '@smithy/node-config-provider': 4.3.13 + '@smithy/types': 4.14.0 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.17': + dependencies: + '@smithy/types': 4.14.0 + fast-xml-parser: 5.5.8 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.4': {} + + '@colors/colors@1.6.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.14.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/rlp@5.0.2': {} + + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/basex@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.3 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/providers@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/sha2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.3 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@fastify/busboy@2.1.1': {} + + '@graphql-typed-document-node/core@3.2.0(graphql@16.13.2)': + dependencies: + graphql: 16.13.2 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lastdotnet/purrikey@git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2)': + dependencies: + '@aws-sdk/client-kms': 3.1028.0 + ethers: 6.13.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@napi-rs/snappy-android-arm-eabi@7.3.3': + optional: true + + '@napi-rs/snappy-android-arm64@7.3.3': + optional: true + + '@napi-rs/snappy-darwin-arm64@7.3.3': + optional: true + + '@napi-rs/snappy-darwin-x64@7.3.3': + optional: true + + '@napi-rs/snappy-freebsd-x64@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-arm64-musl@7.3.3': + optional: true + + '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-s390x-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-x64-gnu@7.3.3': + optional: true + + '@napi-rs/snappy-linux-x64-musl@7.3.3': + optional: true + + '@napi-rs/snappy-openharmony-arm64@7.3.3': + optional: true + + '@napi-rs/snappy-wasm32-wasi@7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@napi-rs/snappy-win32-arm64-msvc@7.3.3': + optional: true + + '@napi-rs/snappy-win32-ia32-msvc@7.3.3': + optional: true + + '@napi-rs/snappy-win32-x64-msvc@7.3.3': + optional: true + + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.2': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.23': {} + + '@nomicfoundation/edr-darwin-x64@0.12.0-next.23': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23': {} + + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23': {} + + '@nomicfoundation/edr@0.12.0-next.23': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.23 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.23 + + '@nomicfoundation/hardhat-ethers@3.0.7(ethers@6.13.2)(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3))': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + ethers: 6.13.2 + hardhat: 2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-foundry@1.2.1(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3))': + dependencies: + hardhat: 2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3) + picocolors: 1.1.1 + + '@nomicfoundation/hardhat-network-helpers@1.1.2(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3) + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@openzeppelin/defender-sdk-account-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-action-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + dotenv: 16.6.1 + glob: 11.1.0 + jszip: 3.10.1 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-address-book-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + dotenv: 16.6.1 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-approval-process-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-base-client@2.7.1': + dependencies: + '@aws-sdk/client-lambda': 3.1028.0 + amazon-cognito-identity-js: 6.3.16 + async-retry: 1.3.3 + axios: 1.15.0 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-deploy-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-key-value-store-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + fs-extra: 11.3.4 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-monitor-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + ethers: 6.13.2 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-network-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-notification-channel-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-proposal-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + ethers: 6.13.2 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-relay-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-relay-group-client@2.7.1': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.1 + axios: 1.15.0 + lodash: 4.18.1 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-relay-signer-client@2.7.1(web3-core@4.7.1)(web3-utils@4.3.3)(web3@4.16.0(typescript@5.9.3)(zod@3.25.76))': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@openzeppelin/defender-sdk-base-client': 2.7.1 + amazon-cognito-identity-js: 6.3.16 + axios: 1.15.0 + ethers: 6.13.2 + lodash: 4.18.1 + web3: 4.16.0(typescript@5.9.3)(zod@3.25.76) + web3-core: 4.7.1 + web3-utils: 4.3.3 + transitivePeerDependencies: + - aws-crt + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk@2.7.0(web3-core@4.7.1)(web3-utils@4.3.3)(web3@4.16.0(typescript@5.9.3)(zod@3.25.76))': + dependencies: + '@openzeppelin/defender-sdk-account-client': 2.7.1 + '@openzeppelin/defender-sdk-action-client': 2.7.1 + '@openzeppelin/defender-sdk-address-book-client': 2.7.1 + '@openzeppelin/defender-sdk-approval-process-client': 2.7.1 + '@openzeppelin/defender-sdk-base-client': 2.7.1 + '@openzeppelin/defender-sdk-deploy-client': 2.7.1 + '@openzeppelin/defender-sdk-key-value-store-client': 2.7.1 + '@openzeppelin/defender-sdk-monitor-client': 2.7.1 + '@openzeppelin/defender-sdk-network-client': 2.7.1 + '@openzeppelin/defender-sdk-notification-channel-client': 2.7.1 + '@openzeppelin/defender-sdk-proposal-client': 2.7.1 + '@openzeppelin/defender-sdk-relay-client': 2.7.1 + '@openzeppelin/defender-sdk-relay-group-client': 2.7.1 + '@openzeppelin/defender-sdk-relay-signer-client': 2.7.1(web3-core@4.7.1)(web3-utils@4.3.3)(web3@4.16.0(typescript@5.9.3)(zod@3.25.76)) + transitivePeerDependencies: + - aws-crt + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-utils + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rollup/plugin-commonjs@25.0.8(rollup@4.60.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.60.1 + + '@rollup/plugin-json@6.1.0(rollup@4.60.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + optionalDependencies: + rollup: 4.60.1 + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.60.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + optionalDependencies: + rollup: 4.60.1 + + '@rollup/pluginutils@5.3.0(rollup@4.60.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.1 + + '@rollup/rollup-android-arm-eabi@4.60.1': + optional: true + + '@rollup/rollup-android-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-x64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.1': + optional: true + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@smithy/config-resolver@4.4.14': + dependencies: + '@smithy/node-config-provider': 4.3.13 + '@smithy/types': 4.14.0 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.4 + '@smithy/util-middleware': 4.2.13 + tslib: 2.8.1 + + '@smithy/core@3.23.14': + dependencies: + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-stream': 4.5.22 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.13': + dependencies: + '@smithy/node-config-provider': 4.3.13 + '@smithy/property-provider': 4.2.13 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.13': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.14.0 + '@smithy/util-hex-encoding': 4.2.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.13': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.13': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.13': + dependencies: + '@smithy/eventstream-codec': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.16': + dependencies: + '@smithy/protocol-http': 5.3.13 + '@smithy/querystring-builder': 4.2.13 + '@smithy/types': 4.14.0 + '@smithy/util-base64': 4.3.2 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.2': + dependencies: + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.13': + dependencies: + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.29': + dependencies: + '@smithy/core': 3.23.14 + '@smithy/middleware-serde': 4.2.17 + '@smithy/node-config-provider': 4.3.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + '@smithy/url-parser': 4.2.13 + '@smithy/util-middleware': 4.2.13 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.5.1': + dependencies: + '@smithy/core': 3.23.14 + '@smithy/node-config-provider': 4.3.13 + '@smithy/protocol-http': 5.3.13 + '@smithy/service-error-classification': 4.2.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-retry': 4.3.1 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.17': + dependencies: + '@smithy/core': 3.23.14 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.13': + dependencies: + '@smithy/property-provider': 4.2.13 + '@smithy/shared-ini-file-loader': 4.4.8 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.5.2': + dependencies: + '@smithy/protocol-http': 5.3.13 + '@smithy/querystring-builder': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + '@smithy/util-uri-escape': 4.2.2 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + + '@smithy/shared-ini-file-loader@4.4.8': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.13': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.13 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@smithy/smithy-client@4.12.9': + dependencies: + '@smithy/core': 3.23.14 + '@smithy/middleware-endpoint': 4.4.29 + '@smithy/middleware-stack': 4.2.13 + '@smithy/protocol-http': 5.3.13 + '@smithy/types': 4.14.0 + '@smithy/util-stream': 4.5.22 + tslib: 2.8.1 + + '@smithy/types@4.14.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.13': + dependencies: + '@smithy/querystring-parser': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.2': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.3': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.2': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.2': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.45': + dependencies: + '@smithy/property-provider': 4.2.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.49': + dependencies: + '@smithy/config-resolver': 4.4.14 + '@smithy/credential-provider-imds': 4.2.13 + '@smithy/node-config-provider': 4.3.13 + '@smithy/property-provider': 4.2.13 + '@smithy/smithy-client': 4.12.9 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.3.4': + dependencies: + '@smithy/node-config-provider': 4.3.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.2': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.13': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.3.1': + dependencies: + '@smithy/service-error-classification': 4.2.13 + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.22': + dependencies: + '@smithy/fetch-http-handler': 5.3.16 + '@smithy/node-http-handler': 4.5.2 + '@smithy/types': 4.14.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.2': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.15': + dependencies: + '@smithy/types': 4.14.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.2': + dependencies: + tslib: 2.8.1 + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@solidity-parser/parser@0.18.0': {} + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 25.6.0 + + '@types/estree@1.0.8': {} + + '@types/node@18.15.13': {} + + '@types/node@25.6.0': + dependencies: + undici-types: 7.19.2 + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 25.6.0 + + '@types/resolve@1.20.2': {} + + '@types/secp256k1@4.0.7': + dependencies: + '@types/node': 25.6.0 + + '@types/triple-beam@1.3.5': {} + + '@types/ws@8.5.3': + dependencies: + '@types/node': 25.6.0 + + '@ungap/structured-clone@1.3.0': {} + + '@wry/caches@1.0.1': + dependencies: + tslib: 2.8.1 + + '@wry/context@0.7.4': + dependencies: + tslib: 2.8.1 + + '@wry/equality@0.5.7': + dependencies: + tslib: 2.8.1 + + '@wry/trie@0.5.0': + dependencies: + tslib: 2.8.1 + + abitype@0.7.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + optionalDependencies: + zod: 3.25.76 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + adm-zip@0.4.16: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + amazon-cognito-identity-js@6.3.16: + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0 + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@4.1.3: {} + + argparse@2.0.1: {} + + assertion-error@1.1.0: {} + + async-exit-hook@2.0.1: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.15.0: + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + bech32@1.1.4: {} + + binary-extensions@2.3.0: {} + + blakejs@1.2.1: {} + + bn.js@4.12.3: {} + + bn.js@5.2.3: {} + + bowser@2.14.1: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@1.1.13: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.3: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.7 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + btoa@1.2.1: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + builtin-modules@3.3.0: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@2.0.0: {} + + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@1.1.4: {} + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + commander@8.3.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + cookie@0.4.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.7 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + + create-require@1.1.1: {} + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dayjs@1.11.20: {} + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + diff@4.0.4: {} + + diff@5.2.2: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.3 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + enabled@2.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.7 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.5 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.4 + setimmediate: 1.0.5 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.2.0 + bn.js: 5.2.3 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethers@6.13.2: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + eventemitter3@5.0.4: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + fast-base64-decode@1.0.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.5.0 + + fast-xml-parser@5.5.8: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fecha@4.2.3: {} + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.4.2: {} + + fn.name@1.1.0: {} + + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3(supports-color@8.1.1) + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fp-ts@1.19.3: {} + + fs-extra@11.3.4: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-tag@2.12.6(graphql@16.13.2): + dependencies: + graphql: 16.13.2 + tslib: 2.8.1 + + graphql@16.13.2: {} + + hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3): + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.12.0-next.23 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.8 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.18.1 + micro-eth-signer: 0.14.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.3 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.3) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.16 + tsort: 0.0.1 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10 + optionalDependencies: + ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immediate@3.0.6: {} + + immutable@4.3.8: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-stream@2.0.1: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-unicode-supported@0.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-unfetch@3.1.0: + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + + isomorphic-ws@5.0.0(ws@8.20.0): + dependencies: + ws: 8.20.0 + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + js-cookie@2.2.1: {} + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stream-stringify@3.1.6: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kuler@2.0.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + long@5.3.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@11.3.3: {} + + lru_map@0.3.3: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memorystream@0.3.1: {} + + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.13 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.3 + + minipass@7.1.3: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.5 + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 5.2.2 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.1 + log-symbols: 4.1.0 + minimatch: 5.1.9 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + obliterator@2.0.5: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optimism@0.18.1: + dependencies: + '@wry/caches': 1.0.1 + '@wry/context': 0.7.4 + '@wry/trie': 0.5.0 + tslib: 2.8.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + os-tmpdir@1.0.2: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + package-json-from-dist@1.0.1: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-expression-matcher@1.5.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.3.3 + minipass: 7.1.3 + + pathval@1.1.1: {} + + pbkdf2@3.1.5: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prettier@3.8.2: {} + + process-nextick-args@2.0.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.6.0 + long: 5.3.2 + + proxy-from-env@2.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-is@16.13.1: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + readdirp@4.1.2: {} + + rehackt@0.1.0: {} + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.3 + + rollup-plugin-visualizer@5.14.0(rollup@4.60.1): + dependencies: + open: 8.4.2 + picomatch: 4.0.4 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.60.1 + + rollup@4.60.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scrypt-js@3.0.1: {} + + secp256k1@4.0.4: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + semver@5.7.2: {} + + semver@6.3.1: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + snappy@7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + optionalDependencies: + '@napi-rs/snappy-android-arm-eabi': 7.3.3 + '@napi-rs/snappy-android-arm64': 7.3.3 + '@napi-rs/snappy-darwin-arm64': 7.3.3 + '@napi-rs/snappy-darwin-x64': 7.3.3 + '@napi-rs/snappy-freebsd-x64': 7.3.3 + '@napi-rs/snappy-linux-arm-gnueabihf': 7.3.3 + '@napi-rs/snappy-linux-arm64-gnu': 7.3.3 + '@napi-rs/snappy-linux-arm64-musl': 7.3.3 + '@napi-rs/snappy-linux-ppc64-gnu': 7.3.3 + '@napi-rs/snappy-linux-riscv64-gnu': 7.3.3 + '@napi-rs/snappy-linux-s390x-gnu': 7.3.3 + '@napi-rs/snappy-linux-x64-gnu': 7.3.3 + '@napi-rs/snappy-linux-x64-musl': 7.3.3 + '@napi-rs/snappy-openharmony-arm64': 7.3.3 + '@napi-rs/snappy-wasm32-wasi': 7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/snappy-win32-arm64-msvc': 7.3.3 + '@napi-rs/snappy-win32-ia32-msvc': 7.3.3 + '@napi-rs/snappy-win32-x64-msvc': 7.3.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + solc@0.8.26(debug@4.4.3): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.11(debug@4.4.3) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + stack-trace@0.0.10: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + strnum@2.2.3: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-observable@4.0.0: {} + + text-hex@1.0.0: {} + + text-table@0.2.0: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + triple-beam@1.4.1: {} + + ts-invariant@0.10.3: + dependencies: + tslib: 2.8.1 + + ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.6.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.4.0: {} + + tslib@2.8.1: {} + + tsort@0.0.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typescript@5.9.3: {} + + undici-types@7.19.2: {} + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + unfetch@4.2.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-polyfill@1.1.14: {} + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + uuid@8.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + web3-core@4.7.1: + dependencies: + web3-errors: 1.3.1 + web3-eth-accounts: 4.3.1 + web3-eth-iban: 4.0.7 + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + optionalDependencies: + web3-providers-ipc: 4.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-errors@1.3.1: + dependencies: + web3-types: 1.10.0 + + web3-eth-abi@4.4.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + abitype: 0.7.1(typescript@5.9.3)(zod@3.25.76) + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - typescript + - zod + + web3-eth-accounts@4.3.1: + dependencies: + '@ethereumjs/rlp': 4.0.1 + crc-32: 1.2.2 + ethereum-cryptography: 2.2.1 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + + web3-eth-contract@4.7.2(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@ethereumjs/rlp': 5.0.2 + web3-core: 4.7.1 + web3-errors: 1.3.1 + web3-eth: 4.11.1(typescript@5.9.3)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.9.3)(zod@3.25.76) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-eth-ens@4.4.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + web3-core: 4.7.1 + web3-errors: 1.3.1 + web3-eth: 4.11.1(typescript@5.9.3)(zod@3.25.76) + web3-eth-contract: 4.7.2(typescript@5.9.3)(zod@3.25.76) + web3-net: 4.1.0 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-eth-iban@4.0.7: + dependencies: + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + + web3-eth-personal@4.1.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + web3-core: 4.7.1 + web3-eth: 4.11.1(typescript@5.9.3)(zod@3.25.76) + web3-rpc-methods: 1.3.0 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-eth@4.11.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + setimmediate: 1.0.5 + web3-core: 4.7.1 + web3-errors: 1.3.1 + web3-eth-abi: 4.4.1(typescript@5.9.3)(zod@3.25.76) + web3-eth-accounts: 4.3.1 + web3-net: 4.1.0 + web3-providers-ws: 4.0.8 + web3-rpc-methods: 1.3.0 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-net@4.1.0: + dependencies: + web3-core: 4.7.1 + web3-rpc-methods: 1.3.0 + web3-types: 1.10.0 + web3-utils: 4.3.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-providers-http@4.2.0: + dependencies: + cross-fetch: 4.1.0 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@4.0.7: + dependencies: + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + optional: true + + web3-providers-ws@4.0.8: + dependencies: + '@types/ws': 8.5.3 + isomorphic-ws: 5.0.0(ws@8.20.0) + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + web3-rpc-methods@1.3.0: + dependencies: + web3-core: 4.7.1 + web3-types: 1.10.0 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-rpc-providers@1.0.0-rc.4: + dependencies: + web3-errors: 1.3.1 + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-types@1.10.0: {} + + web3-utils@4.3.3: + dependencies: + ethereum-cryptography: 2.2.1 + eventemitter3: 5.0.4 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-validator: 2.0.6 + + web3-validator@2.0.6: + dependencies: + ethereum-cryptography: 2.2.1 + util: 0.12.5 + web3-errors: 1.3.1 + web3-types: 1.10.0 + zod: 3.25.76 + + web3@4.16.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + web3-core: 4.7.1 + web3-errors: 1.3.1 + web3-eth: 4.11.1(typescript@5.9.3)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.9.3)(zod@3.25.76) + web3-eth-accounts: 4.3.1 + web3-eth-contract: 4.7.2(typescript@5.9.3)(zod@3.25.76) + web3-eth-ens: 4.4.0(typescript@5.9.3)(zod@3.25.76) + web3-eth-iban: 4.0.7 + web3-eth-personal: 4.1.0(typescript@5.9.3)(zod@3.25.76) + web3-net: 4.1.0 + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8 + web3-rpc-methods: 1.3.0 + web3-rpc-providers: 1.0.0-rc.4 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + winston-loki@6.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + dependencies: + async-exit-hook: 2.0.1 + btoa: 1.2.1 + protobufjs: 7.5.4 + url-polyfill: 1.1.14 + winston-transport: 4.9.0 + optionalDependencies: + snappy: 7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + ws@8.17.1: {} + + ws@8.18.0: {} + + ws@8.20.0: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zen-observable-ts@1.2.5: + dependencies: + zen-observable: 0.8.15 + + zen-observable@0.8.15: {} + + zod@3.25.76: {} From 8cd8bbe0507b7f2a89c83c3b8198827fe23427c3 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Mon, 13 Apr 2026 15:35:14 +0200 Subject: [PATCH 14/41] rename os silo price action --- cron/cron-jobs.ts | 100 +++++++++--------- ...PricesSonic.ts => setOSSiloPriceAction.ts} | 17 +-- 2 files changed, 59 insertions(+), 58 deletions(-) rename src/js/tasks/actions/{setPricesSonic.ts => setOSSiloPriceAction.ts} (86%) diff --git a/cron/cron-jobs.ts b/cron/cron-jobs.ts index 6d18d36d..a8f577bf 100644 --- a/cron/cron-jobs.ts +++ b/cron/cron-jobs.ts @@ -6,170 +6,170 @@ const cronConfig: CronConfig = { name: "healthcheck", schedule: "*/5 * * * *", enabled: true, - command: "cd /app && npx hardhat healthcheck", + command: "cd /app && pnpm hardhat healthcheck", }, { name: "mainnet_auto_request_withdraw", schedule: "5 */3 * * *", enabled: false, - command: "cd /app && npx hardhat autoRequestWithdraw --network mainnet", + command: "cd /app && pnpm hardhat autoRequestWithdraw --network mainnet", }, { name: "mainnet_auto_claim_withdraw", schedule: "20 */3 * * *", enabled: false, - command: "cd /app && npx hardhat autoClaimWithdraw --network mainnet", + command: "cd /app && pnpm hardhat autoClaimWithdraw --network mainnet", }, { name: "mainnet_auto_request_lido_withdraw", schedule: "29,58 12-23,0-8 * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoRequestLidoWithdraw --network mainnet", + "cd /app && pnpm hardhat autoRequestLidoWithdraw --network mainnet", }, { name: "mainnet_auto_claim_lido_withdraw", schedule: "32 0,12 * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoClaimLidoWithdraw --network mainnet", + "cd /app && pnpm hardhat autoClaimLidoWithdraw --network mainnet", }, { name: "mainnet_auto_request_etherfi_withdraw", schedule: "10,40 * * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoRequestEtherFiWithdraw --network mainnet", + "cd /app && pnpm hardhat autoRequestEtherFiWithdraw --network mainnet", }, { name: "mainnet_auto_claim_etherfi_withdraw", schedule: "40 * * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoClaimEtherFiWithdraw --network mainnet", + "cd /app && pnpm hardhat autoClaimEtherFiWithdraw --network mainnet", }, { name: "mainnet_auto_request_ethena_withdraw", - schedule: "0 */3 * * *", - enabled: true, + schedule: "12 * * * *", + enabled: false, command: - "cd /app && npx hardhat autoRequestEthenaWithdraw --network mainnet", + "cd /app && pnpm hardhat autoRequestEthenaWithdraw --network mainnet", }, { name: "mainnet_auto_claim_ethena_withdraw", schedule: "40 * * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoClaimEthenaWithdraw --network mainnet", + "cd /app && pnpm hardhat autoClaimEthenaWithdraw --network mainnet", }, { name: "mainnet_collect_oeth_fees", schedule: "3 0 * * *", enabled: false, - command: "cd /app && npx hardhat collectOETHFees --network mainnet", + command: "cd /app && pnpm hardhat collectOETHFees --network mainnet", }, { name: "mainnet_collect_lido_fees", schedule: "30 12 * * *", - enabled: true, - command: "cd /app && npx hardhat collectLidoFees --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat collectLidoFees --network mainnet", }, { name: "mainnet_collect_etherfi_fees", schedule: "45 23 * * *", - enabled: true, - command: "cd /app && npx hardhat collectEtherFiFees --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat collectEtherFiFees --network mainnet", }, { name: "mainnet_collect_ethena_fees", schedule: "45 23 * * *", - enabled: true, - command: "cd /app && npx hardhat collectEthenaFees --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat collectEthenaFees --network mainnet", }, { name: "mainnet_allocate_oeth", schedule: "42 * * * *", enabled: false, - command: "cd /app && npx hardhat allocateOETH --network mainnet", + command: "cd /app && pnpm hardhat allocateOETH --network mainnet", }, { name: "mainnet_allocate_lido", schedule: "38,08 * * * *", - enabled: true, - command: "cd /app && npx hardhat allocateLido --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat allocateLido --network mainnet", }, { name: "mainnet_allocate_etherfi", schedule: "52 * * * *", enabled: false, - command: "cd /app && npx hardhat allocateEtherFi --network mainnet", + command: "cd /app && pnpm hardhat allocateEtherFi --network mainnet", }, { name: "mainnet_allocate_ethena", schedule: "28 * * * *", - enabled: true, - command: "cd /app && npx hardhat allocateEthena --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat allocateEthena --network mainnet", }, { name: "mainnet_set_prices_oeth", schedule: "*/10 * * * *", enabled: false, - command: "cd /app && npx hardhat setPricesOETH --network mainnet", + command: "cd /app && pnpm hardhat setPricesOETH --network mainnet", }, { name: "mainnet_set_prices_lido", schedule: "*/30 * * * *", - enabled: true, - command: "cd /app && npx hardhat setPricesLido --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat setPricesLido --network mainnet", }, { name: "mainnet_set_prices_etherfi", schedule: "2,32 * * * *", - enabled: true, - command: "cd /app && npx hardhat setPricesEtherFi --network mainnet", + enabled: false, + command: "cd /app && pnpm hardhat setPricesEtherFi --network mainnet", }, { name: "mainnet_set_prices_ethena", - schedule: "0 * * * *", - enabled: true, - command: "cd /app && npx hardhat setPricesEthena --network mainnet", + schedule: "4 * * * *", + enabled: false, + command: "cd /app && pnpm hardhat setPricesEthena --network mainnet", }, { name: "sonic_auto_request_withdraw", schedule: "48,18 * * * *", - enabled: true, + enabled: false, command: - "cd /app && npx hardhat autoRequestWithdrawSonic --network sonic", + "cd /app && pnpm hardhat autoRequestWithdrawSonic --network sonic", }, { name: "sonic_auto_claim_withdraw", schedule: "58 */2 * * *", - enabled: true, - command: "cd /app && npx hardhat autoClaimWithdrawSonic --network sonic", + enabled: false, + command: "cd /app && pnpm hardhat autoClaimWithdrawSonic --network sonic", }, { name: "sonic_collect_fees", schedule: "55 23 * * *", - enabled: true, - command: "cd /app && npx hardhat collectFeesSonic --network sonic", + enabled: false, + command: "cd /app && pnpm hardhat collectFeesSonic --network sonic", }, { name: "sonic_allocate", schedule: "1,31 * * * *", - enabled: true, - command: "cd /app && npx hardhat allocateSonic --network sonic", + enabled: false, + command: "cd /app && pnpm hardhat allocateSonic --network sonic", }, { - name: "sonic_set_prices", + name: "os_silo_set_prices", schedule: "*/30 * * * *", - enabled: true, - command: "cd /app && npx hardhat setPricesSonic --network sonic", + enabled: false, + command: "cd /app && pnpm hardhat setOSSiloPriceAction --network sonic", }, { name: "sonic_collect_rewards", schedule: "45 23 * * *", - enabled: true, - command: "cd /app && npx hardhat collectRewardsSonic --network sonic", + enabled: false, + command: "cd /app && pnpm hardhat collectRewardsSonic --network sonic", }, ], }; diff --git a/src/js/tasks/actions/setPricesSonic.ts b/src/js/tasks/actions/setOSSiloPriceAction.ts similarity index 86% rename from src/js/tasks/actions/setPricesSonic.ts rename to src/js/tasks/actions/setOSSiloPriceAction.ts index 544cf9f0..a00333fe 100644 --- a/src/js/tasks/actions/setPricesSonic.ts +++ b/src/js/tasks/actions/setOSSiloPriceAction.ts @@ -4,7 +4,7 @@ import { action } from "../lib/action"; import { setOSSiloPrice } from "../osSiloPrice"; action({ - name: "setPricesSonic", + name: "setOSSiloPriceAction", description: "Set prices on Sonic ARM", chains: [146], run: async ({ signer, log }) => { @@ -31,10 +31,10 @@ action({ activeMarket === ethers.ZeroAddress ? undefined : new ethers.Contract( - activeMarket, - ["function market() external view returns (address)"], - signer - ); + activeMarket, + ["function market() external view returns (address)"], + signer + ); // Get the WS and OS token contracts const wSAddress = await arm.token0(); @@ -72,12 +72,13 @@ action({ oS, vault, blockTag: "latest", - marketPremium: 1, - lendPremium: 200, - tolerance: 0.3, + marketPremium: 1, // basis points. Negative value reduces the price + lendPremium: 200, // basis points added to lending APY (100 = 1%) + tolerance: 0.3, // basis points market: "1inch", minSwapAmount: parseUnits("16000", 18), minBuyPrice: 0.99, + // maxBuyPrice: 0.995, }); }, }); From d35ea2322cf5a8e04b253710ca657969c8954ca0 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Mon, 13 Apr 2026 16:32:44 +0200 Subject: [PATCH 15/41] make the sonic action use the old ABI which is still actively deployed on sonic --- src/abis/OriginARMV1.json | 1732 +++++++++++++++++++++++++ src/js/tasks/actions/allocateSonic.ts | 3 +- 2 files changed, 1734 insertions(+), 1 deletion(-) create mode 100644 src/abis/OriginARMV1.json diff --git a/src/abis/OriginARMV1.json b/src/abis/OriginARMV1.json new file mode 100644 index 00000000..493057be --- /dev/null +++ b/src/abis/OriginARMV1.json @@ -0,0 +1,1732 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_otoken", + "type": "address" + }, + { + "internalType": "address", + "name": "_liquidityAsset", + "type": "address" + }, + { + "internalType": "address", + "name": "_vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_claimDelay", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minSharesToRedeem", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "_allocateThreshold", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "int256", + "name": "value", + "type": "int256" + } + ], + "name": "SafeCastOverflowedIntDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "value", + "type": "int256" + } + ], + "name": "SafeCastOverflowedIntToUint", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintToInt", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "armBuffer", + "type": "uint256" + } + ], + "name": "ARMBufferUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "ActiveMarketUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "assets", + "type": "int256" + } + ], + "name": "Allocated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "capManager", + "type": "address" + } + ], + "name": "CapManagerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountClaimed", + "type": "uint256" + } + ], + "name": "ClaimOriginWithdrawals", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "crossPrice", + "type": "uint256" + } + ], + "name": "CrossPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "feeCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFeeCollector", + "type": "address" + } + ], + "name": "FeeCollectorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "MarketAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "MarketRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "OperatorChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "withdrawer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "name": "RedeemClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "withdrawer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queued", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimTimestamp", + "type": "uint256" + } + ], + "name": "RedeemRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "RequestOriginWithdrawal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "traderate0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "traderate1", + "type": "uint256" + } + ], + "name": "TraderateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "FEE_SCALE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_CROSS_PRICE_DEVIATION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRICE_SCALE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_markets", + "type": "address[]" + } + ], + "name": "addMarkets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allocate", + "outputs": [ + { + "internalType": "int256", + "name": "liquidityDelta", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allocateThreshold", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "armBuffer", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseAsset", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "name": "claimOriginWithdrawals", + "outputs": [ + { + "internalType": "uint256", + "name": "amountClaimed", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "claimRedeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimable", + "outputs": [ + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collectFees", + "outputs": [ + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "convertToAssets", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "name": "convertToShares", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "crossPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "deposit", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feesAccrued", + "outputs": [ + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "_operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_feeCollector", + "type": "address" + }, + { + "internalType": "address", + "name": "_capManager", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastAvailableAssets", + "outputs": [ + { + "internalType": "int128", + "name": "", + "type": "int128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "liquidityAsset", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minSharesToRedeem", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextWithdrawalIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "name": "previewDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "previewRedeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_market", + "type": "address" + } + ], + "name": "removeMarket", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "requestOriginWithdrawal", + "outputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "requestRedeem", + "outputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_armBuffer", + "type": "uint256" + } + ], + "name": "setARMBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_market", + "type": "address" + } + ], + "name": "setActiveMarket", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_capManager", + "type": "address" + } + ], + "name": "setCapManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newCrossPrice", + "type": "uint256" + } + ], + "name": "setCrossPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeCollector", + "type": "address" + } + ], + "name": "setFeeCollector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOperator", + "type": "address" + } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "buyT1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellT1", + "type": "uint256" + } + ], + "name": "setPrices", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "supportedMarkets", + "outputs": [ + { + "internalType": "bool", + "name": "supported", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "inToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "outToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "inToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "outToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token0", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token1", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalAssets", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "traderate0", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "traderate1", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultWithdrawalAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "withdrawalRequests", + "outputs": [ + { + "internalType": "address", + "name": "withdrawer", + "type": "address" + }, + { + "internalType": "bool", + "name": "claimed", + "type": "bool" + }, + { + "internalType": "uint40", + "name": "claimTimestamp", + "type": "uint40" + }, + { + "internalType": "uint128", + "name": "assets", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "queued", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawsClaimed", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawsQueued", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/src/js/tasks/actions/allocateSonic.ts b/src/js/tasks/actions/allocateSonic.ts index 520eec45..c83e0275 100644 --- a/src/js/tasks/actions/allocateSonic.ts +++ b/src/js/tasks/actions/allocateSonic.ts @@ -3,7 +3,8 @@ import { ethers } from "ethers"; import { action } from "../lib/action"; import { allocate } from "../admin"; import { sonic } from "../../utils/addresses"; -const armAbi = require("../../../abis/OriginARM.json"); +// Sonic still uses the old ARM contract version +const armAbi = require("../../../abis/OriginARMV1.json"); action({ name: "allocateSonic", From b825a550625de5444344c7b9eb7a0365cb76ebee Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Mon, 13 Apr 2026 16:35:29 +0200 Subject: [PATCH 16/41] update cron to reflect the deployed contracts --- cron/cron-jobs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron/cron-jobs.ts b/cron/cron-jobs.ts index a8f577bf..f0a6f758 100644 --- a/cron/cron-jobs.ts +++ b/cron/cron-jobs.ts @@ -143,7 +143,7 @@ const cronConfig: CronConfig = { }, { name: "sonic_auto_claim_withdraw", - schedule: "58 */2 * * *", + schedule: "10 * * * *", enabled: false, command: "cd /app && pnpm hardhat autoClaimWithdrawSonic --network sonic", }, From 616e480903577a246cd635249c49f7e7f340670c Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Mon, 13 Apr 2026 16:56:06 +0200 Subject: [PATCH 17/41] delete the actions that are disabled --- cron/cron-jobs.ts | 30 --------------------- src/js/tasks/actions/collectRewardsSonic.ts | 2 ++ 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/cron/cron-jobs.ts b/cron/cron-jobs.ts index f0a6f758..d82e2caf 100644 --- a/cron/cron-jobs.ts +++ b/cron/cron-jobs.ts @@ -8,18 +8,6 @@ const cronConfig: CronConfig = { enabled: true, command: "cd /app && pnpm hardhat healthcheck", }, - { - name: "mainnet_auto_request_withdraw", - schedule: "5 */3 * * *", - enabled: false, - command: "cd /app && pnpm hardhat autoRequestWithdraw --network mainnet", - }, - { - name: "mainnet_auto_claim_withdraw", - schedule: "20 */3 * * *", - enabled: false, - command: "cd /app && pnpm hardhat autoClaimWithdraw --network mainnet", - }, { name: "mainnet_auto_request_lido_withdraw", schedule: "29,58 12-23,0-8 * * *", @@ -62,12 +50,6 @@ const cronConfig: CronConfig = { command: "cd /app && pnpm hardhat autoClaimEthenaWithdraw --network mainnet", }, - { - name: "mainnet_collect_oeth_fees", - schedule: "3 0 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectOETHFees --network mainnet", - }, { name: "mainnet_collect_lido_fees", schedule: "30 12 * * *", @@ -86,12 +68,6 @@ const cronConfig: CronConfig = { enabled: false, command: "cd /app && pnpm hardhat collectEthenaFees --network mainnet", }, - { - name: "mainnet_allocate_oeth", - schedule: "42 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat allocateOETH --network mainnet", - }, { name: "mainnet_allocate_lido", schedule: "38,08 * * * *", @@ -110,12 +86,6 @@ const cronConfig: CronConfig = { enabled: false, command: "cd /app && pnpm hardhat allocateEthena --network mainnet", }, - { - name: "mainnet_set_prices_oeth", - schedule: "*/10 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat setPricesOETH --network mainnet", - }, { name: "mainnet_set_prices_lido", schedule: "*/30 * * * *", diff --git a/src/js/tasks/actions/collectRewardsSonic.ts b/src/js/tasks/actions/collectRewardsSonic.ts index 5f09fe7b..b14411ed 100644 --- a/src/js/tasks/actions/collectRewardsSonic.ts +++ b/src/js/tasks/actions/collectRewardsSonic.ts @@ -22,5 +22,7 @@ action({ harvester, strategies: [sonic.siloVarlamoreMarket], }); + + // TODO do Silo, beS and wOS swaps with FlyTrade }, }); From 0150c597722495d90da1e03342a5de993ae5a058 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 15 Apr 2026 16:49:51 +0800 Subject: [PATCH 18/41] Refactor supervisor logging and extract API module - Replace console logging with winston/Loki logger in supervisor - Delete log-events.ts emit wrappers, inline structured logging in action.ts - Extract HTTP API + run tracking into api.ts, slim supervisor to orchestrator - Add action.start/action.success events to action framework - Generate run_id (UUID) per action, remove AUTOMATON_RUN_ID env var - Add real action.test.ts that exercises createActionHandler() with mock signer - Delete stale test-action.ts, action-runner.test.ts, snapshot --- cron/README.md | 17 +- cron/action-runner.snapshot.jsonl | 13 - cron/action-runner.test.ts | 196 --------------- cron/api.ts | 239 ++++++++++++++++++ cron/cron-supervisor.ts | 324 ++++--------------------- cron/log-events.ts | 74 ------ cron/test-action.ts | 42 ---- src/js/tasks/lib/action.snapshot.jsonl | 8 + src/js/tasks/lib/action.test.ts | 154 ++++++++++++ src/js/tasks/lib/action.ts | 66 +++-- 10 files changed, 508 insertions(+), 625 deletions(-) delete mode 100644 cron/action-runner.snapshot.jsonl delete mode 100644 cron/action-runner.test.ts create mode 100644 cron/api.ts delete mode 100644 cron/log-events.ts delete mode 100644 cron/test-action.ts create mode 100644 src/js/tasks/lib/action.snapshot.jsonl create mode 100644 src/js/tasks/lib/action.test.ts diff --git a/cron/README.md b/cron/README.md index 935ff4e8..cfe006a9 100644 --- a/cron/README.md +++ b/cron/README.md @@ -10,9 +10,10 @@ A sibling Automaton with the same shape and log schema lives in the `origin-doll |---|---| | `cron/cron-jobs.ts` | Job registry — `name`, `schedule` (5-field cron), `enabled`, `command`. Single source of truth. | | `cron/render-crontab.ts` | Validates the registry (unique names, valid schedules) and writes the supercronic crontab file. | -| `cron/cron-supervisor.ts` | Express HTTP server + supercronic child process. Spawns jobs, tracks runs in memory, exposes `/api/v1/actions`, `/api/v1/actions/:name/runs`, `/api/v1/runs/:id`, `/healthz`. **Owns the canonical Loki run-lifecycle events.** | +| `cron/cron-supervisor.ts` | Boots supercronic + HTTP API server. Exposes `/api/v1/actions`, `/api/v1/actions/:name/runs`, `/api/v1/runs/:id`, `/healthz`. | +| `cron/api.ts` | HTTP server, auth, run tracking for on-demand action triggers. | | `cron/cron-entrypoint.sh` | Container entrypoint — boots the supervisor under `ts-node`. | -| `src/js/tasks/lib/action.ts` | Wrapper used by every hardhat task. Inherits `AUTOMATON_RUN_ID` from the supervisor, attaches it to a child logger, and emits `action.error` (with stack) on failure. | +| `src/js/tasks/lib/action.ts` | Wrapper used by every hardhat task. Generates a `run_id` (UUID), emits `action.start`, `action.success`, and `action.error` events to Loki. | | `src/js/tasks/lib/logger.ts` | Winston + winston-loki. Promotes `action`, `event`, `source` to Loki labels. | ## Adding / enabling / disabling a job @@ -31,8 +32,6 @@ Required env vars: - `PROVIDER_URL`, `SONIC_URL` — RPC endpoints (same as the rest of the repo) - `LOKI_URL`, `LOKI_USER`, `LOKI_API_KEY` — optional; if unset, logs only go to stdout - `ACTION_API_BEARER_TOKEN` — required to start the supervisor (auth for `/api/v1/*`) -- `AUTOMATON_RUN_ID` — set automatically by the supervisor when spawning a job; can be set manually when running a single task standalone if you want it correlated in Loki - Run a single action without the supervisor: ``` npx hardhat --network mainnet @@ -45,9 +44,15 @@ ACTION_API_BEARER_TOKEN=dev npx ts-node cron/cron-supervisor.ts ## Observability -Every scheduled invocation produces exactly one `action.start` and exactly one terminal event (`action.success` or `action.failure`) from the supervisor, plus an `action.error` (with stack, chain, network) from the task wrapper if it threw. All four events share a `run_id` for correlation. +Each action generates its own `run_id` (UUID) and emits structured events via the winston/Loki logger in `src/js/tasks/lib/action.ts`: + +- `action.start` — emitted after resolving the signer and chain, before running the action +- `action.success` — emitted on successful completion, includes `duration_ms` +- `action.error` — emitted on failure, includes `duration_ms`, `error_name`, `error_message`, `error_stack` + +All events for a single run share the same `run_id` for correlation in Grafana. -See [`docs/automaton-observability.md`](../docs/automaton-observability.md) for the field schema, the LogQL cookbook, and the recipe for debugging a single failed run end-to-end. +See [`docs/automaton-observability.md`](../docs/automaton-observability.md) for the field schema and LogQL cookbook. ## Future: Prometheus diff --git a/cron/action-runner.snapshot.jsonl b/cron/action-runner.snapshot.jsonl deleted file mode 100644 index a4d812b6..00000000 --- a/cron/action-runner.snapshot.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{"event":"action.start","source":"supervisor","action":"test_action","run_id":"11111111-1111-1111-1111-111111111111","schedule":"*/5 * * * *","command":"npx ts-node ","level":"info","message":"Started run 11111111-1111-1111-1111-111111111111"} -{"level":"info","action":"test_action","message":"Running on testnet (31337)","run_id":"11111111-1111-1111-1111-111111111111"} -{"level":"info","action":"test_action","message":"Checking balances","run_id":"11111111-1111-1111-1111-111111111111"} -{"level":"info","action":"test_action","message":"Balance: 1000000000000000000 wei","run_id":"11111111-1111-1111-1111-111111111111"} -{"level":"info","action":"test_action","message":"Test action passed","run_id":"11111111-1111-1111-1111-111111111111"} -{"event":"action.success","source":"supervisor","action":"test_action","run_id":"11111111-1111-1111-1111-111111111111","duration_ms":42,"exit_code":0,"signal":null,"level":"info","message":"Completed in 0.0s"} -{"event":"action.start","source":"supervisor","action":"test_action","run_id":"22222222-2222-2222-2222-222222222222","schedule":"0 0 * * *","command":"npx ts-node --fail","level":"info","message":"Started run 22222222-2222-2222-2222-222222222222"} -{"level":"info","action":"test_action","message":"Running on testnet (31337)","run_id":"22222222-2222-2222-2222-222222222222"} -{"level":"info","action":"test_action","message":"Checking balances","run_id":"22222222-2222-2222-2222-222222222222"} -{"level":"info","action":"test_action","message":"Balance: 1000000000000000000 wei","run_id":"22222222-2222-2222-2222-222222222222"} -{"level":"error","action":"test_action","message":"Error: Simulated failure for testing","run_id":"22222222-2222-2222-2222-222222222222","event":"action.error","source":"task","chain_id":31337,"network":"testnet","duration_ms":"","error_name":"Error","error_message":"Simulated failure for testing"} -{"event":"action.failure","source":"supervisor","action":"test_action","run_id":"22222222-2222-2222-2222-222222222222","duration_ms":11398,"exit_code":1,"signal":null,"level":"error","message":"Failed after 11.4s (exit=1)"} -{"event":"action.failure","source":"supervisor","action":"test_action","run_id":"33333333-3333-3333-3333-333333333333","duration_ms":5,"spawn_failed":true,"error_message":"ENOENT: no such file or directory, posix_spawn '/bin/sh'","level":"error","message":"Failed to spawn: ENOENT: no such file or directory, posix_spawn '/bin/sh'"} diff --git a/cron/action-runner.test.ts b/cron/action-runner.test.ts deleted file mode 100644 index a5be5cea..00000000 --- a/cron/action-runner.test.ts +++ /dev/null @@ -1,196 +0,0 @@ -// Integration test for the supervisor's action execution + structured logging. -// -// Spawns a real test action (cron/test-action.ts) through the same code path -// the supervisor uses. Captures both supervisor-level events and the action's -// own log output, then compares the combined stream against a golden snapshot. -// -// Run with: npx ts-node cron/action-runner.test.ts -// Update snapshot: npx ts-node cron/action-runner.test.ts --update - -import { spawn } from "node:child_process"; -import fs from "node:fs"; -import path from "node:path"; -import { format, transports } from "winston"; -import logger from "../src/js/tasks/lib/logger"; -import { - emitActionExit, - emitActionStart, - emitSpawnFailure, -} from "./log-events"; - -const SNAPSHOT_PATH = path.join(__dirname, "action-runner.snapshot.jsonl"); -const updateSnapshot = process.argv.includes("--update"); -const testActionScript = path.join(__dirname, "test-action.ts"); - -// --- Winston capture --------------------------------------------------------- - -const captured: Record[] = []; -const captureFormat = format((info) => { - captured.push({ ...info }); - return false; -}); -logger.add(new transports.Console({ format: captureFormat() })); - -/** Strip volatile fields for stable comparison. */ -function stabilize(record: Record): Record { - const isTaskRecord = record.source === "task"; - const out: Record = {}; - for (const [k, v] of Object.entries(record)) { - if (k === "timestamp") continue; - if (k === "duration_ms" && isTaskRecord) { - out[k] = ""; - continue; - } - if (k === "command" && typeof v === "string") { - out[k] = v.replace(testActionScript, ""); - continue; - } - out[k] = v; - } - return out; -} - -/** - * Parse a console log line from the action child process. - * Format: ` : [] {json}` - */ -function parseLogLine(line: string): Record | null { - const match = line.match( - /^\S+\s+(\w+):\s+(?:\[(\w+)\]\s+)?(.+?)(?:\s+(\{.+\}))?$/ - ); - if (!match) return null; - const [, level, action, message, jsonStr] = match; - const extra = jsonStr ? JSON.parse(jsonStr) : {}; - return { level, action, message, ...extra }; -} - -// --- Helpers ----------------------------------------------------------------- - -const RUN_IDS = { - success: "11111111-1111-1111-1111-111111111111", - failure: "22222222-2222-2222-2222-222222222222", - spawnFail: "33333333-3333-3333-3333-333333333333", -}; - -function spawnTestAction( - args: string[], - runId: string -): Promise<{ - exitCode: number | null; - signal: NodeJS.Signals | null; - logs: Record[]; -}> { - return new Promise((resolve) => { - const child = spawn("npx", ["ts-node", testActionScript, ...args], { - env: { ...process.env, AUTOMATON_RUN_ID: runId }, - stdio: ["ignore", "pipe", "pipe"], - }); - - let stdout = ""; - let stderr = ""; - child.stdout.on("data", (d: Buffer) => (stdout += d)); - child.stderr.on("data", (d: Buffer) => (stderr += d)); - - child.on("exit", (code, signal) => { - const allOutput = (stdout + stderr).trim(); - const logs: Record[] = []; - for (const line of allOutput.split("\n")) { - if (!line.trim()) continue; - const parsed = parseLogLine(line.trim()); - if (parsed) logs.push(parsed); - } - resolve({ exitCode: code, signal, logs }); - }); - }); -} - -// --- Scenarios --------------------------------------------------------------- - -async function runSuccessScenario() { - const action = "test_action"; - const runId = RUN_IDS.success; - const schedule = "*/5 * * * *"; - const command = `npx ts-node ${testActionScript}`; - - emitActionStart({ action, runId, schedule, command }); - const result = await spawnTestAction([], runId); - for (const log of result.logs) captured.push(log); - emitActionExit({ - action, - runId, - durationMs: 42, - exitCode: result.exitCode, - signal: result.signal, - }); -} - -async function runFailureScenario() { - const action = "test_action"; - const runId = RUN_IDS.failure; - const schedule = "0 0 * * *"; - const command = `npx ts-node ${testActionScript} --fail`; - - emitActionStart({ action, runId, schedule, command }); - const result = await spawnTestAction(["--fail"], runId); - for (const log of result.logs) captured.push(log); - emitActionExit({ - action, - runId, - durationMs: 11398, - exitCode: result.exitCode, - signal: result.signal, - }); -} - -async function runSpawnFailureScenario() { - emitSpawnFailure({ - action: "test_action", - runId: RUN_IDS.spawnFail, - durationMs: 5, - errorMessage: "ENOENT: no such file or directory, posix_spawn '/bin/sh'", - }); -} - -// --- Main -------------------------------------------------------------------- - -async function main() { - await runSuccessScenario(); - await runFailureScenario(); - await runSpawnFailureScenario(); - - const stable = captured.map(stabilize); - const actualJsonl = stable.map((r) => JSON.stringify(r)).join("\n") + "\n"; - - if (updateSnapshot) { - fs.writeFileSync(SNAPSHOT_PATH, actualJsonl, "utf8"); - console.log(`Snapshot updated: ${SNAPSHOT_PATH}`); - console.log(actualJsonl); - return; - } - - if (!fs.existsSync(SNAPSHOT_PATH)) { - console.error( - "No snapshot found. Run with --update to create it:\n" + - " npx ts-node cron/action-runner.test.ts --update" - ); - process.exit(1); - } - - const expected = fs.readFileSync(SNAPSHOT_PATH, "utf8"); - if (actualJsonl === expected) { - console.log("OK — log output matches snapshot"); - console.log(` ${stable.length} records across 3 scenarios`); - } else { - console.error("FAIL — log output does not match snapshot\n"); - console.error("Expected:"); - console.error(expected); - console.error("Actual:"); - console.error(actualJsonl); - process.exit(1); - } -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/cron/api.ts b/cron/api.ts new file mode 100644 index 00000000..efd141fb --- /dev/null +++ b/cron/api.ts @@ -0,0 +1,239 @@ +import { spawn } from "node:child_process"; +import { randomUUID, timingSafeEqual } from "node:crypto"; +import http from "node:http"; +import type { Logger } from "winston"; +import type { CronJob } from "./render-crontab"; + +// --- Run tracking --- + +interface ActionRun { + runId: string; + action: string; + schedule: string; + enabled: boolean; + command?: string; + status: "queued" | "running" | "succeeded" | "failed"; + queuedAt: string; + startedAt: string; + finishedAt: string | null; + exitCode: number | null; + signal: string | null; + pid: number | null; + error?: string; +} + +// --- API --- + +export interface ApiOpts { + host: string; + port: number; + apiToken: string; + jobs: CronJob[]; + jobsByName: Map; + workdir: string; + historyLimit: number; + healthCheck: () => { running: boolean; pid: number | null }; + log: Logger; +} + +export function createApi(opts: ApiOpts): http.Server { + const { + host, + port, + apiToken, + jobs, + jobsByName, + workdir, + historyLimit, + healthCheck, + log, + } = opts; + + const nowIso = () => new Date().toISOString(); + + // --- Run store --- + + const runStore = new Map(); + const runOrder: string[] = []; + + function storeRun(run: ActionRun) { + runStore.set(run.runId, run); + runOrder.push(run.runId); + while (runOrder.length > historyLimit) { + runStore.delete(runOrder.shift()!); + } + } + + // --- Action execution --- + + function runAction(action: CronJob, run: ActionRun) { + run.status = "running"; + run.startedAt = nowIso(); + run.command = action.command; + + log.info(`Starting run ${run.runId} for "${action.name}"`); + + const child = spawn("/bin/sh", ["-lc", action.command], { + cwd: workdir, + env: process.env, + stdio: "inherit", + }); + run.pid = child.pid ?? null; + + child.on("error", (err) => { + run.status = "failed"; + run.finishedAt = nowIso(); + run.exitCode = null; + run.signal = null; + run.error = err.message; + log.error(`Run ${run.runId} failed to spawn: ${err.message}`); + }); + + child.on("exit", (code, signal) => { + run.finishedAt = nowIso(); + run.exitCode = code; + run.signal = signal; + run.status = code === 0 ? "succeeded" : "failed"; + }); + } + + function triggerAction(actionName: string): ActionRun | undefined { + const action = jobsByName.get(actionName); + if (!action) return undefined; + + const run: ActionRun = { + runId: randomUUID(), + action: action.name, + schedule: action.schedule, + enabled: action.enabled, + status: "queued", + queuedAt: nowIso(), + startedAt: nowIso(), + finishedAt: null, + exitCode: null, + signal: null, + pid: null, + }; + + storeRun(run); + setImmediate(() => runAction(action, run)); + return run; + } + + // --- HTTP helpers --- + + function json( + res: http.ServerResponse, + statusCode: number, + payload: any, + extraHeaders: Record = {}, + ) { + res.writeHead(statusCode, { + "Content-Type": "application/json", + ...extraHeaders, + }); + res.end(JSON.stringify(payload)); + } + + const expectedTokenBuffer = Buffer.from(apiToken); + function isAuthorized(headerValue: string | string[] | undefined): boolean { + if (typeof headerValue !== "string") return false; + if (!headerValue.startsWith("Bearer ")) return false; + const providedBuffer = Buffer.from(headerValue.slice(7).trim()); + if (providedBuffer.length !== expectedTokenBuffer.length) return false; + return timingSafeEqual(providedBuffer, expectedTokenBuffer); + } + + // --- Server --- + + const server = http.createServer((req, res) => { + const method = req.method || "GET"; + const forwardedProto = req.headers["x-forwarded-proto"]; + const proto = + typeof forwardedProto === "string" && forwardedProto.length > 0 + ? forwardedProto.split(",")[0].trim() + : "http"; + const reqHost = req.headers.host || `${host}:${port}`; + const origin = `${proto}://${reqHost}`; + const url = new URL(req.url || "/", origin); + + // Health check (unauthenticated) + if (method === "GET" && url.pathname === "/healthz") { + const health = healthCheck(); + return json(res, 200, { + status: "ok", + api: "up", + supercronic: { running: health.running, pid: health.pid }, + }); + } + + // Auth gate for /api/v1/* + if ( + url.pathname.startsWith("/api/v1/") && + !isAuthorized(req.headers.authorization) + ) { + return json(res, 401, { error: "Unauthorized" }); + } + + // List actions + if (method === "GET" && url.pathname === "/api/v1/actions") { + return json(res, 200, { + actions: jobs.map((job) => ({ + name: job.name, + schedule: job.schedule, + enabled: job.enabled, + })), + }); + } + + // Trigger action run + const triggerMatch = url.pathname.match( + /^\/api\/v1\/actions\/([^/]+)\/runs$/, + ); + if (method === "POST" && triggerMatch) { + const run = triggerAction(decodeURIComponent(triggerMatch[1])); + if (!run) + return json(res, 404, { + error: `Unknown action "${triggerMatch[1]}"`, + }); + const statusUrl = `${origin}/api/v1/runs/${encodeURIComponent(run.runId)}`; + return json( + res, + 202, + { + runId: run.runId, + action: run.action, + status: run.status, + statusUrl, + startedAt: run.startedAt, + }, + { Location: statusUrl }, + ); + } + + // Get run status + const statusMatch = url.pathname.match(/^\/api\/v1\/runs\/([^/]+)$/); + if (method === "GET" && statusMatch) { + const run = runStore.get(decodeURIComponent(statusMatch[1])); + if (!run) return json(res, 404, { error: "Run not found" }); + return json(res, 200, { + runId: run.runId, + action: run.action, + status: run.status, + startedAt: run.startedAt, + finishedAt: run.finishedAt, + exitCode: run.exitCode, + signal: run.signal, + }); + } + + json(res, 404, { error: "Not found" }); + }); + + server.on("error", (err) => { + log.error(`HTTP server error: ${err.message}`); + process.exit(1); + }); + + return server; +} diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts index 1c2df746..55e05df3 100644 --- a/cron/cron-supervisor.ts +++ b/cron/cron-supervisor.ts @@ -1,16 +1,13 @@ import { spawn } from "node:child_process"; -import { randomUUID, timingSafeEqual } from "node:crypto"; import fs from "node:fs"; -import http from "node:http"; -import { flushLogger } from "../src/js/tasks/lib/logger"; -import { - emitActionExit, - emitActionStart, - emitSpawnFailure, -} from "./log-events"; -import { type CronJob, renderCrontab } from "./render-crontab"; +import baseLogger, { flushLogger } from "../src/js/tasks/lib/logger"; +import { createApi } from "./api"; +import { renderCrontab } from "./render-crontab"; + +const log = baseLogger.child({ source: "supervisor" }); // --- Configuration --- + const host = process.env.HOST || "0.0.0.0"; const port = Number.parseInt(process.env.PORT || "8080", 10); const cronOutputPath = process.env.CRON_OUTPUT_PATH || "/app/cron/cronjob"; @@ -23,198 +20,51 @@ const actionApiToken = process.env.ACTION_API_BEARER_TOKEN; const configuredActionWorkdir = process.env.ACTION_WORKDIR || "/app"; if (!Number.isInteger(port) || port < 1 || port > 65535) { - console.error(`[cron-supervisor] Invalid PORT value "${process.env.PORT}"`); + log.error(`Invalid PORT value "${process.env.PORT}"`); process.exit(1); } if (!actionApiToken || actionApiToken.trim().length === 0) { - console.error( - "[cron-supervisor] ACTION_API_BEARER_TOKEN must be set and non-empty", - ); + log.error("ACTION_API_BEARER_TOKEN must be set and non-empty"); process.exit(1); } if (!Number.isInteger(runHistoryLimit) || runHistoryLimit < 1) { - console.error( - `[cron-supervisor] Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"`, + log.error( + `Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"`, ); process.exit(1); } -const nowIso = () => new Date().toISOString(); const actionWorkdir = fs.existsSync(configuredActionWorkdir) ? configuredActionWorkdir : process.cwd(); if (!fs.existsSync(configuredActionWorkdir)) { - console.warn( - `[cron-supervisor] ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead`, + log.warn( + `ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead`, ); } -// --- HTTP helpers --- - -function json( - res: http.ServerResponse, - statusCode: number, - payload: any, - extraHeaders: Record = {}, -) { - res.writeHead(statusCode, { - "Content-Type": "application/json", - ...extraHeaders, - }); - res.end(JSON.stringify(payload)); -} - -const expectedTokenBuffer = Buffer.from(actionApiToken); -function isAuthorized(headerValue: string | string[] | undefined): boolean { - if (typeof headerValue !== "string") return false; - if (!headerValue.startsWith("Bearer ")) return false; - const providedBuffer = Buffer.from(headerValue.slice(7).trim()); - if (providedBuffer.length !== expectedTokenBuffer.length) return false; - return timingSafeEqual(providedBuffer, expectedTokenBuffer); -} - -// --- Run tracking --- - -interface ActionRun { - runId: string; - action: string; - schedule: string; - enabled: boolean; - command?: string; - status: "queued" | "running" | "succeeded" | "failed"; - queuedAt: string; - startedAt: string; - finishedAt: string | null; - exitCode: number | null; - signal: string | null; - pid: number | null; - error?: string; -} - -const runStore = new Map(); -const runOrder: string[] = []; - -function storeRun(run: ActionRun) { - runStore.set(run.runId, run); - runOrder.push(run.runId); - while (runOrder.length > runHistoryLimit) { - runStore.delete(runOrder.shift()!); - } -} - // --- Cron setup --- function initCron() { try { - const result = renderCrontab({ - outputPath: cronOutputPath, - }); - return result; + return renderCrontab({ outputPath: cronOutputPath }); } catch (e: any) { - console.error(`[cron-supervisor] ${e.message}`); + log.error(e.message); process.exit(1); } } const { config: renderedConfig, enabledJobs } = initCron(); -console.log( - `[cron-supervisor] Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}`, +log.info( + `Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}`, ); -console.log(`[cron-supervisor] Generated ${cronOutputPath}:`); -console.log(fs.readFileSync(cronOutputPath, "utf8")); - -const jobsByName = new Map( - renderedConfig.jobs.map((job) => [job.name, job]), +log.info( + `Generated ${cronOutputPath}:\n${fs.readFileSync(cronOutputPath, "utf8")}`, ); -// --- Action execution --- - -function runAction(action: CronJob, run: ActionRun) { - run.status = "running"; - run.startedAt = nowIso(); - run.command = action.command; - const startMs = Date.now(); - - console.log( - `[cron-supervisor] Starting run ${run.runId} for action "${action.name}"`, - ); - emitActionStart({ - action: action.name, - runId: run.runId, - schedule: action.schedule, - command: action.command, - }); - - const child = spawn("/bin/sh", ["-lc", action.command], { - cwd: actionWorkdir, - env: { ...process.env, AUTOMATON_RUN_ID: run.runId }, - stdio: "inherit", - }); - run.pid = child.pid ?? null; - - child.on("error", (err) => { - run.status = "failed"; - run.finishedAt = nowIso(); - run.exitCode = null; - run.signal = null; - run.error = err.message; - console.error( - `[cron-supervisor] Run ${run.runId} failed to start: ${err.message}`, - ); - emitSpawnFailure({ - action: action.name, - runId: run.runId, - durationMs: Date.now() - startMs, - errorMessage: err.message, - }); - void flushLogger(); - }); - - child.on("exit", (code, signal) => { - run.finishedAt = nowIso(); - run.exitCode = code; - run.signal = signal; - run.status = code === 0 ? "succeeded" : "failed"; - console.log( - `[cron-supervisor] Run ${run.runId} for "${action.name}" finished with status=${run.status}, code=${code}, signal=${signal}`, - ); - emitActionExit({ - action: action.name, - runId: run.runId, - durationMs: Date.now() - startMs, - exitCode: code, - signal, - }); - void flushLogger(); - }); -} - -function triggerAction(actionName: string): ActionRun | undefined { - const action = jobsByName.get(actionName); - if (!action) return undefined; - - const run: ActionRun = { - runId: randomUUID(), - action: action.name, - schedule: action.schedule, - enabled: action.enabled, - status: "queued", - queuedAt: nowIso(), - startedAt: nowIso(), - finishedAt: null, - exitCode: null, - signal: null, - pid: null, - }; - - storeRun(run); - setImmediate(() => runAction(action, run)); - return run; -} - -// --- Supercronic process --- +// --- Supercronic --- const supercronic = spawn(supercronicBin, [cronOutputPath], { env: process.env, @@ -223,10 +73,34 @@ const supercronic = spawn(supercronicBin, [cronOutputPath], { let supercronicAlive = true; supercronic.on("error", (err) => { - console.error(`[cron-supervisor] supercronic start error: ${err.message}`); + log.error(`supercronic start error: ${err.message}`); process.exit(1); }); +// --- API server --- + +const jobsByName = new Map(renderedConfig.jobs.map((job) => [job.name, job])); +const server = createApi({ + host, + port, + apiToken: actionApiToken, + jobs: renderedConfig.jobs, + jobsByName, + workdir: actionWorkdir, + historyLimit: runHistoryLimit, + healthCheck: () => ({ + running: supercronicAlive, + pid: supercronic.pid ?? null, + }), + log, +}); + +server.listen(port, host, () => { + log.info(`API listening on ${host}:${port}`); +}); + +// --- Graceful shutdown --- + let shuttingDown = false; let serverClosed = false; let supercronicClosed = false; @@ -239,118 +113,28 @@ supercronic.on("exit", (code, signal) => { supercronicAlive = false; supercronicClosed = true; if (!shuttingDown) { - console.error( - `[cron-supervisor] supercronic exited unexpectedly (code=${code}, signal=${signal})`, + log.error( + `supercronic exited unexpectedly (code=${code}, signal=${signal})`, ); process.exit(typeof code === "number" ? code : 1); } maybeExit(); }); -// --- HTTP API --- - -const server = http.createServer((req, res) => { - const method = req.method || "GET"; - const forwardedProto = req.headers["x-forwarded-proto"]; - const proto = - typeof forwardedProto === "string" && forwardedProto.length > 0 - ? forwardedProto.split(",")[0].trim() - : "http"; - const reqHost = req.headers.host || `${host}:${port}`; - const origin = `${proto}://${reqHost}`; - const url = new URL(req.url || "/", origin); - - // Health check (unauthenticated) - if (method === "GET" && url.pathname === "/healthz") { - return json(res, 200, { - status: "ok", - api: "up", - supercronic: { running: supercronicAlive, pid: supercronic.pid ?? null }, - }); - } - - // Auth gate for /api/v1/* - if ( - url.pathname.startsWith("/api/v1/") && - !isAuthorized(req.headers.authorization) - ) { - return json(res, 401, { error: "Unauthorized" }); - } - - // List actions - if (method === "GET" && url.pathname === "/api/v1/actions") { - return json(res, 200, { - actions: renderedConfig.jobs.map((job) => ({ - name: job.name, - schedule: job.schedule, - enabled: job.enabled, - })), - }); - } - - // Trigger action run - const triggerMatch = url.pathname.match( - /^\/api\/v1\/actions\/([^/]+)\/runs$/, - ); - if (method === "POST" && triggerMatch) { - const run = triggerAction(decodeURIComponent(triggerMatch[1])); - if (!run) - return json(res, 404, { error: `Unknown action "${triggerMatch[1]}"` }); - const statusUrl = `${origin}/api/v1/runs/${encodeURIComponent(run.runId)}`; - return json( - res, - 202, - { - runId: run.runId, - action: run.action, - status: run.status, - statusUrl, - startedAt: run.startedAt, - }, - { Location: statusUrl }, - ); - } - - // Get run status - const statusMatch = url.pathname.match(/^\/api\/v1\/runs\/([^/]+)$/); - if (method === "GET" && statusMatch) { - const run = runStore.get(decodeURIComponent(statusMatch[1])); - if (!run) return json(res, 404, { error: `Run not found` }); - return json(res, 200, { - runId: run.runId, - action: run.action, - status: run.status, - startedAt: run.startedAt, - finishedAt: run.finishedAt, - exitCode: run.exitCode, - signal: run.signal, - }); - } - - json(res, 404, { error: "Not found" }); -}); - -server.on("error", (err) => { - console.error(`[cron-supervisor] HTTP server error: ${err.message}`); - process.exit(1); -}); - server.on("close", () => { serverClosed = true; maybeExit(); }); -// --- Graceful shutdown --- - async function shutdown(signal: string) { if (shuttingDown) return; shuttingDown = true; - console.log(`[cron-supervisor] Shutting down (signal=${signal})`); + log.info(`Shutting down (signal=${signal})`); try { await flushLogger(); } catch (err: any) { - console.error(`[cron-supervisor] flushLogger failed: ${err?.message}`); + log.error(`flushLogger failed: ${err?.message}`); } server.close(); @@ -364,13 +148,5 @@ async function shutdown(signal: string) { setTimeout(() => process.exit(0), 12_000).unref(); } -process.on("SIGTERM", () => { - void shutdown("SIGTERM"); -}); -process.on("SIGINT", () => { - void shutdown("SIGINT"); -}); - -server.listen(port, host, () => { - console.log(`[cron-supervisor] API listening on ${host}:${port}`); -}); +process.on("SIGTERM", () => void shutdown("SIGTERM")); +process.on("SIGINT", () => void shutdown("SIGINT")); diff --git a/cron/log-events.ts b/cron/log-events.ts deleted file mode 100644 index dfd3064c..00000000 --- a/cron/log-events.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Structured log events emitted by the Automaton supervisor. -// -// These helpers exist as a separate module so the exact shape of every -// supervisor-side Loki record can be unit-tested in isolation, without -// having to spawn supercronic or stand up the HTTP server. -// -// Schema is documented in cron/README.md and docs/automaton-observability.md. -// The sibling Automaton in `origin-dollar` emits the same shapes. - -import logger, { flushLogger } from "../src/js/tasks/lib/logger"; - -export interface ActionStartFields { - action: string; - runId: string; - schedule: string; - command: string; -} - -export function emitActionStart(f: ActionStartFields): void { - logger.info(`Started run ${f.runId}`, { - event: "action.start", - source: "supervisor", - action: f.action, - run_id: f.runId, - schedule: f.schedule, - command: f.command, - }); -} - -export interface ActionExitFields { - action: string; - runId: string; - durationMs: number; - exitCode: number | null; - signal: NodeJS.Signals | null; -} - -export function emitActionExit(f: ActionExitFields): void { - const success = f.exitCode === 0; - const event = success ? "action.success" : "action.failure"; - const msg = success - ? `Completed in ${(f.durationMs / 1000).toFixed(1)}s` - : `Failed after ${(f.durationMs / 1000).toFixed(1)}s (exit=${f.exitCode}${f.signal ? `, signal=${f.signal}` : ""})`; - logger[success ? "info" : "error"](msg, { - event, - source: "supervisor", - action: f.action, - run_id: f.runId, - duration_ms: f.durationMs, - exit_code: f.exitCode, - signal: f.signal, - }); -} - -export interface SpawnFailureFields { - action: string; - runId: string; - durationMs: number; - errorMessage: string; -} - -export function emitSpawnFailure(f: SpawnFailureFields): void { - logger.error(`Failed to spawn: ${f.errorMessage}`, { - event: "action.failure", - source: "supervisor", - action: f.action, - run_id: f.runId, - duration_ms: f.durationMs, - spawn_failed: true, - error_message: f.errorMessage, - }); -} - -export { flushLogger }; diff --git a/cron/test-action.ts b/cron/test-action.ts deleted file mode 100644 index 434cc0f8..00000000 --- a/cron/test-action.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Minimal test action that mimics the real action() wrapper's logging pattern. -// Used by action-runner.test.ts — no network or signer required. - -import logger, { flushLogger } from "../src/js/tasks/lib/logger"; - -const runId = process.env.AUTOMATON_RUN_ID; -const shouldFail = process.argv.includes("--fail"); - -const log = logger.child({ - action: "test_action", - ...(runId ? { run_id: runId } : {}), -}); - -async function main() { - const startTime = Date.now(); - try { - log.info("Running on testnet (31337)"); - log.info("Checking balances"); - log.info("Balance: 1000000000000000000 wei"); - - if (shouldFail) { - throw new Error("Simulated failure for testing"); - } - - log.info("Test action passed"); - } catch (err: any) { - log.error(`${err.name}: ${err.message}`, { - event: "action.error", - source: "task", - chain_id: 31337, - network: "testnet", - duration_ms: Date.now() - startTime, - error_name: err.name, - error_message: err.message, - }); - process.exitCode = 1; - } finally { - await flushLogger(); - } -} - -main(); diff --git a/src/js/tasks/lib/action.snapshot.jsonl b/src/js/tasks/lib/action.snapshot.jsonl new file mode 100644 index 00000000..7b2a47d3 --- /dev/null +++ b/src/js/tasks/lib/action.snapshot.jsonl @@ -0,0 +1,8 @@ +{"action":"test_harvest","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} +{"action":"test_harvest","run_id":"","message":"Harvesting rewards","level":"info"} +{"action":"test_harvest","run_id":"","message":"Swapped 100 CRV -> 0.5 ETH","level":"info"} +{"action":"test_harvest","run_id":"","event":"action.success","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","level":"info","message":"Completed in 0.0s"} +{"action":"test_harvest","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} +{"action":"test_harvest","run_id":"","event":"action.error","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","error_name":"Error","error_message":"insufficient funds for gas","error_stack":"Error: insufficient funds for gas","level":"error","message":"Error: insufficient funds for gas"} +{"action":"sonic_only_action","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} +{"action":"sonic_only_action","run_id":"","event":"action.error","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","error_name":"Error","error_message":"sonic_only_action only supports sonic (146), not mainnet (1)","error_stack":"Error: sonic_only_action only supports sonic (146), not mainnet (1)","level":"error","message":"Error: sonic_only_action only supports sonic (146), not mainnet (1)"} diff --git a/src/js/tasks/lib/action.test.ts b/src/js/tasks/lib/action.test.ts new file mode 100644 index 00000000..d45a2c1d --- /dev/null +++ b/src/js/tasks/lib/action.test.ts @@ -0,0 +1,154 @@ +// Snapshot test for the action framework's structured logging. +// +// Calls createActionHandler() directly with a mock signer, capturing winston +// records via a capture transport. Tests the real code path in action.ts. +// +// Run with: npx ts-node src/js/tasks/lib/action.test.ts +// Update snapshot: npx ts-node src/js/tasks/lib/action.test.ts --update + +import fs from "node:fs"; +import path from "node:path"; +import { format, transports } from "winston"; +import { createActionHandler } from "./action"; +import type { ActionContext } from "./action"; +import logger from "./logger"; + +const SNAPSHOT_PATH = path.join(__dirname, "action.snapshot.jsonl"); +const updateSnapshot = process.argv.includes("--update"); + +// --- Winston capture --------------------------------------------------------- + +const captured: Record[] = []; +const captureFormat = format((info) => { + captured.push({ ...info }); + return false; +}); +logger.add(new transports.Console({ format: captureFormat() })); + +function stabilize(record: Record): Record { + const out: Record = {}; + for (const [k, v] of Object.entries(record)) { + if (k === "timestamp") continue; + if (k === "duration_ms") { + out[k] = ""; + continue; + } + if (k === "error_stack" && typeof v === "string") { + out[k] = v.split("\n")[0]; + continue; + } + if (k === "run_id") { + out[k] = ""; + continue; + } + out[k] = v; + } + return out; +} + +// --- Mock signer ------------------------------------------------------------- + +function mockSigner(chainId: number) { + return async () => + ({ + provider: { + getNetwork: async () => ({ chainId: BigInt(chainId) }), + }, + }) as any; +} + +// --- Scenarios --------------------------------------------------------------- + +async function runSuccessScenario() { + const handler = createActionHandler( + { + name: "test_harvest", + description: "test", + run: async (ctx: ActionContext) => { + ctx.log.info("Harvesting rewards"); + ctx.log.info("Swapped 100 CRV -> 0.5 ETH"); + }, + }, + { getSigner: mockSigner(1) }, + ); + await handler({}); +} + +async function runErrorScenario() { + const handler = createActionHandler( + { + name: "test_harvest", + description: "test", + run: async () => { + throw new Error("insufficient funds for gas"); + }, + }, + { getSigner: mockSigner(1) }, + ); + try { + await handler({}); + } catch { + // expected + } +} + +async function runChainValidationScenario() { + const handler = createActionHandler( + { + name: "sonic_only_action", + description: "test", + chains: [146], + run: async () => {}, + }, + { getSigner: mockSigner(1) }, + ); + try { + await handler({}); + } catch { + // expected + } +} + +// --- Main -------------------------------------------------------------------- + +async function main() { + await runSuccessScenario(); + await runErrorScenario(); + await runChainValidationScenario(); + + const stable = captured.map(stabilize); + const actualJsonl = stable.map((r) => JSON.stringify(r)).join("\n") + "\n"; + + if (updateSnapshot) { + fs.writeFileSync(SNAPSHOT_PATH, actualJsonl, "utf8"); + console.log(`Snapshot updated: ${SNAPSHOT_PATH}`); + console.log(actualJsonl); + return; + } + + if (!fs.existsSync(SNAPSHOT_PATH)) { + console.error( + "No snapshot found. Run with --update to create it:\n" + + " npx ts-node src/js/tasks/lib/action.test.ts --update", + ); + process.exit(1); + } + + const expected = fs.readFileSync(SNAPSHOT_PATH, "utf8"); + if (actualJsonl === expected) { + console.log("OK — action log output matches snapshot"); + console.log(` ${stable.length} records across 3 scenarios`); + } else { + console.error("FAIL — action log output does not match snapshot\n"); + console.error("Expected:"); + console.error(expected); + console.error("Actual:"); + console.error(actualJsonl); + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 6d190a0b..903bd602 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -1,9 +1,10 @@ +import { randomUUID } from "node:crypto"; import type { Signer } from "ethers"; import { subtask, task } from "hardhat/config"; import type { ConfigurableTaskDefinition } from "hardhat/types"; import type { Logger } from "winston"; -import { getSigner } from "../../utils/signers"; +import { getSigner as defaultGetSigner } from "../../utils/signers"; import logger, { flushLogger } from "./logger"; export interface ActionContext { @@ -14,7 +15,7 @@ export interface ActionContext { args: Record; } -interface ActionConfig { +export interface ActionConfig { name: string; description: string; chains?: number[]; @@ -22,27 +23,26 @@ interface ActionConfig { run: (ctx: ActionContext) => Promise; } +export interface ActionDeps { + getSigner?: () => Promise; +} + const CHAIN_NAMES: Record = { 1: "mainnet", 146: "sonic", 17000: "holesky", }; -export function action(config: ActionConfig) { - const { name, description, chains, params, run } = config; +export function createActionHandler( + config: ActionConfig, + deps: ActionDeps = {}, +) { + const { name, chains, run } = config; + const getSigner = deps.getSigner ?? defaultGetSigner; - const definition = subtask(name, description); - - if (params) { - params(definition); - } - - definition.setAction(async (taskArgs: Record) => { - const runId = process.env.AUTOMATON_RUN_ID; - const log = logger.child({ - action: name, - ...(runId ? { run_id: runId } : {}), - }); + return async (taskArgs: Record) => { + const runId = randomUUID(); + const log = logger.child({ action: name, run_id: runId }); const startTime = Date.now(); let chainId: number | undefined; let networkName: string | undefined; @@ -53,17 +53,33 @@ export function action(config: ActionConfig) { chainId = Number(network.chainId); networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; + log.info(`Running on ${networkName} (${chainId})`, { + event: "action.start", + source: "task", + chain_id: chainId, + network: networkName, + }); + if (chains && !chains.includes(chainId)) { const valid = chains .map((id) => `${CHAIN_NAMES[id] ?? id} (${id})`) .join(", "); throw new Error( - `${name} only supports ${valid}, not ${networkName} (${chainId})` + `${name} only supports ${valid}, not ${networkName} (${chainId})`, ); } - log.info(`Running on ${networkName} (${chainId})`); await run({ signer, chainId, networkName, log, args: taskArgs }); + log.info( + `Completed in ${((Date.now() - startTime) / 1000).toFixed(1)}s`, + { + event: "action.success", + source: "task", + chain_id: chainId, + network: networkName, + duration_ms: Date.now() - startTime, + }, + ); } catch (err: any) { log.error(`${err?.name ?? "Error"}: ${err?.message ?? String(err)}`, { event: "action.error", @@ -79,9 +95,19 @@ export function action(config: ActionConfig) { } finally { await flushLogger(); } - }); + }; +} + +export function action(config: ActionConfig) { + const handler = createActionHandler(config); + + const definition = subtask(config.name, config.description); + if (config.params) { + config.params(definition); + } + definition.setAction(handler); - task(name).setAction(async (_, __, runSuper) => { + task(config.name).setAction(async (_, __, runSuper) => { return runSuper(); }); } From 78adc8d372a37acd8642a65fd62639dcfbeaadc3 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Sat, 18 Apr 2026 16:06:14 +0200 Subject: [PATCH 19/41] add nonceQueueTxLifecycle changes to arm-oeth with proper logger --- cron/render-crontab.ts | 12 +- src/js/tasks/lib/action.ts | 2 +- src/js/tasks/lib/env.ts | 2 +- src/js/tasks/lib/logger.ts | 4 +- src/js/tasks/lib/nonceQueue.test.ts | 20 +- src/js/tasks/lib/nonceQueue.ts | 134 +++-- .../tasks/lib/nonceQueueTxLifecycle.test.ts | 562 ++++++++++++++++++ src/js/tasks/lib/nonceQueueTxLifecycle.ts | 560 +++++++++++++++++ 8 files changed, 1243 insertions(+), 53 deletions(-) create mode 100644 src/js/tasks/lib/nonceQueueTxLifecycle.test.ts create mode 100644 src/js/tasks/lib/nonceQueueTxLifecycle.ts diff --git a/cron/render-crontab.ts b/cron/render-crontab.ts index 30a924f3..e0ae8544 100644 --- a/cron/render-crontab.ts +++ b/cron/render-crontab.ts @@ -33,7 +33,7 @@ function assertCronConfig(data: any): asserts data is CronConfig { } if (typeof job.name !== "string" || !job.name.trim()) { throw new RenderCrontabError( - `jobs[${i}].name must be a non-empty string` + `jobs[${i}].name must be a non-empty string`, ); } if (names.has(job.name)) { @@ -45,7 +45,7 @@ function assertCronConfig(data: any): asserts data is CronConfig { job.schedule.trim().split(/\s+/).length !== 5 ) { throw new RenderCrontabError( - `jobs[${i}].schedule must be a valid 5-field cron expression` + `jobs[${i}].schedule must be a valid 5-field cron expression`, ); } if (typeof job.enabled !== "boolean") { @@ -53,7 +53,7 @@ function assertCronConfig(data: any): asserts data is CronConfig { } if (typeof job.command !== "string" || !job.command.trim()) { throw new RenderCrontabError( - `jobs[${i}].command must be a non-empty string` + `jobs[${i}].command must be a non-empty string`, ); } } @@ -64,9 +64,7 @@ export function loadCronConfig(): CronConfig { return cronConfig; } -export function renderCrontab({ - outputPath = DEFAULT_OUTPUT_PATH, -} = {}) { +export function renderCrontab({ outputPath = DEFAULT_OUTPUT_PATH } = {}) { const config = loadCronConfig(); const enabledJobs = config.jobs.filter((job) => job.enabled); if (enabledJobs.length === 0) { @@ -89,7 +87,7 @@ if (require.main === module) { try { const result = renderCrontab(); console.log( - `[render-crontab] wrote ${result.enabledJobs.length} enabled jobs to ${result.outputPath}` + `[render-crontab] wrote ${result.enabledJobs.length} enabled jobs to ${result.outputPath}`, ); } catch (e: any) { console.error(`[render-crontab] ${e.message}`); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 56b498cb..6cac945f 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -52,7 +52,7 @@ export function createActionHandler( const rawSigner = await getSigner(); const network = await rawSigner.provider!.getNetwork(); chainId = Number(network.chainId); - const signer = wrapWithNonceQueue(rawSigner, chainId); + const signer = wrapWithNonceQueue(rawSigner, chainId, log); networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; log.info(`Running on ${networkName} (${chainId})`, { diff --git a/src/js/tasks/lib/env.ts b/src/js/tasks/lib/env.ts index 7e46bcf9..85a92ccd 100644 --- a/src/js/tasks/lib/env.ts +++ b/src/js/tasks/lib/env.ts @@ -8,7 +8,7 @@ export function requireEnv(name: string): string { export function optionalEnv( name: string, - fallback?: string + fallback?: string, ): string | undefined { return process.env[name] ?? fallback; } diff --git a/src/js/tasks/lib/logger.ts b/src/js/tasks/lib/logger.ts index f142ae84..2b2b1c71 100644 --- a/src/js/tasks/lib/logger.ts +++ b/src/js/tasks/lib/logger.ts @@ -12,7 +12,7 @@ const consoleFormat = format.combine( const prefix = action ? `[${action}] ` : ""; const extra = Object.keys(rest).length ? ` ${JSON.stringify(rest)}` : ""; return `${timestamp} ${level}: ${prefix}${message}${extra}`; - }) + }), ); const logTransports: InstanceType< @@ -41,7 +41,7 @@ if (lokiUrl) { } return info; })(), - format.json() + format.json(), ), replaceTimestamp: true, batching: true, diff --git a/src/js/tasks/lib/nonceQueue.test.ts b/src/js/tasks/lib/nonceQueue.test.ts index 5bda6f27..83d7d858 100644 --- a/src/js/tasks/lib/nonceQueue.test.ts +++ b/src/js/tasks/lib/nonceQueue.test.ts @@ -12,6 +12,14 @@ */ import { Pool } from "pg"; +import type { Logger } from "winston"; + +const mockLog = { + info: () => {}, + warn: () => {}, + error: () => {}, + child: () => mockLog, +} as unknown as Logger; if (!process.env.DATABASE_URL) { console.error( @@ -83,7 +91,7 @@ async function test() { results[results.length - 1].endMs = Date.now(); }); - const wrapped1 = wrapWithNonceQueue(signer1, 1); + const wrapped1 = wrapWithNonceQueue(signer1, 1, mockLog); for (let i = 0; i < 3; i++) { await wrapped1.sendTransaction({ to: "0xbbbb", data: "0x" }); @@ -113,8 +121,8 @@ async function test() { results[results.length - 1].endMs = Date.now(); }); - const wrapped2a = wrapWithNonceQueue(signer2a, 1); - const wrapped2b = wrapWithNonceQueue(signer2b, 1); + const wrapped2a = wrapWithNonceQueue(signer2a, 1, mockLog); + const wrapped2b = wrapWithNonceQueue(signer2b, 1, mockLog); const p1 = wrapped2a.sendTransaction({ to: "0xbbbb", data: "0x" }); // Small delay so both connections are open and racing for the lock @@ -161,8 +169,8 @@ async function test() { results.push({ id: 2, nonce, startMs: Date.now(), endMs: 0 }); }); - const wrappedMainnet = wrapWithNonceQueue(signer3a, 1); - const wrappedSonic = wrapWithNonceQueue(signer3b, 146); + const wrappedMainnet = wrapWithNonceQueue(signer3a, 1, mockLog); + const wrappedSonic = wrapWithNonceQueue(signer3b, 146, mockLog); await wrappedMainnet.sendTransaction({ to: "0xbbbb", data: "0x" }); await wrappedSonic.sendTransaction({ to: "0xbbbb", data: "0x" }); @@ -191,7 +199,7 @@ async function test() { } }); - const wrappedFail = wrapWithNonceQueue(signerFail, 1); + const wrappedFail = wrapWithNonceQueue(signerFail, 1, mockLog); try { await wrappedFail.sendTransaction({ to: "0xbbbb", data: "0x" }); diff --git a/src/js/tasks/lib/nonceQueue.ts b/src/js/tasks/lib/nonceQueue.ts index ad904a22..4632f54a 100644 --- a/src/js/tasks/lib/nonceQueue.ts +++ b/src/js/tasks/lib/nonceQueue.ts @@ -1,11 +1,30 @@ import type { Pool, PoolClient } from "pg"; import type { Signer, TransactionResponse } from "ethers"; - -const log = require("../../utils/logger")("utils:nonceQueue"); +import type { Logger } from "winston"; +import { + isNonceMismatchError, + recoverNonceFromChain, + submitNonceQueuedTransaction, +} from "./nonceQueueTxLifecycle"; let pool: Pool | null = null; let tableEnsurePromise: Promise | null = null; +function getNonceQueueLockTimeoutSeconds(log: Logger): number { + const value = process.env.NONCE_QUEUE_LOCK_TIMEOUT_S; + if (!value) return 0; + + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) { + log.warn( + `Invalid NONCE_QUEUE_LOCK_TIMEOUT_S="${value}" (expected integer >= 0). Falling back to 0 (wait forever).`, + ); + return 0; + } + + return parsed; +} + export function getNoncePool(): Pool | null { if (!process.env.DATABASE_URL) return null; if (!pool) { @@ -44,6 +63,7 @@ async function ensureNonceRow( signerAddress: string, chainId: number, getOnChainNonce: () => Promise, + log: Logger, ): Promise { const { rows } = await client.query( "SELECT 1 FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2", @@ -51,9 +71,12 @@ async function ensureNonceRow( ); if (rows.length === 0) { const onChainNonce = await getOnChainNonce(); - log( - `Initializing nonce row: address=${signerAddress} chain=${chainId} nonce=${onChainNonce}`, - ); + log.info("Initializing nonce row", { + event: "nonce.init", + signer_address: signerAddress, + chain_id: chainId, + nonce: onChainNonce, + }); await client.query( `INSERT INTO nonce_queue (signer_address, chain_id, nonce) VALUES ($1, $2, $3) @@ -63,12 +86,12 @@ async function ensureNonceRow( } } -function isNonceMismatchError(err: any): boolean { +function isLockTimeoutError(err: any): boolean { const msg = (err?.message ?? "").toLowerCase(); return ( - msg.includes("nonce too low") || - msg.includes("nonce has already been used") || - msg.includes("replacement transaction underpriced") + err?.code === "55P03" || + msg.includes("lock timeout") || + msg.includes("canceling statement due to lock timeout") ); } @@ -77,16 +100,30 @@ async function withNonceLock( signerAddress: string, chainId: number, getOnChainNonce: () => Promise, + log: Logger, fn: (nonce: number) => Promise, maxRetries = 3, ): Promise { await ensureNonceTable(p); + const meta = { signer_address: signerAddress, chain_id: chainId }; for (let attempt = 0; attempt < maxRetries; attempt++) { const client = await p.connect(); + const lockTimeoutSeconds = getNonceQueueLockTimeoutSeconds(log); try { await client.query("BEGIN"); - await ensureNonceRow(client, signerAddress, chainId, getOnChainNonce); + if (lockTimeoutSeconds > 0) { + await client.query("SELECT set_config('lock_timeout', $1, true)", [ + `${lockTimeoutSeconds}s`, + ]); + } + await ensureNonceRow( + client, + signerAddress, + chainId, + getOnChainNonce, + log, + ); const { rows } = await client.query( "SELECT nonce FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2 FOR UPDATE", @@ -94,9 +131,11 @@ async function withNonceLock( ); const nonce: number = rows[0].nonce; - log( - `Acquired nonce lock: address=${signerAddress} chain=${chainId} nonce=${nonce}`, - ); + log.info("Acquired nonce lock", { + event: "nonce.lock.acquired", + ...meta, + nonce, + }); const result = await fn(nonce); @@ -106,31 +145,46 @@ async function withNonceLock( ); await client.query("COMMIT"); - log( - `Released nonce lock: address=${signerAddress} chain=${chainId} nonce=${nonce} → ${nonce + 1}`, - ); + log.info("Released nonce lock", { + event: "nonce.lock.released", + ...meta, + nonce, + next_nonce: nonce + 1, + }); return result; } catch (err: any) { await client.query("ROLLBACK").catch(() => {}); + if (isLockTimeoutError(err)) { + const configuredTimeout = + lockTimeoutSeconds > 0 + ? `${lockTimeoutSeconds}s` + : "Postgres default"; + log.warn("Nonce lock timeout", { + event: "nonce.lock.timeout", + ...meta, + timeout: configuredTimeout, + }); + } + if (isNonceMismatchError(err)) { - log( - `Nonce mismatch (attempt ${attempt + 1}/${maxRetries}), recovering from chain…`, + log.warn( + `Nonce mismatch (attempt ${attempt + 1}/${maxRetries}), recovering from chain`, + { + event: "nonce.mismatch", + ...meta, + attempt: attempt + 1, + max_retries: maxRetries, + }, ); - const onChainNonce = await getOnChainNonce(); - const recovery = await p.connect(); - try { - await recovery.query( - "UPDATE nonce_queue SET nonce = $1, updated_at = NOW() WHERE signer_address = $2 AND chain_id = $3", - [onChainNonce, signerAddress, chainId], - ); - log( - `Recovered nonce from chain: address=${signerAddress} chain=${chainId} nonce=${onChainNonce}`, - ); - } finally { - recovery.release(); - } + await recoverNonceFromChain({ + pool: p, + signerAddress, + chainId, + getOnChainNonce, + log, + }); if (attempt < maxRetries - 1) continue; } @@ -157,7 +211,11 @@ export function _resetForTesting() { * * If DATABASE_URL is not set, the signer is returned unmodified. */ -export function wrapWithNonceQueue(signer: Signer, chainId: number): Signer { +export function wrapWithNonceQueue( + signer: Signer, + chainId: number, + log: Logger, +): Signer { const p = getNoncePool(); if (!p) return signer; @@ -174,13 +232,17 @@ export function wrapWithNonceQueue(signer: Signer, chainId: number): Signer { signerAddress, chainId, getOnChainNonce, + log, async (nonce) => { - const response = await originalSendTransaction({ - ...transaction, + return submitNonceQueuedTransaction({ + sendTransaction: originalSendTransaction, + provider: signer.provider ?? undefined, + transaction, nonce, + signerAddress, + chainId, + log, }); - await response.wait(); - return response; }, ); }; diff --git a/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts b/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts new file mode 100644 index 00000000..72b13243 --- /dev/null +++ b/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts @@ -0,0 +1,562 @@ +import { Wallet } from "ethers"; +import type { Logger } from "winston"; + +import { submitNonceQueuedTransaction } from "./nonceQueueTxLifecycle"; + +const mockLog = { + info: () => {}, + warn: () => {}, + error: () => {}, + child: () => mockLog, +} as unknown as Logger; + +type EnvOverrides = Record; +const MAINNET_GAS_CAP_ENV = "NONCE_QUEUE_MAX_GAS_PRICE_GWEI_CHAIN_1"; + +function makeResponse(hash: string, raw?: string): any { + return { + hash, + raw, + rawTransaction: raw, + wait: async () => ({ status: 1, transactionHash: hash }), + }; +} + +async function withEnv(overrides: EnvOverrides, fn: () => Promise) { + const previousValues: Record = {}; + for (const key of Object.keys(overrides)) { + previousValues[key] = process.env[key]; + } + + for (const [key, value] of Object.entries(overrides)) { + if (value === undefined) { + delete process.env[key]; + } else { + process.env[key] = value; + } + } + + try { + return await fn(); + } finally { + for (const [key, value] of Object.entries(previousValues)) { + if (value === undefined) { + delete process.env[key]; + } else { + process.env[key] = value; + } + } + } +} + +const GWEI = 1_000_000_000n; + +async function testReplacementPath() { + console.log("--- Lifecycle Test 1: Replacement path fee bump ---"); + + const sentTxs: any[] = []; + let sendCount = 0; + const signerSendTransaction = async (tx: any) => { + sentTxs.push(tx); + if (sendCount === 0) { + sendCount++; + return makeResponse("0xinitial", "0xraw-initial"); + } + sendCount++; + return makeResponse("0xreplacement", "0xraw-replacement"); + }; + + let receiptChecks = 0; + const provider: any = { + async getTransactionReceipt(hash: string) { + receiptChecks++; + if (hash === "0xreplacement" && receiptChecks >= 4) { + return { status: 1, hash: "0xreplacement" }; + } + return null; + }, + async getFeeData() { + return { + maxFeePerGas: 400n, + maxPriorityFeePerGas: 5n, + }; + }, + async broadcastTransaction() { + throw new Error("rebroadcast disabled in this test"); + }, + }; + + const result = await withEnv( + { + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "20", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "1", + NONCE_QUEUE_MAX_REPLACEMENTS: "2", + NONCE_QUEUE_FEE_BUMP_PCT: "20", + }, + () => + submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + maxFeePerGas: 100n, + maxPriorityFeePerGas: 2n, + } as any, + nonce: 7, + signerAddress: "0xaaaa", + chainId: 1, + log: mockLog, + }), + ); + + if (result.hash !== "0xreplacement") { + throw new Error(`Expected replacement hash, got ${result.hash}`); + } + if (sentTxs.length < 2) { + throw new Error(`Expected at least 2 submissions, got ${sentTxs.length}`); + } + if (sentTxs[1].nonce !== 7) { + throw new Error(`Expected replacement nonce=7, got ${sentTxs[1].nonce}`); + } + if (!(BigInt(sentTxs[1].maxFeePerGas) > BigInt(sentTxs[0].maxFeePerGas))) { + throw new Error("Expected replacement maxFeePerGas to increase"); + } + if ( + !( + BigInt(sentTxs[1].maxPriorityFeePerGas) >= + BigInt(sentTxs[0].maxPriorityFeePerGas) + ) + ) { + throw new Error("Expected replacement maxPriorityFeePerGas to increase"); + } + + console.log("PASS: replacement submitted with same nonce and higher fees\n"); +} + +async function testTimeoutPath() { + console.log("--- Lifecycle Test 2: Confirmation timeout path ---"); + + const signerSendTransaction = async () => makeResponse("0xtimeout"); + const provider: any = { + async getTransactionReceipt() { + return null; + }, + async getFeeData() { + return {}; + }, + async broadcastTransaction() { + return makeResponse("0xnever"); + }, + }; + + let timeoutError: Error | undefined; + await withEnv( + { + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "2", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + async () => { + try { + await submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + } as any, + nonce: 11, + signerAddress: "0xbbbb", + chainId: 1, + log: mockLog, + }); + } catch (err: any) { + timeoutError = err; + } + }, + ); + + if (!timeoutError) { + throw new Error("Expected timeout error but transaction did not fail"); + } + if (!timeoutError.message.includes("after 2s")) { + throw new Error( + `Unexpected timeout error message: ${timeoutError.message}`, + ); + } + + console.log("PASS: confirmation timeout errors as expected\n"); +} + +async function testRebroadcastPath() { + console.log("--- Lifecycle Test 3: Rebroadcast duplicate handling ---"); + + const signerSendTransaction = async () => + makeResponse("0xrebroadcast", "0xraw-rebroadcast"); + + let rebroadcastAttempts = 0; + let receiptChecks = 0; + const provider: any = { + async getTransactionReceipt(hash: string) { + receiptChecks++; + if (hash === "0xrebroadcast" && receiptChecks >= 3) { + return { status: 1, hash: "0xrebroadcast" }; + } + return null; + }, + async getFeeData() { + return {}; + }, + async broadcastTransaction() { + rebroadcastAttempts++; + throw new Error("already known"); + }, + }; + + const result = await withEnv( + { + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "1", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + () => + submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + } as any, + nonce: 12, + signerAddress: "0xcccc", + chainId: 1, + log: mockLog, + }), + ); + + if (result.hash !== "0xrebroadcast") { + throw new Error(`Expected original hash, got ${result.hash}`); + } + if (rebroadcastAttempts < 1) { + throw new Error("Expected at least one rebroadcast attempt"); + } + + console.log("PASS: rebroadcast duplicate errors are handled\n"); +} + +async function testInitialSubmissionGasCap() { + console.log("--- Lifecycle Test 4: Initial submission per-chain gas cap ---"); + + let sendCalls = 0; + const signerSendTransaction = async () => { + sendCalls++; + return makeResponse("0xshould-not-send"); + }; + const provider: any = { + async getFeeData() { + return {}; + }, + }; + + let capError: Error | undefined; + await withEnv( + { + [MAINNET_GAS_CAP_ENV]: "20", + NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + async () => { + try { + await submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + gasPrice: 25n * GWEI, + } as any, + nonce: 21, + signerAddress: "0xdddd", + chainId: 1, + log: mockLog, + }); + } catch (err: any) { + capError = err; + } + }, + ); + + if (!capError) { + throw new Error("Expected initial submission gas cap error"); + } + if (!capError.message.includes("initial submission")) { + throw new Error(`Unexpected gas cap error message: ${capError.message}`); + } + if (sendCalls !== 0) { + throw new Error( + `Expected sendTransaction not to be called, got ${sendCalls}`, + ); + } + + console.log("PASS: initial submission over cap fails before sending\n"); +} + +async function testMissingChainSpecificCapDisablesEnforcement() { + console.log( + "--- Lifecycle Test 5: Missing chain-specific cap disables enforcement ---", + ); + + let sendCalls = 0; + const signerSendTransaction = async () => { + sendCalls++; + return makeResponse("0xno-cap-chain"); + }; + + const result = await withEnv( + { + [MAINNET_GAS_CAP_ENV]: "20", + NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + () => + submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + gasPrice: 25n * GWEI, + } as any, + nonce: 23, + signerAddress: "0xffff", + chainId: 146, // Sonic — no cap set for this chain + log: mockLog, + }), + ); + + if (result.hash !== "0xno-cap-chain") { + throw new Error(`Expected successful tx hash, got ${result.hash}`); + } + if (sendCalls !== 1) { + throw new Error(`Expected one send call, got ${sendCalls}`); + } + + console.log("PASS: cap is disabled when chain-specific env is missing\n"); +} + +async function testReplacementGasCap() { + console.log("--- Lifecycle Test 6: Replacement gas cap ---"); + + const sentTxs: any[] = []; + const signerSendTransaction = async (tx: any) => { + sentTxs.push(tx); + return makeResponse("0xreplacement-seed", "0xraw-replacement-seed"); + }; + + const provider: any = { + async getTransactionReceipt() { + return null; + }, + async getFeeData() { + return { + maxFeePerGas: 10n * GWEI, + maxPriorityFeePerGas: 2n * GWEI, + }; + }, + async broadcastTransaction() { + throw new Error("rebroadcast disabled in replacement cap test"); + }, + }; + + let capError: Error | undefined; + await withEnv( + { + [MAINNET_GAS_CAP_ENV]: "12", + NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "1", + NONCE_QUEUE_MAX_REPLACEMENTS: "2", + NONCE_QUEUE_FEE_BUMP_PCT: "30", + }, + async () => { + try { + await submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + maxFeePerGas: 10n * GWEI, + maxPriorityFeePerGas: 2n * GWEI, + type: 2, + } as any, + nonce: 24, + signerAddress: "0x1111", + chainId: 1, + log: mockLog, + }); + } catch (err: any) { + capError = err; + } + }, + ); + + if (!capError) { + throw new Error("Expected replacement gas cap error"); + } + if (!capError.message.includes("replacement")) { + throw new Error(`Unexpected replacement cap error: ${capError.message}`); + } + if (sentTxs.length !== 1) { + throw new Error( + `Expected only initial send to happen before replacement cap failure, got ${sentTxs.length}`, + ); + } + + console.log("PASS: replacement over cap fails before sending replacement\n"); +} + +async function testRebroadcastGasCap() { + console.log("--- Lifecycle Test 7: Rebroadcast gas cap ---"); + + const wallet = new Wallet( + "0x59c6995e998f97a5a0044966f0945388cf0f6e44f9c76c9d83f816f94f8f93f4", + ); + const highGasTx = await wallet.signTransaction({ + to: "0x0000000000000000000000000000000000000001", + nonce: 0, + gasLimit: 21_000, + gasPrice: 30n * GWEI, + value: 0, + chainId: 1, + data: "0x", + }); + + let providerSendCalls = 0; + const signerSendTransaction = async () => makeResponse("0xseed", highGasTx); + const provider: any = { + async getTransactionReceipt() { + return null; + }, + async getFeeData() { + return {}; + }, + async broadcastTransaction() { + providerSendCalls++; + return makeResponse("0xrebroadcast-high"); + }, + }; + + let capError: Error | undefined; + await withEnv( + { + [MAINNET_GAS_CAP_ENV]: "20", + NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, + NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", + NONCE_QUEUE_RECEIPT_POLL_S: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "1", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + async () => { + try { + await submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + provider, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + gasPrice: 10n * GWEI, + } as any, + nonce: 22, + signerAddress: "0xeeee", + chainId: 1, + log: mockLog, + }); + } catch (err: any) { + capError = err; + } + }, + ); + + if (!capError) { + throw new Error("Expected rebroadcast gas cap error"); + } + if (!capError.message.includes("rebroadcast")) { + throw new Error(`Unexpected rebroadcast cap error: ${capError.message}`); + } + if (providerSendCalls !== 0) { + throw new Error( + `Expected provider rebroadcast broadcastTransaction not to be called, got ${providerSendCalls}`, + ); + } + + console.log("PASS: rebroadcast over cap fails with clear error\n"); +} + +async function testDeprecatedGlobalGasCapIgnored() { + console.log("--- Lifecycle Test 8: Deprecated global gas cap is ignored ---"); + + let sendCalls = 0; + const signerSendTransaction = async () => { + sendCalls++; + return makeResponse("0xglobal-ignored"); + }; + + const result = await withEnv( + { + [MAINNET_GAS_CAP_ENV]: undefined, + NONCE_QUEUE_MAX_GAS_PRICE_GWEI: "1", + NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", + NONCE_QUEUE_REPLACE_INTERVAL_S: "0", + }, + () => + submitNonceQueuedTransaction({ + sendTransaction: signerSendTransaction as any, + transaction: { + to: "0x0000000000000000000000000000000000000001", + data: "0x", + gasPrice: 50n * GWEI, + } as any, + nonce: 25, + signerAddress: "0x2222", + chainId: 1, + log: mockLog, + }), + ); + + if (result.hash !== "0xglobal-ignored") { + throw new Error(`Expected tx success when only global cap is set`); + } + if (sendCalls !== 1) { + throw new Error(`Expected one send call, got ${sendCalls}`); + } + + console.log("PASS: deprecated global cap does not enforce lifecycle limit\n"); +} + +async function test() { + await testReplacementPath(); + await testTimeoutPath(); + await testRebroadcastPath(); + await testInitialSubmissionGasCap(); + await testMissingChainSpecificCapDisablesEnforcement(); + await testReplacementGasCap(); + await testRebroadcastGasCap(); + await testDeprecatedGlobalGasCapIgnored(); + console.log("All nonceQueueTxLifecycle tests passed!"); +} + +test().catch((err) => { + console.error("TEST FAILED:", err); + process.exit(1); +}); diff --git a/src/js/tasks/lib/nonceQueueTxLifecycle.ts b/src/js/tasks/lib/nonceQueueTxLifecycle.ts new file mode 100644 index 00000000..398f4f85 --- /dev/null +++ b/src/js/tasks/lib/nonceQueueTxLifecycle.ts @@ -0,0 +1,560 @@ +import type { Provider, Signer, TransactionResponse } from "ethers"; +import { Transaction } from "ethers"; +import type { Pool, PoolClient } from "pg"; +import type { Logger } from "winston"; + +const GWEI = 1_000_000_000n; +const DEFAULT_PRIORITY_FEE = GWEI * 2n; +const DEFAULT_GAS_PRICE = GWEI * 20n; + +export interface SubmitNonceQueuedTxParams { + sendTransaction: ( + transaction: Parameters[0], + ) => Promise; + provider?: Provider; + transaction: Parameters[0]; + nonce: number; + signerAddress: string; + chainId: number; + log: Logger; +} + +interface TxLifecycleConfig { + txConfirmTimeoutS: number; + receiptPollS: number; + rebroadcastIntervalS: number; + replaceIntervalS: number; + maxReplacements: number; + feeBumpPct: number; +} + +function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function parseIntEnv( + log: Logger, + name: string, + fallback: number, + minimum = 0, + maximum?: number, +): number { + const value = process.env[name]; + if (!value) return fallback; + + const parsed = Number(value); + const withinMax = maximum === undefined || parsed <= maximum; + if (!Number.isInteger(parsed) || parsed < minimum || !withinMax) { + const maxMsg = maximum === undefined ? "" : ` and <= ${maximum}`; + log.warn( + `Invalid ${name}="${value}" (expected integer >= ${minimum}${maxMsg}). Falling back to ${fallback}.`, + ); + return fallback; + } + return parsed; +} + +function getTxLifecycleConfig(log: Logger): TxLifecycleConfig { + return { + txConfirmTimeoutS: parseIntEnv( + log, + "NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S", + 600, + ), + receiptPollS: parseIntEnv(log, "NONCE_QUEUE_RECEIPT_POLL_S", 5, 1), + rebroadcastIntervalS: parseIntEnv( + log, + "NONCE_QUEUE_REBROADCAST_INTERVAL_S", + 30, + ), + replaceIntervalS: parseIntEnv(log, "NONCE_QUEUE_REPLACE_INTERVAL_S", 90), + maxReplacements: parseIntEnv(log, "NONCE_QUEUE_MAX_REPLACEMENTS", 3), + feeBumpPct: parseIntEnv(log, "NONCE_QUEUE_FEE_BUMP_PCT", 15, 0, 500), + }; +} + +function secondsToMs(seconds: number): number { + return seconds * 1_000; +} + +function asBigInt(value: any): bigint | undefined { + if (value === undefined || value === null) return undefined; + try { + return BigInt(value); + } catch { + return undefined; + } +} + +function bumpByPercent(value: bigint, percent: number): bigint { + if (percent === 0) return value; + return (value * BigInt(100 + percent) + 99n) / 100n; +} + +function maxBigInt(a: bigint, b: bigint): bigint { + return a >= b ? a : b; +} + +function getTxCapComparableGasPrice( + transaction: Parameters[0], +): bigint | undefined { + return ( + asBigInt((transaction as any).maxFeePerGas) ?? + asBigInt((transaction as any).gasPrice) + ); +} + +function getPerChainMaxGasPriceEnvKey(chainId: number): string { + return `NONCE_QUEUE_MAX_GAS_PRICE_GWEI_CHAIN_${chainId}`; +} + +function resolveMaxGasPriceWeiForChain( + chainId: number, + log: Logger, +): bigint | null { + const envKey = getPerChainMaxGasPriceEnvKey(chainId); + const value = process.env[envKey]; + if (!value) return null; + + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) { + log.warn( + `Invalid ${envKey}="${value}" (expected integer >= 0). Gas cap disabled for chain ${chainId}.`, + ); + return null; + } + if (parsed === 0) return null; + return GWEI * BigInt(parsed); +} + +function assertWithinGasPriceCap({ + priceWei, + maxGasPriceWei, + maxGasPriceEnvKey, + stage, + signerAddress, + chainId, + nonce, +}: { + priceWei: bigint; + maxGasPriceWei: bigint; + maxGasPriceEnvKey: string; + stage: "initial submission" | "rebroadcast" | "replacement"; + signerAddress: string; + chainId: number; + nonce: number; +}) { + if (priceWei <= maxGasPriceWei) return; + throw new Error( + `Nonce queue gas price cap exceeded during ${stage}: address=${signerAddress} chain=${chainId} nonce=${nonce} gasPrice=${priceWei.toString()} wei cap=${maxGasPriceWei.toString()} wei (set by ${maxGasPriceEnvKey})`, + ); +} + +async function enforceSubmissionGasPriceCap({ + transaction, + provider, + maxGasPriceWei, + maxGasPriceEnvKey, + stage, + signerAddress, + chainId, + nonce, +}: { + transaction: Parameters[0]; + provider?: Provider; + maxGasPriceWei: bigint | null; + maxGasPriceEnvKey: string; + stage: "initial submission" | "replacement"; + signerAddress: string; + chainId: number; + nonce: number; +}) { + if (!maxGasPriceWei) return; + + let comparableGasPrice = getTxCapComparableGasPrice(transaction); + if (!comparableGasPrice && provider) { + const feeData = await provider.getFeeData().catch(() => null); + comparableGasPrice = + asBigInt(feeData?.maxFeePerGas) ?? asBigInt(feeData?.gasPrice); + } + + if (!comparableGasPrice) { + throw new Error( + `Unable to enforce ${maxGasPriceEnvKey} for ${stage}: address=${signerAddress} chain=${chainId} nonce=${nonce} transaction has no gasPrice/maxFeePerGas and provider fee data is unavailable`, + ); + } + + assertWithinGasPriceCap({ + priceWei: comparableGasPrice, + maxGasPriceWei, + maxGasPriceEnvKey, + stage, + signerAddress, + chainId, + nonce, + }); +} + +function enforceRebroadcastGasPriceCap({ + rawTransaction, + maxGasPriceWei, + maxGasPriceEnvKey, + signerAddress, + chainId, + nonce, +}: { + rawTransaction: string; + maxGasPriceWei: bigint | null; + maxGasPriceEnvKey: string; + signerAddress: string; + chainId: number; + nonce: number; +}) { + if (!maxGasPriceWei) return; + + const parsedTransaction = Transaction.from(rawTransaction); + const comparableGasPrice = + asBigInt(parsedTransaction.maxFeePerGas) ?? + asBigInt(parsedTransaction.gasPrice); + + if (!comparableGasPrice) { + throw new Error( + `Unable to enforce ${maxGasPriceEnvKey} for rebroadcast: address=${signerAddress} chain=${chainId} nonce=${nonce} raw transaction has no gasPrice/maxFeePerGas`, + ); + } + + assertWithinGasPriceCap({ + priceWei: comparableGasPrice, + maxGasPriceWei, + maxGasPriceEnvKey, + stage: "rebroadcast", + signerAddress, + chainId, + nonce, + }); +} + +function extractRawTransaction( + response: TransactionResponse, +): string | undefined { + const candidate = + (response as any).raw ?? + (response as any).rawTransaction ?? + (response as any).serialized; + return typeof candidate === "string" && candidate.length > 0 + ? candidate + : undefined; +} + +function isDuplicateBroadcastError(err: any): boolean { + const msg = (err?.message ?? "").toLowerCase(); + return ( + msg.includes("already known") || + msg.includes("known transaction") || + msg.includes("already imported") + ); +} + +async function findMinedReceipt(provider: Provider, hashes: string[]) { + for (const hash of hashes) { + const receipt = await provider.getTransactionReceipt(hash); + if (receipt) return receipt; + } + return null; +} + +async function buildReplacementTransaction( + transaction: Parameters[0], + provider: Provider, + feeBumpPct: number, +): Promise[0]> { + const feeData = await provider.getFeeData().catch(() => null); + const nextTx: any = { ...transaction }; + + const hasEip1559Fees = + nextTx.maxFeePerGas !== undefined || + nextTx.maxPriorityFeePerGas !== undefined || + nextTx.type === 2; + + if (hasEip1559Fees) { + const basePriority = + asBigInt(nextTx.maxPriorityFeePerGas) ?? + asBigInt(feeData?.maxPriorityFeePerGas) ?? + DEFAULT_PRIORITY_FEE; + const baseMaxFee = + asBigInt(nextTx.maxFeePerGas) ?? + asBigInt(feeData?.maxFeePerGas) ?? + basePriority * 2n; + + const bumpedPriority = bumpByPercent(basePriority, feeBumpPct); + const bumpedMaxFee = bumpByPercent(baseMaxFee, feeBumpPct); + const networkPriority = asBigInt(feeData?.maxPriorityFeePerGas); + const networkMaxFee = asBigInt(feeData?.maxFeePerGas); + + let finalPriority = bumpedPriority; + let finalMaxFee = bumpedMaxFee; + if (networkPriority) { + finalPriority = maxBigInt(finalPriority, networkPriority); + } + if (networkMaxFee) { + finalMaxFee = maxBigInt(finalMaxFee, networkMaxFee); + } + if (finalMaxFee < finalPriority) { + finalMaxFee = finalPriority; + } + + delete nextTx.gasPrice; + nextTx.maxPriorityFeePerGas = finalPriority; + nextTx.maxFeePerGas = finalMaxFee; + nextTx.type = 2; + return nextTx; + } + + const baseGasPrice = + asBigInt(nextTx.gasPrice) ?? + asBigInt(feeData?.gasPrice) ?? + DEFAULT_GAS_PRICE; + const networkGasPrice = asBigInt(feeData?.gasPrice); + let finalGasPrice = bumpByPercent(baseGasPrice, feeBumpPct); + if (networkGasPrice) { + finalGasPrice = maxBigInt(finalGasPrice, networkGasPrice); + } + nextTx.gasPrice = finalGasPrice; + return nextTx; +} + +/** + * Send a nonce-pinned transaction and wait for on-chain confirmation. + * Handles rebroadcast of raw tx, same-nonce replacement with bumped fees, + * and per-chain gas price caps. + */ +export async function submitNonceQueuedTransaction({ + sendTransaction, + provider, + transaction, + nonce, + signerAddress, + chainId, + log, +}: SubmitNonceQueuedTxParams): Promise { + const config = getTxLifecycleConfig(log); + const maxGasPriceEnvKey = getPerChainMaxGasPriceEnvKey(chainId); + const maxGasPriceWei = resolveMaxGasPriceWeiForChain(chainId, log); + const meta = { signer_address: signerAddress, chain_id: chainId }; + const initialTx: any = { + ...transaction, + nonce, + }; + + await enforceSubmissionGasPriceCap({ + transaction: initialTx, + provider, + maxGasPriceWei, + maxGasPriceEnvKey, + stage: "initial submission", + signerAddress, + chainId, + nonce, + }); + + const firstResponse = await sendTransaction(initialTx); + const responsesByHash = new Map([ + [firstResponse.hash, firstResponse], + ]); + const knownHashes: string[] = [firstResponse.hash]; + let activeTx = initialTx; + let activeResponse = firstResponse; + let activeRawTx = extractRawTransaction(firstResponse); + let replacementCount = 0; + let rebroadcastRawUnavailableLogged = false; + + log.info("Submitted tx", { + event: "nonce.tx.submitted", + ...meta, + nonce, + tx_hash: firstResponse.hash, + }); + + if (!provider || typeof provider.getTransactionReceipt !== "function") { + await firstResponse.wait(); + return firstResponse; + } + const txProvider = provider; + + const startedAt = Date.now(); + let nextRebroadcastAt = + config.rebroadcastIntervalS > 0 + ? startedAt + secondsToMs(config.rebroadcastIntervalS) + : Number.POSITIVE_INFINITY; + let nextReplaceAt = + config.replaceIntervalS > 0 + ? startedAt + secondsToMs(config.replaceIntervalS) + : Number.POSITIVE_INFINITY; + + while (true) { + const receipt = await findMinedReceipt(txProvider, knownHashes); + if (receipt) { + if (receipt.status === 0) { + throw new Error( + `Nonce-queued transaction reverted on-chain: hash=${receipt.hash} nonce=${nonce}`, + ); + } + return responsesByHash.get(receipt.hash) ?? activeResponse; + } + + const now = Date.now(); + if ( + config.txConfirmTimeoutS > 0 && + now - startedAt >= secondsToMs(config.txConfirmTimeoutS) + ) { + throw new Error( + `Timed out waiting for nonce-queued tx confirmation after ${config.txConfirmTimeoutS}s: address=${signerAddress} chain=${chainId} nonce=${nonce} lastHash=${activeResponse.hash}`, + ); + } + + if (now >= nextRebroadcastAt) { + nextRebroadcastAt = now + secondsToMs(config.rebroadcastIntervalS); + + if ( + activeRawTx && + typeof txProvider.broadcastTransaction === "function" + ) { + try { + enforceRebroadcastGasPriceCap({ + rawTransaction: activeRawTx, + maxGasPriceWei, + maxGasPriceEnvKey, + signerAddress, + chainId, + nonce, + }); + const rebroadcastResponse = + await txProvider.broadcastTransaction(activeRawTx); + if (!responsesByHash.has(rebroadcastResponse.hash)) { + responsesByHash.set(rebroadcastResponse.hash, rebroadcastResponse); + knownHashes.push(rebroadcastResponse.hash); + } + log.info("Rebroadcasted raw tx", { + event: "nonce.tx.rebroadcast", + ...meta, + nonce, + tx_hash: rebroadcastResponse.hash, + }); + } catch (err: any) { + if (!isDuplicateBroadcastError(err)) throw err; + log.info("Rebroadcast ignored duplicate", { + event: "nonce.tx.rebroadcast.duplicate", + ...meta, + nonce, + tx_hash: activeResponse.hash, + }); + } + } else if (!rebroadcastRawUnavailableLogged) { + rebroadcastRawUnavailableLogged = true; + log.warn("Rebroadcast skipped: raw transaction payload unavailable", { + ...meta, + nonce, + tx_hash: activeResponse.hash, + }); + } + } + + if ( + now >= nextReplaceAt && + replacementCount < config.maxReplacements && + config.replaceIntervalS > 0 + ) { + nextReplaceAt = now + secondsToMs(config.replaceIntervalS); + activeTx = await buildReplacementTransaction( + activeTx, + txProvider, + config.feeBumpPct, + ); + await enforceSubmissionGasPriceCap({ + transaction: activeTx, + provider: txProvider, + maxGasPriceWei, + maxGasPriceEnvKey, + stage: "replacement", + signerAddress, + chainId, + nonce, + }); + + try { + const replacementResponse = await sendTransaction(activeTx); + replacementCount++; + activeResponse = replacementResponse; + activeRawTx = extractRawTransaction(replacementResponse); + if (!responsesByHash.has(replacementResponse.hash)) { + responsesByHash.set(replacementResponse.hash, replacementResponse); + knownHashes.push(replacementResponse.hash); + } + log.info("Submitted replacement tx", { + event: "nonce.tx.replacement", + ...meta, + nonce, + tx_hash: replacementResponse.hash, + replacement_count: replacementCount, + max_replacements: config.maxReplacements, + }); + } catch (err: any) { + if (!isNonceMismatchError(err) && !isDuplicateBroadcastError(err)) { + throw err; + } + log.warn("Replacement attempt not accepted", { + event: "nonce.tx.replacement.rejected", + ...meta, + nonce, + error_message: err?.message ?? String(err), + }); + } + } + + await sleep(secondsToMs(config.receiptPollS)); + } +} + +export function isNonceMismatchError(err: any): boolean { + const msg = (err?.message ?? "").toLowerCase(); + return ( + msg.includes("nonce too low") || + msg.includes("nonce has already been used") || + msg.includes("replacement transaction underpriced") + ); +} + +export async function recoverNonceFromChain({ + pool, + signerAddress, + chainId, + getOnChainNonce, + client, + log, +}: { + pool: Pool; + signerAddress: string; + chainId: number; + getOnChainNonce: () => Promise; + client?: PoolClient; + log: Logger; +}) { + const onChainNonce = await getOnChainNonce(); + const recoveryClient = client ?? (await pool.connect()); + const usingExternalClient = !!client; + + try { + await recoveryClient.query( + "UPDATE nonce_queue SET nonce = $1, updated_at = NOW() WHERE signer_address = $2 AND chain_id = $3", + [onChainNonce, signerAddress, chainId], + ); + log.info("Recovered nonce from chain", { + event: "nonce.recovered", + signer_address: signerAddress, + chain_id: chainId, + nonce: onChainNonce, + }); + } finally { + if (!usingExternalClient) recoveryClient.release(); + } +} From fa70ce2ce2ad51cf62110fa7de845c25ddad5932 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 21 Apr 2026 18:14:40 +0200 Subject: [PATCH 20/41] Replace local scheduler + nonce queue + signer logic with @automaton/client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: supercronic (cron/) loops hardhat tasks; local nonce queue + signer code mirror the automaton library. After: @automaton/client provides all three primitives; hardhat remains the execution engine for the action files themselves (unchanged). New: - runner.ts — calls runContainer({product:"arm-oeth", workdir:"/app"}). Library reads schedules from shared Postgres, croner fires them, parent spawns each command and captures stdio into run_logs. - migrations/seed_schedules.sql — 22 rows mirroring cron/cron-jobs.ts. Modified: - src/js/tasks/lib/action.ts — uses @automaton/client's wrapSignerWithNonceQueueV6 + createDb/createPool instead of the deleted local nonceQueue.ts. No change to ActionContext shape. - src/js/utils/signers.ts — delegates KMS + privkey paths to the library's resolveEthersV6Signer (which auto-detects strategy from AWS creds, reads KMS_RELAYER_ID / DEPLOYER_PRIVATE_KEY etc.). Hardhat-native fork impersonation + explicit-address paths stay. Defender fallback dropped. - dockerfile-actions — bun base (needed by runner.ts), drop Foundry (no cast/forge shellouts anywhere) + supercronic (replaced by library's schedule loop), pnpm for install. - docker-compose.yml — drop Loki env, add ACTION_API_BEARER_TOKEN and RUNNER_BASE_URL. Env var names unchanged (MAINNET_URL/etc.). - .env.example — drop Loki + Defender + DEPLOYER_PRIVATE_KEY, document the new runtime env. - hardhat.config.js — drop nothing; auto-load loop for action files still registers every action as a hardhat task. - package.json — add @automaton/client via git-install subpath. Deleted (all superseded by @automaton/client): - src/js/tasks/lib/nonceQueue.ts + .test.ts - src/js/tasks/lib/nonceQueueTxLifecycle.ts + .test.ts - cron/ (cron-supervisor, cron-jobs, cron-entrypoint.sh, render-crontab, api, README, TODO). Co-Authored-By: Claude Opus 4.7 (1M context) --- .env.example | 28 +- cron/README.md | 65 -- cron/TODO.md | 28 - cron/api.ts | 239 -------- cron/cron-entrypoint.sh | 4 - cron/cron-jobs.ts | 147 ----- cron/cron-supervisor.ts | 159 ----- cron/render-crontab.ts | 96 --- docker-compose.yml | 6 +- dockerfile-actions | 35 +- migrations/seed_schedules.sql | 29 + package.json | 1 + runner.ts | 7 + src/js/tasks/lib/action.ts | 22 +- src/js/tasks/lib/nonceQueue.test.ts | 231 ------- src/js/tasks/lib/nonceQueue.ts | 251 -------- .../tasks/lib/nonceQueueTxLifecycle.test.ts | 562 ------------------ src/js/tasks/lib/nonceQueueTxLifecycle.ts | 560 ----------------- src/js/utils/signers.ts | 125 +--- 19 files changed, 90 insertions(+), 2505 deletions(-) delete mode 100644 cron/README.md delete mode 100644 cron/TODO.md delete mode 100644 cron/api.ts delete mode 100755 cron/cron-entrypoint.sh delete mode 100644 cron/cron-jobs.ts delete mode 100644 cron/cron-supervisor.ts delete mode 100644 cron/render-crontab.ts create mode 100644 migrations/seed_schedules.sql create mode 100644 runner.ts delete mode 100644 src/js/tasks/lib/nonceQueue.test.ts delete mode 100644 src/js/tasks/lib/nonceQueue.ts delete mode 100644 src/js/tasks/lib/nonceQueueTxLifecycle.test.ts delete mode 100644 src/js/tasks/lib/nonceQueueTxLifecycle.ts diff --git a/.env.example b/.env.example index 9663161c..fe912de4 100644 --- a/.env.example +++ b/.env.example @@ -8,6 +8,7 @@ MAINNET_URL= # [Optional] RPC URLs for other networks TESTNET_URL= SONIC_URL= +HOLESKY_URL= LOCAL_URL= # ╔══════════════════════════════════════════════════════════════════════════════╗ @@ -39,31 +40,22 @@ FORK_BLOCK_NUMBER_SONIC= # DEPLOYER_ADDRESS= # ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ OPENZEPPELIN DEFENDER ║ +# ║ AUTOMATON RUNTIME ║ # ╚══════════════════════════════════════════════════════════════════════════════╝ -# Relayer credentials (for automated transactions) -# DEFENDER_RELAYER_KEY= -# DEFENDER_RELAYER_SECRET= +# Bearer token the parent admin API uses to authenticate to the runner +# ACTION_API_BEARER_TOKEN= -# Team API credentials (for managing Defender Actions) -# Used with: npx hardhat setActionVars, npx defender-autotask update-code -# Note: Different from Relayer credentials -# DEFENDER_TEAM_KEY= -# DEFENDER_TEAM_SECRET= +# Base URL the runner advertises back to automaton for manual triggers +# RUNNER_BASE_URL=http://arm-oeth:8080 -# ╔══════════════════════════════════════════════════════════════════════════════╗ -# ║ LOKI LOGGING ║ -# ╚══════════════════════════════════════════════════════════════════════════════╝ - -# LOKI_URL= -# LOKI_USER= -# LOKI_API_KEY= +# Shared Postgres URL (nonce queue + schedules + runs) +# DATABASE_URL= # ╔══════════════════════════════════════════════════════════════════════════════╗ # ║ AWS KMS SIGNER ║ # ╚══════════════════════════════════════════════════════════════════════════════╝ -# needed for running Origin Automaton +# needed for running scheduled actions via hardhat # AWS_ACCESS_KEY_ID= -# AWS_SECRET_ACCESS_KEY= \ No newline at end of file +# AWS_SECRET_ACCESS_KEY= diff --git a/cron/README.md b/cron/README.md deleted file mode 100644 index cfe006a9..00000000 --- a/cron/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Automaton - -The cron + supervisor system that runs scheduled hardhat tasks for arm-oeth. A long-running container renders a crontab from a TypeScript registry, executes jobs via [supercronic](https://github.com/aptible/supercronic), exposes a small HTTP API for manual triggers and run inspection, and ships structured logs to Loki for Grafana. - -A sibling Automaton with the same shape and log schema lives in the `origin-dollar` repo. Keep field names (`event`, `source`, `action`, `run_id`, `duration_ms`, `error_*`) in sync across both so a single Grafana dashboard can serve both. - -## Components - -| File | Purpose | -|---|---| -| `cron/cron-jobs.ts` | Job registry — `name`, `schedule` (5-field cron), `enabled`, `command`. Single source of truth. | -| `cron/render-crontab.ts` | Validates the registry (unique names, valid schedules) and writes the supercronic crontab file. | -| `cron/cron-supervisor.ts` | Boots supercronic + HTTP API server. Exposes `/api/v1/actions`, `/api/v1/actions/:name/runs`, `/api/v1/runs/:id`, `/healthz`. | -| `cron/api.ts` | HTTP server, auth, run tracking for on-demand action triggers. | -| `cron/cron-entrypoint.sh` | Container entrypoint — boots the supervisor under `ts-node`. | -| `src/js/tasks/lib/action.ts` | Wrapper used by every hardhat task. Generates a `run_id` (UUID), emits `action.start`, `action.success`, and `action.error` events to Loki. | -| `src/js/tasks/lib/logger.ts` | Winston + winston-loki. Promotes `action`, `event`, `source` to Loki labels. | - -## Adding / enabling / disabling a job - -1. Append (or edit) an entry in `cron/cron-jobs.ts`. Names must be unique; schedules must be valid 5-field cron expressions. -2. Make sure the underlying hardhat task is built on the `action(...)` wrapper from `src/js/tasks/lib/action.ts` — that's where the run-id correlation and error reporting come from. -3. Flip `enabled` to toggle without removing the entry. -4. Redeploy the container (the GitHub Action on the `automation` branch builds and pushes the image). - -`render-crontab.ts` will fail loudly at boot if the registry is malformed — the container won't start with a broken config. - -## Local dev - -Required env vars: - -- `PROVIDER_URL`, `SONIC_URL` — RPC endpoints (same as the rest of the repo) -- `LOKI_URL`, `LOKI_USER`, `LOKI_API_KEY` — optional; if unset, logs only go to stdout -- `ACTION_API_BEARER_TOKEN` — required to start the supervisor (auth for `/api/v1/*`) -Run a single action without the supervisor: -``` -npx hardhat --network mainnet -``` - -Run the full supervisor locally: -``` -ACTION_API_BEARER_TOKEN=dev npx ts-node cron/cron-supervisor.ts -``` - -## Observability - -Each action generates its own `run_id` (UUID) and emits structured events via the winston/Loki logger in `src/js/tasks/lib/action.ts`: - -- `action.start` — emitted after resolving the signer and chain, before running the action -- `action.success` — emitted on successful completion, includes `duration_ms` -- `action.error` — emitted on failure, includes `duration_ms`, `error_name`, `error_message`, `error_stack` - -All events for a single run share the same `run_id` for correlation in Grafana. - -See [`docs/automaton-observability.md`](../docs/automaton-observability.md) for the field schema and LogQL cookbook. - -## Future: Prometheus - -For SLO-grade metrics — p99 latency panels, alert rules with cheap evaluation, "no successful run in N hours" alarms, long-retention dashboards — the right next step is a Prometheus endpoint on the supervisor exposing: - -- `automaton_runs_total{action,status}` — counter -- `automaton_run_duration_seconds{action}` — histogram -- `automaton_last_success_timestamp_seconds{action}` — gauge - -Out of scope for now; logs are sufficient until we want recording rules or sub-second-cost alerting. diff --git a/cron/TODO.md b/cron/TODO.md deleted file mode 100644 index 7f862882..00000000 --- a/cron/TODO.md +++ /dev/null @@ -1,28 +0,0 @@ -# TODO List - -## Defender Actions which use compiled code: - -https://defender.openzeppelin.com/#/actions/automatic/002c2b0d-9522-4d5f-a340-9713ee43a1c3 -https://defender.openzeppelin.com/#/actions/automatic/062cfee1-c34e-43ae-beb0-de62bc668bbd -https://defender.openzeppelin.com/#/actions/automatic/127171fd-7b85-497e-8335-fd7907c08386 -https://defender.openzeppelin.com/#/actions/automatic/12977d51-d107-45eb-ac20-45942009ab01 -https://defender.openzeppelin.com/#/actions/automatic/32dbc67b-89f3-4856-8f3d-ad4dc5a09322 -https://defender.openzeppelin.com/#/actions/automatic/3a49c165-62d9-43a2-bef0-901ce1d59bef // was every 190m -> using cron of 180m -https://defender.openzeppelin.com/#/actions/automatic/641e73f8-6792-41c8-bda9-930681d94ada -https://defender.openzeppelin.com/#/actions/automatic/6c52f3a9-85d8-4c7f-8aee-90a95b13965c -https://defender.openzeppelin.com/#/actions/automatic/6d148f26-54a6-4377-92f2-3148d572eea3 -https://defender.openzeppelin.com/#/actions/automatic/6e26641e-4132-4824-bb80-7c891fd31455 -https://defender.openzeppelin.com/#/actions/automatic/6ec46510-0b8e-48b4-a4c8-de759aad0ba4 -https://defender.openzeppelin.com/#/actions/automatic/80565995-9bb2-42a0-bbd5-e15297b67050 -https://defender.openzeppelin.com/#/actions/automatic/82ead29e-88f1-43bc-a5ed-503fadb3e491 -https://defender.openzeppelin.com/#/actions/automatic/84b5f134-8351-4402-8f6a-fb4376034bc4 -https://defender.openzeppelin.com/#/actions/automatic/89658c5f-3857-4972-bef8-a5e914e13c56 -https://defender.openzeppelin.com/#/actions/automatic/a9fc4c86-0506-4809-afbc-93b5e558cb68 -https://defender.openzeppelin.com/#/actions/automatic/acfbb7d6-5ea6-4ffc-a758-fa4b4f584dd1 -https://defender.openzeppelin.com/#/actions/automatic/b362885c-a023-4fb5-8c04-1c33147465eb -https://defender.openzeppelin.com/#/actions/automatic/c010fb76-ea63-409d-9981-69322d27993a -https://defender.openzeppelin.com/#/actions/automatic/ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 -https://defender.openzeppelin.com/#/actions/automatic/f92ea662-fc34-433b-8beb-b34e9ab74685 -https://defender.openzeppelin.com/#/actions/automatic/7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 - -Every ARM defender action used compiled code - so likely all the actions we have in here are all that we need. diff --git a/cron/api.ts b/cron/api.ts deleted file mode 100644 index efd141fb..00000000 --- a/cron/api.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { spawn } from "node:child_process"; -import { randomUUID, timingSafeEqual } from "node:crypto"; -import http from "node:http"; -import type { Logger } from "winston"; -import type { CronJob } from "./render-crontab"; - -// --- Run tracking --- - -interface ActionRun { - runId: string; - action: string; - schedule: string; - enabled: boolean; - command?: string; - status: "queued" | "running" | "succeeded" | "failed"; - queuedAt: string; - startedAt: string; - finishedAt: string | null; - exitCode: number | null; - signal: string | null; - pid: number | null; - error?: string; -} - -// --- API --- - -export interface ApiOpts { - host: string; - port: number; - apiToken: string; - jobs: CronJob[]; - jobsByName: Map; - workdir: string; - historyLimit: number; - healthCheck: () => { running: boolean; pid: number | null }; - log: Logger; -} - -export function createApi(opts: ApiOpts): http.Server { - const { - host, - port, - apiToken, - jobs, - jobsByName, - workdir, - historyLimit, - healthCheck, - log, - } = opts; - - const nowIso = () => new Date().toISOString(); - - // --- Run store --- - - const runStore = new Map(); - const runOrder: string[] = []; - - function storeRun(run: ActionRun) { - runStore.set(run.runId, run); - runOrder.push(run.runId); - while (runOrder.length > historyLimit) { - runStore.delete(runOrder.shift()!); - } - } - - // --- Action execution --- - - function runAction(action: CronJob, run: ActionRun) { - run.status = "running"; - run.startedAt = nowIso(); - run.command = action.command; - - log.info(`Starting run ${run.runId} for "${action.name}"`); - - const child = spawn("/bin/sh", ["-lc", action.command], { - cwd: workdir, - env: process.env, - stdio: "inherit", - }); - run.pid = child.pid ?? null; - - child.on("error", (err) => { - run.status = "failed"; - run.finishedAt = nowIso(); - run.exitCode = null; - run.signal = null; - run.error = err.message; - log.error(`Run ${run.runId} failed to spawn: ${err.message}`); - }); - - child.on("exit", (code, signal) => { - run.finishedAt = nowIso(); - run.exitCode = code; - run.signal = signal; - run.status = code === 0 ? "succeeded" : "failed"; - }); - } - - function triggerAction(actionName: string): ActionRun | undefined { - const action = jobsByName.get(actionName); - if (!action) return undefined; - - const run: ActionRun = { - runId: randomUUID(), - action: action.name, - schedule: action.schedule, - enabled: action.enabled, - status: "queued", - queuedAt: nowIso(), - startedAt: nowIso(), - finishedAt: null, - exitCode: null, - signal: null, - pid: null, - }; - - storeRun(run); - setImmediate(() => runAction(action, run)); - return run; - } - - // --- HTTP helpers --- - - function json( - res: http.ServerResponse, - statusCode: number, - payload: any, - extraHeaders: Record = {}, - ) { - res.writeHead(statusCode, { - "Content-Type": "application/json", - ...extraHeaders, - }); - res.end(JSON.stringify(payload)); - } - - const expectedTokenBuffer = Buffer.from(apiToken); - function isAuthorized(headerValue: string | string[] | undefined): boolean { - if (typeof headerValue !== "string") return false; - if (!headerValue.startsWith("Bearer ")) return false; - const providedBuffer = Buffer.from(headerValue.slice(7).trim()); - if (providedBuffer.length !== expectedTokenBuffer.length) return false; - return timingSafeEqual(providedBuffer, expectedTokenBuffer); - } - - // --- Server --- - - const server = http.createServer((req, res) => { - const method = req.method || "GET"; - const forwardedProto = req.headers["x-forwarded-proto"]; - const proto = - typeof forwardedProto === "string" && forwardedProto.length > 0 - ? forwardedProto.split(",")[0].trim() - : "http"; - const reqHost = req.headers.host || `${host}:${port}`; - const origin = `${proto}://${reqHost}`; - const url = new URL(req.url || "/", origin); - - // Health check (unauthenticated) - if (method === "GET" && url.pathname === "/healthz") { - const health = healthCheck(); - return json(res, 200, { - status: "ok", - api: "up", - supercronic: { running: health.running, pid: health.pid }, - }); - } - - // Auth gate for /api/v1/* - if ( - url.pathname.startsWith("/api/v1/") && - !isAuthorized(req.headers.authorization) - ) { - return json(res, 401, { error: "Unauthorized" }); - } - - // List actions - if (method === "GET" && url.pathname === "/api/v1/actions") { - return json(res, 200, { - actions: jobs.map((job) => ({ - name: job.name, - schedule: job.schedule, - enabled: job.enabled, - })), - }); - } - - // Trigger action run - const triggerMatch = url.pathname.match( - /^\/api\/v1\/actions\/([^/]+)\/runs$/, - ); - if (method === "POST" && triggerMatch) { - const run = triggerAction(decodeURIComponent(triggerMatch[1])); - if (!run) - return json(res, 404, { - error: `Unknown action "${triggerMatch[1]}"`, - }); - const statusUrl = `${origin}/api/v1/runs/${encodeURIComponent(run.runId)}`; - return json( - res, - 202, - { - runId: run.runId, - action: run.action, - status: run.status, - statusUrl, - startedAt: run.startedAt, - }, - { Location: statusUrl }, - ); - } - - // Get run status - const statusMatch = url.pathname.match(/^\/api\/v1\/runs\/([^/]+)$/); - if (method === "GET" && statusMatch) { - const run = runStore.get(decodeURIComponent(statusMatch[1])); - if (!run) return json(res, 404, { error: "Run not found" }); - return json(res, 200, { - runId: run.runId, - action: run.action, - status: run.status, - startedAt: run.startedAt, - finishedAt: run.finishedAt, - exitCode: run.exitCode, - signal: run.signal, - }); - } - - json(res, 404, { error: "Not found" }); - }); - - server.on("error", (err) => { - log.error(`HTTP server error: ${err.message}`); - process.exit(1); - }); - - return server; -} diff --git a/cron/cron-entrypoint.sh b/cron/cron-entrypoint.sh deleted file mode 100755 index 60c072e9..00000000 --- a/cron/cron-entrypoint.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -set -eu - -exec node -r ts-node/register /app/cron/cron-supervisor.ts diff --git a/cron/cron-jobs.ts b/cron/cron-jobs.ts deleted file mode 100644 index d82e2caf..00000000 --- a/cron/cron-jobs.ts +++ /dev/null @@ -1,147 +0,0 @@ -import type { CronConfig } from "./render-crontab"; - -const cronConfig: CronConfig = { - jobs: [ - { - name: "healthcheck", - schedule: "*/5 * * * *", - enabled: true, - command: "cd /app && pnpm hardhat healthcheck", - }, - { - name: "mainnet_auto_request_lido_withdraw", - schedule: "29,58 12-23,0-8 * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoRequestLidoWithdraw --network mainnet", - }, - { - name: "mainnet_auto_claim_lido_withdraw", - schedule: "32 0,12 * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoClaimLidoWithdraw --network mainnet", - }, - { - name: "mainnet_auto_request_etherfi_withdraw", - schedule: "10,40 * * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoRequestEtherFiWithdraw --network mainnet", - }, - { - name: "mainnet_auto_claim_etherfi_withdraw", - schedule: "40 * * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoClaimEtherFiWithdraw --network mainnet", - }, - { - name: "mainnet_auto_request_ethena_withdraw", - schedule: "12 * * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoRequestEthenaWithdraw --network mainnet", - }, - { - name: "mainnet_auto_claim_ethena_withdraw", - schedule: "40 * * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoClaimEthenaWithdraw --network mainnet", - }, - { - name: "mainnet_collect_lido_fees", - schedule: "30 12 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectLidoFees --network mainnet", - }, - { - name: "mainnet_collect_etherfi_fees", - schedule: "45 23 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectEtherFiFees --network mainnet", - }, - { - name: "mainnet_collect_ethena_fees", - schedule: "45 23 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectEthenaFees --network mainnet", - }, - { - name: "mainnet_allocate_lido", - schedule: "38,08 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat allocateLido --network mainnet", - }, - { - name: "mainnet_allocate_etherfi", - schedule: "52 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat allocateEtherFi --network mainnet", - }, - { - name: "mainnet_allocate_ethena", - schedule: "28 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat allocateEthena --network mainnet", - }, - { - name: "mainnet_set_prices_lido", - schedule: "*/30 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat setPricesLido --network mainnet", - }, - { - name: "mainnet_set_prices_etherfi", - schedule: "2,32 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat setPricesEtherFi --network mainnet", - }, - { - name: "mainnet_set_prices_ethena", - schedule: "4 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat setPricesEthena --network mainnet", - }, - { - name: "sonic_auto_request_withdraw", - schedule: "48,18 * * * *", - enabled: false, - command: - "cd /app && pnpm hardhat autoRequestWithdrawSonic --network sonic", - }, - { - name: "sonic_auto_claim_withdraw", - schedule: "10 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat autoClaimWithdrawSonic --network sonic", - }, - { - name: "sonic_collect_fees", - schedule: "55 23 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectFeesSonic --network sonic", - }, - { - name: "sonic_allocate", - schedule: "1,31 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat allocateSonic --network sonic", - }, - { - name: "os_silo_set_prices", - schedule: "*/30 * * * *", - enabled: false, - command: "cd /app && pnpm hardhat setOSSiloPriceAction --network sonic", - }, - { - name: "sonic_collect_rewards", - schedule: "45 23 * * *", - enabled: false, - command: "cd /app && pnpm hardhat collectRewardsSonic --network sonic", - }, - ], -}; - -export default cronConfig; diff --git a/cron/cron-supervisor.ts b/cron/cron-supervisor.ts deleted file mode 100644 index 6cf7cfc9..00000000 --- a/cron/cron-supervisor.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { spawn } from "node:child_process"; -import fs from "node:fs"; -import baseLogger, { flushLogger } from "../src/js/tasks/lib/logger"; -import { getNoncePool } from "../src/js/tasks/lib/nonceQueue"; -import { createApi } from "./api"; -import { renderCrontab } from "./render-crontab"; - -const log = baseLogger.child({ source: "supervisor" }); - -// --- Configuration --- - -const host = process.env.HOST || "0.0.0.0"; -const port = Number.parseInt(process.env.PORT || "8080", 10); -const cronOutputPath = process.env.CRON_OUTPUT_PATH || "/app/cron/cronjob"; -const supercronicBin = process.env.SUPERCRONIC_BIN || "supercronic"; -const runHistoryLimit = Number.parseInt( - process.env.ACTION_RUN_HISTORY_LIMIT || "500", - 10, -); -const actionApiToken = process.env.ACTION_API_BEARER_TOKEN; -const configuredActionWorkdir = process.env.ACTION_WORKDIR || "/app"; - -if (!Number.isInteger(port) || port < 1 || port > 65535) { - log.error(`Invalid PORT value "${process.env.PORT}"`); - process.exit(1); -} -if (!actionApiToken || actionApiToken.trim().length === 0) { - log.error("ACTION_API_BEARER_TOKEN must be set and non-empty"); - process.exit(1); -} -if (!Number.isInteger(runHistoryLimit) || runHistoryLimit < 1) { - log.error( - `Invalid ACTION_RUN_HISTORY_LIMIT value "${process.env.ACTION_RUN_HISTORY_LIMIT}"`, - ); - process.exit(1); -} - -const actionWorkdir = fs.existsSync(configuredActionWorkdir) - ? configuredActionWorkdir - : process.cwd(); - -if (!fs.existsSync(configuredActionWorkdir)) { - log.warn( - `ACTION_WORKDIR "${configuredActionWorkdir}" does not exist, using "${actionWorkdir}" instead`, - ); -} - -// --- Cron setup --- - -function initCron() { - try { - return renderCrontab({ outputPath: cronOutputPath }); - } catch (e: any) { - log.error(e.message); - process.exit(1); - } -} - -const { config: renderedConfig, enabledJobs } = initCron(); - -log.info( - `Generated ${enabledJobs.length} enabled cron jobs at ${cronOutputPath}`, -); -log.info( - `Generated ${cronOutputPath}:\n${fs.readFileSync(cronOutputPath, "utf8")}`, -); - -// --- Supercronic --- - -const supercronic = spawn(supercronicBin, [cronOutputPath], { - env: process.env, - stdio: "inherit", -}); -let supercronicAlive = true; - -supercronic.on("error", (err) => { - log.error(`supercronic start error: ${err.message}`); - process.exit(1); -}); - -// --- API server --- - -const jobsByName = new Map(renderedConfig.jobs.map((job) => [job.name, job])); -const server = createApi({ - host, - port, - apiToken: actionApiToken, - jobs: renderedConfig.jobs, - jobsByName, - workdir: actionWorkdir, - historyLimit: runHistoryLimit, - healthCheck: () => ({ - running: supercronicAlive, - pid: supercronic.pid ?? null, - }), - log, -}); - -server.listen(port, host, () => { - log.info(`API listening on ${host}:${port}`); -}); - -// --- Graceful shutdown --- - -let shuttingDown = false; -let serverClosed = false; -let supercronicClosed = false; - -function maybeExit() { - if (shuttingDown && serverClosed && supercronicClosed) process.exit(0); -} - -supercronic.on("exit", (code, signal) => { - supercronicAlive = false; - supercronicClosed = true; - if (!shuttingDown) { - log.error( - `supercronic exited unexpectedly (code=${code}, signal=${signal})`, - ); - process.exit(typeof code === "number" ? code : 1); - } - maybeExit(); -}); - -server.on("close", () => { - serverClosed = true; - maybeExit(); -}); - -async function shutdown(signal: string) { - if (shuttingDown) return; - shuttingDown = true; - - log.info(`Shutting down (signal=${signal})`); - try { - await flushLogger(); - } catch (err: any) { - log.error(`flushLogger failed: ${err?.message}`); - } - try { - const pool = getNoncePool(); - if (pool) await pool.end(); - } catch (err: any) { - log.error(`noncePool close failed: ${err?.message}`); - } - server.close(); - - if (supercronicAlive && supercronic.exitCode === null) { - supercronic.kill("SIGTERM"); - setTimeout(() => { - if (supercronic.exitCode === null) supercronic.kill("SIGKILL"); - }, 10_000).unref(); - } - - setTimeout(() => process.exit(0), 12_000).unref(); -} - -process.on("SIGTERM", () => void shutdown("SIGTERM")); -process.on("SIGINT", () => void shutdown("SIGINT")); diff --git a/cron/render-crontab.ts b/cron/render-crontab.ts deleted file mode 100644 index e0ae8544..00000000 --- a/cron/render-crontab.ts +++ /dev/null @@ -1,96 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -import cronConfig from "./cron-jobs"; - -const DEFAULT_OUTPUT_PATH = process.env.CRON_OUTPUT_PATH || "./cron/cronjob"; - -export class RenderCrontabError extends Error {} - -export interface CronJob { - name: string; - schedule: string; - enabled: boolean; - command: string; -} - -export interface CronConfig { - jobs: CronJob[]; -} - -function assertCronConfig(data: any): asserts data is CronConfig { - if (!data || typeof data !== "object" || Array.isArray(data)) { - throw new RenderCrontabError("config root must be an object"); - } - if (!Array.isArray(data.jobs)) { - throw new RenderCrontabError('config must include a "jobs" array'); - } - const names = new Set(); - for (let i = 0; i < data.jobs.length; i++) { - const job = data.jobs[i]; - if (!job || typeof job !== "object" || Array.isArray(job)) { - throw new RenderCrontabError(`jobs[${i}] must be an object`); - } - if (typeof job.name !== "string" || !job.name.trim()) { - throw new RenderCrontabError( - `jobs[${i}].name must be a non-empty string`, - ); - } - if (names.has(job.name)) { - throw new RenderCrontabError(`duplicate job name "${job.name}"`); - } - names.add(job.name); - if ( - typeof job.schedule !== "string" || - job.schedule.trim().split(/\s+/).length !== 5 - ) { - throw new RenderCrontabError( - `jobs[${i}].schedule must be a valid 5-field cron expression`, - ); - } - if (typeof job.enabled !== "boolean") { - throw new RenderCrontabError(`jobs[${i}].enabled must be a boolean`); - } - if (typeof job.command !== "string" || !job.command.trim()) { - throw new RenderCrontabError( - `jobs[${i}].command must be a non-empty string`, - ); - } - } -} - -export function loadCronConfig(): CronConfig { - assertCronConfig(cronConfig); - return cronConfig; -} - -export function renderCrontab({ outputPath = DEFAULT_OUTPUT_PATH } = {}) { - const config = loadCronConfig(); - const enabledJobs = config.jobs.filter((job) => job.enabled); - if (enabledJobs.length === 0) { - throw new RenderCrontabError("config has zero enabled jobs"); - } - - const lines: string[] = []; - for (const job of enabledJobs) { - lines.push(`# ${job.name}`); - lines.push(`${job.schedule} ${job.command}`); - } - - fs.mkdirSync(path.dirname(outputPath), { recursive: true }); - fs.writeFileSync(outputPath, `${lines.join("\n")}\n`, "utf8"); - - return { config, enabledJobs, outputPath }; -} - -if (require.main === module) { - try { - const result = renderCrontab(); - console.log( - `[render-crontab] wrote ${result.enabledJobs.length} enabled jobs to ${result.outputPath}`, - ); - } catch (e: any) { - console.error(`[render-crontab] ${e.message}`); - process.exit(1); - } -} diff --git a/docker-compose.yml b/docker-compose.yml index fb0edba8..fe0a89c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,13 +28,9 @@ services: - SONIC_URL=${SONIC_URL:-} - HOLESKY_URL=${HOLESKY_URL:-} - ACTION_API_BEARER_TOKEN=${ACTION_API_BEARER_TOKEN:-test-token} - - LOKI_URL=${LOKI_URL:-} - - LOKI_USER=${LOKI_USER:-} - - LOKI_API_KEY=${LOKI_API_KEY:-} - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} - - CRON_OUTPUT_PATH=./cron/cronjob - - DEBUG=arm* + - RUNNER_BASE_URL=${RUNNER_BASE_URL:-http://arm-oeth:8080} volumes: pgdata: diff --git a/dockerfile-actions b/dockerfile-actions index c52bb589..ac5a2b1f 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -1,7 +1,6 @@ -FROM node:20 +FROM oven/bun:1 ENV DEBIAN_FRONTEND=noninteractive \ - DEBUG=arm* \ DEBUG_HIDE_DATE=true RUN apt-get update \ @@ -20,35 +19,11 @@ RUN mkdir -p /root/.ssh \ RUN git config --global url."https://github.com/".insteadOf "git@github.com:" -# Install Foundry and symlink binaries to /usr/local/bin so they're available -# in all shell modes (login shells reset PATH, dropping ~/.foundry/bin). -RUN curl -L https://foundry.paradigm.xyz | bash \ - && /root/.foundry/bin/foundryup \ - && ln -s /root/.foundry/bin/forge /usr/local/bin/forge \ - && ln -s /root/.foundry/bin/cast /usr/local/bin/cast \ - && ln -s /root/.foundry/bin/anvil /usr/local/bin/anvil - -ARG TARGETARCH -ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.39/supercronic-linux-${TARGETARCH} \ - SUPERCRONIC=supercronic-linux-${TARGETARCH} - -# sha1sums from https://github.com/aptible/supercronic/releases/tag/v0.2.39 -COPY <<'EOF' /tmp/supercronic-checksums.txt -c98bbf82c5f648aaac8708c182cc83046fe48423 supercronic-linux-amd64 -5ef4ccc3d43f12d0f6c3763758bc37cc4e5af76e supercronic-linux-arm64 -EOF - -RUN curl -fsSLO "$SUPERCRONIC_URL" \ - && grep "$SUPERCRONIC" /tmp/supercronic-checksums.txt | sha1sum -c - \ - && chmod +x "$SUPERCRONIC" \ - && mv "$SUPERCRONIC" /usr/local/bin/supercronic \ - && rm /tmp/supercronic-checksums.txt - WORKDIR /app # Install dependencies first for better caching. -COPY yarn.lock package.json ./ -RUN yarn install --frozen-lockfile +COPY package.json pnpm-lock.yaml ./ +RUN npm install -g pnpm && pnpm install --frozen-lockfile # Copy the rest of the workspace. COPY . . @@ -57,6 +32,4 @@ ENV MAINNET_URL="" \ SONIC_URL="" \ HOLESKY_URL="" -RUN chmod +x /app/cron/cron-entrypoint.sh - -ENTRYPOINT ["/app/cron/cron-entrypoint.sh"] +CMD ["bun", "run", "runner.ts"] diff --git a/migrations/seed_schedules.sql b/migrations/seed_schedules.sql new file mode 100644 index 00000000..11c2eb1b --- /dev/null +++ b/migrations/seed_schedules.sql @@ -0,0 +1,29 @@ +-- migrations/seed_schedules.sql +-- Apply against the shared automaton Postgres. +-- Commands match the original cron/cron-jobs.ts; the container's runContainer +-- spawns them via sh -c in workdir /app. + +INSERT INTO schedules (product, name, command, cron_expr, timezone, enabled, note) VALUES +('arm-oeth', 'healthcheck', 'cd /app && pnpm hardhat healthcheck', '*/5 * * * *', 'UTC', true, NULL), +('arm-oeth', 'mainnet_auto_request_lido_withdraw', 'cd /app && pnpm hardhat autoRequestLidoWithdraw --network mainnet', '29,58 12-23,0-8 * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_auto_claim_lido_withdraw', 'cd /app && pnpm hardhat autoClaimLidoWithdraw --network mainnet', '32 0,12 * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_auto_request_etherfi_withdraw','cd /app && pnpm hardhat autoRequestEtherFiWithdraw --network mainnet', '10,40 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_auto_claim_etherfi_withdraw', 'cd /app && pnpm hardhat autoClaimEtherFiWithdraw --network mainnet', '40 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_auto_request_ethena_withdraw', 'cd /app && pnpm hardhat autoRequestEthenaWithdraw --network mainnet', '12 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_auto_claim_ethena_withdraw', 'cd /app && pnpm hardhat autoClaimEthenaWithdraw --network mainnet', '40 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_collect_lido_fees', 'cd /app && pnpm hardhat collectLidoFees --network mainnet', '30 12 * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_collect_etherfi_fees', 'cd /app && pnpm hardhat collectEtherFiFees --network mainnet', '45 23 * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_collect_ethena_fees', 'cd /app && pnpm hardhat collectEthenaFees --network mainnet', '45 23 * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_allocate_lido', 'cd /app && pnpm hardhat allocateLido --network mainnet', '38,08 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_allocate_etherfi', 'cd /app && pnpm hardhat allocateEtherFi --network mainnet', '52 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_allocate_ethena', 'cd /app && pnpm hardhat allocateEthena --network mainnet', '28 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_set_prices_lido', 'cd /app && pnpm hardhat setPricesLido --network mainnet', '*/30 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_set_prices_etherfi', 'cd /app && pnpm hardhat setPricesEtherFi --network mainnet', '2,32 * * * *', 'UTC', false, NULL), +('arm-oeth', 'mainnet_set_prices_ethena', 'cd /app && pnpm hardhat setPricesEthena --network mainnet', '4 * * * *', 'UTC', false, NULL), +('arm-oeth', 'sonic_auto_request_withdraw', 'cd /app && pnpm hardhat autoRequestWithdrawSonic --network sonic', '48,18 * * * *', 'UTC', false, NULL), +('arm-oeth', 'sonic_auto_claim_withdraw', 'cd /app && pnpm hardhat autoClaimWithdrawSonic --network sonic', '10 * * * *', 'UTC', false, NULL), +('arm-oeth', 'sonic_collect_fees', 'cd /app && pnpm hardhat collectFeesSonic --network sonic', '55 23 * * *', 'UTC', false, NULL), +('arm-oeth', 'sonic_allocate', 'cd /app && pnpm hardhat allocateSonic --network sonic', '1,31 * * * *', 'UTC', false, NULL), +('arm-oeth', 'os_silo_set_prices', 'cd /app && pnpm hardhat setOSSiloPriceAction --network sonic', '*/30 * * * *', 'UTC', false, NULL), +('arm-oeth', 'sonic_collect_rewards', 'cd /app && pnpm hardhat collectRewardsSonic --network sonic', '45 23 * * *', 'UTC', false, NULL) +ON CONFLICT DO NOTHING; diff --git a/package.json b/package.json index 067432a6..157a6687 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "winston-loki": "^6.1.3" }, "dependencies": { + "@automaton/client": "github:OriginProtocol/automaton#path:packages/client", "@types/pg": "^8.20.0", "pg": "^8.20.0" } diff --git a/runner.ts b/runner.ts new file mode 100644 index 00000000..845bc08f --- /dev/null +++ b/runner.ts @@ -0,0 +1,7 @@ +import { runContainer } from "@automaton/client"; + +await runContainer({ + product: "arm-oeth", + baseUrl: process.env.RUNNER_BASE_URL ?? "http://arm-oeth:8080", + workdir: "/app", +}); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 6cac945f..8bf40b20 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -3,10 +3,25 @@ import type { Signer } from "ethers"; import { subtask, task } from "hardhat/config"; import type { ConfigurableTaskDefinition } from "hardhat/types"; import type { Logger } from "winston"; +import { + createDb, + createPool, + type Db, + wrapSignerWithNonceQueueV6, +} from "@automaton/client"; import { getSigner as defaultGetSigner } from "../../utils/signers"; import logger, { flushLogger } from "./logger"; -import { wrapWithNonceQueue } from "./nonceQueue"; + +let dbInstance: Db | null = null; +function getNonceDb(): Db | null { + if (!process.env.DATABASE_URL) return null; + if (!dbInstance) { + const pool = createPool({ connectionString: process.env.DATABASE_URL }); + dbInstance = createDb(pool); + } + return dbInstance; +} export interface ActionContext { signer: Signer; @@ -52,7 +67,10 @@ export function createActionHandler( const rawSigner = await getSigner(); const network = await rawSigner.provider!.getNetwork(); chainId = Number(network.chainId); - const signer = wrapWithNonceQueue(rawSigner, chainId, log); + const db = getNonceDb(); + const signer = db + ? wrapSignerWithNonceQueueV6(rawSigner, { db, log }) + : rawSigner; networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; log.info(`Running on ${networkName} (${chainId})`, { diff --git a/src/js/tasks/lib/nonceQueue.test.ts b/src/js/tasks/lib/nonceQueue.test.ts deleted file mode 100644 index 83d7d858..00000000 --- a/src/js/tasks/lib/nonceQueue.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -/** - * Integration test for the Postgres nonce queue. - * - * Prerequisites: - * docker run -d --name nonce-test-pg -p 5433:5432 \ - * -e POSTGRES_DB=nonce_test -e POSTGRES_USER=test -e POSTGRES_PASSWORD=test \ - * postgres:16-alpine - * - * Run: - * DATABASE_URL=postgresql://test:test@localhost:5433/nonce_test \ - * npx ts-node src/js/tasks/lib/nonceQueue.test.ts - */ - -import { Pool } from "pg"; -import type { Logger } from "winston"; - -const mockLog = { - info: () => {}, - warn: () => {}, - error: () => {}, - child: () => mockLog, -} as unknown as Logger; - -if (!process.env.DATABASE_URL) { - console.error( - "Set DATABASE_URL to run this test, e.g.:\n" + - " DATABASE_URL=postgresql://test:test@localhost:5433/nonce_test npx ts-node src/js/tasks/lib/nonceQueue.test.ts", - ); - process.exit(1); -} - -import { - wrapWithNonceQueue, - getNoncePool, - _resetForTesting, -} from "./nonceQueue"; - -// Minimal mock signer for testing (ethers v6 interface) -function createMockSigner( - address: string, - onSend: (nonce: number) => Promise, -) { - const signer: any = { - getAddress: async () => address, - getNonce: async () => 0, // ethers v6 uses getNonce instead of getTransactionCount - provider: { - getNetwork: async () => ({ chainId: 1n }), // v6 returns bigint - }, - sendTransaction: async (tx: any) => { - await onSend(tx.nonce); - return { - hash: "0x" + Math.random().toString(16).slice(2), - from: address, - nonce: tx.nonce, - wait: async () => ({ status: 1 }), - }; - }, - signMessage: async () => "0x", - signTransaction: async () => "0x", - connect: () => signer, - }; - return signer; -} - -/** Drop and recreate table, reset module state */ -async function resetAll() { - const existing = getNoncePool(); - if (existing) await existing.end(); - _resetForTesting(); - - const tmpPool = new Pool({ connectionString: process.env.DATABASE_URL }); - await tmpPool.query("DROP TABLE IF EXISTS nonce_queue"); - await tmpPool.end(); -} - -async function test() { - const results: { - id: number; - nonce: number; - startMs: number; - endMs: number; - }[] = []; - - // --- Test 1 --- - console.log("--- Test 1: Sequential nonce assignment ---"); - await resetAll(); - - const signer1 = createMockSigner("0xaaaa", async (nonce) => { - results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); - await new Promise((r) => setTimeout(r, 100)); - results[results.length - 1].endMs = Date.now(); - }); - - const wrapped1 = wrapWithNonceQueue(signer1, 1, mockLog); - - for (let i = 0; i < 3; i++) { - await wrapped1.sendTransaction({ to: "0xbbbb", data: "0x" }); - } - - console.log("Results:", results.map((r) => `nonce=${r.nonce}`).join(", ")); - const nonces = results.map((r) => r.nonce); - console.assert( - nonces[0] === 0 && nonces[1] === 1 && nonces[2] === 2, - `Expected nonces [0,1,2] but got [${nonces}]`, - ); - console.log("PASS: Sequential nonces assigned correctly\n"); - - // --- Test 2 --- - console.log("--- Test 2: Concurrent processes block on lock ---"); - results.length = 0; - await resetAll(); - - const signer2a = createMockSigner("0xaaaa", async (nonce) => { - results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); - await new Promise((r) => setTimeout(r, 500)); // Hold lock for 500ms - results[results.length - 1].endMs = Date.now(); - }); - const signer2b = createMockSigner("0xaaaa", async (nonce) => { - results.push({ id: 2, nonce, startMs: Date.now(), endMs: 0 }); - await new Promise((r) => setTimeout(r, 100)); - results[results.length - 1].endMs = Date.now(); - }); - - const wrapped2a = wrapWithNonceQueue(signer2a, 1, mockLog); - const wrapped2b = wrapWithNonceQueue(signer2b, 1, mockLog); - - const p1 = wrapped2a.sendTransaction({ to: "0xbbbb", data: "0x" }); - // Small delay so both connections are open and racing for the lock - await new Promise((r) => setTimeout(r, 50)); - const p2 = wrapped2b.sendTransaction({ to: "0xbbbb", data: "0x" }); - - await Promise.all([p1, p2]); - - console.log( - "Results:", - results.map((r) => `id=${r.id} nonce=${r.nonce}`).join(", "), - ); - - const sortedNonces = results.map((r) => r.nonce).sort(); - console.assert( - sortedNonces[0] === 0 && sortedNonces[1] === 1, - `Expected nonces [0,1] but got [${sortedNonces}]`, - ); - - const sorted = [...results].sort((a, b) => a.startMs - b.startMs); - const gap = sorted[1].startMs - sorted[0].endMs; - console.log( - ` First tx: ${sorted[0].startMs}-${sorted[0].endMs} (${sorted[0].endMs - sorted[0].startMs}ms)`, - ); - console.log( - ` Second tx: ${sorted[1].startMs}-${sorted[1].endMs} (${sorted[1].endMs - sorted[1].startMs}ms)`, - ); - console.log(` Gap between first end and second start: ${gap}ms`); - console.assert( - gap >= -50, - `Second tx started ${-gap}ms BEFORE first finished — lock didn't serialize!`, - ); - console.log("PASS: Concurrent transactions serialized correctly\n"); - - // --- Test 3 --- - console.log("--- Test 3: Different chains have independent nonces ---"); - results.length = 0; - await resetAll(); - - const signer3a = createMockSigner("0xaaaa", async (nonce) => { - results.push({ id: 1, nonce, startMs: Date.now(), endMs: 0 }); - }); - const signer3b = createMockSigner("0xaaaa", async (nonce) => { - results.push({ id: 2, nonce, startMs: Date.now(), endMs: 0 }); - }); - - const wrappedMainnet = wrapWithNonceQueue(signer3a, 1, mockLog); - const wrappedSonic = wrapWithNonceQueue(signer3b, 146, mockLog); - - await wrappedMainnet.sendTransaction({ to: "0xbbbb", data: "0x" }); - await wrappedSonic.sendTransaction({ to: "0xbbbb", data: "0x" }); - - console.log( - "Results:", - results.map((r) => `chain=${r.id} nonce=${r.nonce}`).join(", "), - ); - console.assert( - results[0].nonce === 0 && results[1].nonce === 0, - `Expected both nonces to be 0 but got [${results.map((r) => r.nonce)}]`, - ); - console.log("PASS: Independent nonces per chain\n"); - - // --- Test 4 --- - console.log("--- Test 4: Rollback on failure keeps nonce ---"); - results.length = 0; - await resetAll(); - - let callCount = 0; - const signerFail = createMockSigner("0xaaaa", async (nonce) => { - callCount++; - results.push({ id: callCount, nonce, startMs: Date.now(), endMs: 0 }); - if (callCount === 1) { - throw new Error("Transaction reverted"); - } - }); - - const wrappedFail = wrapWithNonceQueue(signerFail, 1, mockLog); - - try { - await wrappedFail.sendTransaction({ to: "0xbbbb", data: "0x" }); - } catch (e: any) { - console.log(`First tx failed as expected: ${e.message}`); - } - - await wrappedFail.sendTransaction({ to: "0xbbbb", data: "0x" }); - - console.log( - "Results:", - results.map((r) => `id=${r.id} nonce=${r.nonce}`).join(", "), - ); - console.assert( - results[0].nonce === 0 && results[1].nonce === 0, - `Expected both nonces to be 0 but got [${results.map((r) => r.nonce)}]`, - ); - console.log("PASS: Nonce preserved after rollback\n"); - - // --- Cleanup --- - const pool = getNoncePool(); - if (pool) await pool.end(); - console.log("All tests passed!"); -} - -test().catch((err) => { - console.error("TEST FAILED:", err); - process.exit(1); -}); diff --git a/src/js/tasks/lib/nonceQueue.ts b/src/js/tasks/lib/nonceQueue.ts deleted file mode 100644 index 4632f54a..00000000 --- a/src/js/tasks/lib/nonceQueue.ts +++ /dev/null @@ -1,251 +0,0 @@ -import type { Pool, PoolClient } from "pg"; -import type { Signer, TransactionResponse } from "ethers"; -import type { Logger } from "winston"; -import { - isNonceMismatchError, - recoverNonceFromChain, - submitNonceQueuedTransaction, -} from "./nonceQueueTxLifecycle"; - -let pool: Pool | null = null; -let tableEnsurePromise: Promise | null = null; - -function getNonceQueueLockTimeoutSeconds(log: Logger): number { - const value = process.env.NONCE_QUEUE_LOCK_TIMEOUT_S; - if (!value) return 0; - - const parsed = Number(value); - if (!Number.isInteger(parsed) || parsed < 0) { - log.warn( - `Invalid NONCE_QUEUE_LOCK_TIMEOUT_S="${value}" (expected integer >= 0). Falling back to 0 (wait forever).`, - ); - return 0; - } - - return parsed; -} - -export function getNoncePool(): Pool | null { - if (!process.env.DATABASE_URL) return null; - if (!pool) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { Pool: PgPool } = require("pg"); - pool = new PgPool({ - connectionString: process.env.DATABASE_URL, - max: 5, - connectionTimeoutMillis: 120_000, - }); - } - return pool; -} - -function ensureNonceTable(p: Pool): Promise { - if (!tableEnsurePromise) { - tableEnsurePromise = p - .query( - ` - CREATE TABLE IF NOT EXISTS nonce_queue ( - signer_address TEXT NOT NULL, - chain_id INTEGER NOT NULL, - nonce INTEGER NOT NULL, - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - PRIMARY KEY (signer_address, chain_id) - ) - `, - ) - .then(() => {}); - } - return tableEnsurePromise; -} - -async function ensureNonceRow( - client: PoolClient, - signerAddress: string, - chainId: number, - getOnChainNonce: () => Promise, - log: Logger, -): Promise { - const { rows } = await client.query( - "SELECT 1 FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2", - [signerAddress, chainId], - ); - if (rows.length === 0) { - const onChainNonce = await getOnChainNonce(); - log.info("Initializing nonce row", { - event: "nonce.init", - signer_address: signerAddress, - chain_id: chainId, - nonce: onChainNonce, - }); - await client.query( - `INSERT INTO nonce_queue (signer_address, chain_id, nonce) - VALUES ($1, $2, $3) - ON CONFLICT DO NOTHING`, - [signerAddress, chainId, onChainNonce], - ); - } -} - -function isLockTimeoutError(err: any): boolean { - const msg = (err?.message ?? "").toLowerCase(); - return ( - err?.code === "55P03" || - msg.includes("lock timeout") || - msg.includes("canceling statement due to lock timeout") - ); -} - -async function withNonceLock( - p: Pool, - signerAddress: string, - chainId: number, - getOnChainNonce: () => Promise, - log: Logger, - fn: (nonce: number) => Promise, - maxRetries = 3, -): Promise { - await ensureNonceTable(p); - const meta = { signer_address: signerAddress, chain_id: chainId }; - - for (let attempt = 0; attempt < maxRetries; attempt++) { - const client = await p.connect(); - const lockTimeoutSeconds = getNonceQueueLockTimeoutSeconds(log); - try { - await client.query("BEGIN"); - if (lockTimeoutSeconds > 0) { - await client.query("SELECT set_config('lock_timeout', $1, true)", [ - `${lockTimeoutSeconds}s`, - ]); - } - await ensureNonceRow( - client, - signerAddress, - chainId, - getOnChainNonce, - log, - ); - - const { rows } = await client.query( - "SELECT nonce FROM nonce_queue WHERE signer_address = $1 AND chain_id = $2 FOR UPDATE", - [signerAddress, chainId], - ); - const nonce: number = rows[0].nonce; - - log.info("Acquired nonce lock", { - event: "nonce.lock.acquired", - ...meta, - nonce, - }); - - const result = await fn(nonce); - - await client.query( - "UPDATE nonce_queue SET nonce = nonce + 1, updated_at = NOW() WHERE signer_address = $1 AND chain_id = $2", - [signerAddress, chainId], - ); - await client.query("COMMIT"); - - log.info("Released nonce lock", { - event: "nonce.lock.released", - ...meta, - nonce, - next_nonce: nonce + 1, - }); - - return result; - } catch (err: any) { - await client.query("ROLLBACK").catch(() => {}); - - if (isLockTimeoutError(err)) { - const configuredTimeout = - lockTimeoutSeconds > 0 - ? `${lockTimeoutSeconds}s` - : "Postgres default"; - log.warn("Nonce lock timeout", { - event: "nonce.lock.timeout", - ...meta, - timeout: configuredTimeout, - }); - } - - if (isNonceMismatchError(err)) { - log.warn( - `Nonce mismatch (attempt ${attempt + 1}/${maxRetries}), recovering from chain`, - { - event: "nonce.mismatch", - ...meta, - attempt: attempt + 1, - max_retries: maxRetries, - }, - ); - await recoverNonceFromChain({ - pool: p, - signerAddress, - chainId, - getOnChainNonce, - log, - }); - if (attempt < maxRetries - 1) continue; - } - - throw err; - } finally { - client.release(); - } - } - - throw new Error("withNonceLock: max retries exhausted"); -} - -/** Reset module state. Only for testing. */ -export function _resetForTesting() { - tableEnsurePromise = null; - pool = null; -} - -/** - * Wraps an ethers v6 Signer so that every `sendTransaction` call is - * serialized through a Postgres row lock. The nonce is managed by the - * database — not by the provider. The lock is held until the transaction - * is confirmed on-chain, so concurrent processes block rather than collide. - * - * If DATABASE_URL is not set, the signer is returned unmodified. - */ -export function wrapWithNonceQueue( - signer: Signer, - chainId: number, - log: Logger, -): Signer { - const p = getNoncePool(); - if (!p) return signer; - - const originalSendTransaction = signer.sendTransaction.bind(signer); - const addressPromise = signer.getAddress().then((a) => a.toLowerCase()); - const getOnChainNonce = () => signer.getNonce("pending"); - - signer.sendTransaction = async function ( - transaction: Parameters[0], - ): Promise { - const signerAddress = await addressPromise; - return withNonceLock( - p, - signerAddress, - chainId, - getOnChainNonce, - log, - async (nonce) => { - return submitNonceQueuedTransaction({ - sendTransaction: originalSendTransaction, - provider: signer.provider ?? undefined, - transaction, - nonce, - signerAddress, - chainId, - log, - }); - }, - ); - }; - - return signer; -} diff --git a/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts b/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts deleted file mode 100644 index 72b13243..00000000 --- a/src/js/tasks/lib/nonceQueueTxLifecycle.test.ts +++ /dev/null @@ -1,562 +0,0 @@ -import { Wallet } from "ethers"; -import type { Logger } from "winston"; - -import { submitNonceQueuedTransaction } from "./nonceQueueTxLifecycle"; - -const mockLog = { - info: () => {}, - warn: () => {}, - error: () => {}, - child: () => mockLog, -} as unknown as Logger; - -type EnvOverrides = Record; -const MAINNET_GAS_CAP_ENV = "NONCE_QUEUE_MAX_GAS_PRICE_GWEI_CHAIN_1"; - -function makeResponse(hash: string, raw?: string): any { - return { - hash, - raw, - rawTransaction: raw, - wait: async () => ({ status: 1, transactionHash: hash }), - }; -} - -async function withEnv(overrides: EnvOverrides, fn: () => Promise) { - const previousValues: Record = {}; - for (const key of Object.keys(overrides)) { - previousValues[key] = process.env[key]; - } - - for (const [key, value] of Object.entries(overrides)) { - if (value === undefined) { - delete process.env[key]; - } else { - process.env[key] = value; - } - } - - try { - return await fn(); - } finally { - for (const [key, value] of Object.entries(previousValues)) { - if (value === undefined) { - delete process.env[key]; - } else { - process.env[key] = value; - } - } - } -} - -const GWEI = 1_000_000_000n; - -async function testReplacementPath() { - console.log("--- Lifecycle Test 1: Replacement path fee bump ---"); - - const sentTxs: any[] = []; - let sendCount = 0; - const signerSendTransaction = async (tx: any) => { - sentTxs.push(tx); - if (sendCount === 0) { - sendCount++; - return makeResponse("0xinitial", "0xraw-initial"); - } - sendCount++; - return makeResponse("0xreplacement", "0xraw-replacement"); - }; - - let receiptChecks = 0; - const provider: any = { - async getTransactionReceipt(hash: string) { - receiptChecks++; - if (hash === "0xreplacement" && receiptChecks >= 4) { - return { status: 1, hash: "0xreplacement" }; - } - return null; - }, - async getFeeData() { - return { - maxFeePerGas: 400n, - maxPriorityFeePerGas: 5n, - }; - }, - async broadcastTransaction() { - throw new Error("rebroadcast disabled in this test"); - }, - }; - - const result = await withEnv( - { - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "20", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "1", - NONCE_QUEUE_MAX_REPLACEMENTS: "2", - NONCE_QUEUE_FEE_BUMP_PCT: "20", - }, - () => - submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - maxFeePerGas: 100n, - maxPriorityFeePerGas: 2n, - } as any, - nonce: 7, - signerAddress: "0xaaaa", - chainId: 1, - log: mockLog, - }), - ); - - if (result.hash !== "0xreplacement") { - throw new Error(`Expected replacement hash, got ${result.hash}`); - } - if (sentTxs.length < 2) { - throw new Error(`Expected at least 2 submissions, got ${sentTxs.length}`); - } - if (sentTxs[1].nonce !== 7) { - throw new Error(`Expected replacement nonce=7, got ${sentTxs[1].nonce}`); - } - if (!(BigInt(sentTxs[1].maxFeePerGas) > BigInt(sentTxs[0].maxFeePerGas))) { - throw new Error("Expected replacement maxFeePerGas to increase"); - } - if ( - !( - BigInt(sentTxs[1].maxPriorityFeePerGas) >= - BigInt(sentTxs[0].maxPriorityFeePerGas) - ) - ) { - throw new Error("Expected replacement maxPriorityFeePerGas to increase"); - } - - console.log("PASS: replacement submitted with same nonce and higher fees\n"); -} - -async function testTimeoutPath() { - console.log("--- Lifecycle Test 2: Confirmation timeout path ---"); - - const signerSendTransaction = async () => makeResponse("0xtimeout"); - const provider: any = { - async getTransactionReceipt() { - return null; - }, - async getFeeData() { - return {}; - }, - async broadcastTransaction() { - return makeResponse("0xnever"); - }, - }; - - let timeoutError: Error | undefined; - await withEnv( - { - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "2", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - async () => { - try { - await submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - } as any, - nonce: 11, - signerAddress: "0xbbbb", - chainId: 1, - log: mockLog, - }); - } catch (err: any) { - timeoutError = err; - } - }, - ); - - if (!timeoutError) { - throw new Error("Expected timeout error but transaction did not fail"); - } - if (!timeoutError.message.includes("after 2s")) { - throw new Error( - `Unexpected timeout error message: ${timeoutError.message}`, - ); - } - - console.log("PASS: confirmation timeout errors as expected\n"); -} - -async function testRebroadcastPath() { - console.log("--- Lifecycle Test 3: Rebroadcast duplicate handling ---"); - - const signerSendTransaction = async () => - makeResponse("0xrebroadcast", "0xraw-rebroadcast"); - - let rebroadcastAttempts = 0; - let receiptChecks = 0; - const provider: any = { - async getTransactionReceipt(hash: string) { - receiptChecks++; - if (hash === "0xrebroadcast" && receiptChecks >= 3) { - return { status: 1, hash: "0xrebroadcast" }; - } - return null; - }, - async getFeeData() { - return {}; - }, - async broadcastTransaction() { - rebroadcastAttempts++; - throw new Error("already known"); - }, - }; - - const result = await withEnv( - { - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "1", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - () => - submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - } as any, - nonce: 12, - signerAddress: "0xcccc", - chainId: 1, - log: mockLog, - }), - ); - - if (result.hash !== "0xrebroadcast") { - throw new Error(`Expected original hash, got ${result.hash}`); - } - if (rebroadcastAttempts < 1) { - throw new Error("Expected at least one rebroadcast attempt"); - } - - console.log("PASS: rebroadcast duplicate errors are handled\n"); -} - -async function testInitialSubmissionGasCap() { - console.log("--- Lifecycle Test 4: Initial submission per-chain gas cap ---"); - - let sendCalls = 0; - const signerSendTransaction = async () => { - sendCalls++; - return makeResponse("0xshould-not-send"); - }; - const provider: any = { - async getFeeData() { - return {}; - }, - }; - - let capError: Error | undefined; - await withEnv( - { - [MAINNET_GAS_CAP_ENV]: "20", - NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - async () => { - try { - await submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - gasPrice: 25n * GWEI, - } as any, - nonce: 21, - signerAddress: "0xdddd", - chainId: 1, - log: mockLog, - }); - } catch (err: any) { - capError = err; - } - }, - ); - - if (!capError) { - throw new Error("Expected initial submission gas cap error"); - } - if (!capError.message.includes("initial submission")) { - throw new Error(`Unexpected gas cap error message: ${capError.message}`); - } - if (sendCalls !== 0) { - throw new Error( - `Expected sendTransaction not to be called, got ${sendCalls}`, - ); - } - - console.log("PASS: initial submission over cap fails before sending\n"); -} - -async function testMissingChainSpecificCapDisablesEnforcement() { - console.log( - "--- Lifecycle Test 5: Missing chain-specific cap disables enforcement ---", - ); - - let sendCalls = 0; - const signerSendTransaction = async () => { - sendCalls++; - return makeResponse("0xno-cap-chain"); - }; - - const result = await withEnv( - { - [MAINNET_GAS_CAP_ENV]: "20", - NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - () => - submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - gasPrice: 25n * GWEI, - } as any, - nonce: 23, - signerAddress: "0xffff", - chainId: 146, // Sonic — no cap set for this chain - log: mockLog, - }), - ); - - if (result.hash !== "0xno-cap-chain") { - throw new Error(`Expected successful tx hash, got ${result.hash}`); - } - if (sendCalls !== 1) { - throw new Error(`Expected one send call, got ${sendCalls}`); - } - - console.log("PASS: cap is disabled when chain-specific env is missing\n"); -} - -async function testReplacementGasCap() { - console.log("--- Lifecycle Test 6: Replacement gas cap ---"); - - const sentTxs: any[] = []; - const signerSendTransaction = async (tx: any) => { - sentTxs.push(tx); - return makeResponse("0xreplacement-seed", "0xraw-replacement-seed"); - }; - - const provider: any = { - async getTransactionReceipt() { - return null; - }, - async getFeeData() { - return { - maxFeePerGas: 10n * GWEI, - maxPriorityFeePerGas: 2n * GWEI, - }; - }, - async broadcastTransaction() { - throw new Error("rebroadcast disabled in replacement cap test"); - }, - }; - - let capError: Error | undefined; - await withEnv( - { - [MAINNET_GAS_CAP_ENV]: "12", - NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "1", - NONCE_QUEUE_MAX_REPLACEMENTS: "2", - NONCE_QUEUE_FEE_BUMP_PCT: "30", - }, - async () => { - try { - await submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - maxFeePerGas: 10n * GWEI, - maxPriorityFeePerGas: 2n * GWEI, - type: 2, - } as any, - nonce: 24, - signerAddress: "0x1111", - chainId: 1, - log: mockLog, - }); - } catch (err: any) { - capError = err; - } - }, - ); - - if (!capError) { - throw new Error("Expected replacement gas cap error"); - } - if (!capError.message.includes("replacement")) { - throw new Error(`Unexpected replacement cap error: ${capError.message}`); - } - if (sentTxs.length !== 1) { - throw new Error( - `Expected only initial send to happen before replacement cap failure, got ${sentTxs.length}`, - ); - } - - console.log("PASS: replacement over cap fails before sending replacement\n"); -} - -async function testRebroadcastGasCap() { - console.log("--- Lifecycle Test 7: Rebroadcast gas cap ---"); - - const wallet = new Wallet( - "0x59c6995e998f97a5a0044966f0945388cf0f6e44f9c76c9d83f816f94f8f93f4", - ); - const highGasTx = await wallet.signTransaction({ - to: "0x0000000000000000000000000000000000000001", - nonce: 0, - gasLimit: 21_000, - gasPrice: 30n * GWEI, - value: 0, - chainId: 1, - data: "0x", - }); - - let providerSendCalls = 0; - const signerSendTransaction = async () => makeResponse("0xseed", highGasTx); - const provider: any = { - async getTransactionReceipt() { - return null; - }, - async getFeeData() { - return {}; - }, - async broadcastTransaction() { - providerSendCalls++; - return makeResponse("0xrebroadcast-high"); - }, - }; - - let capError: Error | undefined; - await withEnv( - { - [MAINNET_GAS_CAP_ENV]: "20", - NONCE_QUEUE_MAX_GAS_PRICE_GWEI: undefined, - NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S: "10", - NONCE_QUEUE_RECEIPT_POLL_S: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "1", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - async () => { - try { - await submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - provider, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - gasPrice: 10n * GWEI, - } as any, - nonce: 22, - signerAddress: "0xeeee", - chainId: 1, - log: mockLog, - }); - } catch (err: any) { - capError = err; - } - }, - ); - - if (!capError) { - throw new Error("Expected rebroadcast gas cap error"); - } - if (!capError.message.includes("rebroadcast")) { - throw new Error(`Unexpected rebroadcast cap error: ${capError.message}`); - } - if (providerSendCalls !== 0) { - throw new Error( - `Expected provider rebroadcast broadcastTransaction not to be called, got ${providerSendCalls}`, - ); - } - - console.log("PASS: rebroadcast over cap fails with clear error\n"); -} - -async function testDeprecatedGlobalGasCapIgnored() { - console.log("--- Lifecycle Test 8: Deprecated global gas cap is ignored ---"); - - let sendCalls = 0; - const signerSendTransaction = async () => { - sendCalls++; - return makeResponse("0xglobal-ignored"); - }; - - const result = await withEnv( - { - [MAINNET_GAS_CAP_ENV]: undefined, - NONCE_QUEUE_MAX_GAS_PRICE_GWEI: "1", - NONCE_QUEUE_REBROADCAST_INTERVAL_S: "0", - NONCE_QUEUE_REPLACE_INTERVAL_S: "0", - }, - () => - submitNonceQueuedTransaction({ - sendTransaction: signerSendTransaction as any, - transaction: { - to: "0x0000000000000000000000000000000000000001", - data: "0x", - gasPrice: 50n * GWEI, - } as any, - nonce: 25, - signerAddress: "0x2222", - chainId: 1, - log: mockLog, - }), - ); - - if (result.hash !== "0xglobal-ignored") { - throw new Error(`Expected tx success when only global cap is set`); - } - if (sendCalls !== 1) { - throw new Error(`Expected one send call, got ${sendCalls}`); - } - - console.log("PASS: deprecated global cap does not enforce lifecycle limit\n"); -} - -async function test() { - await testReplacementPath(); - await testTimeoutPath(); - await testRebroadcastPath(); - await testInitialSubmissionGasCap(); - await testMissingChainSpecificCapDisablesEnforcement(); - await testReplacementGasCap(); - await testRebroadcastGasCap(); - await testDeprecatedGlobalGasCapIgnored(); - console.log("All nonceQueueTxLifecycle tests passed!"); -} - -test().catch((err) => { - console.error("TEST FAILED:", err); - process.exit(1); -}); diff --git a/src/js/tasks/lib/nonceQueueTxLifecycle.ts b/src/js/tasks/lib/nonceQueueTxLifecycle.ts deleted file mode 100644 index 398f4f85..00000000 --- a/src/js/tasks/lib/nonceQueueTxLifecycle.ts +++ /dev/null @@ -1,560 +0,0 @@ -import type { Provider, Signer, TransactionResponse } from "ethers"; -import { Transaction } from "ethers"; -import type { Pool, PoolClient } from "pg"; -import type { Logger } from "winston"; - -const GWEI = 1_000_000_000n; -const DEFAULT_PRIORITY_FEE = GWEI * 2n; -const DEFAULT_GAS_PRICE = GWEI * 20n; - -export interface SubmitNonceQueuedTxParams { - sendTransaction: ( - transaction: Parameters[0], - ) => Promise; - provider?: Provider; - transaction: Parameters[0]; - nonce: number; - signerAddress: string; - chainId: number; - log: Logger; -} - -interface TxLifecycleConfig { - txConfirmTimeoutS: number; - receiptPollS: number; - rebroadcastIntervalS: number; - replaceIntervalS: number; - maxReplacements: number; - feeBumpPct: number; -} - -function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -function parseIntEnv( - log: Logger, - name: string, - fallback: number, - minimum = 0, - maximum?: number, -): number { - const value = process.env[name]; - if (!value) return fallback; - - const parsed = Number(value); - const withinMax = maximum === undefined || parsed <= maximum; - if (!Number.isInteger(parsed) || parsed < minimum || !withinMax) { - const maxMsg = maximum === undefined ? "" : ` and <= ${maximum}`; - log.warn( - `Invalid ${name}="${value}" (expected integer >= ${minimum}${maxMsg}). Falling back to ${fallback}.`, - ); - return fallback; - } - return parsed; -} - -function getTxLifecycleConfig(log: Logger): TxLifecycleConfig { - return { - txConfirmTimeoutS: parseIntEnv( - log, - "NONCE_QUEUE_TX_CONFIRM_TIMEOUT_S", - 600, - ), - receiptPollS: parseIntEnv(log, "NONCE_QUEUE_RECEIPT_POLL_S", 5, 1), - rebroadcastIntervalS: parseIntEnv( - log, - "NONCE_QUEUE_REBROADCAST_INTERVAL_S", - 30, - ), - replaceIntervalS: parseIntEnv(log, "NONCE_QUEUE_REPLACE_INTERVAL_S", 90), - maxReplacements: parseIntEnv(log, "NONCE_QUEUE_MAX_REPLACEMENTS", 3), - feeBumpPct: parseIntEnv(log, "NONCE_QUEUE_FEE_BUMP_PCT", 15, 0, 500), - }; -} - -function secondsToMs(seconds: number): number { - return seconds * 1_000; -} - -function asBigInt(value: any): bigint | undefined { - if (value === undefined || value === null) return undefined; - try { - return BigInt(value); - } catch { - return undefined; - } -} - -function bumpByPercent(value: bigint, percent: number): bigint { - if (percent === 0) return value; - return (value * BigInt(100 + percent) + 99n) / 100n; -} - -function maxBigInt(a: bigint, b: bigint): bigint { - return a >= b ? a : b; -} - -function getTxCapComparableGasPrice( - transaction: Parameters[0], -): bigint | undefined { - return ( - asBigInt((transaction as any).maxFeePerGas) ?? - asBigInt((transaction as any).gasPrice) - ); -} - -function getPerChainMaxGasPriceEnvKey(chainId: number): string { - return `NONCE_QUEUE_MAX_GAS_PRICE_GWEI_CHAIN_${chainId}`; -} - -function resolveMaxGasPriceWeiForChain( - chainId: number, - log: Logger, -): bigint | null { - const envKey = getPerChainMaxGasPriceEnvKey(chainId); - const value = process.env[envKey]; - if (!value) return null; - - const parsed = Number(value); - if (!Number.isInteger(parsed) || parsed < 0) { - log.warn( - `Invalid ${envKey}="${value}" (expected integer >= 0). Gas cap disabled for chain ${chainId}.`, - ); - return null; - } - if (parsed === 0) return null; - return GWEI * BigInt(parsed); -} - -function assertWithinGasPriceCap({ - priceWei, - maxGasPriceWei, - maxGasPriceEnvKey, - stage, - signerAddress, - chainId, - nonce, -}: { - priceWei: bigint; - maxGasPriceWei: bigint; - maxGasPriceEnvKey: string; - stage: "initial submission" | "rebroadcast" | "replacement"; - signerAddress: string; - chainId: number; - nonce: number; -}) { - if (priceWei <= maxGasPriceWei) return; - throw new Error( - `Nonce queue gas price cap exceeded during ${stage}: address=${signerAddress} chain=${chainId} nonce=${nonce} gasPrice=${priceWei.toString()} wei cap=${maxGasPriceWei.toString()} wei (set by ${maxGasPriceEnvKey})`, - ); -} - -async function enforceSubmissionGasPriceCap({ - transaction, - provider, - maxGasPriceWei, - maxGasPriceEnvKey, - stage, - signerAddress, - chainId, - nonce, -}: { - transaction: Parameters[0]; - provider?: Provider; - maxGasPriceWei: bigint | null; - maxGasPriceEnvKey: string; - stage: "initial submission" | "replacement"; - signerAddress: string; - chainId: number; - nonce: number; -}) { - if (!maxGasPriceWei) return; - - let comparableGasPrice = getTxCapComparableGasPrice(transaction); - if (!comparableGasPrice && provider) { - const feeData = await provider.getFeeData().catch(() => null); - comparableGasPrice = - asBigInt(feeData?.maxFeePerGas) ?? asBigInt(feeData?.gasPrice); - } - - if (!comparableGasPrice) { - throw new Error( - `Unable to enforce ${maxGasPriceEnvKey} for ${stage}: address=${signerAddress} chain=${chainId} nonce=${nonce} transaction has no gasPrice/maxFeePerGas and provider fee data is unavailable`, - ); - } - - assertWithinGasPriceCap({ - priceWei: comparableGasPrice, - maxGasPriceWei, - maxGasPriceEnvKey, - stage, - signerAddress, - chainId, - nonce, - }); -} - -function enforceRebroadcastGasPriceCap({ - rawTransaction, - maxGasPriceWei, - maxGasPriceEnvKey, - signerAddress, - chainId, - nonce, -}: { - rawTransaction: string; - maxGasPriceWei: bigint | null; - maxGasPriceEnvKey: string; - signerAddress: string; - chainId: number; - nonce: number; -}) { - if (!maxGasPriceWei) return; - - const parsedTransaction = Transaction.from(rawTransaction); - const comparableGasPrice = - asBigInt(parsedTransaction.maxFeePerGas) ?? - asBigInt(parsedTransaction.gasPrice); - - if (!comparableGasPrice) { - throw new Error( - `Unable to enforce ${maxGasPriceEnvKey} for rebroadcast: address=${signerAddress} chain=${chainId} nonce=${nonce} raw transaction has no gasPrice/maxFeePerGas`, - ); - } - - assertWithinGasPriceCap({ - priceWei: comparableGasPrice, - maxGasPriceWei, - maxGasPriceEnvKey, - stage: "rebroadcast", - signerAddress, - chainId, - nonce, - }); -} - -function extractRawTransaction( - response: TransactionResponse, -): string | undefined { - const candidate = - (response as any).raw ?? - (response as any).rawTransaction ?? - (response as any).serialized; - return typeof candidate === "string" && candidate.length > 0 - ? candidate - : undefined; -} - -function isDuplicateBroadcastError(err: any): boolean { - const msg = (err?.message ?? "").toLowerCase(); - return ( - msg.includes("already known") || - msg.includes("known transaction") || - msg.includes("already imported") - ); -} - -async function findMinedReceipt(provider: Provider, hashes: string[]) { - for (const hash of hashes) { - const receipt = await provider.getTransactionReceipt(hash); - if (receipt) return receipt; - } - return null; -} - -async function buildReplacementTransaction( - transaction: Parameters[0], - provider: Provider, - feeBumpPct: number, -): Promise[0]> { - const feeData = await provider.getFeeData().catch(() => null); - const nextTx: any = { ...transaction }; - - const hasEip1559Fees = - nextTx.maxFeePerGas !== undefined || - nextTx.maxPriorityFeePerGas !== undefined || - nextTx.type === 2; - - if (hasEip1559Fees) { - const basePriority = - asBigInt(nextTx.maxPriorityFeePerGas) ?? - asBigInt(feeData?.maxPriorityFeePerGas) ?? - DEFAULT_PRIORITY_FEE; - const baseMaxFee = - asBigInt(nextTx.maxFeePerGas) ?? - asBigInt(feeData?.maxFeePerGas) ?? - basePriority * 2n; - - const bumpedPriority = bumpByPercent(basePriority, feeBumpPct); - const bumpedMaxFee = bumpByPercent(baseMaxFee, feeBumpPct); - const networkPriority = asBigInt(feeData?.maxPriorityFeePerGas); - const networkMaxFee = asBigInt(feeData?.maxFeePerGas); - - let finalPriority = bumpedPriority; - let finalMaxFee = bumpedMaxFee; - if (networkPriority) { - finalPriority = maxBigInt(finalPriority, networkPriority); - } - if (networkMaxFee) { - finalMaxFee = maxBigInt(finalMaxFee, networkMaxFee); - } - if (finalMaxFee < finalPriority) { - finalMaxFee = finalPriority; - } - - delete nextTx.gasPrice; - nextTx.maxPriorityFeePerGas = finalPriority; - nextTx.maxFeePerGas = finalMaxFee; - nextTx.type = 2; - return nextTx; - } - - const baseGasPrice = - asBigInt(nextTx.gasPrice) ?? - asBigInt(feeData?.gasPrice) ?? - DEFAULT_GAS_PRICE; - const networkGasPrice = asBigInt(feeData?.gasPrice); - let finalGasPrice = bumpByPercent(baseGasPrice, feeBumpPct); - if (networkGasPrice) { - finalGasPrice = maxBigInt(finalGasPrice, networkGasPrice); - } - nextTx.gasPrice = finalGasPrice; - return nextTx; -} - -/** - * Send a nonce-pinned transaction and wait for on-chain confirmation. - * Handles rebroadcast of raw tx, same-nonce replacement with bumped fees, - * and per-chain gas price caps. - */ -export async function submitNonceQueuedTransaction({ - sendTransaction, - provider, - transaction, - nonce, - signerAddress, - chainId, - log, -}: SubmitNonceQueuedTxParams): Promise { - const config = getTxLifecycleConfig(log); - const maxGasPriceEnvKey = getPerChainMaxGasPriceEnvKey(chainId); - const maxGasPriceWei = resolveMaxGasPriceWeiForChain(chainId, log); - const meta = { signer_address: signerAddress, chain_id: chainId }; - const initialTx: any = { - ...transaction, - nonce, - }; - - await enforceSubmissionGasPriceCap({ - transaction: initialTx, - provider, - maxGasPriceWei, - maxGasPriceEnvKey, - stage: "initial submission", - signerAddress, - chainId, - nonce, - }); - - const firstResponse = await sendTransaction(initialTx); - const responsesByHash = new Map([ - [firstResponse.hash, firstResponse], - ]); - const knownHashes: string[] = [firstResponse.hash]; - let activeTx = initialTx; - let activeResponse = firstResponse; - let activeRawTx = extractRawTransaction(firstResponse); - let replacementCount = 0; - let rebroadcastRawUnavailableLogged = false; - - log.info("Submitted tx", { - event: "nonce.tx.submitted", - ...meta, - nonce, - tx_hash: firstResponse.hash, - }); - - if (!provider || typeof provider.getTransactionReceipt !== "function") { - await firstResponse.wait(); - return firstResponse; - } - const txProvider = provider; - - const startedAt = Date.now(); - let nextRebroadcastAt = - config.rebroadcastIntervalS > 0 - ? startedAt + secondsToMs(config.rebroadcastIntervalS) - : Number.POSITIVE_INFINITY; - let nextReplaceAt = - config.replaceIntervalS > 0 - ? startedAt + secondsToMs(config.replaceIntervalS) - : Number.POSITIVE_INFINITY; - - while (true) { - const receipt = await findMinedReceipt(txProvider, knownHashes); - if (receipt) { - if (receipt.status === 0) { - throw new Error( - `Nonce-queued transaction reverted on-chain: hash=${receipt.hash} nonce=${nonce}`, - ); - } - return responsesByHash.get(receipt.hash) ?? activeResponse; - } - - const now = Date.now(); - if ( - config.txConfirmTimeoutS > 0 && - now - startedAt >= secondsToMs(config.txConfirmTimeoutS) - ) { - throw new Error( - `Timed out waiting for nonce-queued tx confirmation after ${config.txConfirmTimeoutS}s: address=${signerAddress} chain=${chainId} nonce=${nonce} lastHash=${activeResponse.hash}`, - ); - } - - if (now >= nextRebroadcastAt) { - nextRebroadcastAt = now + secondsToMs(config.rebroadcastIntervalS); - - if ( - activeRawTx && - typeof txProvider.broadcastTransaction === "function" - ) { - try { - enforceRebroadcastGasPriceCap({ - rawTransaction: activeRawTx, - maxGasPriceWei, - maxGasPriceEnvKey, - signerAddress, - chainId, - nonce, - }); - const rebroadcastResponse = - await txProvider.broadcastTransaction(activeRawTx); - if (!responsesByHash.has(rebroadcastResponse.hash)) { - responsesByHash.set(rebroadcastResponse.hash, rebroadcastResponse); - knownHashes.push(rebroadcastResponse.hash); - } - log.info("Rebroadcasted raw tx", { - event: "nonce.tx.rebroadcast", - ...meta, - nonce, - tx_hash: rebroadcastResponse.hash, - }); - } catch (err: any) { - if (!isDuplicateBroadcastError(err)) throw err; - log.info("Rebroadcast ignored duplicate", { - event: "nonce.tx.rebroadcast.duplicate", - ...meta, - nonce, - tx_hash: activeResponse.hash, - }); - } - } else if (!rebroadcastRawUnavailableLogged) { - rebroadcastRawUnavailableLogged = true; - log.warn("Rebroadcast skipped: raw transaction payload unavailable", { - ...meta, - nonce, - tx_hash: activeResponse.hash, - }); - } - } - - if ( - now >= nextReplaceAt && - replacementCount < config.maxReplacements && - config.replaceIntervalS > 0 - ) { - nextReplaceAt = now + secondsToMs(config.replaceIntervalS); - activeTx = await buildReplacementTransaction( - activeTx, - txProvider, - config.feeBumpPct, - ); - await enforceSubmissionGasPriceCap({ - transaction: activeTx, - provider: txProvider, - maxGasPriceWei, - maxGasPriceEnvKey, - stage: "replacement", - signerAddress, - chainId, - nonce, - }); - - try { - const replacementResponse = await sendTransaction(activeTx); - replacementCount++; - activeResponse = replacementResponse; - activeRawTx = extractRawTransaction(replacementResponse); - if (!responsesByHash.has(replacementResponse.hash)) { - responsesByHash.set(replacementResponse.hash, replacementResponse); - knownHashes.push(replacementResponse.hash); - } - log.info("Submitted replacement tx", { - event: "nonce.tx.replacement", - ...meta, - nonce, - tx_hash: replacementResponse.hash, - replacement_count: replacementCount, - max_replacements: config.maxReplacements, - }); - } catch (err: any) { - if (!isNonceMismatchError(err) && !isDuplicateBroadcastError(err)) { - throw err; - } - log.warn("Replacement attempt not accepted", { - event: "nonce.tx.replacement.rejected", - ...meta, - nonce, - error_message: err?.message ?? String(err), - }); - } - } - - await sleep(secondsToMs(config.receiptPollS)); - } -} - -export function isNonceMismatchError(err: any): boolean { - const msg = (err?.message ?? "").toLowerCase(); - return ( - msg.includes("nonce too low") || - msg.includes("nonce has already been used") || - msg.includes("replacement transaction underpriced") - ); -} - -export async function recoverNonceFromChain({ - pool, - signerAddress, - chainId, - getOnChainNonce, - client, - log, -}: { - pool: Pool; - signerAddress: string; - chainId: number; - getOnChainNonce: () => Promise; - client?: PoolClient; - log: Logger; -}) { - const onChainNonce = await getOnChainNonce(); - const recoveryClient = client ?? (await pool.connect()); - const usingExternalClient = !!client; - - try { - await recoveryClient.query( - "UPDATE nonce_queue SET nonce = $1, updated_at = NOW() WHERE signer_address = $2 AND chain_id = $3", - [onChainNonce, signerAddress, chainId], - ); - log.info("Recovered nonce from chain", { - event: "nonce.recovered", - signer_address: signerAddress, - chain_id: chainId, - nonce: onChainNonce, - }); - } finally { - if (!usingExternalClient) recoveryClient.release(); - } -} diff --git a/src/js/utils/signers.ts b/src/js/utils/signers.ts index 17e2341d..b14417ed 100644 --- a/src/js/utils/signers.ts +++ b/src/js/utils/signers.ts @@ -1,8 +1,8 @@ -import { JsonRpcProvider, Signer, Wallet } from "ethers"; -import { Defender } from "@openzeppelin/defender-sdk"; +import { JsonRpcProvider, Signer } from "ethers"; import * as hhHelpers from "@nomicfoundation/hardhat-network-helpers"; +import { resolveEthersV6Signer } from "@automaton/client"; -import { ethereumAddress, privateKey } from "./regex"; +import { ethereumAddress } from "./regex"; // eslint-disable-next-line @typescript-eslint/no-var-requires const log = require("./logger")("utils:signers"); @@ -16,85 +16,20 @@ declare const hre: { }; declare const ethers: { provider: JsonRpcProvider }; -// --------------------------------------------------------------------------- -// KMS signer -// --------------------------------------------------------------------------- - -const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; -const AWS_KMS_REGION = "us-east-1"; - -function hasAwsKmsCredentials(): boolean { - return !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY; -} - -async function getKmsSigner(): Promise { - // Dynamic require so we don't pull in the AWS SDK when it's not needed. - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { DirectKmsTransactionSigner } = require("@lastdotnet/purrikey"); - const relayerId = process.env.KMS_RELAYER_ID || DEFAULT_KMS_RELAYER_ID; - const signer = new DirectKmsTransactionSigner( - relayerId, - hre.ethers.provider, - AWS_KMS_REGION, - ); - log( - `Using KMS signer ${await signer.getAddress()} from relayer-id "${relayerId}"`, - ); - return signer as Signer; -} - -// --------------------------------------------------------------------------- -// Defender relayer signer -// --------------------------------------------------------------------------- - -type DefenderSpeed = "safeLow" | "average" | "fast" | "fastest"; - -async function getDefenderSigner(): Promise { - const speed = (process.env.SPEED || "fastest") as string; - const validSpeeds: DefenderSpeed[] = [ - "safeLow", - "average", - "fast", - "fastest", - ]; - if (!validSpeeds.includes(speed as DefenderSpeed)) { - console.error( - `Defender Relay Speed param must be either 'safeLow', 'average', 'fast' or 'fastest'. Not "${speed}"`, - ); - process.exit(2); - } - const credentials = { - relayerApiKey: process.env.DEFENDER_RELAYER_KEY, - relayerApiSecret: process.env.DEFENDER_RELAYER_SECRET, - }; - const client = new Defender(credentials); - const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); - - const signer = await client.relaySigner.getSigner(provider, { - speed: speed as DefenderSpeed, - ethersVersion: "v6", - }); - log( - `Using Defender Relayer account ${await signer.getAddress()} from env vars DEFENDER_RELAYER_KEY and DEFENDER_RELAYER_SECRET`, - ); - return signer as unknown as Signer; -} - -// --------------------------------------------------------------------------- -// Public API -// --------------------------------------------------------------------------- - /** - * Signer factory — resolves a signer based on available credentials. + * Signer factory. * * Resolution order: - * 1. Explicit `address` parameter (returns provider signer for that address) - * 2. `DEPLOYER_PRIVATE_KEY` env var (Wallet from private key) - * 3. AWS KMS credentials (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`) - * 4. `IMPERSONATE` env var (impersonate + fund on a fork) - * 5. Defender Relayer (`DEFENDER_RELAYER_KEY` + `DEFENDER_RELAYER_SECRET`) - * 6. First hardhat signer (from the configured network) - * 7. Random wallet (last resort) + * 1. Explicit `address` parameter — return the provider signer for that + * address (hardhat-native; used by fork tests). + * 2. `IMPERSONATE` env var — impersonate + fund that address on a fork. + * 3. Otherwise delegate to `@automaton/client`'s `resolveEthersV6Signer`, + * which auto-detects strategy from env: + * - AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY present + * → KMS signer (KMS_RELAYER_ID, default Origin production key) + * - else → private key (DEPLOYER_PRIVATE_KEY / DEPLOYER_PK / + * GOVERNOR_PK / ANVIL_PRIVATE_KEY, in that order) + * - else → anvil account #0 (local dev) */ export async function getSigner(address?: string): Promise { if (address) { @@ -104,20 +39,6 @@ export async function getSigner(address?: string): Promise { return await hre.ethers.provider.getSigner(address); } - const pk = process.env.DEPLOYER_PRIVATE_KEY; - if (pk) { - if (!pk.match(privateKey)) { - throw new Error("Invalid format of private key"); - } - const wallet = new Wallet(pk, hre.ethers.provider); - log(`Using signer ${await wallet.getAddress()} from private key`); - return wallet; - } - - if (hasAwsKmsCredentials()) { - return await getKmsSigner(); - } - if (process.env.IMPERSONATE) { const impersonateAddr = process.env.IMPERSONATE; if (!impersonateAddr.match(ethereumAddress)) { @@ -131,20 +52,10 @@ export async function getSigner(address?: string): Promise { return await impersonateAndFund(impersonateAddr); } - // Defender Relayer - if (process.env.DEFENDER_RELAYER_KEY && process.env.DEFENDER_RELAYER_SECRET) { - return await getDefenderSigner(); - } - - const signers = await hre.ethers.getSigners(); - if (signers[0]) { - const signer = signers[0]; - log(`Using the first hardhat signer ${await signer.getAddress()}`); - return signer; - } - - const signer = Wallet.createRandom().connect(hre.ethers.provider); - log(`Using random signer ${await signer.getAddress()}`); + const signer = await resolveEthersV6Signer(hre.ethers.provider); + log( + `Using signer ${await signer.getAddress()} (resolved by @automaton/client)`, + ); return signer; } From f9f295cddf4950ed5c47f3ff8d2b35b22a3e4607 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 21 Apr 2026 20:07:53 +0200 Subject: [PATCH 21/41] Restore local KMS/signer path; drop winston+loki for simple console logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Puts the sibling signer code back to its proven purrikey-based chain (DEPLOYER_PRIVATE_KEY → KMS via @lastdotnet/purrikey → IMPERSONATE → Defender → hardhat first signer). The library's resolveEthersV6Signer is no longer imported here — siblings don't need ergonomic signer construction; they already had a battle-tested one. The library is reserved for primitives (nonce queue, runtime) rather than signer ergonomics, matching the layering it was originally designed for. What the library DOES still provide, via lib/action.ts: - wrapSignerWithNonceQueueV6(signer, { db, log }) wraps whatever signer getSigner() returns, routing sendTransaction through the Postgres row-lock + lifecycle when DATABASE_URL is set. Dev runs without a DB get an unwrapped signer. - createDb / createPool for the shared handle. Logging: winston + winston-loki are gone. The action wrapper builds a tiny Logger ({ info, warn, error }) backed by console with an `[action-name]` prefix. Action bodies calling log.info(...) / log.error(...) keep working unchanged. The utils/logger.js (debug-based) used by domain helpers is untouched. Removed files: - src/js/tasks/lib/logger.ts (winston + loki transport). - src/js/tasks/lib/action.test.ts + action.snapshot.jsonl (tested the winston structured-logging path we're dropping). - winston + winston-loki devDeps from package.json. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 4 +- src/js/tasks/lib/action.snapshot.jsonl | 8 -- src/js/tasks/lib/action.test.ts | 154 ------------------------- src/js/tasks/lib/action.ts | 49 +++----- src/js/tasks/lib/logger.ts | 66 ----------- src/js/utils/signers.ts | 125 +++++++++++++++++--- 6 files changed, 127 insertions(+), 279 deletions(-) delete mode 100644 src/js/tasks/lib/action.snapshot.jsonl delete mode 100644 src/js/tasks/lib/action.test.ts delete mode 100644 src/js/tasks/lib/logger.ts diff --git a/package.json b/package.json index 157a6687..50512946 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,7 @@ "rollup": "^4.9.1", "rollup-plugin-visualizer": "^5.12.0", "ts-node": "^10.9.2", - "typescript": "^5.7.0", - "winston": "^3.17.0", - "winston-loki": "^6.1.3" + "typescript": "^5.7.0" }, "dependencies": { "@automaton/client": "github:OriginProtocol/automaton#path:packages/client", diff --git a/src/js/tasks/lib/action.snapshot.jsonl b/src/js/tasks/lib/action.snapshot.jsonl deleted file mode 100644 index 7b2a47d3..00000000 --- a/src/js/tasks/lib/action.snapshot.jsonl +++ /dev/null @@ -1,8 +0,0 @@ -{"action":"test_harvest","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} -{"action":"test_harvest","run_id":"","message":"Harvesting rewards","level":"info"} -{"action":"test_harvest","run_id":"","message":"Swapped 100 CRV -> 0.5 ETH","level":"info"} -{"action":"test_harvest","run_id":"","event":"action.success","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","level":"info","message":"Completed in 0.0s"} -{"action":"test_harvest","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} -{"action":"test_harvest","run_id":"","event":"action.error","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","error_name":"Error","error_message":"insufficient funds for gas","error_stack":"Error: insufficient funds for gas","level":"error","message":"Error: insufficient funds for gas"} -{"action":"sonic_only_action","run_id":"","event":"action.start","source":"task","chain_id":1,"network":"mainnet","level":"info","message":"Running on mainnet (1)"} -{"action":"sonic_only_action","run_id":"","event":"action.error","source":"task","chain_id":1,"network":"mainnet","duration_ms":"","error_name":"Error","error_message":"sonic_only_action only supports sonic (146), not mainnet (1)","error_stack":"Error: sonic_only_action only supports sonic (146), not mainnet (1)","level":"error","message":"Error: sonic_only_action only supports sonic (146), not mainnet (1)"} diff --git a/src/js/tasks/lib/action.test.ts b/src/js/tasks/lib/action.test.ts deleted file mode 100644 index d45a2c1d..00000000 --- a/src/js/tasks/lib/action.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -// Snapshot test for the action framework's structured logging. -// -// Calls createActionHandler() directly with a mock signer, capturing winston -// records via a capture transport. Tests the real code path in action.ts. -// -// Run with: npx ts-node src/js/tasks/lib/action.test.ts -// Update snapshot: npx ts-node src/js/tasks/lib/action.test.ts --update - -import fs from "node:fs"; -import path from "node:path"; -import { format, transports } from "winston"; -import { createActionHandler } from "./action"; -import type { ActionContext } from "./action"; -import logger from "./logger"; - -const SNAPSHOT_PATH = path.join(__dirname, "action.snapshot.jsonl"); -const updateSnapshot = process.argv.includes("--update"); - -// --- Winston capture --------------------------------------------------------- - -const captured: Record[] = []; -const captureFormat = format((info) => { - captured.push({ ...info }); - return false; -}); -logger.add(new transports.Console({ format: captureFormat() })); - -function stabilize(record: Record): Record { - const out: Record = {}; - for (const [k, v] of Object.entries(record)) { - if (k === "timestamp") continue; - if (k === "duration_ms") { - out[k] = ""; - continue; - } - if (k === "error_stack" && typeof v === "string") { - out[k] = v.split("\n")[0]; - continue; - } - if (k === "run_id") { - out[k] = ""; - continue; - } - out[k] = v; - } - return out; -} - -// --- Mock signer ------------------------------------------------------------- - -function mockSigner(chainId: number) { - return async () => - ({ - provider: { - getNetwork: async () => ({ chainId: BigInt(chainId) }), - }, - }) as any; -} - -// --- Scenarios --------------------------------------------------------------- - -async function runSuccessScenario() { - const handler = createActionHandler( - { - name: "test_harvest", - description: "test", - run: async (ctx: ActionContext) => { - ctx.log.info("Harvesting rewards"); - ctx.log.info("Swapped 100 CRV -> 0.5 ETH"); - }, - }, - { getSigner: mockSigner(1) }, - ); - await handler({}); -} - -async function runErrorScenario() { - const handler = createActionHandler( - { - name: "test_harvest", - description: "test", - run: async () => { - throw new Error("insufficient funds for gas"); - }, - }, - { getSigner: mockSigner(1) }, - ); - try { - await handler({}); - } catch { - // expected - } -} - -async function runChainValidationScenario() { - const handler = createActionHandler( - { - name: "sonic_only_action", - description: "test", - chains: [146], - run: async () => {}, - }, - { getSigner: mockSigner(1) }, - ); - try { - await handler({}); - } catch { - // expected - } -} - -// --- Main -------------------------------------------------------------------- - -async function main() { - await runSuccessScenario(); - await runErrorScenario(); - await runChainValidationScenario(); - - const stable = captured.map(stabilize); - const actualJsonl = stable.map((r) => JSON.stringify(r)).join("\n") + "\n"; - - if (updateSnapshot) { - fs.writeFileSync(SNAPSHOT_PATH, actualJsonl, "utf8"); - console.log(`Snapshot updated: ${SNAPSHOT_PATH}`); - console.log(actualJsonl); - return; - } - - if (!fs.existsSync(SNAPSHOT_PATH)) { - console.error( - "No snapshot found. Run with --update to create it:\n" + - " npx ts-node src/js/tasks/lib/action.test.ts --update", - ); - process.exit(1); - } - - const expected = fs.readFileSync(SNAPSHOT_PATH, "utf8"); - if (actualJsonl === expected) { - console.log("OK — action log output matches snapshot"); - console.log(` ${stable.length} records across 3 scenarios`); - } else { - console.error("FAIL — action log output does not match snapshot\n"); - console.error("Expected:"); - console.error(expected); - console.error("Actual:"); - console.error(actualJsonl); - process.exit(1); - } -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 8bf40b20..1b233719 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -1,8 +1,6 @@ -import { randomUUID } from "node:crypto"; import type { Signer } from "ethers"; import { subtask, task } from "hardhat/config"; import type { ConfigurableTaskDefinition } from "hardhat/types"; -import type { Logger } from "winston"; import { createDb, createPool, @@ -11,7 +9,12 @@ import { } from "@automaton/client"; import { getSigner as defaultGetSigner } from "../../utils/signers"; -import logger, { flushLogger } from "./logger"; + +export interface Logger { + info(msg: unknown, ...rest: unknown[]): void; + warn(msg: unknown, ...rest: unknown[]): void; + error(msg: unknown, ...rest: unknown[]): void; +} let dbInstance: Db | null = null; function getNonceDb(): Db | null { @@ -49,6 +52,15 @@ const CHAIN_NAMES: Record = { 17000: "holesky", }; +function makeLog(name: string): Logger { + const prefix = `[${name}]`; + return { + info: (msg, ...rest) => console.log(prefix, msg, ...rest), + warn: (msg, ...rest) => console.warn(prefix, msg, ...rest), + error: (msg, ...rest) => console.error(prefix, msg, ...rest), + }; +} + export function createActionHandler( config: ActionConfig, deps: ActionDeps = {}, @@ -57,8 +69,7 @@ export function createActionHandler( const getSigner = deps.getSigner ?? defaultGetSigner; return async (taskArgs: Record) => { - const runId = randomUUID(); - const log = logger.child({ action: name, run_id: runId }); + const log = makeLog(name); const startTime = Date.now(); let chainId: number | undefined; let networkName: string | undefined; @@ -73,12 +84,7 @@ export function createActionHandler( : rawSigner; networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; - log.info(`Running on ${networkName} (${chainId})`, { - event: "action.start", - source: "task", - chain_id: chainId, - network: networkName, - }); + log.info(`Running on ${networkName} (${chainId})`); if (chains && !chains.includes(chainId)) { const valid = chains @@ -92,28 +98,11 @@ export function createActionHandler( await run({ signer, chainId, networkName, log, args: taskArgs }); log.info( `Completed in ${((Date.now() - startTime) / 1000).toFixed(1)}s`, - { - event: "action.success", - source: "task", - chain_id: chainId, - network: networkName, - duration_ms: Date.now() - startTime, - }, ); } catch (err: any) { - log.error(`${err?.name ?? "Error"}: ${err?.message ?? String(err)}`, { - event: "action.error", - source: "task", - chain_id: chainId, - network: networkName, - duration_ms: Date.now() - startTime, - error_name: err?.name ?? "Error", - error_message: err?.message ?? String(err), - error_stack: err?.stack, - }); + log.error(`${err?.name ?? "Error"}: ${err?.message ?? String(err)}`); + if (err?.stack) log.error(err.stack); throw err; - } finally { - await flushLogger(); } }; } diff --git a/src/js/tasks/lib/logger.ts b/src/js/tasks/lib/logger.ts deleted file mode 100644 index 2b2b1c71..00000000 --- a/src/js/tasks/lib/logger.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { createLogger, format, transports } from "winston"; -import LokiTransport from "winston-loki"; - -const lokiUrl = process.env.LOKI_URL; -const lokiUser = process.env.LOKI_USER; -const lokiApiKey = process.env.LOKI_API_KEY; - -const consoleFormat = format.combine( - format.timestamp(), - format.errors({ stack: true }), - format.printf(({ timestamp, level, message, action, ...rest }) => { - const prefix = action ? `[${action}] ` : ""; - const extra = Object.keys(rest).length ? ` ${JSON.stringify(rest)}` : ""; - return `${timestamp} ${level}: ${prefix}${message}${extra}`; - }), -); - -const logTransports: InstanceType< - typeof transports.Console | typeof LokiTransport ->[] = [new transports.Console({ format: consoleFormat })]; - -let lokiTransport: LokiTransport | undefined; -if (lokiUrl) { - lokiTransport = new LokiTransport({ - host: lokiUrl, - basicAuth: lokiUrl && lokiApiKey ? `${lokiUser}:${lokiApiKey}` : undefined, - labels: { app: "arm-oeth" }, - json: true, - format: format.combine( - // Promote select low-cardinality fields from metadata to Loki labels. - // Keep high-cardinality fields (run_id, error_*, duration_ms, chain_id) - // as JSON fields — they're still queryable via `| json`. - format((info) => { - const LABEL_FIELDS = ["action", "event", "source"] as const; - const labels: Record = {}; - for (const k of LABEL_FIELDS) { - if (info[k]) labels[k] = String(info[k]); - } - if (Object.keys(labels).length) { - info.labels = { ...(info.labels || {}), ...labels }; - } - return info; - })(), - format.json(), - ), - replaceTimestamp: true, - batching: true, - interval: 5, - onConnectionError: (err: unknown) => { - console.error("Loki connection error:", err); - }, - }); - logTransports.push(lokiTransport); -} - -const logger = createLogger({ - level: process.env.LOG_LEVEL ?? "info", - format: format.combine(format.timestamp(), format.errors({ stack: true })), - transports: logTransports, -}); - -export async function flushLogger(): Promise { - await lokiTransport?.flush(); -} - -export default logger; diff --git a/src/js/utils/signers.ts b/src/js/utils/signers.ts index b14417ed..17e2341d 100644 --- a/src/js/utils/signers.ts +++ b/src/js/utils/signers.ts @@ -1,8 +1,8 @@ -import { JsonRpcProvider, Signer } from "ethers"; +import { JsonRpcProvider, Signer, Wallet } from "ethers"; +import { Defender } from "@openzeppelin/defender-sdk"; import * as hhHelpers from "@nomicfoundation/hardhat-network-helpers"; -import { resolveEthersV6Signer } from "@automaton/client"; -import { ethereumAddress } from "./regex"; +import { ethereumAddress, privateKey } from "./regex"; // eslint-disable-next-line @typescript-eslint/no-var-requires const log = require("./logger")("utils:signers"); @@ -16,20 +16,85 @@ declare const hre: { }; declare const ethers: { provider: JsonRpcProvider }; +// --------------------------------------------------------------------------- +// KMS signer +// --------------------------------------------------------------------------- + +const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; +const AWS_KMS_REGION = "us-east-1"; + +function hasAwsKmsCredentials(): boolean { + return !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY; +} + +async function getKmsSigner(): Promise { + // Dynamic require so we don't pull in the AWS SDK when it's not needed. + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { DirectKmsTransactionSigner } = require("@lastdotnet/purrikey"); + const relayerId = process.env.KMS_RELAYER_ID || DEFAULT_KMS_RELAYER_ID; + const signer = new DirectKmsTransactionSigner( + relayerId, + hre.ethers.provider, + AWS_KMS_REGION, + ); + log( + `Using KMS signer ${await signer.getAddress()} from relayer-id "${relayerId}"`, + ); + return signer as Signer; +} + +// --------------------------------------------------------------------------- +// Defender relayer signer +// --------------------------------------------------------------------------- + +type DefenderSpeed = "safeLow" | "average" | "fast" | "fastest"; + +async function getDefenderSigner(): Promise { + const speed = (process.env.SPEED || "fastest") as string; + const validSpeeds: DefenderSpeed[] = [ + "safeLow", + "average", + "fast", + "fastest", + ]; + if (!validSpeeds.includes(speed as DefenderSpeed)) { + console.error( + `Defender Relay Speed param must be either 'safeLow', 'average', 'fast' or 'fastest'. Not "${speed}"`, + ); + process.exit(2); + } + const credentials = { + relayerApiKey: process.env.DEFENDER_RELAYER_KEY, + relayerApiSecret: process.env.DEFENDER_RELAYER_SECRET, + }; + const client = new Defender(credentials); + const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); + + const signer = await client.relaySigner.getSigner(provider, { + speed: speed as DefenderSpeed, + ethersVersion: "v6", + }); + log( + `Using Defender Relayer account ${await signer.getAddress()} from env vars DEFENDER_RELAYER_KEY and DEFENDER_RELAYER_SECRET`, + ); + return signer as unknown as Signer; +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + /** - * Signer factory. + * Signer factory — resolves a signer based on available credentials. * * Resolution order: - * 1. Explicit `address` parameter — return the provider signer for that - * address (hardhat-native; used by fork tests). - * 2. `IMPERSONATE` env var — impersonate + fund that address on a fork. - * 3. Otherwise delegate to `@automaton/client`'s `resolveEthersV6Signer`, - * which auto-detects strategy from env: - * - AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY present - * → KMS signer (KMS_RELAYER_ID, default Origin production key) - * - else → private key (DEPLOYER_PRIVATE_KEY / DEPLOYER_PK / - * GOVERNOR_PK / ANVIL_PRIVATE_KEY, in that order) - * - else → anvil account #0 (local dev) + * 1. Explicit `address` parameter (returns provider signer for that address) + * 2. `DEPLOYER_PRIVATE_KEY` env var (Wallet from private key) + * 3. AWS KMS credentials (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`) + * 4. `IMPERSONATE` env var (impersonate + fund on a fork) + * 5. Defender Relayer (`DEFENDER_RELAYER_KEY` + `DEFENDER_RELAYER_SECRET`) + * 6. First hardhat signer (from the configured network) + * 7. Random wallet (last resort) */ export async function getSigner(address?: string): Promise { if (address) { @@ -39,6 +104,20 @@ export async function getSigner(address?: string): Promise { return await hre.ethers.provider.getSigner(address); } + const pk = process.env.DEPLOYER_PRIVATE_KEY; + if (pk) { + if (!pk.match(privateKey)) { + throw new Error("Invalid format of private key"); + } + const wallet = new Wallet(pk, hre.ethers.provider); + log(`Using signer ${await wallet.getAddress()} from private key`); + return wallet; + } + + if (hasAwsKmsCredentials()) { + return await getKmsSigner(); + } + if (process.env.IMPERSONATE) { const impersonateAddr = process.env.IMPERSONATE; if (!impersonateAddr.match(ethereumAddress)) { @@ -52,10 +131,20 @@ export async function getSigner(address?: string): Promise { return await impersonateAndFund(impersonateAddr); } - const signer = await resolveEthersV6Signer(hre.ethers.provider); - log( - `Using signer ${await signer.getAddress()} (resolved by @automaton/client)`, - ); + // Defender Relayer + if (process.env.DEFENDER_RELAYER_KEY && process.env.DEFENDER_RELAYER_SECRET) { + return await getDefenderSigner(); + } + + const signers = await hre.ethers.getSigners(); + if (signers[0]) { + const signer = signers[0]; + log(`Using the first hardhat signer ${await signer.getAddress()}`); + return signer; + } + + const signer = Wallet.createRandom().connect(hre.ethers.provider); + log(`Using random signer ${await signer.getAddress()}`); return signer; } From 4a7d4abb5566db4d2004073f93943247b0d73e29 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 21 Apr 2026 20:28:26 +0200 Subject: [PATCH 22/41] docs: document Automaton runner + DATABASE_URL dev gate Adds a concise "Automated Actions (Automaton)" section to the README covering runner.ts, the seed SQL, and lib/action.ts's library integration. Calls out that local `pnpm hardhat --network ` runs open no DB connection because the nonce-queue wrap is gated on DATABASE_URL. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index e44cc5e6..39985b09 100644 --- a/README.md +++ b/README.md @@ -293,6 +293,29 @@ yarn hardhat tenderlySync --network sonic yarn hardhat tenderlyUpload --network sonic --name ORIGIN_ARM ``` +## Automated Actions (Automaton) + +The `src/js/tasks/actions/*.ts` files are hardhat tasks that handle operational jobs (allocations, fee collection, withdrawal requests, etc.). In production they're driven by a container that imports [`@automaton/client`](https://github.com/OriginProtocol/automaton): + +- **`runner.ts`** at repo root calls `runContainer({ product: "arm-oeth", workdir: "/app" })`. The library reads enabled schedules from the shared automaton Postgres, fires them via croner, and spawns each schedule's command as `pnpm hardhat --network `. +- **`migrations/seed_schedules.sql`** is a one-time seed of the `schedules` table mirroring the old `cron/cron-jobs.ts`. +- **`src/js/tasks/lib/action.ts`** wraps the hardhat signer with `wrapSignerWithNonceQueueV6` from the library when `DATABASE_URL` is set. That routes `signer.sendTransaction` through Postgres row-locked nonce coordination. + +### Running actions locally + +Every action remains directly executable as a hardhat task on your dev machine: + +```bash +pnpm hardhat allocateLido --network mainnet +pnpm hardhat healthcheck +``` + +**No Postgres required.** The library's nonce queue is gated by `process.env.DATABASE_URL`: if unset, the action uses a raw ethers signer with the provider's default nonce handling — exactly the behavior you had before Automaton existed. The gate is a single check at the top of the handler; no DB connection is opened. + +If you opt in by setting `DATABASE_URL` (e.g., via `docker compose up`), the nonce queue engages and will try to connect to whatever that URL points at. `unset DATABASE_URL` to go back to the unwrapped path. + +Signer selection (`DEPLOYER_PRIVATE_KEY` → KMS via `KMS_RELAYER_ID` → `IMPERSONATE` → Defender → hardhat first signer) lives entirely in `src/js/utils/signers.ts` and is unchanged. + ## Open Zeppelin Defender [Open Zeppelin Defender v2](https://docs.openzeppelin.com/defender/v2/) is used to manage the Operations account and automate AMM operational jobs like managing liquidity. From d81ac825e3d97e119e226253f4d04d62989db57d Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 01:13:58 +0200 Subject: [PATCH 23/41] chore: regenerate pnpm-lock after automaton migration Drop unused pg + @types/pg deps (vendored transitively by @automaton/client) and remove stale yarn.lock. Fixes Railway build failing on `pnpm install --frozen-lockfile`. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 4 +- pnpm-lock.yaml | 1075 +++++----- yarn.lock | 5279 ------------------------------------------------ 3 files changed, 562 insertions(+), 5796 deletions(-) delete mode 100644 yarn.lock diff --git a/package.json b/package.json index 50512946..6009e913 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,6 @@ "typescript": "^5.7.0" }, "dependencies": { - "@automaton/client": "github:OriginProtocol/automaton#path:packages/client", - "@types/pg": "^8.20.0", - "pg": "^8.20.0" + "@automaton/client": "github:OriginProtocol/automaton#path:packages/client" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 830350e1..5d0c822f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + '@automaton/client': + specifier: github:OriginProtocol/automaton#path:packages/client + version: https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -86,12 +90,6 @@ importers: typescript: specifier: ^5.7.0 version: 5.9.3 - winston: - specifier: ^3.17.0 - version: 3.19.0 - winston-loki: - specifier: ^6.1.3 - version: 6.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) packages: @@ -119,6 +117,10 @@ packages: subscriptions-transport-ws: optional: true + '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client': + resolution: {path: packages/client, tarball: https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12} + version: 0.0.1 + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -249,26 +251,10 @@ packages: resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.8': - resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} - - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -328,9 +314,18 @@ packages: '@ethersproject/constants@5.8.0': resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + '@ethersproject/hash@5.8.0': resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + '@ethersproject/keccak256@5.8.0': resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} @@ -340,6 +335,9 @@ packages: '@ethersproject/networks@5.8.0': resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + '@ethersproject/properties@5.8.0': resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} @@ -358,15 +356,27 @@ packages: '@ethersproject/signing-key@5.8.0': resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + '@ethersproject/strings@5.8.0': resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} '@ethersproject/transactions@5.8.0': resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + '@ethersproject/web@5.8.0': resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -376,6 +386,12 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -410,118 +426,9 @@ packages: peerDependencies: ethers: ^6.13.0 - '@napi-rs/snappy-android-arm-eabi@7.3.3': - resolution: {integrity: sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/snappy-android-arm64@7.3.3': - resolution: {integrity: sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/snappy-darwin-arm64@7.3.3': - resolution: {integrity: sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/snappy-darwin-x64@7.3.3': - resolution: {integrity: sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/snappy-freebsd-x64@7.3.3': - resolution: {integrity: sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': - resolution: {integrity: sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/snappy-linux-arm64-gnu@7.3.3': - resolution: {integrity: sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/snappy-linux-arm64-musl@7.3.3': - resolution: {integrity: sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': - resolution: {integrity: sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA==} - engines: {node: '>= 10'} - cpu: [ppc64] - os: [linux] - - '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': - resolution: {integrity: sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@napi-rs/snappy-linux-s390x-gnu@7.3.3': - resolution: {integrity: sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg==} - engines: {node: '>= 10'} - cpu: [s390x] - os: [linux] - - '@napi-rs/snappy-linux-x64-gnu@7.3.3': - resolution: {integrity: sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/snappy-linux-x64-musl@7.3.3': - resolution: {integrity: sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/snappy-openharmony-arm64@7.3.3': - resolution: {integrity: sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [openharmony] - - '@napi-rs/snappy-wasm32-wasi@7.3.3': - resolution: {integrity: sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@napi-rs/snappy-win32-arm64-msvc@7.3.3': - resolution: {integrity: sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/snappy-win32-ia32-msvc@7.3.3': - resolution: {integrity: sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@napi-rs/snappy-win32-x64-msvc@7.3.3': - resolution: {integrity: sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} @@ -533,6 +440,10 @@ packages: resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -548,6 +459,10 @@ packages: resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -693,36 +608,6 @@ packages: '@openzeppelin/defender-sdk@2.7.0': resolution: {integrity: sha512-A7Lvte6+j6A0EQ/nYXtremP37JhW/x58C9AtD//4LS9o6OsSJuXE4R58L5E48cTxOT/I3xelYmgGh0KGQTao4A==} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@rollup/plugin-commonjs@25.0.8': resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} engines: {node: '>=14.0.0'} @@ -896,12 +781,18 @@ packages: '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -1122,9 +1013,6 @@ packages: resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} - '@so-ric/colorspace@1.1.6': - resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} @@ -1140,9 +1028,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/bn.js@5.2.0': resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} @@ -1164,9 +1049,6 @@ packages: '@types/secp256k1@4.0.7': resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/ws@8.5.3': resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} @@ -1198,6 +1080,17 @@ packages: zod: optional: true + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1216,6 +1109,9 @@ packages: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} @@ -1265,16 +1161,9 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} - async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1350,11 +1239,6 @@ packages: bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - btoa@1.2.1: - resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} - engines: {node: '>= 0.4.0'} - hasBin: true - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1437,25 +1321,9 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-convert@3.1.3: - resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} - engines: {node: '>=14.6'} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.1.0: - resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} - engines: {node: '>=12.20'} - - color-string@2.1.4: - resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} - engines: {node: '>=18'} - - color@5.0.3: - resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} - engines: {node: '>=18'} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1494,6 +1362,10 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + cross-fetch@4.1.0: resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} @@ -1560,6 +1432,98 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + drizzle-orm@0.36.4: + resolution: {integrity: sha512-1OZY3PXD7BR00Gl61UUOFihslDldfH4NFRH2MbP54Yxi0G/PKn4HfO65JYZ7c16DeP3SpM3Aw+VXVG9j6CRSXA==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1570,9 +1534,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1655,10 +1616,16 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + ethers@6.13.2: resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} engines: {node: '>=14.0.0'} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -1696,9 +1663,6 @@ packages: picomatch: optional: true - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1722,9 +1686,6 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -1882,6 +1843,10 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.12.14: + resolution: {integrity: sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==} + engines: {node: '>=16.9.0'} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -1988,10 +1953,6 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -2021,6 +1982,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + jackspeak@4.2.3: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} @@ -2067,9 +2033,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2095,13 +2058,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2215,9 +2171,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -2233,6 +2186,14 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + ox@0.14.17: + resolution: {integrity: sha512-jOzNb2Wlfzsr8z/GoCtd1bf6OSRuWuysvbhnHGD+7fV1WRbcBR6B0RYoe3xWnUedF7zp4l5APmS7CzAhUok/lA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2285,6 +2246,40 @@ packages: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} + pg-cloudflare@1.3.0: + resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} + + pg-connection-string@2.12.0: + resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.13.0: + resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.13.0: + resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.20.0: + resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2300,6 +2295,22 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2315,10 +2326,6 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} @@ -2434,10 +2441,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2486,10 +2489,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - snappy@7.3.3: - resolution: {integrity: sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ==} - engines: {node: '>= 10'} - solc@0.8.26: resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} engines: {node: '>=10.0.0'} @@ -2506,8 +2505,9 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} stacktrace-parser@0.1.11: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} @@ -2554,9 +2554,6 @@ packages: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2583,10 +2580,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - ts-invariant@0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} @@ -2671,9 +2664,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-polyfill@1.1.14: - resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2687,6 +2677,14 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + viem@2.48.3: + resolution: {integrity: sha512-KFuwd5GN5bXiqOrv8amWiim2kR+tS/NveG/MtURSRS7PsuS9RFKUaCNlg+3nFx6bF/2pcOQVAVwUX4dkQ9/JqA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + web3-core@4.7.1: resolution: {integrity: sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==} engines: {node: '>=14', npm: '>=6.12.0'} @@ -2782,17 +2780,6 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} - winston-loki@6.1.4: - resolution: {integrity: sha512-/j/Zf7TGLjgSBck29BkPnpJlEnGQr5xqlx8A0N6LZnXYYYvyK7lFk6FPpWiD+VMO8xjaxOu1KNF9SzWaRDsigA==} - - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - - winston@3.19.0: - resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} - engines: {node: '>= 12.0.0'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2843,6 +2830,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} @@ -2855,6 +2854,10 @@ packages: utf-8-validate: optional: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2921,6 +2924,51 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client(typescript@5.9.3)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.14) + croner: 9.1.0 + drizzle-orm: 0.36.4(pg@8.20.0) + ethers-v5: ethers@5.8.0 + ethers-v6: ethers@6.13.2 + hono: 4.12.14 + pg: 8.20.0 + viem: 2.48.3(typescript@5.9.3)(zod@3.25.76) + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - react + - sql.js + - sqlite3 + - typescript + - utf-8-validate + - zod + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -3318,34 +3366,10 @@ snapshots: '@aws/lambda-invoke-store@0.2.4': {} - '@colors/colors@1.6.0': {} - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.8': - dependencies: - '@so-ric/colorspace': 1.1.6 - enabled: 2.0.0 - kuler: 2.0.0 - - '@emnapi/core@1.9.2': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -3439,6 +3463,19 @@ snapshots: dependencies: '@ethersproject/bignumber': 5.8.0 + '@ethersproject/contracts@5.8.0': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/hash@5.8.0': dependencies: '@ethersproject/abstract-signer': 5.8.0 @@ -3451,6 +3488,37 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 + '@ethersproject/hdnode@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/json-wallets@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + '@ethersproject/keccak256@5.8.0': dependencies: '@ethersproject/bytes': 5.8.0 @@ -3462,6 +3530,11 @@ snapshots: dependencies: '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/properties@5.8.0': dependencies: '@ethersproject/logger': 5.8.0 @@ -3517,6 +3590,15 @@ snapshots: elliptic: 6.6.1 hash.js: 1.1.7 + '@ethersproject/solidity@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/strings@5.8.0': dependencies: '@ethersproject/bytes': 5.8.0 @@ -3535,6 +3617,30 @@ snapshots: '@ethersproject/rlp': 5.8.0 '@ethersproject/signing-key': 5.8.0 + '@ethersproject/units@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/wallet@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + '@ethersproject/web@5.8.0': dependencies: '@ethersproject/base64': 5.8.0 @@ -3543,12 +3649,24 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 + '@ethersproject/wordlists@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@fastify/busboy@2.1.1': {} '@graphql-typed-document-node/core@3.2.0(graphql@16.13.2)': dependencies: graphql: 16.13.2 + '@hono/node-server@1.19.14(hono@4.12.14)': + dependencies: + hono: 4.12.14 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -3580,71 +3698,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@napi-rs/snappy-android-arm-eabi@7.3.3': - optional: true - - '@napi-rs/snappy-android-arm64@7.3.3': - optional: true - - '@napi-rs/snappy-darwin-arm64@7.3.3': - optional: true - - '@napi-rs/snappy-darwin-x64@7.3.3': - optional: true - - '@napi-rs/snappy-freebsd-x64@7.3.3': - optional: true - - '@napi-rs/snappy-linux-arm-gnueabihf@7.3.3': - optional: true - - '@napi-rs/snappy-linux-arm64-gnu@7.3.3': - optional: true - - '@napi-rs/snappy-linux-arm64-musl@7.3.3': - optional: true - - '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': - optional: true - - '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': - optional: true - - '@napi-rs/snappy-linux-s390x-gnu@7.3.3': - optional: true - - '@napi-rs/snappy-linux-x64-gnu@7.3.3': - optional: true - - '@napi-rs/snappy-linux-x64-musl@7.3.3': - optional: true - - '@napi-rs/snappy-openharmony-arm64@7.3.3': - optional: true - - '@napi-rs/snappy-wasm32-wasi@7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - - '@napi-rs/snappy-win32-arm64-msvc@7.3.3': - optional: true - - '@napi-rs/snappy-win32-ia32-msvc@7.3.3': - optional: true - - '@napi-rs/snappy-win32-x64-msvc@7.3.3': - optional: true - - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 - optional: true + '@noble/ciphers@1.3.0': {} '@noble/curves@1.2.0': dependencies: @@ -3658,6 +3712,10 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -3666,6 +3724,8 @@ snapshots: '@noble/hashes@1.7.2': {} + '@noble/hashes@1.8.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -3945,29 +4005,6 @@ snapshots: - web3-core - web3-utils - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - '@rollup/plugin-commonjs@25.0.8(rollup@4.60.1)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.1) @@ -4094,6 +4131,12 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 @@ -4104,6 +4147,11 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -4458,11 +4506,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@so-ric/colorspace@1.1.6': - dependencies: - color: 5.0.3 - text-hex: 1.0.0 - '@solidity-parser/parser@0.18.0': {} '@tsconfig/node10@1.0.12': {} @@ -4473,11 +4516,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - '@types/bn.js@5.2.0': dependencies: '@types/node': 25.6.0 @@ -4500,8 +4538,6 @@ snapshots: dependencies: '@types/node': 25.6.0 - '@types/triple-beam@1.3.5': {} - '@types/ws@8.5.3': dependencies: '@types/node': 25.6.0 @@ -4530,6 +4566,11 @@ snapshots: optionalDependencies: zod: 3.25.76 + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -4542,6 +4583,8 @@ snapshots: adm-zip@0.4.16: {} + aes-js@3.0.0: {} + aes-js@4.0.0-beta.5: {} agent-base@6.0.2: @@ -4599,14 +4642,10 @@ snapshots: assertion-error@1.1.0: {} - async-exit-hook@2.0.1: {} - async-retry@1.3.3: dependencies: retry: 0.13.1 - async@3.2.6: {} - asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -4694,8 +4733,6 @@ snapshots: create-hash: 1.2.0 safe-buffer: 5.2.1 - btoa@1.2.1: {} - buffer-from@1.1.2: {} buffer-xor@1.0.3: {} @@ -4794,23 +4831,8 @@ snapshots: dependencies: color-name: 1.1.4 - color-convert@3.1.3: - dependencies: - color-name: 2.1.0 - color-name@1.1.4: {} - color-name@2.1.0: {} - - color-string@2.1.4: - dependencies: - color-name: 2.1.0 - - color@5.0.3: - dependencies: - color-convert: 3.1.3 - color-string: 2.1.4 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -4848,6 +4870,8 @@ snapshots: create-require@1.1.1: {} + croner@9.1.0: {} + cross-fetch@4.1.0: dependencies: node-fetch: 2.7.0 @@ -4900,6 +4924,10 @@ snapshots: dotenv@16.6.1: {} + drizzle-orm@0.36.4(pg@8.20.0): + optionalDependencies: + pg: 8.20.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4918,8 +4946,6 @@ snapshots: emoji-regex@8.0.0: {} - enabled@2.0.0: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -5056,6 +5082,42 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 + ethers@5.8.0: + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethers@6.13.2: dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -5069,6 +5131,8 @@ snapshots: - bufferutil - utf-8-validate + eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} evp_bytestokey@1.0.3: @@ -5102,8 +5166,6 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - fecha@4.2.3: {} - file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -5127,8 +5189,6 @@ snapshots: flatted@3.4.2: {} - fn.name@1.1.0: {} - follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: debug: 4.4.3(supports-color@8.1.1) @@ -5335,6 +5395,8 @@ snapshots: dependencies: react-is: 16.13.1 + hono@4.12.14: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -5434,8 +5496,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-stream@2.0.1: {} - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.20 @@ -5463,6 +5523,10 @@ snapshots: dependencies: ws: 8.20.0 + isows@1.0.7(ws@8.18.3): + dependencies: + ws: 8.18.3 + jackspeak@4.2.3: dependencies: '@isaacs/cliui': 9.0.0 @@ -5512,8 +5576,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kuler@2.0.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -5538,17 +5600,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - - long@5.3.2: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -5662,10 +5713,6 @@ snapshots: dependencies: wrappy: 1.0.2 - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -5690,6 +5737,21 @@ snapshots: os-tmpdir@1.0.2: {} + ox@0.14.17(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5736,6 +5798,41 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.2 + pg-cloudflare@1.3.0: + optional: true + + pg-connection-string@2.12.0: {} + + pg-int8@1.0.1: {} + + pg-pool@3.13.0(pg@8.20.0): + dependencies: + pg: 8.20.0 + + pg-protocol@1.13.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.20.0: + dependencies: + pg-connection-string: 2.12.0 + pg-pool: 3.13.0(pg@8.20.0) + pg-protocol: 1.13.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.3.0 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -5744,6 +5841,16 @@ snapshots: possible-typed-array-names@1.1.0: {} + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + prelude-ls@1.2.1: {} prettier@3.8.2: {} @@ -5756,21 +5863,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 25.6.0 - long: 5.3.2 - proxy-from-env@2.1.0: {} punycode@2.3.1: {} @@ -5899,8 +5991,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} scrypt-js@3.0.1: {} @@ -5946,31 +6036,6 @@ snapshots: signal-exit@4.1.0: {} - snappy@7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): - optionalDependencies: - '@napi-rs/snappy-android-arm-eabi': 7.3.3 - '@napi-rs/snappy-android-arm64': 7.3.3 - '@napi-rs/snappy-darwin-arm64': 7.3.3 - '@napi-rs/snappy-darwin-x64': 7.3.3 - '@napi-rs/snappy-freebsd-x64': 7.3.3 - '@napi-rs/snappy-linux-arm-gnueabihf': 7.3.3 - '@napi-rs/snappy-linux-arm64-gnu': 7.3.3 - '@napi-rs/snappy-linux-arm64-musl': 7.3.3 - '@napi-rs/snappy-linux-ppc64-gnu': 7.3.3 - '@napi-rs/snappy-linux-riscv64-gnu': 7.3.3 - '@napi-rs/snappy-linux-s390x-gnu': 7.3.3 - '@napi-rs/snappy-linux-x64-gnu': 7.3.3 - '@napi-rs/snappy-linux-x64-musl': 7.3.3 - '@napi-rs/snappy-openharmony-arm64': 7.3.3 - '@napi-rs/snappy-wasm32-wasi': 7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@napi-rs/snappy-win32-arm64-msvc': 7.3.3 - '@napi-rs/snappy-win32-ia32-msvc': 7.3.3 - '@napi-rs/snappy-win32-x64-msvc': 7.3.3 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - solc@0.8.26(debug@4.4.3): dependencies: command-exists: 1.2.9 @@ -5992,7 +6057,7 @@ snapshots: source-map@0.7.6: {} - stack-trace@0.0.10: {} + split2@4.2.0: {} stacktrace-parser@0.1.11: dependencies: @@ -6034,8 +6099,6 @@ snapshots: symbol-observable@4.0.0: {} - text-hex@1.0.0: {} - text-table@0.2.0: {} tinyglobby@0.2.16: @@ -6061,8 +6124,6 @@ snapshots: tr46@0.0.3: {} - triple-beam@1.4.1: {} - ts-invariant@0.10.3: dependencies: tslib: 2.8.1 @@ -6131,8 +6192,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-polyfill@1.1.14: {} - util-deprecate@1.0.2: {} util@0.12.5: @@ -6147,6 +6206,23 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + viem@2.48.3(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3) + ox: 0.14.17(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.3 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + web3-core@4.7.1: dependencies: web3-errors: 1.3.1 @@ -6397,39 +6473,6 @@ snapshots: dependencies: string-width: 4.2.3 - winston-loki@6.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): - dependencies: - async-exit-hook: 2.0.1 - btoa: 1.2.1 - protobufjs: 7.5.4 - url-polyfill: 1.1.14 - winston-transport: 4.9.0 - optionalDependencies: - snappy: 7.3.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.19.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.8 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - word-wrap@1.2.5: {} workerpool@6.5.1: {} @@ -6448,8 +6491,12 @@ snapshots: ws@8.18.0: {} + ws@8.18.3: {} + ws@8.20.0: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yargs-parser@20.2.9: {} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 3f32e172..00000000 --- a/yarn.lock +++ /dev/null @@ -1,5279 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" - integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== - -"@apollo/client@^3.11.4": - version "3.14.0" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.14.0.tgz#eda34b85ee03c6c0828ba21782419c8699feaf0b" - integrity sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/caches" "^1.0.0" - "@wry/equality" "^0.5.6" - "@wry/trie" "^0.5.0" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.18.0" - prop-types "^15.7.2" - rehackt "^0.1.0" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@aws-crypto/crc32@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" - integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== - dependencies: - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - tslib "^2.6.2" - -"@aws-crypto/sha256-browser@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" - integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== - dependencies: - "@aws-crypto/sha256-js" "^5.2.0" - "@aws-crypto/supports-web-crypto" "^5.2.0" - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-locate-window" "^3.0.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-crypto/sha256-js@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" - integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== - dependencies: - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" - tslib "^1.11.1" - -"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" - integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== - dependencies: - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" - tslib "^2.6.2" - -"@aws-crypto/supports-web-crypto@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" - integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== - dependencies: - tslib "^2.6.2" - -"@aws-crypto/util@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" - integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== - dependencies: - "@aws-sdk/types" "^3.1.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" - -"@aws-crypto/util@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" - integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== - dependencies: - "@aws-sdk/types" "^3.222.0" - "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-lambda@^3.563.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.972.0.tgz#4bd68abfad2bafae11ddad45b95447f011bc4b3a" - integrity sha512-0wrTTn5fIIU0LfbqKn8e/SFTaBkA+AHPsvELOU7unTxNfkxlg1KXGHynm4O/aNxNeElO73NrYp4s+lIQ558OiA== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.972.0" - "@aws-sdk/credential-provider-node" "3.972.0" - "@aws-sdk/middleware-host-header" "3.972.0" - "@aws-sdk/middleware-logger" "3.972.0" - "@aws-sdk/middleware-recursion-detection" "3.972.0" - "@aws-sdk/middleware-user-agent" "3.972.0" - "@aws-sdk/region-config-resolver" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@aws-sdk/util-endpoints" "3.972.0" - "@aws-sdk/util-user-agent-browser" "3.972.0" - "@aws-sdk/util-user-agent-node" "3.972.0" - "@smithy/config-resolver" "^4.4.6" - "@smithy/core" "^3.20.6" - "@smithy/eventstream-serde-browser" "^4.2.8" - "@smithy/eventstream-serde-config-resolver" "^4.3.8" - "@smithy/eventstream-serde-node" "^4.2.8" - "@smithy/fetch-http-handler" "^5.3.9" - "@smithy/hash-node" "^4.2.8" - "@smithy/invalid-dependency" "^4.2.8" - "@smithy/middleware-content-length" "^4.2.8" - "@smithy/middleware-endpoint" "^4.4.7" - "@smithy/middleware-retry" "^4.4.23" - "@smithy/middleware-serde" "^4.2.9" - "@smithy/middleware-stack" "^4.2.8" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/node-http-handler" "^4.4.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/smithy-client" "^4.10.8" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.22" - "@smithy/util-defaults-mode-node" "^4.2.25" - "@smithy/util-endpoints" "^3.2.8" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-retry" "^4.2.8" - "@smithy/util-stream" "^4.5.10" - "@smithy/util-utf8" "^4.2.0" - "@smithy/util-waiter" "^4.2.8" - tslib "^2.6.2" - -"@aws-sdk/client-sso@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.972.0.tgz#973d5a337bb473d3e019b4fca00f60ffa2666ff3" - integrity sha512-5qw6qLiRE4SUiz0hWy878dSR13tSVhbTWhsvFT8mGHe37NRRiaobm5MA2sWD0deRAuO98djSiV+dhWXa1xIFNw== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.972.0" - "@aws-sdk/middleware-host-header" "3.972.0" - "@aws-sdk/middleware-logger" "3.972.0" - "@aws-sdk/middleware-recursion-detection" "3.972.0" - "@aws-sdk/middleware-user-agent" "3.972.0" - "@aws-sdk/region-config-resolver" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@aws-sdk/util-endpoints" "3.972.0" - "@aws-sdk/util-user-agent-browser" "3.972.0" - "@aws-sdk/util-user-agent-node" "3.972.0" - "@smithy/config-resolver" "^4.4.6" - "@smithy/core" "^3.20.6" - "@smithy/fetch-http-handler" "^5.3.9" - "@smithy/hash-node" "^4.2.8" - "@smithy/invalid-dependency" "^4.2.8" - "@smithy/middleware-content-length" "^4.2.8" - "@smithy/middleware-endpoint" "^4.4.7" - "@smithy/middleware-retry" "^4.4.23" - "@smithy/middleware-serde" "^4.2.9" - "@smithy/middleware-stack" "^4.2.8" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/node-http-handler" "^4.4.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/smithy-client" "^4.10.8" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.22" - "@smithy/util-defaults-mode-node" "^4.2.25" - "@smithy/util-endpoints" "^3.2.8" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-retry" "^4.2.8" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@aws-sdk/core@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.972.0.tgz#20d9c47fc3ad1bed4c1866eb6f6488bcc5d31754" - integrity sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A== - dependencies: - "@aws-sdk/types" "3.972.0" - "@aws-sdk/xml-builder" "3.972.0" - "@smithy/core" "^3.20.6" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/signature-v4" "^5.3.8" - "@smithy/smithy-client" "^4.10.8" - "@smithy/types" "^4.12.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-env@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.0.tgz#54d185812f435843b25da1a87c4d10c847e5f675" - integrity sha512-kKHoNv+maHlPQOAhYamhap0PObd16SAb3jwaY0KYgNTiSbeXlbGUZPLioo9oA3wU10zItJzx83ClU7d7h40luA== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-http@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.0.tgz#15f54d50b4efba1aa7863158c532704e8c3dff9e" - integrity sha512-xzEi81L7I5jGUbpmqEHCe7zZr54hCABdj4H+3LzktHYuovV/oqnvoDdvZpGFR0e/KAw1+PL38NbGrpG30j6qlA== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/fetch-http-handler" "^5.3.9" - "@smithy/node-http-handler" "^4.4.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/smithy-client" "^4.10.8" - "@smithy/types" "^4.12.0" - "@smithy/util-stream" "^4.5.10" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-ini@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.0.tgz#d2b700a99e370d61765fb9ffec50d9b4ab5818ed" - integrity sha512-ruhAMceUIq2aknFd3jhWxmO0P0Efab5efjyIXOkI9i80g+zDY5VekeSxfqRKStEEJSKSCHDLQuOu0BnAn4Rzew== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/credential-provider-env" "3.972.0" - "@aws-sdk/credential-provider-http" "3.972.0" - "@aws-sdk/credential-provider-login" "3.972.0" - "@aws-sdk/credential-provider-process" "3.972.0" - "@aws-sdk/credential-provider-sso" "3.972.0" - "@aws-sdk/credential-provider-web-identity" "3.972.0" - "@aws-sdk/nested-clients" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/credential-provider-imds" "^4.2.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-login@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.0.tgz#f2c220055725cc1ab58db19a384ea127f2e0d9b3" - integrity sha512-SsrsFJsEYAJHO4N/r2P0aK6o8si6f1lprR+Ej8J731XJqTckSGs/HFHcbxOyW/iKt+LNUvZa59/VlJmjhF4bEQ== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/nested-clients" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-node@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.0.tgz#8e31768ebc5a6a88ba81815c6397515d7ba6e506" - integrity sha512-wwJDpEGl6+sOygic8QKu0OHVB8SiodqF1fr5jvUlSFfS6tJss/E9vBc2aFjl7zI6KpAIYfIzIgM006lRrZtWCQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.972.0" - "@aws-sdk/credential-provider-http" "3.972.0" - "@aws-sdk/credential-provider-ini" "3.972.0" - "@aws-sdk/credential-provider-process" "3.972.0" - "@aws-sdk/credential-provider-sso" "3.972.0" - "@aws-sdk/credential-provider-web-identity" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/credential-provider-imds" "^4.2.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-process@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.0.tgz#f42eb44b51c46fac088ef8c45b304e15aa23ca4e" - integrity sha512-nmzYhamLDJ8K+v3zWck79IaKMc350xZnWsf/GeaXO6E3MewSzd3lYkTiMi7lEp3/UwDm9NHfPguoPm+mhlSWQQ== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-sso@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.0.tgz#d2de6de88de52fa886362a01d4bc12c1034be387" - integrity sha512-6mYyfk1SrMZ15cH9T53yAF4YSnvq4yU1Xlgm3nqV1gZVQzmF5kr4t/F3BU3ygbvzi4uSwWxG3I3TYYS5eMlAyg== - dependencies: - "@aws-sdk/client-sso" "3.972.0" - "@aws-sdk/core" "3.972.0" - "@aws-sdk/token-providers" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-web-identity@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.0.tgz#025ee6bf5a152cd76e6c022eddcdc0efbd547b0d" - integrity sha512-vsJXBGL8H54kz4T6do3p5elATj5d1izVGUXMluRJntm9/I0be/zUYtdd4oDTM2kSUmd4Zhyw3fMQ9lw7CVhd4A== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/nested-clients" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-host-header@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.0.tgz#a878a2ecffec506ecb07bc3d8087c200b8b8fa82" - integrity sha512-3eztFI6F9/eHtkIaWKN3nT+PM+eQ6p1MALDuNshFk323ixuCZzOOVT8oUqtZa30Z6dycNXJwhlIq7NhUVFfimw== - dependencies: - "@aws-sdk/types" "3.972.0" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-logger@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.0.tgz#ae973b7fe8bffc5e371f2e058fe46fbb66b832f6" - integrity sha512-ZvdyVRwzK+ra31v1pQrgbqR/KsLD+wwJjHgko6JfoKUBIcEfAwJzQKO6HspHxdHWTVUz6MgvwskheR/TTYZl2g== - dependencies: - "@aws-sdk/types" "3.972.0" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-recursion-detection@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.0.tgz#4d3f0f56de3fc3ead87b37f57f02e79cb156bed4" - integrity sha512-F2SmUeO+S6l1h6dydNet3BQIk173uAkcfU1HDkw/bUdRLAnh15D3HP9vCZ7oCPBNcdEICbXYDmx0BR9rRUHGlQ== - dependencies: - "@aws-sdk/types" "3.972.0" - "@aws/lambda-invoke-store" "^0.2.2" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/middleware-user-agent@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.0.tgz#32abe845222f7d40e6261afe99909b86b7a9132c" - integrity sha512-kFHQm2OCBJCzGWRafgdWHGFjitUXY/OxXngymcX4l8CiyiNDZB27HDDBg2yLj3OUJc4z4fexLMmP8r9vgag19g== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@aws-sdk/util-endpoints" "3.972.0" - "@smithy/core" "^3.20.6" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/nested-clients@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.972.0.tgz#8b1d78ac4dc340e1a5a4b385e82dae082de455c9" - integrity sha512-QGlbnuGzSQJVG6bR9Qw6G0Blh6abFR4VxNa61ttMbzy9jt28xmk2iGtrYLrQPlCCPhY6enHqjTWm3n3LOb0wAw== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.972.0" - "@aws-sdk/middleware-host-header" "3.972.0" - "@aws-sdk/middleware-logger" "3.972.0" - "@aws-sdk/middleware-recursion-detection" "3.972.0" - "@aws-sdk/middleware-user-agent" "3.972.0" - "@aws-sdk/region-config-resolver" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@aws-sdk/util-endpoints" "3.972.0" - "@aws-sdk/util-user-agent-browser" "3.972.0" - "@aws-sdk/util-user-agent-node" "3.972.0" - "@smithy/config-resolver" "^4.4.6" - "@smithy/core" "^3.20.6" - "@smithy/fetch-http-handler" "^5.3.9" - "@smithy/hash-node" "^4.2.8" - "@smithy/invalid-dependency" "^4.2.8" - "@smithy/middleware-content-length" "^4.2.8" - "@smithy/middleware-endpoint" "^4.4.7" - "@smithy/middleware-retry" "^4.4.23" - "@smithy/middleware-serde" "^4.2.9" - "@smithy/middleware-stack" "^4.2.8" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/node-http-handler" "^4.4.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/smithy-client" "^4.10.8" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-body-length-node" "^4.2.1" - "@smithy/util-defaults-mode-browser" "^4.3.22" - "@smithy/util-defaults-mode-node" "^4.2.25" - "@smithy/util-endpoints" "^3.2.8" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-retry" "^4.2.8" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@aws-sdk/region-config-resolver@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.0.tgz#9b0022b4ef34f62a82513e348064556967f32271" - integrity sha512-JyOf+R/6vJW8OEVFCAyzEOn2reri/Q+L0z9zx4JQSKWvTmJ1qeFO25sOm8VIfB8URKhfGRTQF30pfYaH2zxt/A== - dependencies: - "@aws-sdk/types" "3.972.0" - "@smithy/config-resolver" "^4.4.6" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/token-providers@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.972.0.tgz#9471b8163a2f7bb1661ad87610fd58762051704a" - integrity sha512-kWlXG+y5nZhgXGEtb72Je+EvqepBPs8E3vZse//1PYLWs2speFqbGE/ywCXmzEJgHgVqSB/u/lqBvs5WlYmSqQ== - dependencies: - "@aws-sdk/core" "3.972.0" - "@aws-sdk/nested-clients" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/types@3.972.0", "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.222.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.972.0.tgz#2c8ddf7fa63038da2e27d888c1bd5817b62e30fa" - integrity sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/util-endpoints@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz#0c483aa4853ea3858024bc502454ba395e533cb0" - integrity sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg== - dependencies: - "@aws-sdk/types" "3.972.0" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - "@smithy/util-endpoints" "^3.2.8" - tslib "^2.6.2" - -"@aws-sdk/util-locate-window@^3.0.0": - version "3.965.3" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.3.tgz#07f98caac26b51442e4ee4e7d66b87a07be267ea" - integrity sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA== - dependencies: - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-browser@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.0.tgz#a0068c8e44361b312f5983324acc52d52a7f9d92" - integrity sha512-eOLdkQyoRbDgioTS3Orr7iVsVEutJyMZxvyZ6WAF95IrF0kfWx5Rd/KXnfbnG/VKa2CvjZiitWfouLzfVEyvJA== - dependencies: - "@aws-sdk/types" "3.972.0" - "@smithy/types" "^4.12.0" - bowser "^2.11.0" - tslib "^2.6.2" - -"@aws-sdk/util-user-agent-node@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.0.tgz#1219a0291f6e51dd160be4805ee2a8c8065d6f26" - integrity sha512-GOy+AiSrE9kGiojiwlZvVVSXwylu4+fmP0MJfvras/MwP09RB/YtQuOVR1E0fKQc6OMwaTNBjgAbOEhxuWFbAw== - dependencies: - "@aws-sdk/middleware-user-agent" "3.972.0" - "@aws-sdk/types" "3.972.0" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== - dependencies: - tslib "^2.3.1" - -"@aws-sdk/xml-builder@3.972.0": - version "3.972.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz#8ae8f6f6e0a63d518c8c8ce9f40f3c94d9b67884" - integrity sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg== - dependencies: - "@smithy/types" "^4.12.0" - fast-xml-parser "5.2.5" - tslib "^2.6.2" - -"@aws/lambda-invoke-store@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz#f1137f56209ccc69c15f826242cbf37f828617dd" - integrity sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw== - -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.8": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e" - integrity sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q== - dependencies: - "@so-ric/colorspace" "^1.1.6" - enabled "2.0.x" - kuler "^2.0.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.6.1": - version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@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/util@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" - integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== - dependencies: - "@ethereumjs/rlp" "^5.0.2" - ethereum-cryptography "^2.2.1" - -"@ethersproject/abi@^5.1.2": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" - integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== - dependencies: - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/abstract-provider@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" - integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/networks" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/web" "^5.8.0" - -"@ethersproject/abstract-signer@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" - integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - -"@ethersproject/address@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" - integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - -"@ethersproject/base64@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" - integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== - dependencies: - "@ethersproject/bytes" "^5.8.0" - -"@ethersproject/basex@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" - integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - -"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" - integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" - integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/constants@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" - integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - -"@ethersproject/hash@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" - integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/keccak256@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" - integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== - dependencies: - "@ethersproject/bytes" "^5.8.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.7.0", "@ethersproject/logger@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" - integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== - -"@ethersproject/networks@^5.7.1", "@ethersproject/networks@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" - integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/properties@^5.7.0", "@ethersproject/properties@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" - integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/providers@^5.7.2": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" - integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/base64" "^5.8.0" - "@ethersproject/basex" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/networks" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/web" "^5.8.0" - bech32 "1.1.4" - ws "8.18.0" - -"@ethersproject/random@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" - integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/rlp@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" - integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/sha2@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" - integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" - integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - bn.js "^5.2.1" - elliptic "6.6.1" - hash.js "1.1.7" - -"@ethersproject/strings@^5.7.0", "@ethersproject/strings@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" - integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/transactions@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" - integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== - dependencies: - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - -"@ethersproject/web@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" - integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== - dependencies: - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@graphql-typed-document-node/core@^3.1.1": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" - integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" - integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@napi-rs/snappy-android-arm-eabi@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.3.3.tgz#5d02f180548bcf50bb85744309cd33a532b835e9" - integrity sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA== - -"@napi-rs/snappy-android-arm64@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.3.3.tgz#36e94d9b6e78b6d25b42a9e421fd03470f56f7f9" - integrity sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg== - -"@napi-rs/snappy-darwin-arm64@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.3.3.tgz#e5f42a2364a002bc3200c104dbc3b11df9099df4" - integrity sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw== - -"@napi-rs/snappy-darwin-x64@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.3.3.tgz#262b18ac224d067ecbd6f374e1a7ddfce1a51851" - integrity sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA== - -"@napi-rs/snappy-freebsd-x64@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.3.3.tgz#7aedacf6378e227bb9954073e6f32e5418fb3f6e" - integrity sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g== - -"@napi-rs/snappy-linux-arm-gnueabihf@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.3.3.tgz#ea21c6b0f1132de0c247aefe500cf67f58e7506d" - integrity sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA== - -"@napi-rs/snappy-linux-arm64-gnu@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.3.3.tgz#381a0ff8818b94c0b242236bc3592edd91d9a1e6" - integrity sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA== - -"@napi-rs/snappy-linux-arm64-musl@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.3.3.tgz#b96eeb6b6930f30009e282c1e4a7fab5edd9074d" - integrity sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q== - -"@napi-rs/snappy-linux-ppc64-gnu@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-ppc64-gnu/-/snappy-linux-ppc64-gnu-7.3.3.tgz#b8d24c435baaebf041502d8f7ee8a64510a8085b" - integrity sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA== - -"@napi-rs/snappy-linux-riscv64-gnu@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-riscv64-gnu/-/snappy-linux-riscv64-gnu-7.3.3.tgz#24d0281dc3ef72626225f1456fd0a3c8c0b0de13" - integrity sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q== - -"@napi-rs/snappy-linux-s390x-gnu@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-s390x-gnu/-/snappy-linux-s390x-gnu-7.3.3.tgz#c5d2a07c0abfe4562da358dc7642a527db337e23" - integrity sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg== - -"@napi-rs/snappy-linux-x64-gnu@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.3.3.tgz#2d2cbb3983b663d60432fc60c25a3bc2233575e4" - integrity sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ== - -"@napi-rs/snappy-linux-x64-musl@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.3.3.tgz#c874e068c4d8c2c21c13b59b01652e035fe4acbb" - integrity sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg== - -"@napi-rs/snappy-openharmony-arm64@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-openharmony-arm64/-/snappy-openharmony-arm64-7.3.3.tgz#da8596bc9341030faebbb57dd8cd19eb49831376" - integrity sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw== - -"@napi-rs/snappy-wasm32-wasi@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-wasm32-wasi/-/snappy-wasm32-wasi-7.3.3.tgz#bc51055793f8c00bc8c0c79647941ba5a4d37e81" - integrity sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q== - dependencies: - "@napi-rs/wasm-runtime" "^1.0.3" - -"@napi-rs/snappy-win32-arm64-msvc@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.3.3.tgz#3a29b6d2c8e048c81ae71bcd7139dab231d53e0d" - integrity sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ== - -"@napi-rs/snappy-win32-ia32-msvc@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.3.3.tgz#ccef21e323784a74619a43a12c0fb37f68eb44b0" - integrity sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA== - -"@napi-rs/snappy-win32-x64-msvc@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.3.3.tgz#b9bbe529c38477744a8dc6b2ee47f5b53dd3b00c" - integrity sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q== - -"@napi-rs/wasm-runtime@^1.0.3": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc" - integrity sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw== - dependencies: - "@tybys/wasm-util" "^0.10.1" - -"@noble/curves@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/curves@1.4.2", "@noble/curves@~1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/curves@~1.8.1": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" - integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== - dependencies: - "@noble/hashes" "1.7.2" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/hashes@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - -"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" - integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== - -"@noble/secp256k1@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - -"@noble/secp256k1@~1.7.0": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" - integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nomicfoundation/edr-darwin-arm64@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.22.tgz#2033c1b49461212682fd557002feb41b68677042" - integrity sha512-TpEBSKyMZJEPvYwBPYclC2b+qobKjn1YhVa7aJ1R7RMPy5dJ/PqsrUK5UuUFFybBqoIorru5NTcsyCMWP5T/Fg== - -"@nomicfoundation/edr-darwin-x64@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.22.tgz#f140f5150c80ca6135704831d31875c077309985" - integrity sha512-aK/+m8xUkR4u+czTVGU06nSFVH43AY6XCBoR2YjO8SglAAjCSTWK3WAfVb6FcsriMmKv4PrvoyHLMbMP+fXcGA== - -"@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.22.tgz#54eb2c8c285067fb5970442a8d8a3252a8b2d23e" - integrity sha512-W5vXMleG14hVzRYGPEwlHLJ6iiQE8Qh63Uj538nAz4YUI6wWSgUOZE7K2Gt1EdujZGnrt7kfDslgJ96n4nKQZw== - -"@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.22.tgz#3862beb688bc2d460d8a2400d4d4e206357dfbc9" - integrity sha512-VDp7EB3iY8MH/fFVcgEzLDGYmtS6j2honNc0RNUCFECKPrdsngGrTG8p+YFxyVjq2m5GEsdyKo4e+BKhaUNPdg== - -"@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.22.tgz#eea4bf9850c8aa37661e8a7625249e43a57014da" - integrity sha512-XL6oA3ymRSQYyvg6hF1KIax6V/9vlWr5gJ8GPHVVODk1a/YfuEEY1osN5Zmo6aztUkSGKwSuac/3Ax7rfDDiSg== - -"@nomicfoundation/edr-linux-x64-musl@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.22.tgz#801cfad4063b831f0bea8d57a34a47e782f44536" - integrity sha512-hmkRIXxWa9P0PwfXOAO6WUw11GyV5gpxcMunqWBTkwZ4QW/hi/CkXmlLo6VHd6ceCwpUNLhCGndBtrOPrNRi4A== - -"@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.22.tgz#303a1d274ccb1a2c4ff1f73b734ebb5c280f1311" - integrity sha512-X7f+7KUMm00trsXAHCHJa+x1fc3QAbk2sBctyOgpET+GLrfCXbxqrccKi7op8f0zTweAVGg1Hsc8SjjC7kwFLw== - -"@nomicfoundation/edr@0.12.0-next.22": - version "0.12.0-next.22" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.12.0-next.22.tgz#f40b373eec002c0170068e39eb90df6037a0d3dc" - integrity sha512-JigYWf2stjpDxSndBsxRoobQHK8kz4SAVaHtTIKQLIHbsBwymE8i120Ejne6Jk+Ndc5CsNINXB8/bK6vLPe9jA== - dependencies: - "@nomicfoundation/edr-darwin-arm64" "0.12.0-next.22" - "@nomicfoundation/edr-darwin-x64" "0.12.0-next.22" - "@nomicfoundation/edr-linux-arm64-gnu" "0.12.0-next.22" - "@nomicfoundation/edr-linux-arm64-musl" "0.12.0-next.22" - "@nomicfoundation/edr-linux-x64-gnu" "0.12.0-next.22" - "@nomicfoundation/edr-linux-x64-musl" "0.12.0-next.22" - "@nomicfoundation/edr-win32-x64-msvc" "0.12.0-next.22" - -"@nomicfoundation/hardhat-ethers@3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.7.tgz#be90f79e96a22e6e982bca20ab0af05ed1f09c26" - integrity sha512-pxLWpDiqC208shoz/lMbVFbxcVxE+qIs8qDrwdcubWH99UO1p6uwXakMa36ICRfB/IEToSLDJGSsKhwY84feCQ== - dependencies: - debug "^4.1.1" - lodash.isequal "^4.5.0" - -"@nomicfoundation/hardhat-foundry@^1.1.1": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.2.0.tgz#00bac127d1540c5c3900709f9f5fa511c599ba6c" - integrity sha512-2AJQLcWnUk/iQqHDVnyOadASKFQKF1PhNtt1cONEQqzUPK+fqME1IbP+EKu+RkZTRcyc4xqUMaB0sutglKRITg== - dependencies: - picocolors "^1.1.0" - -"@nomicfoundation/hardhat-network-helpers@^1.0.10": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz#24ba943d27099f09f9a188f04cdfe7c136d5aafc" - integrity sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ== - dependencies: - ethereumjs-util "^7.1.4" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" - integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" - integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" - integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" - integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" - integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" - integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" - integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" - integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" - -"@openzeppelin/defender-sdk-account-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-account-client/-/defender-sdk-account-client-2.7.0.tgz#99092ce243cc22f58c4a18aefe86a171b288b3ab" - integrity sha512-tf23hTk6PmQm6UK1R5BAvru2a7aFO/zRcQKJg9453mAvVXfadld4KVjWUV64e40klQjcpSjkzkSClraN/n+LEQ== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-action-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-action-client/-/defender-sdk-action-client-2.7.0.tgz#911b67d5997629acda5945f2239a00b9811a67cb" - integrity sha512-fwGH6Se8YqKtIv2KNRFB2NopB9IXT429QNjsmfGc7MobnTMniilCDQP80THQ1G+1bbYcg2NI/1PLHQnCvrbynQ== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - dotenv "^16.3.1" - glob "^11.0.0" - jszip "^3.10.1" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-address-book-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-address-book-client/-/defender-sdk-address-book-client-2.7.0.tgz#43b2edfaf37cb6322019d6d8fd40fa14f127d6e3" - integrity sha512-e4bgdx9+26MOMotAQ6WL8WaFEVYlxgSmxG2Qi6SV4T74NNijjtsm29rFdWsBO41xf8X9XoQjF/+GvoZyaSd2Yg== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - dotenv "^16.3.1" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-approval-process-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-approval-process-client/-/defender-sdk-approval-process-client-2.7.0.tgz#087e0c9654d0bd5f30098170ddc0fe4e17eb0325" - integrity sha512-yZVTZ5eVDlVd3lKorBElSVAj3MFqH7uboUBc7TR7eGAGGcml7423LrzIQz3SJg9UXXHT2n8MB3Ve0pmeoqRAlg== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-base-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.7.0.tgz#fe8600f99fd9b641c39192eae249778ac2c8d6e5" - integrity sha512-J5IpvbFfdIJM4IadBcXfhCXVdX2yEpaZtRR1ecq87d8CdkmmEpniYfef/yVlG98yekvu125LaIRg0yXQOt9Bdg== - dependencies: - "@aws-sdk/client-lambda" "^3.563.0" - amazon-cognito-identity-js "^6.3.6" - async-retry "^1.3.3" - -"@openzeppelin/defender-sdk-deploy-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.7.0.tgz#302024856172c798f1edb561e2b8d4d0e66d3e14" - integrity sha512-YOHZmnHmM1y6uSqXWGfk2/5/ae4zZJE6xG92yFEAIOy8vqh1dxznWMsoCcAXRXTCWc8RdCDpFdMfEy4SBTyYtg== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-key-value-store-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-key-value-store-client/-/defender-sdk-key-value-store-client-2.7.0.tgz#a7b0850dbd4fea8ba5b4e3d2aecc929b08b2e211" - integrity sha512-LcNhAq094nTYxHfWrrG7MLOAfNMQoWI1b7imHm3yQy7i7r0n0qYCx7yOXvJ83LzGXDSpEloUt8Z28xtqgUrqHw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - fs-extra "^11.2.0" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-monitor-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-monitor-client/-/defender-sdk-monitor-client-2.7.0.tgz#8365f433003053aa0ce3424a8758dd4482157a7a" - integrity sha512-+BumVy/fhIf+dNUycXnuo+FciOiu9Vf+Ho8jViC6ig12ft0Iz2p8+5j03SJ11Kl0rA+qQ3IaxUtnf9hOvtmQKA== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - ethers "^6.9.0" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-network-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.7.0.tgz#bec7d83966db5f396c7a40ca29faeb1b44821e70" - integrity sha512-4CYWPa9+kSjojE5KS7kRmP161qsBATdp97TCrzyDdGoVahj0GyqgafRL9AAjm0eHZOM1c7EIYEpbvYRtFi8vyA== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-notification-channel-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-notification-channel-client/-/defender-sdk-notification-channel-client-2.7.0.tgz#48304430d5b2492eb5f6614e25879b9c85d42e24" - integrity sha512-ZlHJ95xHagYr8s5/BiRKPi3m+/PQVXao9efmUw8Z/5pNgOYewQ3MillPvObJvVyEMOAWpeGQPw8bT/pLn9F1TQ== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-proposal-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-proposal-client/-/defender-sdk-proposal-client-2.7.0.tgz#c589819043b26983419beec4aaac0460e756183c" - integrity sha512-rXBSg0luPbly7H1g2TAmD81VulslffP2iPDpTxluPACMEiShLUSI6268EatxlmE5LbChuQLjSfKRgONGh7aHKw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - ethers "^6.9.0" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-relay-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-client/-/defender-sdk-relay-client-2.7.0.tgz#73a70fed57d5df3528d3789a9ffdd579e00e6708" - integrity sha512-w20PTic+MLj989VNE6gUtTua+Di0M0oxB1xByX5uOSdofoblXE8vriUFYn2EdIfvtYCZUnEHdf9BfolbJdeSPw== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-relay-group-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-group-client/-/defender-sdk-relay-group-client-2.7.0.tgz#0c49f5c361ae8df575cb16e7862d17b7b2f3e2d1" - integrity sha512-FOMgK0ifrtZuorr+bOoxyYMuIt7dQ6FT1JVnWHg0+X9/xJ8RoBEMunXa0NXtG8706zZEci2SgWYQhxnefUz0Ag== - dependencies: - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - axios "^1.7.4" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk-relay-signer-client@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-signer-client/-/defender-sdk-relay-signer-client-2.7.0.tgz#0906497702b779c9329ae557de7a28543a7b3fea" - integrity sha512-bOK6GSlUXhW1hSs4e3PeHwHp2QC24LYbLlMdVQE4EvAXvqGVqSZSRc1eOEEuMSg/gYfHC3Ef1O+9R9kjyDBt1w== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.1" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/strings" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - amazon-cognito-identity-js "^6.3.6" - axios "^1.7.4" - ethers "^6.9.0" - lodash "^4.17.21" - -"@openzeppelin/defender-sdk@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk/-/defender-sdk-2.7.0.tgz#a5830b39a4c57a63b91c0195dda7ef6571f491af" - integrity sha512-A7Lvte6+j6A0EQ/nYXtremP37JhW/x58C9AtD//4LS9o6OsSJuXE4R58L5E48cTxOT/I3xelYmgGh0KGQTao4A== - dependencies: - "@openzeppelin/defender-sdk-account-client" "^2.7.0" - "@openzeppelin/defender-sdk-action-client" "^2.7.0" - "@openzeppelin/defender-sdk-address-book-client" "^2.7.0" - "@openzeppelin/defender-sdk-approval-process-client" "^2.7.0" - "@openzeppelin/defender-sdk-base-client" "^2.7.0" - "@openzeppelin/defender-sdk-deploy-client" "^2.7.0" - "@openzeppelin/defender-sdk-key-value-store-client" "^2.7.0" - "@openzeppelin/defender-sdk-monitor-client" "^2.7.0" - "@openzeppelin/defender-sdk-network-client" "^2.7.0" - "@openzeppelin/defender-sdk-notification-channel-client" "^2.7.0" - "@openzeppelin/defender-sdk-proposal-client" "^2.7.0" - "@openzeppelin/defender-sdk-relay-client" "^2.7.0" - "@openzeppelin/defender-sdk-relay-group-client" "^2.7.0" - "@openzeppelin/defender-sdk-relay-signer-client" "^2.7.0" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@rollup/plugin-commonjs@^25.0.7": - version "25.0.8" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" - integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A== - dependencies: - "@rollup/pluginutils" "^5.0.1" - commondir "^1.0.1" - estree-walker "^2.0.2" - glob "^8.0.3" - is-reference "1.2.1" - magic-string "^0.30.3" - -"@rollup/plugin-json@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" - integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== - dependencies: - "@rollup/pluginutils" "^5.1.0" - -"@rollup/plugin-node-resolve@^15.2.3": - version "15.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" - integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" - integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz#067cfcd81f1c1bfd92aefe3ad5ef1523549d5052" - integrity sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw== - -"@rollup/rollup-android-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz#85e39a44034d7d4e4fee2a1616f0bddb85a80517" - integrity sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q== - -"@rollup/rollup-darwin-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz#17d92fe98f2cc277b91101eb1528b7c0b6c00c54" - integrity sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w== - -"@rollup/rollup-darwin-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz#89ae6c66b1451609bd1f297da9384463f628437d" - integrity sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g== - -"@rollup/rollup-freebsd-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz#cdbdb9947b26e76c188a31238c10639347413628" - integrity sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ== - -"@rollup/rollup-freebsd-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz#9b1458d07b6e040be16ee36d308a2c9520f7f7cc" - integrity sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg== - -"@rollup/rollup-linux-arm-gnueabihf@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz#1d50ded7c965d5f125f5832c971ad5b287befef7" - integrity sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A== - -"@rollup/rollup-linux-arm-musleabihf@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz#53597e319b7e65990d3bc2a5048097384814c179" - integrity sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw== - -"@rollup/rollup-linux-arm64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz#597002909dec198ca4bdccb25f043d32db3d6283" - integrity sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ== - -"@rollup/rollup-linux-arm64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz#286f0e0f799545ce288bdc5a7c777261fcba3d54" - integrity sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA== - -"@rollup/rollup-linux-loong64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz#1fab07fa1a4f8d3697735b996517f1bae0ba101b" - integrity sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg== - -"@rollup/rollup-linux-loong64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz#efc2cb143d6c067f95205482afb177f78ed9ea3d" - integrity sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA== - -"@rollup/rollup-linux-ppc64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz#e8de8bd3463f96b92b7dfb7f151fd80ffe8a937c" - integrity sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw== - -"@rollup/rollup-linux-ppc64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz#8c508fe28a239da83b3a9da75bcf093186e064b4" - integrity sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg== - -"@rollup/rollup-linux-riscv64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz#ff6d51976e0830732880770a9e18553136b8d92b" - integrity sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew== - -"@rollup/rollup-linux-riscv64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz#325fb35eefc7e81d75478318f0deee1e4a111493" - integrity sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ== - -"@rollup/rollup-linux-s390x-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz#37410fabb5d3ba4ad34abcfbe9ba9b6288413f30" - integrity sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ== - -"@rollup/rollup-linux-x64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz#8ef907a53b2042068fc03fcc6a641e2b02276eca" - integrity sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw== - -"@rollup/rollup-linux-x64-musl@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz#61b9ba09ea219e0174b3f35a6ad2afc94bdd5662" - integrity sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA== - -"@rollup/rollup-openbsd-x64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz#fc4e54133134c1787d0b016ffdd5aeb22a5effd3" - integrity sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA== - -"@rollup/rollup-openharmony-arm64@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz#959ae225b1eeea0cc5b7c9f88e4834330fb6cd09" - integrity sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ== - -"@rollup/rollup-win32-arm64-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz#842acd38869fa1cbdbc240c76c67a86f93444c27" - integrity sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing== - -"@rollup/rollup-win32-ia32-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz#7ab654def4042df44cb29f8ed9d5044e850c66d5" - integrity sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg== - -"@rollup/rollup-win32-x64-gnu@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz#7426cdec1b01d2382ffd5cda83cbdd1c8efb3ca6" - integrity sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ== - -"@rollup/rollup-win32-x64-msvc@4.56.0": - version "4.56.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz#9eec0212732a432c71bde0350bc40b673d15b2db" - integrity sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g== - -"@scure/base@~1.1.0", "@scure/base@~1.1.6": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" - integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== - -"@scure/base@~1.2.5": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" - integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== - -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@smithy/abort-controller@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.2.8.tgz#3bfd7a51acce88eaec9a65c3382542be9f3a053a" - integrity sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/config-resolver@^4.4.6": - version "4.4.6" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.6.tgz#bd7f65b3da93f37f1c97a399ade0124635c02297" - integrity sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ== - dependencies: - "@smithy/node-config-provider" "^4.3.8" - "@smithy/types" "^4.12.0" - "@smithy/util-config-provider" "^4.2.0" - "@smithy/util-endpoints" "^3.2.8" - "@smithy/util-middleware" "^4.2.8" - tslib "^2.6.2" - -"@smithy/core@^3.20.6", "@smithy/core@^3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.21.0.tgz#adcc016036fd3d510e38adba026f86f41ee1d411" - integrity sha512-bg2TfzgsERyETAxc/Ims/eJX8eAnIeTi4r4LHpMpfF/2NyO6RsWis0rjKcCPaGksljmOb23BZRiCeT/3NvwkXw== - dependencies: - "@smithy/middleware-serde" "^4.2.9" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-body-length-browser" "^4.2.0" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-stream" "^4.5.10" - "@smithy/util-utf8" "^4.2.0" - "@smithy/uuid" "^1.1.0" - tslib "^2.6.2" - -"@smithy/credential-provider-imds@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz#b2f4bf759ab1c35c0dd00fa3470263c749ebf60f" - integrity sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw== - dependencies: - "@smithy/node-config-provider" "^4.3.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - tslib "^2.6.2" - -"@smithy/eventstream-codec@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz#2f431f4bac22e40aa6565189ea350c6fcb5efafd" - integrity sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw== - dependencies: - "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^4.12.0" - "@smithy/util-hex-encoding" "^4.2.0" - tslib "^2.6.2" - -"@smithy/eventstream-serde-browser@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz#04e2e1fad18e286d5595fbc0bff22e71251fca38" - integrity sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw== - dependencies: - "@smithy/eventstream-serde-universal" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/eventstream-serde-config-resolver@^4.3.8": - version "4.3.8" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz#b913d23834c6ebf1646164893e1bec89dffe4f3b" - integrity sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/eventstream-serde-node@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz#5f2dfa2cbb30bf7564c8d8d82a9832e9313f5243" - integrity sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A== - dependencies: - "@smithy/eventstream-serde-universal" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/eventstream-serde-universal@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz#a62b389941c28a8c3ab44a0c8ba595447e0258a7" - integrity sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ== - dependencies: - "@smithy/eventstream-codec" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/fetch-http-handler@^5.3.9": - version "5.3.9" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz#edfc9e90e0c7538c81e22e748d62c0066cc91d58" - integrity sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA== - dependencies: - "@smithy/protocol-http" "^5.3.8" - "@smithy/querystring-builder" "^4.2.8" - "@smithy/types" "^4.12.0" - "@smithy/util-base64" "^4.3.0" - tslib "^2.6.2" - -"@smithy/hash-node@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.8.tgz#c21eb055041716cd492dda3a109852a94b6d47bb" - integrity sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA== - dependencies: - "@smithy/types" "^4.12.0" - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@smithy/invalid-dependency@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz#c578bc6d5540c877aaed5034b986b5f6bd896451" - integrity sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/is-array-buffer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" - integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== - dependencies: - tslib "^2.6.2" - -"@smithy/is-array-buffer@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz#b0f874c43887d3ad44f472a0f3f961bcce0550c2" - integrity sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ== - dependencies: - tslib "^2.6.2" - -"@smithy/middleware-content-length@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz#82c1df578fa70fe5800cf305b8788b9d2836a3e4" - integrity sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A== - dependencies: - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/middleware-endpoint@^4.4.10", "@smithy/middleware-endpoint@^4.4.7": - version "4.4.10" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.10.tgz#06259987e8557ae9654c991eca7046265cefda19" - integrity sha512-kwWpNltpxrvPabnjEFvwSmA+66l6s2ReCvgVSzW/z92LU4T28fTdgZ18IdYRYOrisu2NMQ0jUndRScbO65A/zg== - dependencies: - "@smithy/core" "^3.21.0" - "@smithy/middleware-serde" "^4.2.9" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - "@smithy/url-parser" "^4.2.8" - "@smithy/util-middleware" "^4.2.8" - tslib "^2.6.2" - -"@smithy/middleware-retry@^4.4.23": - version "4.4.26" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.26.tgz#a7315a5b18da04d7af9a74945737dcc808f7985f" - integrity sha512-ozZMoTAr+B2aVYfLYfkssFvc8ZV3p/vLpVQ7/k277xxUOA9ykSPe5obL2j6yHfbdrM/SZV7qj0uk/hSqavHrLw== - dependencies: - "@smithy/node-config-provider" "^4.3.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/service-error-classification" "^4.2.8" - "@smithy/smithy-client" "^4.10.11" - "@smithy/types" "^4.12.0" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-retry" "^4.2.8" - "@smithy/uuid" "^1.1.0" - tslib "^2.6.2" - -"@smithy/middleware-serde@^4.2.9": - version "4.2.9" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz#fd9d9b02b265aef67c9a30f55c2a5038fc9ca791" - integrity sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ== - dependencies: - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/middleware-stack@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz#4fa9cfaaa05f664c9bb15d45608f3cb4f6da2b76" - integrity sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/node-config-provider@^4.3.8": - version "4.3.8" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz#85a0683448262b2eb822f64c14278d4887526377" - integrity sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg== - dependencies: - "@smithy/property-provider" "^4.2.8" - "@smithy/shared-ini-file-loader" "^4.4.3" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/node-http-handler@^4.4.8": - version "4.4.8" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz#298cc148c812b9a79f0ebd75e82bdab9e6d0bbcd" - integrity sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg== - dependencies: - "@smithy/abort-controller" "^4.2.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/querystring-builder" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/property-provider@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.2.8.tgz#6e37b30923d2d31370c50ce303a4339020031472" - integrity sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/protocol-http@^5.3.8": - version "5.3.8" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.3.8.tgz#0938f69a3c3673694c2f489a640fce468ce75006" - integrity sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/querystring-builder@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz#2fa72d29eb1844a6a9933038bbbb14d6fe385e93" - integrity sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw== - dependencies: - "@smithy/types" "^4.12.0" - "@smithy/util-uri-escape" "^4.2.0" - tslib "^2.6.2" - -"@smithy/querystring-parser@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz#aa3f2456180ce70242e89018d0b1ebd4782a6347" - integrity sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/service-error-classification@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz#6d89dbad4f4978d7b75a44af8c18c22455a16cdc" - integrity sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ== - dependencies: - "@smithy/types" "^4.12.0" - -"@smithy/shared-ini-file-loader@^4.4.3": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz#6054215ecb3a6532b13aa49a9fbda640b63be50e" - integrity sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/signature-v4@^5.3.8": - version "5.3.8" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.8.tgz#796619b10b7cc9467d0625b0ebd263ae04fdfb76" - integrity sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg== - dependencies: - "@smithy/is-array-buffer" "^4.2.0" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - "@smithy/util-hex-encoding" "^4.2.0" - "@smithy/util-middleware" "^4.2.8" - "@smithy/util-uri-escape" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@smithy/smithy-client@^4.10.11", "@smithy/smithy-client@^4.10.8": - version "4.10.11" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.10.11.tgz#923db7327494d52562e8794435c1760c3392df9e" - integrity sha512-6o804SCyHGMXAb5mFJ+iTy9kVKv7F91a9szN0J+9X6p8A0NrdpUxdaC57aye2ipQkP2C4IAqETEpGZ0Zj77Haw== - dependencies: - "@smithy/core" "^3.21.0" - "@smithy/middleware-endpoint" "^4.4.10" - "@smithy/middleware-stack" "^4.2.8" - "@smithy/protocol-http" "^5.3.8" - "@smithy/types" "^4.12.0" - "@smithy/util-stream" "^4.5.10" - tslib "^2.6.2" - -"@smithy/types@^4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.12.0.tgz#55d2479080922bda516092dbf31916991d9c6fee" - integrity sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw== - dependencies: - tslib "^2.6.2" - -"@smithy/url-parser@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.8.tgz#b44267cd704abe114abcd00580acdd9e4acc1177" - integrity sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA== - dependencies: - "@smithy/querystring-parser" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-base64@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.0.tgz#5e287b528793aa7363877c1a02cd880d2e76241d" - integrity sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ== - dependencies: - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@smithy/util-body-length-browser@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz#04e9fc51ee7a3e7f648a4b4bcdf96c350cfa4d61" - integrity sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg== - dependencies: - tslib "^2.6.2" - -"@smithy/util-body-length-node@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz#79c8a5d18e010cce6c42d5cbaf6c1958523e6fec" - integrity sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA== - dependencies: - tslib "^2.6.2" - -"@smithy/util-buffer-from@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" - integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== - dependencies: - "@smithy/is-array-buffer" "^2.2.0" - tslib "^2.6.2" - -"@smithy/util-buffer-from@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz#7abd12c4991b546e7cee24d1e8b4bfaa35c68a9d" - integrity sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew== - dependencies: - "@smithy/is-array-buffer" "^4.2.0" - tslib "^2.6.2" - -"@smithy/util-config-provider@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz#2e4722937f8feda4dcb09672c59925a4e6286cfc" - integrity sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q== - dependencies: - tslib "^2.6.2" - -"@smithy/util-defaults-mode-browser@^4.3.22": - version "4.3.25" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.25.tgz#ed341a6f6892f8ca50bb67fec4676072b79ed588" - integrity sha512-8ugoNMtss2dJHsXnqsibGPqoaafvWJPACmYKxJ4E6QWaDrixsAemmiMMAVbvwYadjR0H9G2+AlzsInSzRi8PSw== - dependencies: - "@smithy/property-provider" "^4.2.8" - "@smithy/smithy-client" "^4.10.11" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-defaults-mode-node@^4.2.25": - version "4.2.28" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.28.tgz#041cd486f342ec56d0b8a46a5d5c97933cf813d7" - integrity sha512-mjUdcP8h3E0K/XvNMi9oBXRV3DMCzeRiYIieZ1LQ7jq5tu6GH/GTWym7a1xIIE0pKSoLcpGsaImuQhGPSIJzAA== - dependencies: - "@smithy/config-resolver" "^4.4.6" - "@smithy/credential-provider-imds" "^4.2.8" - "@smithy/node-config-provider" "^4.3.8" - "@smithy/property-provider" "^4.2.8" - "@smithy/smithy-client" "^4.10.11" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-endpoints@^3.2.8": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz#5650bda2adac989ff2e562606088c5de3dcb1b36" - integrity sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw== - dependencies: - "@smithy/node-config-provider" "^4.3.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-hex-encoding@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz#1c22ea3d1e2c3a81ff81c0a4f9c056a175068a7b" - integrity sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw== - dependencies: - tslib "^2.6.2" - -"@smithy/util-middleware@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.2.8.tgz#1da33f29a74c7ebd9e584813cb7e12881600a80a" - integrity sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A== - dependencies: - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-retry@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.2.8.tgz#23f3f47baf0681233fd0c37b259e60e268c73b11" - integrity sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg== - dependencies: - "@smithy/service-error-classification" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/util-stream@^4.5.10": - version "4.5.10" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.5.10.tgz#3a7b56f0bdc3833205f80fea67d8e76756ea055b" - integrity sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g== - dependencies: - "@smithy/fetch-http-handler" "^5.3.9" - "@smithy/node-http-handler" "^4.4.8" - "@smithy/types" "^4.12.0" - "@smithy/util-base64" "^4.3.0" - "@smithy/util-buffer-from" "^4.2.0" - "@smithy/util-hex-encoding" "^4.2.0" - "@smithy/util-utf8" "^4.2.0" - tslib "^2.6.2" - -"@smithy/util-uri-escape@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz#096a4cec537d108ac24a68a9c60bee73fc7e3a9e" - integrity sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA== - dependencies: - tslib "^2.6.2" - -"@smithy/util-utf8@^2.0.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" - integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== - dependencies: - "@smithy/util-buffer-from" "^2.2.0" - tslib "^2.6.2" - -"@smithy/util-utf8@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.2.0.tgz#8b19d1514f621c44a3a68151f3d43e51087fed9d" - integrity sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw== - dependencies: - "@smithy/util-buffer-from" "^4.2.0" - tslib "^2.6.2" - -"@smithy/util-waiter@^4.2.8": - version "4.2.8" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.2.8.tgz#35d7bd8b2be7a2ebc12d8c38a0818c501b73e928" - integrity sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg== - dependencies: - "@smithy/abort-controller" "^4.2.8" - "@smithy/types" "^4.12.0" - tslib "^2.6.2" - -"@smithy/uuid@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@smithy/uuid/-/uuid-1.1.0.tgz#9fd09d3f91375eab94f478858123387df1cda987" - integrity sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw== - dependencies: - tslib "^2.6.2" - -"@so-ric/colorspace@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@so-ric/colorspace/-/colorspace-1.1.6.tgz#62515d8b9f27746b76950a83bde1af812d91923b" - integrity sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw== - dependencies: - color "^5.0.2" - text-hex "1.0.x" - -"@solidity-parser/parser@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" - integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== - -"@tsconfig/node10@^1.0.7": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" - integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@tybys/wasm-util@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" - integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== - dependencies: - tslib "^2.4.0" - -"@types/bn.js@^5.1.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80" - integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== - dependencies: - "@types/node" "*" - -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/node@*": - version "25.0.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.10.tgz#4864459c3c9459376b8b75fd051315071c8213e7" - integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg== - dependencies: - undici-types "~7.16.0" - -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - -"@types/node@22.7.5": - version "22.7.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" - integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== - dependencies: - undici-types "~6.19.2" - -"@types/node@>=13.7.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" - integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== - dependencies: - undici-types "~7.18.0" - -"@types/pbkdf2@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" - integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== - dependencies: - "@types/node" "*" - -"@types/pg@^8.20.0": - version "8.20.0" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.20.0.tgz#8bd03d3ac6b19143a8de7d66a9d13da32cd91526" - integrity sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^2.2.0" - -"@types/resolve@1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" - integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== - -"@types/secp256k1@^4.0.1": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.7.tgz#534c9814eb80964962108ad45d549d1555c75fa0" - integrity sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw== - dependencies: - "@types/node" "*" - -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - -"@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -"@wry/caches@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" - integrity sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA== - dependencies: - tslib "^2.3.0" - -"@wry/context@^0.7.0": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.4.tgz#e32d750fa075955c4ab2cfb8c48095e1d42d5990" - integrity sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.6": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.7.tgz#72ec1a73760943d439d56b7b1e9985aec5d497bb" - integrity sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" - integrity sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA== - dependencies: - tslib "^2.3.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.5" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" - integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" - integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== - -acorn@^8.9.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@4.0.0-beta.5: - version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" - integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -amazon-cognito-identity-js@^6.3.6: - version "6.3.16" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.16.tgz#4a6aceb64c80406b9ee4344980794ff9e506017a" - integrity sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ== - dependencies: - "@aws-crypto/sha256-js" "1.2.2" - buffer "4.9.2" - fast-base64-decode "^1.0.0" - isomorphic-unfetch "^3.0.0" - js-cookie "^2.2.1" - -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "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.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async-exit-hook@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" - integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== - -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.7.4, axios@^1.9.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" - integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" - integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bn.js@^4.11.9: - version "4.12.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" - integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== - -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" - integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== - -bowser@^2.11.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.13.1.tgz#5a4c652de1d002f847dd011819f5fc729f308a7e" - integrity sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw== - -boxen@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" - integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - to-buffer "^1.2.2" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-convert@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.3.tgz#db6627b97181cb8facdfce755ae26f97ab0711f1" - integrity sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg== - dependencies: - color-name "^2.0.0" - -color-name@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.1.0.tgz#0b677385c1c4b4edfdeaf77e38fa338e3a40b693" - integrity sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.4.tgz#9dcf566ff976e23368c8bd673f5c35103ab41058" - integrity sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg== - dependencies: - color-name "^2.0.0" - -color@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/color/-/color-5.0.3.tgz#f79390b1b778e222ffbb54304d3dbeaef633f97f" - integrity sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA== - dependencies: - color-convert "^3.1.3" - color-string "^2.1.3" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.2, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -dayjs@^1.11.12: - version "1.11.19" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938" - integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw== - -debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -diff@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" - integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== - -diff@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.2.tgz#0a4742797281d09cfa699b79ea32d27723623bad" - integrity sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@^16.3.1, dotenv@^16.4.5: - version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -elliptic@6.6.1, elliptic@^6.5.7: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -enquirer@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.55.0: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -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== - dependencies: - "@noble/curves" "1.4.2" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - -ethereumjs-util@^7.1.4: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethers@6.13.2: - version "6.13.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe" - integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== - dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.17.1" - -ethers@^6.9.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.16.0.tgz#fff9b4f05d7a359c774ad6e91085a800f7fccf65" - integrity sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A== - dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "22.7.5" - aes-js "4.0.0-beta.5" - tslib "2.7.0" - ws "8.17.1" - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -fast-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" - integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-xml-parser@5.2.5: - version "5.2.5" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a" - integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== - dependencies: - strnum "^2.1.0" - -fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== - dependencies: - reusify "^1.0.4" - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.12.1, follow-redirects@^1.15.6: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - -for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" - integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fs-extra@^11.2.0: - version "11.3.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" - integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-caller-file@^2.0.5: - version "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-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" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" - integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.1.1" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.3, glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql@^16.9.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.12.0.tgz#28cc2462435b1ac3fdc6976d030cef83a0c13ac7" - integrity sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ== - -hardhat@^2.22.9: - version "2.28.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.28.3.tgz#f6f337cf99266a22de9dff0d45588ad7d7503586" - integrity sha512-f1WxpCJCXzxDc12MgIIxxkvB2QK40g/atsW4Az5WQFhUXpZx4VFoSfvwYBIRsRbq6xIrgxef+tXuWda5wTLlgA== - dependencies: - "@ethereumjs/util" "^9.1.0" - "@ethersproject/abi" "^5.1.2" - "@nomicfoundation/edr" "0.12.0-next.22" - "@nomicfoundation/solidity-analyzer" "^0.1.0" - "@sentry/node" "^5.18.1" - adm-zip "^0.4.16" - aggregate-error "^3.0.0" - ansi-escapes "^4.3.0" - boxen "^5.1.2" - chokidar "^4.0.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" - find-up "^5.0.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - json-stream-stringify "^3.1.4" - keccak "^3.0.2" - lodash "^4.17.11" - micro-eth-signer "^0.14.0" - mnemonist "^0.38.0" - mocha "^10.0.0" - p-map "^4.0.0" - picocolors "^1.1.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - solc "0.8.26" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - tinyglobby "^0.2.6" - tsort "0.0.1" - undici "^5.14.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hash-base@^3.0.0, hash-base@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" - integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== - dependencies: - inherits "^2.0.4" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - to-buffer "^1.2.1" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@~0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - -immutable@^4.0.0-rc.12: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "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-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" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-reference@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typed-array@^1.1.14: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-unfetch@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -jackspeak@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" - integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" - integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-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" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stream-stringify@^3.1.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" - integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" - integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jszip@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - setimmediate "^1.0.5" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" - integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.11, lodash@^4.17.21: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -logform@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" - integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -long@^5.0.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" - integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lru-cache@^11.0.0: - version "11.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.4.tgz#ecb523ebb0e6f4d837c807ad1abaea8e0619770d" - integrity sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg== - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -magic-string@^0.30.3: - version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" - integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -micro-eth-signer@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" - integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== - dependencies: - "@noble/curves" "~1.8.1" - "@noble/hashes" "~1.7.1" - micro-packed "~0.7.2" - -micro-packed@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" - integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== - dependencies: - "@scure/base" "~1.2.5" - -mime-db@1.52.0: - version "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: - 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" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" - integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1, minimatch@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@^10.0.0: - version "10.8.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" - integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== - dependencies: - ansi-colors "^4.1.3" - browser-stdout "^1.3.1" - chokidar "^3.5.3" - debug "^4.3.5" - diff "^5.2.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^8.1.0" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" - yargs-unparser "^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== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-addon-api@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" - integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== - -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.2.0: - version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -obliterator@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" - integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optimism@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.1.tgz#5cf16847921413dbb0ac809907370388b9c6335f" - integrity sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ== - dependencies: - "@wry/caches" "^1.0.0" - "@wry/context" "^0.7.0" - "@wry/trie" "^0.5.0" - tslib "^2.3.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -pako@~1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -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-scurry@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" - integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17: - version "3.1.5" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" - integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== - dependencies: - create-hash "^1.2.0" - create-hmac "^1.1.7" - ripemd160 "^2.0.3" - safe-buffer "^5.2.1" - sha.js "^2.4.12" - to-buffer "^1.2.1" - -pg-cloudflare@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz#386035d4bfcf1a7045b026f8b21acf5353f14d65" - integrity sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ== - -pg-connection-string@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.12.0.tgz#4084f917902bb2daae3dc1376fe24ac7b4eaccf2" - integrity sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ== - -pg-int8@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" - integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== - -pg-pool@^3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.13.0.tgz#416482e9700e8f80c685a6ae5681697a413c13a3" - integrity sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA== - -pg-protocol@*, pg-protocol@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.13.0.tgz#fdaf6d020bca590d58bb991b4b16fc448efe0511" - integrity sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w== - -pg-types@2.2.0, pg-types@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" - integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== - dependencies: - pg-int8 "1.0.1" - postgres-array "~2.0.0" - postgres-bytea "~1.0.0" - postgres-date "~1.0.4" - postgres-interval "^1.1.0" - -pg@^8.20.0: - version "8.20.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.20.0.tgz#1a274de944cb329fd6dd77a6d371a005ba6b136d" - integrity sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA== - dependencies: - pg-connection-string "^2.12.0" - pg-pool "^3.13.0" - pg-protocol "^1.13.0" - pg-types "2.2.0" - pgpass "1.0.5" - optionalDependencies: - pg-cloudflare "^1.3.0" - -pgpass@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" - integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== - dependencies: - split2 "^4.1.0" - -picocolors@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postgres-array@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" - integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== - -postgres-bytea@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.1.tgz#c40b3da0222c500ff1e51c5d7014b60b79697c7a" - integrity sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ== - -postgres-date@~1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" - integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== - -postgres-interval@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" - integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== - dependencies: - xtend "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.6.2: - version "3.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" - integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -protobufjs@^7.2.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" - integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -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" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -raw-body@^2.4.1: - version "2.5.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" - integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - unpipe "~1.0.0" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -readable-stream@^2.3.8, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rehackt@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" - integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.22.1: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== - dependencies: - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" - integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== - dependencies: - hash-base "^3.1.2" - inherits "^2.0.4" - -rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -rollup-plugin-visualizer@^5.12.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz#be82d43fb3c644e396e2d50ac8a53d354022d57c" - integrity sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA== - dependencies: - open "^8.4.0" - picomatch "^4.0.2" - source-map "^0.7.4" - yargs "^17.5.1" - -rollup@^4.9.1: - version "4.56.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.56.0.tgz#65959d13cfbd7e48b8868c05165b1738f0143862" - integrity sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.56.0" - "@rollup/rollup-android-arm64" "4.56.0" - "@rollup/rollup-darwin-arm64" "4.56.0" - "@rollup/rollup-darwin-x64" "4.56.0" - "@rollup/rollup-freebsd-arm64" "4.56.0" - "@rollup/rollup-freebsd-x64" "4.56.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.56.0" - "@rollup/rollup-linux-arm-musleabihf" "4.56.0" - "@rollup/rollup-linux-arm64-gnu" "4.56.0" - "@rollup/rollup-linux-arm64-musl" "4.56.0" - "@rollup/rollup-linux-loong64-gnu" "4.56.0" - "@rollup/rollup-linux-loong64-musl" "4.56.0" - "@rollup/rollup-linux-ppc64-gnu" "4.56.0" - "@rollup/rollup-linux-ppc64-musl" "4.56.0" - "@rollup/rollup-linux-riscv64-gnu" "4.56.0" - "@rollup/rollup-linux-riscv64-musl" "4.56.0" - "@rollup/rollup-linux-s390x-gnu" "4.56.0" - "@rollup/rollup-linux-x64-gnu" "4.56.0" - "@rollup/rollup-linux-x64-musl" "4.56.0" - "@rollup/rollup-openbsd-x64" "4.56.0" - "@rollup/rollup-openharmony-arm64" "4.56.0" - "@rollup/rollup-win32-arm64-msvc" "4.56.0" - "@rollup/rollup-win32-ia32-msvc" "4.56.0" - "@rollup/rollup-win32-x64-gnu" "4.56.0" - "@rollup/rollup-win32-x64-msvc" "4.56.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, 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== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-stable-stringify@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" - integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" - integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== - dependencies: - elliptic "^6.5.7" - node-addon-api "^5.0.0" - node-gyp-build "^4.2.0" - -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: - version "2.4.12" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" - integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - to-buffer "^1.2.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -snappy@^7.2.2: - version "7.3.3" - resolved "https://registry.yarnpkg.com/snappy/-/snappy-7.3.3.tgz#cbc3793f03b019eb1ccecfa24a371ef87ef6b469" - integrity sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ== - optionalDependencies: - "@napi-rs/snappy-android-arm-eabi" "7.3.3" - "@napi-rs/snappy-android-arm64" "7.3.3" - "@napi-rs/snappy-darwin-arm64" "7.3.3" - "@napi-rs/snappy-darwin-x64" "7.3.3" - "@napi-rs/snappy-freebsd-x64" "7.3.3" - "@napi-rs/snappy-linux-arm-gnueabihf" "7.3.3" - "@napi-rs/snappy-linux-arm64-gnu" "7.3.3" - "@napi-rs/snappy-linux-arm64-musl" "7.3.3" - "@napi-rs/snappy-linux-ppc64-gnu" "7.3.3" - "@napi-rs/snappy-linux-riscv64-gnu" "7.3.3" - "@napi-rs/snappy-linux-s390x-gnu" "7.3.3" - "@napi-rs/snappy-linux-x64-gnu" "7.3.3" - "@napi-rs/snappy-linux-x64-musl" "7.3.3" - "@napi-rs/snappy-openharmony-arm64" "7.3.3" - "@napi-rs/snappy-wasm32-wasi" "7.3.3" - "@napi-rs/snappy-win32-arm64-msvc" "7.3.3" - "@napi-rs/snappy-win32-ia32-msvc" "7.3.3" - "@napi-rs/snappy-win32-x64-msvc" "7.3.3" - -solc@0.8.26: - version "0.8.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" - integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== - dependencies: - command-exists "^1.2.8" - commander "^8.1.0" - follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -source-map-support@^0.5.13: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== - -split2@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stacktrace-parser@^0.1.10: - version "0.1.11" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" - integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== - dependencies: - type-fest "^0.7.1" - -statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strnum@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" - integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tinyglobby@^0.2.6: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -tmp@0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" - integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== - dependencies: - isarray "^2.0.5" - safe-buffer "^5.2.1" - typed-array-buffer "^1.0.3" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tslib@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== - -tslib@^1.11.1, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typescript@^5.7.0: - version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== - -undici@^5.14.0: - version "5.29.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" - integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg== - dependencies: - "@fastify/busboy" "^2.0.0" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -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== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-polyfill@^1.1.12: - version "1.1.14" - resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.14.tgz#26497c1302408af05ea548e3370f0d0c68aafc40" - integrity sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-typed-array@^1.1.16: - version "1.1.20" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" - integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -winston-loki@^6.1.3: - version "6.1.4" - resolved "https://registry.yarnpkg.com/winston-loki/-/winston-loki-6.1.4.tgz#a1ced672d96be70a27718206fb192a8b0e407a1c" - integrity sha512-/j/Zf7TGLjgSBck29BkPnpJlEnGQr5xqlx8A0N6LZnXYYYvyK7lFk6FPpWiD+VMO8xjaxOu1KNF9SzWaRDsigA== - dependencies: - async-exit-hook "2.0.1" - btoa "^1.2.1" - protobufjs "^7.2.4" - url-polyfill "^1.1.12" - winston-transport "^4.3.0" - optionalDependencies: - snappy "^7.2.2" - -winston-transport@^4.3.0, winston-transport@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" - integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== - dependencies: - logform "^2.7.0" - readable-stream "^3.6.2" - triple-beam "^1.3.0" - -winston@^3.17.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.19.0.tgz#cc1d1262f5f45946904085cfffe73efb4b7a581d" - integrity sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.8" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.7.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.9.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.5.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From 81c4b65dd32d18bd97b9b8decc189a03c2350b6c Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 01:21:10 +0200 Subject: [PATCH 24/41] fix(docker): install nodejs + npm in actions image The oven/bun:1 base image ships bun but not node/npm, so `npm install -g pnpm` failed at build time. Node is also needed at runtime for `pnpm hardhat ...` subprocesses spawned by runner.ts. Co-Authored-By: Claude Opus 4.7 (1M context) --- dockerfile-actions | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockerfile-actions b/dockerfile-actions index ac5a2b1f..456f28f8 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -12,6 +12,8 @@ RUN apt-get update \ build-essential \ python3 \ bsdutils \ + nodejs \ + npm \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /root/.ssh \ From 26ec3e11868789d6975e16682617ecf4cb22a661 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 01:35:19 +0200 Subject: [PATCH 25/41] build: allow purrikey prepare script under pnpm 10 pnpm 10 requires git-hosted deps with a prepare script to be allowlisted via onlyBuiltDependencies. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 6009e913..dc044bc4 100644 --- a/package.json +++ b/package.json @@ -45,5 +45,10 @@ }, "dependencies": { "@automaton/client": "github:OriginProtocol/automaton#path:packages/client" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@lastdotnet/purrikey" + ] } } From 21288929d3159d7b9f354250124d139be45c7a7f Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 02:24:22 +0200 Subject: [PATCH 26/41] Bump @automaton/client to pick up real LogCapture Co-Authored-By: Claude Opus 4.7 (1M context) --- pnpm-lock.yaml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d0c822f..3ce2efa5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@automaton/client': specifier: github:OriginProtocol/automaton#path:packages/client - version: https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client(typescript@5.9.3)(zod@3.25.76) + version: https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -117,8 +117,8 @@ packages: subscriptions-transport-ws: optional: true - '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client': - resolution: {path: packages/client, tarball: https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12} + '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client': + resolution: {path: packages/client, tarball: https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb} version: 0.0.1 '@aws-crypto/crc32@5.2.0': @@ -1833,6 +1833,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -2924,7 +2928,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/e0ef5896a69923968bd4fea026eebc89714cdf12#path:packages/client(typescript@5.9.3)(zod@3.25.76)': + '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client(typescript@5.9.3)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.14) croner: 9.1.0 @@ -5383,6 +5387,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + he@1.2.0: {} hmac-drbg@1.0.1: @@ -5494,7 +5502,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-typed-array@1.1.15: dependencies: From 7e22bd46698fd91a618ac6214ea8443b22908b10 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 09:17:51 +0200 Subject: [PATCH 27/41] feat(docker): install Foundry tools for Hardhat configuration Added installation of Foundry (forge/cast/anvil) to the Dockerfile, ensuring the tools are available at Hardhat config load time. This change updates the PATH to include Foundry binaries, facilitating the use of @nomicfoundation/hardhat-foundry in the project. --- dockerfile-actions | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dockerfile-actions b/dockerfile-actions index 456f28f8..e336f69a 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -21,6 +21,12 @@ RUN mkdir -p /root/.ssh \ RUN git config --global url."https://github.com/".insteadOf "git@github.com:" +# Install Foundry (forge/cast/anvil) — required at hardhat config load time +# because hardhat.config.js loads @nomicfoundation/hardhat-foundry. +ENV PATH="/root/.foundry/bin:${PATH}" +RUN curl -L https://foundry.paradigm.xyz | bash \ + && /root/.foundry/bin/foundryup + WORKDIR /app # Install dependencies first for better caching. From dd42c5d3b7a6d20ca98248074694c82481c21b20 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 10:09:34 +0200 Subject: [PATCH 28/41] rename dependency package --- README.md | 6 +++--- package.json | 2 +- runner.ts | 2 +- src/js/tasks/lib/action.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 39985b09..0d8e53d7 100644 --- a/README.md +++ b/README.md @@ -293,11 +293,11 @@ yarn hardhat tenderlySync --network sonic yarn hardhat tenderlyUpload --network sonic --name ORIGIN_ARM ``` -## Automated Actions (Automaton) +## Automated Actions (Talos) -The `src/js/tasks/actions/*.ts` files are hardhat tasks that handle operational jobs (allocations, fee collection, withdrawal requests, etc.). In production they're driven by a container that imports [`@automaton/client`](https://github.com/OriginProtocol/automaton): +The `src/js/tasks/actions/*.ts` files are hardhat tasks that handle operational jobs (allocations, fee collection, withdrawal requests, etc.). In production they're driven by a container that imports [`@talos/client`](https://github.com/oplabs/talos): -- **`runner.ts`** at repo root calls `runContainer({ product: "arm-oeth", workdir: "/app" })`. The library reads enabled schedules from the shared automaton Postgres, fires them via croner, and spawns each schedule's command as `pnpm hardhat --network `. +- **`runner.ts`** at repo root calls `runContainer({ product: "arm-oeth", workdir: "/app" })`. The library reads enabled schedules from the shared Talos Postgres, fires them via croner, and spawns each schedule's command as `pnpm hardhat --network `. - **`migrations/seed_schedules.sql`** is a one-time seed of the `schedules` table mirroring the old `cron/cron-jobs.ts`. - **`src/js/tasks/lib/action.ts`** wraps the hardhat signer with `wrapSignerWithNonceQueueV6` from the library when `DATABASE_URL` is set. That routes `signer.sendTransaction` through Postgres row-locked nonce coordination. diff --git a/package.json b/package.json index dc044bc4..eb86da43 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "typescript": "^5.7.0" }, "dependencies": { - "@automaton/client": "github:OriginProtocol/automaton#path:packages/client" + "@talos/client": "github:oplabs/talos#path:packages/client" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/runner.ts b/runner.ts index 845bc08f..3c29751b 100644 --- a/runner.ts +++ b/runner.ts @@ -1,4 +1,4 @@ -import { runContainer } from "@automaton/client"; +import { runContainer } from "@talos/client"; await runContainer({ product: "arm-oeth", diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 1b233719..06658b9f 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -6,7 +6,7 @@ import { createPool, type Db, wrapSignerWithNonceQueueV6, -} from "@automaton/client"; +} from "@talos/client"; import { getSigner as defaultGetSigner } from "../../utils/signers"; From 9e35a5a5122e502943b28f1ebcfaf024df8e6997 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 10:41:36 +0200 Subject: [PATCH 29/41] Regenerate lockfile after @automaton/client -> @talos/client rename Resolves to oplabs/talos tarball. Pairs with dd42c5d (package.json rename). Co-Authored-By: Claude Opus 4.7 (1M context) --- pnpm-lock.yaml | 104 ++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ce2efa5..25587257 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - '@automaton/client': - specifier: github:OriginProtocol/automaton#path:packages/client - version: https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client(typescript@5.9.3)(zod@3.25.76) + '@talos/client': + specifier: github:oplabs/talos#path:packages/client + version: git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -117,10 +117,6 @@ packages: subscriptions-transport-ws: optional: true - '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client': - resolution: {path: packages/client, tarball: https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb} - version: 0.0.1 - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -1016,6 +1012,10 @@ packages: '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + '@talos/client@git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client': + resolution: {commit: de368268930f62604ecc47e8a8486cb5c6ba22e9, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} + version: 0.0.1 + '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -2928,51 +2928,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@automaton/client@https://codeload.github.com/OriginProtocol/automaton/tar.gz/21415b9e15c3f21bffcbac63c54407f93a8abaeb#path:packages/client(typescript@5.9.3)(zod@3.25.76)': - dependencies: - '@hono/node-server': 1.19.14(hono@4.12.14) - croner: 9.1.0 - drizzle-orm: 0.36.4(pg@8.20.0) - ethers-v5: ethers@5.8.0 - ethers-v6: ethers@6.13.2 - hono: 4.12.14 - pg: 8.20.0 - viem: 2.48.3(typescript@5.9.3)(zod@3.25.76) - transitivePeerDependencies: - - '@aws-sdk/client-rds-data' - - '@cloudflare/workers-types' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/react' - - '@types/sql.js' - - '@vercel/postgres' - - '@xata.io/client' - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - knex - - kysely - - mysql2 - - pg-native - - postgres - - prisma - - react - - sql.js - - sqlite3 - - typescript - - utf-8-validate - - zod - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -4512,6 +4467,51 @@ snapshots: '@solidity-parser/parser@0.18.0': {} + '@talos/client@git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client(typescript@5.9.3)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.14) + croner: 9.1.0 + drizzle-orm: 0.36.4(pg@8.20.0) + ethers-v5: ethers@5.8.0 + ethers-v6: ethers@6.13.2 + hono: 4.12.14 + pg: 8.20.0 + viem: 2.48.3(typescript@5.9.3)(zod@3.25.76) + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - react + - sql.js + - sqlite3 + - typescript + - utf-8-validate + - zod + '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} From 25a99956310f55842ba7b81aa9135fdcf17dafe3 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 11:15:54 +0200 Subject: [PATCH 30/41] Switch @automaton/client to private talos via SSH; add BuildKit SSH forwarding --- .github/workflows/actions-image.yml | 9 + dockerfile-actions | 15 +- package.json | 2 +- pnpm-lock.yaml | 1403 ++++++++++++++------------- 4 files changed, 739 insertions(+), 690 deletions(-) diff --git a/.github/workflows/actions-image.yml b/.github/workflows/actions-image.yml index c8bcb714..ab392ae0 100644 --- a/.github/workflows/actions-image.yml +++ b/.github/workflows/actions-image.yml @@ -17,6 +17,14 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Set up SSH agent for @automaton/client deploy key + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.TALOS_DEPLOY_KEY }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: @@ -37,6 +45,7 @@ jobs: context: . file: ./dockerfile-actions push: true + ssh: default tags: | ${{ steps.prep.outputs.image_name }}:latest ${{ steps.prep.outputs.image_name }}:${{ github.sha }} diff --git a/dockerfile-actions b/dockerfile-actions index e336f69a..2aaa7dad 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -1,7 +1,9 @@ +# syntax=docker/dockerfile:1.7 FROM oven/bun:1 ENV DEBIAN_FRONTEND=noninteractive \ - DEBUG_HIDE_DATE=true + DEBUG_HIDE_DATE=true \ + PNPM_STORE_DIR=/root/.local/share/pnpm/store RUN apt-get update \ && apt-get install -y --no-install-recommends \ @@ -17,9 +19,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /root/.ssh \ - && ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts - -RUN git config --global url."https://github.com/".insteadOf "git@github.com:" + && ssh-keyscan -t ed25519,rsa github.com >> /root/.ssh/known_hosts # Install Foundry (forge/cast/anvil) — required at hardhat config load time # because hardhat.config.js loads @nomicfoundation/hardhat-foundry. @@ -29,9 +29,12 @@ RUN curl -L https://foundry.paradigm.xyz | bash \ WORKDIR /app -# Install dependencies first for better caching. +# Install dependencies first for better caching. Requires BuildKit SSH +# forwarding (e.g. Railway deploy key) to resolve @automaton/client. COPY package.json pnpm-lock.yaml ./ -RUN npm install -g pnpm && pnpm install --frozen-lockfile +RUN --mount=type=ssh \ + --mount=type=cache,id=arm-oeth-pnpm-store,target=/root/.local/share/pnpm/store \ + npm install -g pnpm && pnpm install --frozen-lockfile # Copy the rest of the workspace. COPY . . diff --git a/package.json b/package.json index eb86da43..f58433c5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "typescript": "^5.7.0" }, "dependencies": { - "@talos/client": "github:oplabs/talos#path:packages/client" + "@talos/client": "git+ssh://git@github.com/oplabs/talos.git#path:packages/client" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25587257..7afa077b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@talos/client': - specifier: github:oplabs/talos#path:packages/client - version: git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client(typescript@5.9.3)(zod@3.25.76) + specifier: git+ssh://git@github.com/oplabs/talos.git#path:packages/client + version: git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -20,7 +20,7 @@ importers: version: 5.8.0 '@lastdotnet/purrikey': specifier: github:OriginProtocol/purrikey#3d10b79b567c52c0c37e630800dae6c7059bd9b8 - version: git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2) + version: https://codeload.github.com/OriginProtocol/purrikey/tar.gz/3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2) '@nomicfoundation/hardhat-ethers': specifier: 3.0.7 version: 3.0.7(ethers@6.13.2)(hardhat@2.28.6(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3))(typescript@5.9.3)) @@ -35,19 +35,19 @@ importers: version: 2.7.0(web3-core@4.7.1)(web3-utils@4.3.3)(web3@4.16.0(typescript@5.9.3)(zod@3.25.76)) '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.8(rollup@4.60.1) + version: 25.0.8(rollup@4.60.2) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.60.1) + version: 6.1.0(rollup@4.60.2) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.3.1(rollup@4.60.1) + version: 15.3.1(rollup@4.60.2) '@solidity-parser/parser': specifier: ^0.18.0 version: 0.18.0 axios: specifier: ^1.9.0 - version: 1.15.0 + version: 1.15.2 builtin-modules: specifier: ^3.3.0 version: 3.3.0 @@ -77,13 +77,13 @@ importers: version: 2.7.0 prettier: specifier: ^3.6.2 - version: 3.8.2 + version: 3.8.3 rollup: specifier: ^4.9.1 - version: 4.60.1 + version: 4.60.2 rollup-plugin-visualizer: specifier: ^5.12.0 - version: 5.14.0(rollup@4.60.1) + version: 5.14.0(rollup@4.60.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) @@ -140,95 +140,107 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-kms@3.1028.0': - resolution: {integrity: sha512-M3ahMP9HAuklAX3u3KvyotryrF/S+wr37hOE+P47EOM64XV85tRoy4+5x8hD5lUIEa1XMEtqrkC0VrXxdyFFBw==} + '@aws-sdk/client-kms@3.1034.0': + resolution: {integrity: sha512-SJNtvd7ft/LXTN37ELP8hmM2iE4VPOyaoyg81IUyDUXJ/7fmduLBEuwDSgB19i8/aCzwEQwYM8GYF2DbF4a8fw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-lambda@3.1028.0': - resolution: {integrity: sha512-wAJT/1M5UT5d0Nw/7XTWzVO3nJpvghGxoiiKxR3KKIbOEIGPEY2FJpw5xZHFaLS7Du5sr9rCyqJ+0fiejID/gA==} + '@aws-sdk/client-lambda@3.1034.0': + resolution: {integrity: sha512-5IpqMHHMLNhsuDxyUsC9DlEDZTATkfzjEHPjN+dcWnQwue5LjufEOo5Zk6Aryzu3vWnr43hbjI2PMJjehJculQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.27': - resolution: {integrity: sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==} + '@aws-sdk/core@3.974.3': + resolution: {integrity: sha512-W3aJJm2clu8OmsrwMOMnfof13O6LGnbknnZIQeSRbxjqKah2nVvkjbUBBZVhWrt08KC69H7WsINTdrxC/2SXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.25': - resolution: {integrity: sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==} + '@aws-sdk/credential-provider-env@3.972.29': + resolution: {integrity: sha512-rf+AlUxgTeSzQ/4zoS0D+Bt7XvgpY48PnWG8Yg/N9fdMgyK2Jaqa+6tLZp4MYMIMHkGrfAxnbSeb2YLMGFMg6g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.27': - resolution: {integrity: sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==} + '@aws-sdk/credential-provider-http@3.972.31': + resolution: {integrity: sha512-TR2/lQ3qKFj2EOrsiASzemsNEz2uzZ/SUBf48+U4Cr9a/FZlHfH/hwAeBJNBp1gMyJNxROJZhT3dn1cO+jnYfQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.29': - resolution: {integrity: sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==} + '@aws-sdk/credential-provider-ini@3.972.33': + resolution: {integrity: sha512-UwdbJbOrgnOxZbshaNZ4DzX35h5wQd33MNYTGzWhN3ORG9lG9KQbDX6l6tDJSAdaGTktJoZPSritmUoW1rYkRA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.29': - resolution: {integrity: sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==} + '@aws-sdk/credential-provider-login@3.972.33': + resolution: {integrity: sha512-WyZuPVoDM1HGNl41eVg8HSSXIB+FGkuuK63GhDbh4TMdfWU03AciWvF/QqOVWvJtWVYaLddANJ+aUklVr2ieuw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.30': - resolution: {integrity: sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==} + '@aws-sdk/credential-provider-node@3.972.34': + resolution: {integrity: sha512-sPcisURibKU4x0PCWJkWF1KJYm49Cph9dCn/PAnG5FU0wq5Id3g2v7RuEWAtNlKv1Af4gUJYBVGOeNpSEEx41A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.25': - resolution: {integrity: sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==} + '@aws-sdk/credential-provider-process@3.972.29': + resolution: {integrity: sha512-DURisqWS3bUgiwMXTmzymVNGlcRW0FnbPZ3SZknhmxnCXm3n9idkTJ6T+Uir359KRKtJNFLRViskk8HsSVLi1w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.29': - resolution: {integrity: sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==} + '@aws-sdk/credential-provider-sso@3.972.33': + resolution: {integrity: sha512-9y9obU4IQWru9f+NiiscUeyCe5ZmQav4FKEb1qfUNrik/C3BzBGUnHQWyPEyXjOX9cb+vx1TYx0qZBtinKdzTA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.29': - resolution: {integrity: sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==} + '@aws-sdk/credential-provider-web-identity@3.972.33': + resolution: {integrity: sha512-RazhlN0YAkna2T2p2v4YuuRlVBVRNo8V0SL+9JePTWDndEUAeOBAjYeQfAMbtDyCh120+zA0Op6V0jS4dw2+iw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.9': - resolution: {integrity: sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==} + '@aws-sdk/middleware-host-header@3.972.10': + resolution: {integrity: sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.9': - resolution: {integrity: sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==} + '@aws-sdk/middleware-logger@3.972.10': + resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.10': - resolution: {integrity: sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==} + '@aws-sdk/middleware-recursion-detection@3.972.11': + resolution: {integrity: sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.29': - resolution: {integrity: sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==} + '@aws-sdk/middleware-sdk-s3@3.972.32': + resolution: {integrity: sha512-dc2O2x0V5pGJhmdQYQveUIFtMZsur7GrGuSgoKM4oQJuEcfvwnJ3sj+ip6WnxR5l6TrX5zkl4KgcgswOy3wAzQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.19': - resolution: {integrity: sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==} + '@aws-sdk/middleware-user-agent@3.972.33': + resolution: {integrity: sha512-mqtT3Fo7xanWMk2SbAcKLGGI/q1GHWNrExBj7cnWP2W2mkTMheXB4ntJvwPZ1UxPrQobrsv2dWFXmaOJeSOiDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.11': - resolution: {integrity: sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==} + '@aws-sdk/nested-clients@3.997.1': + resolution: {integrity: sha512-Afc9hc2WZs3X4Jb8dnxyuYiZsLoWRO51roTCRf497gPnAKN2WRdXANu1vaVCTzwnDMOYFXb/cYv4ZSjxqAqcKA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1026.0': - resolution: {integrity: sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==} + '@aws-sdk/region-config-resolver@3.972.13': + resolution: {integrity: sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.7': - resolution: {integrity: sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==} + '@aws-sdk/signature-v4-multi-region@3.996.20': + resolution: {integrity: sha512-MEj6DhEcaO8RgVtFCJ+xpCQnZC3Iesr09avdY75qkMQfckQULu447IegK7Rs1MCGerVBfKnJQ4q+pQq9hI5lng==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.6': - resolution: {integrity: sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==} + '@aws-sdk/token-providers@3.1034.0': + resolution: {integrity: sha512-8E+KGcD4ET0H9FXJ2/ZWbfFnQNYEkTZZYJxAs1lkdJlve1AYuqaydInIFfvNgoz5GbYtzbK8/ugsSMu5wPm6kA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.8': + resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-arn-parser@3.972.3': + resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.996.8': + resolution: {integrity: sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.5': resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.9': - resolution: {integrity: sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==} + '@aws-sdk/util-user-agent-browser@3.972.10': + resolution: {integrity: sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==} - '@aws-sdk/util-user-agent-node@3.973.15': - resolution: {integrity: sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==} + '@aws-sdk/util-user-agent-node@3.973.19': + resolution: {integrity: sha512-ZAfHjpzdbrzkAftC139JoYGfXzDh5HY+AxRzw8pGJ8cULsf+l721sKAMK8mV5NvRETaW/BwghSwQhGgoNgrxMw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -239,8 +251,8 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.972.17': - resolution: {integrity: sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==} + '@aws-sdk/xml-builder@3.972.18': + resolution: {integrity: sha512-BMDNVG1ETXRhl1tnisQiYBef3RShJ1kfZA7x7afivTFMLirfHNTb6U71K569HNXhSXbQZsweHvSDZ6euBw8hPA==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.4': @@ -415,8 +427,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@lastdotnet/purrikey@git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8': - resolution: {commit: 3d10b79b567c52c0c37e630800dae6c7059bd9b8, repo: git@github.com:OriginProtocol/purrikey.git, type: git} + '@lastdotnet/purrikey@https://codeload.github.com/OriginProtocol/purrikey/tar.gz/3d10b79b567c52c0c37e630800dae6c7059bd9b8': + resolution: {tarball: https://codeload.github.com/OriginProtocol/purrikey/tar.gz/3d10b79b567c52c0c37e630800dae6c7059bd9b8} version: 1.0.0 engines: {node: '>=14.0.0'} peerDependencies: @@ -640,128 +652,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rollup/rollup-android-arm-eabi@4.60.2': + resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rollup/rollup-android-arm64@4.60.2': + resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rollup/rollup-darwin-arm64@4.60.2': + resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rollup/rollup-darwin-x64@4.60.2': + resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + '@rollup/rollup-freebsd-arm64@4.60.2': + resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rollup/rollup-freebsd-x64@4.60.2': + resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rollup/rollup-linux-arm64-gnu@4.60.2': + resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rollup/rollup-linux-arm64-musl@4.60.2': + resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + '@rollup/rollup-linux-loong64-gnu@4.60.2': + resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + '@rollup/rollup-linux-loong64-musl@4.60.2': + resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rollup/rollup-linux-ppc64-musl@4.60.2': + resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + '@rollup/rollup-linux-riscv64-musl@4.60.2': + resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rollup/rollup-linux-s390x-gnu@4.60.2': + resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rollup/rollup-linux-x64-gnu@4.60.2': + resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rollup/rollup-linux-x64-musl@4.60.2': + resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + '@rollup/rollup-openbsd-x64@4.60.2': + resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rollup/rollup-openharmony-arm64@4.60.2': + resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rollup/rollup-win32-arm64-msvc@4.60.2': + resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + '@rollup/rollup-win32-ia32-msvc@4.60.2': + resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rollup/rollup-win32-x64-gnu@4.60.2': + resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + '@rollup/rollup-win32-x64-msvc@4.60.2': + resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} cpu: [x64] os: [win32] @@ -817,48 +829,48 @@ packages: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} - '@smithy/config-resolver@4.4.14': - resolution: {integrity: sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==} + '@smithy/config-resolver@4.4.17': + resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.14': - resolution: {integrity: sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==} + '@smithy/core@3.23.16': + resolution: {integrity: sha512-JStomOrINQA1VqNEopLsgcdgwd42au7mykKqVr30XFw89wLt9sDxJDi4djVPRwQmmzyTGy/uOvTc2ultMpFi1w==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.13': - resolution: {integrity: sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==} + '@smithy/credential-provider-imds@4.2.14': + resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.13': - resolution: {integrity: sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==} + '@smithy/eventstream-codec@4.2.14': + resolution: {integrity: sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.13': - resolution: {integrity: sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==} + '@smithy/eventstream-serde-browser@4.2.14': + resolution: {integrity: sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.13': - resolution: {integrity: sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==} + '@smithy/eventstream-serde-config-resolver@4.3.14': + resolution: {integrity: sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.13': - resolution: {integrity: sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==} + '@smithy/eventstream-serde-node@4.2.14': + resolution: {integrity: sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.13': - resolution: {integrity: sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==} + '@smithy/eventstream-serde-universal@4.2.14': + resolution: {integrity: sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.16': - resolution: {integrity: sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==} + '@smithy/fetch-http-handler@5.3.17': + resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.13': - resolution: {integrity: sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==} + '@smithy/hash-node@4.2.14': + resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.13': - resolution: {integrity: sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==} + '@smithy/invalid-dependency@4.2.14': + resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -869,72 +881,72 @@ packages: resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.13': - resolution: {integrity: sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==} + '@smithy/middleware-content-length@4.2.14': + resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.29': - resolution: {integrity: sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==} + '@smithy/middleware-endpoint@4.4.31': + resolution: {integrity: sha512-KJPdCIN2kOE2aGmqZd7eUTr4WQwOGgtLWgUkswGJggs7rBcQYQjcZMEDa3C0DwbOiXS9L8/wDoQHkfxBYLfiLw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.5.1': - resolution: {integrity: sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==} + '@smithy/middleware-retry@4.5.4': + resolution: {integrity: sha512-/z7nIFK+ZRW3Ie/l3NEVGdy34LvmEOzBrtBAvgWZ/4PrKX0xP3kWm8pkfcwUk523SqxZhdbQP9JSXgjF77Uhpw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.17': - resolution: {integrity: sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==} + '@smithy/middleware-serde@4.2.19': + resolution: {integrity: sha512-Q6y+W9h3iYVMCKWDoVge+OC1LKFqbEKaq8SIWG2X2bWJRpd/6dDLyICcNLT6PbjH3Rr6bmg/SeDB25XFOFfeEw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.13': - resolution: {integrity: sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==} + '@smithy/middleware-stack@4.2.14': + resolution: {integrity: sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.13': - resolution: {integrity: sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==} + '@smithy/node-config-provider@4.3.14': + resolution: {integrity: sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.5.2': - resolution: {integrity: sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==} + '@smithy/node-http-handler@4.6.0': + resolution: {integrity: sha512-P734cAoTFtuGfWa/R3jgBnGlURt2w9bYEBwQNMKf58sRM9RShirB2mKwLsVP+jlG/wxpCu8abv8NxdUts8tdLA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.13': - resolution: {integrity: sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==} + '@smithy/property-provider@4.2.14': + resolution: {integrity: sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.13': - resolution: {integrity: sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==} + '@smithy/protocol-http@5.3.14': + resolution: {integrity: sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.13': - resolution: {integrity: sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==} + '@smithy/querystring-builder@4.2.14': + resolution: {integrity: sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.13': - resolution: {integrity: sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==} + '@smithy/querystring-parser@4.2.14': + resolution: {integrity: sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.13': - resolution: {integrity: sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==} + '@smithy/service-error-classification@4.3.0': + resolution: {integrity: sha512-9jKsBYQRPR0xBLgc2415RsA5PIcP2sis4oBdN9s0D13cg1B1284mNTjx9Yc+BEERXzuPm5ObktI96OxsKh8E9A==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.8': - resolution: {integrity: sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==} + '@smithy/shared-ini-file-loader@4.4.9': + resolution: {integrity: sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.13': - resolution: {integrity: sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==} + '@smithy/signature-v4@5.3.14': + resolution: {integrity: sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.9': - resolution: {integrity: sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==} + '@smithy/smithy-client@4.12.12': + resolution: {integrity: sha512-daO7SJn4eM6ArbmrEs+/BTbH7af8AEbSL3OMQdcRvvn8tuUcR5rU2n6DgxIV53aXMS42uwK8NgKKCh5XgqYOPQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.14.0': - resolution: {integrity: sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==} + '@smithy/types@4.14.1': + resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.13': - resolution: {integrity: sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==} + '@smithy/url-parser@4.2.14': + resolution: {integrity: sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.2': @@ -961,32 +973,32 @@ packages: resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.45': - resolution: {integrity: sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==} + '@smithy/util-defaults-mode-browser@4.3.48': + resolution: {integrity: sha512-hxVRVPYaRDWa6YQdse1aWX1qrksmLsvNyGBKdc32q4jFzSjxYVNWfstknAfR228TnzS4tzgswXRuYIbhXBuXFQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.49': - resolution: {integrity: sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==} + '@smithy/util-defaults-mode-node@4.2.53': + resolution: {integrity: sha512-ybgCk+9JdBq8pYC8Y6U5fjyS8e4sboyAShetxPNL0rRBtaVl56GSFAxsolVBIea1tXR4LPIzL8i6xqmcf0+DCQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.3.4': - resolution: {integrity: sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==} + '@smithy/util-endpoints@3.4.2': + resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.2': resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.13': - resolution: {integrity: sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==} + '@smithy/util-middleware@4.2.14': + resolution: {integrity: sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.3.1': - resolution: {integrity: sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==} + '@smithy/util-retry@4.3.3': + resolution: {integrity: sha512-idjUvd4M9Jj6rXkhqw4H4reHoweuK4ZxYWyOrEp4N2rOF5VtaOlQGLDQJva/8WanNXk9ScQtsAb7o5UHGvFm4A==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.22': - resolution: {integrity: sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==} + '@smithy/util-stream@4.5.24': + resolution: {integrity: sha512-na5vv2mBSDzXewLEEoWGI7LQQkfpmFEomBsmOpzLFjqGctm0iMwXY5lAwesY9pIaErkccW0qzEOUcYP+WKneXg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.2': @@ -1001,8 +1013,8 @@ packages: resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.15': - resolution: {integrity: sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg==} + '@smithy/util-waiter@4.2.16': + resolution: {integrity: sha512-GtclrKoZ3Lt7jPQ7aTIYKfjY92OgceScftVnkTsG8e1KV8rkvZgN+ny6YSRhd9hxB8rZtwVbmln7NTvE5O3GmQ==} engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.2': @@ -1012,8 +1024,8 @@ packages: '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - '@talos/client@git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client': - resolution: {commit: de368268930f62604ecc47e8a8486cb5c6ba22e9, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} + '@talos/client@git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client': + resolution: {commit: 854cc43044ad222e83b7d1a3aa47453bae5bd475, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} version: 0.0.1 '@tsconfig/node10@1.0.12': @@ -1171,8 +1183,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1210,11 +1222,11 @@ packages: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.0.3: - resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -1644,8 +1656,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-xml-builder@1.1.4: - resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-builder@1.1.5: + resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} fast-xml-parser@5.5.8: resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} @@ -1686,8 +1698,8 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1829,10 +1841,6 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} @@ -2024,8 +2032,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -2069,8 +2077,8 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@11.3.3: - resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} lru_map@0.3.3: @@ -2190,8 +2198,8 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - ox@0.14.17: - resolution: {integrity: sha512-jOzNb2Wlfzsr8z/GoCtd1bf6OSRuWuysvbhnHGD+7fV1WRbcBR6B0RYoe3xWnUedF7zp4l5APmS7CzAhUok/lA==} + ox@0.14.20: + resolution: {integrity: sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -2319,8 +2327,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -2388,8 +2396,8 @@ packages: resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -2427,8 +2435,8 @@ packages: rollup: optional: true - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + rollup@4.60.2: + resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2681,8 +2689,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - viem@2.48.3: - resolution: {integrity: sha512-KFuwd5GN5bXiqOrv8amWiim2kR+tS/NveG/MtURSRS7PsuS9RFKUaCNlg+3nFx6bF/2pcOQVAVwUX4dkQ9/JqA==} + viem@2.48.4: + resolution: {integrity: sha512-mReP/rgY2P+WeeRSG4sUvccCLKfyAW1C73Y3KkobAqgzYmVna9qyUMNE44xIUkDtfvRuC33r24UhF4baBYovsg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -2931,7 +2939,7 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/sha256-browser@5.2.0': @@ -2939,7 +2947,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 '@aws-sdk/util-locate-window': 3.965.5 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -2947,13 +2955,13 @@ snapshots: '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -2962,354 +2970,386 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-kms@3.1028.0': + '@aws-sdk/client-kms@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.27 - '@aws-sdk/credential-provider-node': 3.972.30 - '@aws-sdk/middleware-host-header': 3.972.9 - '@aws-sdk/middleware-logger': 3.972.9 - '@aws-sdk/middleware-recursion-detection': 3.972.10 - '@aws-sdk/middleware-user-agent': 3.972.29 - '@aws-sdk/region-config-resolver': 3.972.11 - '@aws-sdk/types': 3.973.7 - '@aws-sdk/util-endpoints': 3.996.6 - '@aws-sdk/util-user-agent-browser': 3.972.9 - '@aws-sdk/util-user-agent-node': 3.973.15 - '@smithy/config-resolver': 4.4.14 - '@smithy/core': 3.23.14 - '@smithy/fetch-http-handler': 5.3.16 - '@smithy/hash-node': 4.2.13 - '@smithy/invalid-dependency': 4.2.13 - '@smithy/middleware-content-length': 4.2.13 - '@smithy/middleware-endpoint': 4.4.29 - '@smithy/middleware-retry': 4.5.1 - '@smithy/middleware-serde': 4.2.17 - '@smithy/middleware-stack': 4.2.13 - '@smithy/node-config-provider': 4.3.13 - '@smithy/node-http-handler': 4.5.2 - '@smithy/protocol-http': 5.3.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.45 - '@smithy/util-defaults-mode-node': 4.2.49 - '@smithy/util-endpoints': 3.3.4 - '@smithy/util-middleware': 4.2.13 - '@smithy/util-retry': 4.3.1 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-lambda@3.1028.0': + '@aws-sdk/client-lambda@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.27 - '@aws-sdk/credential-provider-node': 3.972.30 - '@aws-sdk/middleware-host-header': 3.972.9 - '@aws-sdk/middleware-logger': 3.972.9 - '@aws-sdk/middleware-recursion-detection': 3.972.10 - '@aws-sdk/middleware-user-agent': 3.972.29 - '@aws-sdk/region-config-resolver': 3.972.11 - '@aws-sdk/types': 3.973.7 - '@aws-sdk/util-endpoints': 3.996.6 - '@aws-sdk/util-user-agent-browser': 3.972.9 - '@aws-sdk/util-user-agent-node': 3.973.15 - '@smithy/config-resolver': 4.4.14 - '@smithy/core': 3.23.14 - '@smithy/eventstream-serde-browser': 4.2.13 - '@smithy/eventstream-serde-config-resolver': 4.3.13 - '@smithy/eventstream-serde-node': 4.2.13 - '@smithy/fetch-http-handler': 5.3.16 - '@smithy/hash-node': 4.2.13 - '@smithy/invalid-dependency': 4.2.13 - '@smithy/middleware-content-length': 4.2.13 - '@smithy/middleware-endpoint': 4.4.29 - '@smithy/middleware-retry': 4.5.1 - '@smithy/middleware-serde': 4.2.17 - '@smithy/middleware-stack': 4.2.13 - '@smithy/node-config-provider': 4.3.13 - '@smithy/node-http-handler': 4.5.2 - '@smithy/protocol-http': 5.3.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.45 - '@smithy/util-defaults-mode-node': 4.2.49 - '@smithy/util-endpoints': 3.3.4 - '@smithy/util-middleware': 4.2.13 - '@smithy/util-retry': 4.3.1 - '@smithy/util-stream': 4.5.22 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 - '@smithy/util-waiter': 4.2.15 + '@smithy/util-waiter': 4.2.16 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.27': - dependencies: - '@aws-sdk/types': 3.973.7 - '@aws-sdk/xml-builder': 3.972.17 - '@smithy/core': 3.23.14 - '@smithy/node-config-provider': 4.3.13 - '@smithy/property-provider': 4.2.13 - '@smithy/protocol-http': 5.3.13 - '@smithy/signature-v4': 5.3.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 + '@aws-sdk/core@3.974.3': + dependencies: + '@aws-sdk/types': 3.973.8 + '@aws-sdk/xml-builder': 3.972.18 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.13 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.25': + '@aws-sdk/credential-provider-env@3.972.29': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.27': - dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/types': 3.973.7 - '@smithy/fetch-http-handler': 5.3.16 - '@smithy/node-http-handler': 4.5.2 - '@smithy/property-provider': 4.2.13 - '@smithy/protocol-http': 5.3.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 - '@smithy/util-stream': 4.5.22 + '@aws-sdk/credential-provider-http@3.972.31': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.0 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.24 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.29': - dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/credential-provider-env': 3.972.25 - '@aws-sdk/credential-provider-http': 3.972.27 - '@aws-sdk/credential-provider-login': 3.972.29 - '@aws-sdk/credential-provider-process': 3.972.25 - '@aws-sdk/credential-provider-sso': 3.972.29 - '@aws-sdk/credential-provider-web-identity': 3.972.29 - '@aws-sdk/nested-clients': 3.996.19 - '@aws-sdk/types': 3.973.7 - '@smithy/credential-provider-imds': 4.2.13 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/credential-provider-ini@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-login': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.29': + '@aws-sdk/credential-provider-login@3.972.33': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/nested-clients': 3.996.19 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/protocol-http': 5.3.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.30': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.25 - '@aws-sdk/credential-provider-http': 3.972.27 - '@aws-sdk/credential-provider-ini': 3.972.29 - '@aws-sdk/credential-provider-process': 3.972.25 - '@aws-sdk/credential-provider-sso': 3.972.29 - '@aws-sdk/credential-provider-web-identity': 3.972.29 - '@aws-sdk/types': 3.973.7 - '@smithy/credential-provider-imds': 4.2.13 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/credential-provider-node@3.972.34': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-ini': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.25': + '@aws-sdk/credential-provider-process@3.972.29': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.29': + '@aws-sdk/credential-provider-sso@3.972.33': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/nested-clients': 3.996.19 - '@aws-sdk/token-providers': 3.1026.0 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/token-providers': 3.1034.0 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.29': + '@aws-sdk/credential-provider-web-identity@3.972.33': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/nested-clients': 3.996.19 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.972.9': + '@aws-sdk/middleware-host-header@3.972.10': dependencies: - '@aws-sdk/types': 3.973.7 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.9': + '@aws-sdk/middleware-logger@3.972.10': dependencies: - '@aws-sdk/types': 3.973.7 - '@smithy/types': 4.14.0 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.10': + '@aws-sdk/middleware-recursion-detection@3.972.11': dependencies: - '@aws-sdk/types': 3.973.7 + '@aws-sdk/types': 3.973.8 '@aws/lambda-invoke-store': 0.2.4 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.32': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.29': + '@aws-sdk/middleware-user-agent@3.972.33': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/types': 3.973.7 - '@aws-sdk/util-endpoints': 3.996.6 - '@smithy/core': 3.23.14 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 - '@smithy/util-retry': 4.3.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@smithy/core': 3.23.16 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-retry': 4.3.3 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.19': + '@aws-sdk/nested-clients@3.997.1': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.27 - '@aws-sdk/middleware-host-header': 3.972.9 - '@aws-sdk/middleware-logger': 3.972.9 - '@aws-sdk/middleware-recursion-detection': 3.972.10 - '@aws-sdk/middleware-user-agent': 3.972.29 - '@aws-sdk/region-config-resolver': 3.972.11 - '@aws-sdk/types': 3.973.7 - '@aws-sdk/util-endpoints': 3.996.6 - '@aws-sdk/util-user-agent-browser': 3.972.9 - '@aws-sdk/util-user-agent-node': 3.973.15 - '@smithy/config-resolver': 4.4.14 - '@smithy/core': 3.23.14 - '@smithy/fetch-http-handler': 5.3.16 - '@smithy/hash-node': 4.2.13 - '@smithy/invalid-dependency': 4.2.13 - '@smithy/middleware-content-length': 4.2.13 - '@smithy/middleware-endpoint': 4.4.29 - '@smithy/middleware-retry': 4.5.1 - '@smithy/middleware-serde': 4.2.17 - '@smithy/middleware-stack': 4.2.13 - '@smithy/node-config-provider': 4.3.13 - '@smithy/node-http-handler': 4.5.2 - '@smithy/protocol-http': 5.3.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/signature-v4-multi-region': 3.996.20 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.45 - '@smithy/util-defaults-mode-node': 4.2.49 - '@smithy/util-endpoints': 3.3.4 - '@smithy/util-middleware': 4.2.13 - '@smithy/util-retry': 4.3.1 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.11': + '@aws-sdk/region-config-resolver@3.972.13': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/config-resolver': 4.4.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.20': dependencies: - '@aws-sdk/types': 3.973.7 - '@smithy/config-resolver': 4.4.14 - '@smithy/node-config-provider': 4.3.13 - '@smithy/types': 4.14.0 + '@aws-sdk/middleware-sdk-s3': 3.972.32 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1026.0': + '@aws-sdk/token-providers@3.1034.0': dependencies: - '@aws-sdk/core': 3.973.27 - '@aws-sdk/nested-clients': 3.996.19 - '@aws-sdk/types': 3.973.7 - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.973.7': + '@aws-sdk/types@3.973.8': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.6': + '@aws-sdk/util-arn-parser@3.972.3': dependencies: - '@aws-sdk/types': 3.973.7 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 - '@smithy/util-endpoints': 3.3.4 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.996.8': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-endpoints': 3.4.2 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.9': + '@aws-sdk/util-user-agent-browser@3.972.10': dependencies: - '@aws-sdk/types': 3.973.7 - '@smithy/types': 4.14.0 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.15': + '@aws-sdk/util-user-agent-node@3.973.19': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.29 - '@aws-sdk/types': 3.973.7 - '@smithy/node-config-provider': 4.3.13 - '@smithy/types': 4.14.0 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 @@ -3317,9 +3357,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.17': + '@aws-sdk/xml-builder@3.972.18': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 fast-xml-parser: 5.5.8 tslib: 2.8.1 @@ -3649,9 +3689,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@lastdotnet/purrikey@git+https://git@github.com:OriginProtocol/purrikey.git#3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2)': + '@lastdotnet/purrikey@https://codeload.github.com/OriginProtocol/purrikey/tar.gz/3d10b79b567c52c0c37e630800dae6c7059bd9b8(ethers@6.13.2)': dependencies: - '@aws-sdk/client-kms': 3.1028.0 + '@aws-sdk/client-kms': 3.1034.0 ethers: 6.13.2 tslib: 2.8.1 transitivePeerDependencies: @@ -3776,7 +3816,7 @@ snapshots: '@openzeppelin/defender-sdk-account-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3786,7 +3826,7 @@ snapshots: '@openzeppelin/defender-sdk-action-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 dotenv: 16.6.1 glob: 11.1.0 jszip: 3.10.1 @@ -3809,7 +3849,7 @@ snapshots: '@openzeppelin/defender-sdk-approval-process-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3818,10 +3858,10 @@ snapshots: '@openzeppelin/defender-sdk-base-client@2.7.1': dependencies: - '@aws-sdk/client-lambda': 3.1028.0 + '@aws-sdk/client-lambda': 3.1034.0 amazon-cognito-identity-js: 6.3.16 async-retry: 1.3.3 - axios: 1.15.0 + axios: 1.15.2 transitivePeerDependencies: - aws-crt - debug @@ -3830,7 +3870,7 @@ snapshots: '@openzeppelin/defender-sdk-deploy-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3840,7 +3880,7 @@ snapshots: '@openzeppelin/defender-sdk-key-value-store-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 fs-extra: 11.3.4 lodash: 4.18.1 transitivePeerDependencies: @@ -3851,7 +3891,7 @@ snapshots: '@openzeppelin/defender-sdk-monitor-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 ethers: 6.13.2 lodash: 4.18.1 transitivePeerDependencies: @@ -3864,7 +3904,7 @@ snapshots: '@openzeppelin/defender-sdk-network-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3874,7 +3914,7 @@ snapshots: '@openzeppelin/defender-sdk-notification-channel-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3884,7 +3924,7 @@ snapshots: '@openzeppelin/defender-sdk-proposal-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 ethers: 6.13.2 lodash: 4.18.1 transitivePeerDependencies: @@ -3897,7 +3937,7 @@ snapshots: '@openzeppelin/defender-sdk-relay-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3907,7 +3947,7 @@ snapshots: '@openzeppelin/defender-sdk-relay-group-client@2.7.1': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.1 - axios: 1.15.0 + axios: 1.15.2 lodash: 4.18.1 transitivePeerDependencies: - aws-crt @@ -3925,7 +3965,7 @@ snapshots: '@ethersproject/strings': 5.8.0 '@openzeppelin/defender-sdk-base-client': 2.7.1 amazon-cognito-identity-js: 6.3.16 - axios: 1.15.0 + axios: 1.15.2 ethers: 6.13.2 lodash: 4.18.1 web3: 4.16.0(typescript@5.9.3)(zod@3.25.76) @@ -3964,114 +4004,114 @@ snapshots: - web3-core - web3-utils - '@rollup/plugin-commonjs@25.0.8(rollup@4.60.1)': + '@rollup/plugin-commonjs@25.0.8(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.21 optionalDependencies: - rollup: 4.60.1 + rollup: 4.60.2 - '@rollup/plugin-json@6.1.0(rollup@4.60.1)': + '@rollup/plugin-json@6.1.0(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) optionalDependencies: - rollup: 4.60.1 + rollup: 4.60.2 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.60.1)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.11 + resolve: 1.22.12 optionalDependencies: - rollup: 4.60.1 + rollup: 4.60.2 - '@rollup/pluginutils@5.3.0(rollup@4.60.1)': + '@rollup/pluginutils@5.3.0(rollup@4.60.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.1 + rollup: 4.60.2 - '@rollup/rollup-android-arm-eabi@4.60.1': + '@rollup/rollup-android-arm-eabi@4.60.2': optional: true - '@rollup/rollup-android-arm64@4.60.1': + '@rollup/rollup-android-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-arm64@4.60.1': + '@rollup/rollup-darwin-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-x64@4.60.1': + '@rollup/rollup-darwin-x64@4.60.2': optional: true - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rollup/rollup-freebsd-arm64@4.60.2': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rollup/rollup-freebsd-x64@4.60.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rollup/rollup-linux-arm-musleabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rollup/rollup-linux-arm64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rollup/rollup-linux-arm64-musl@4.60.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rollup/rollup-linux-loong64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rollup/rollup-linux-loong64-musl@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rollup/rollup-linux-ppc64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rollup/rollup-linux-ppc64-musl@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rollup/rollup-linux-riscv64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rollup/rollup-linux-riscv64-musl@4.60.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rollup/rollup-linux-s390x-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': + '@rollup/rollup-openbsd-x64@4.60.2': optional: true - '@rollup/rollup-openharmony-arm64@4.60.1': + '@rollup/rollup-openharmony-arm64@4.60.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.1': + '@rollup/rollup-win32-arm64-msvc@4.60.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.1': + '@rollup/rollup-win32-ia32-msvc@4.60.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.1': + '@rollup/rollup-win32-x64-gnu@4.60.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.1': + '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true '@scure/base@1.1.9': {} @@ -4160,84 +4200,84 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@smithy/config-resolver@4.4.14': + '@smithy/config-resolver@4.4.17': dependencies: - '@smithy/node-config-provider': 4.3.13 - '@smithy/types': 4.14.0 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 '@smithy/util-config-provider': 4.2.2 - '@smithy/util-endpoints': 3.3.4 - '@smithy/util-middleware': 4.2.13 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 - '@smithy/core@3.23.14': + '@smithy/core@3.23.16': dependencies: - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.13 - '@smithy/util-stream': 4.5.22 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.13': + '@smithy/credential-provider-imds@4.2.14': dependencies: - '@smithy/node-config-provider': 4.3.13 - '@smithy/property-provider': 4.2.13 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.13': + '@smithy/eventstream-codec@4.2.14': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.13': + '@smithy/eventstream-serde-browser@4.2.14': dependencies: - '@smithy/eventstream-serde-universal': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/eventstream-serde-universal': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.13': + '@smithy/eventstream-serde-config-resolver@4.3.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.13': + '@smithy/eventstream-serde-node@4.2.14': dependencies: - '@smithy/eventstream-serde-universal': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/eventstream-serde-universal': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.13': + '@smithy/eventstream-serde-universal@4.2.14': dependencies: - '@smithy/eventstream-codec': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/eventstream-codec': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.16': + '@smithy/fetch-http-handler@5.3.17': dependencies: - '@smithy/protocol-http': 5.3.13 - '@smithy/querystring-builder': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/querystring-builder': 4.2.14 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/hash-node@4.2.13': + '@smithy/hash-node@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 '@smithy/util-buffer-from': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.13': + '@smithy/invalid-dependency@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -4248,121 +4288,121 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.13': + '@smithy/middleware-content-length@4.2.14': dependencies: - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.29': + '@smithy/middleware-endpoint@4.4.31': dependencies: - '@smithy/core': 3.23.14 - '@smithy/middleware-serde': 4.2.17 - '@smithy/node-config-provider': 4.3.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 - '@smithy/url-parser': 4.2.13 - '@smithy/util-middleware': 4.2.13 + '@smithy/core': 3.23.16 + '@smithy/middleware-serde': 4.2.19 + '@smithy/node-config-provider': 4.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 - '@smithy/middleware-retry@4.5.1': + '@smithy/middleware-retry@4.5.4': dependencies: - '@smithy/core': 3.23.14 - '@smithy/node-config-provider': 4.3.13 - '@smithy/protocol-http': 5.3.13 - '@smithy/service-error-classification': 4.2.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 - '@smithy/util-middleware': 4.2.13 - '@smithy/util-retry': 4.3.1 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/service-error-classification': 4.3.0 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.17': + '@smithy/middleware-serde@4.2.19': dependencies: - '@smithy/core': 3.23.14 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 + '@smithy/core': 3.23.16 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.13': + '@smithy/middleware-stack@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.13': + '@smithy/node-config-provider@4.3.14': dependencies: - '@smithy/property-provider': 4.2.13 - '@smithy/shared-ini-file-loader': 4.4.8 - '@smithy/types': 4.14.0 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.5.2': + '@smithy/node-http-handler@4.6.0': dependencies: - '@smithy/protocol-http': 5.3.13 - '@smithy/querystring-builder': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/querystring-builder': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.13': + '@smithy/property-provider@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.13': + '@smithy/protocol-http@5.3.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.13': + '@smithy/querystring-builder@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 '@smithy/util-uri-escape': 4.2.2 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.13': + '@smithy/querystring-parser@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.13': + '@smithy/service-error-classification@4.3.0': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 - '@smithy/shared-ini-file-loader@4.4.8': + '@smithy/shared-ini-file-loader@4.4.9': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/signature-v4@5.3.13': + '@smithy/signature-v4@5.3.14': dependencies: '@smithy/is-array-buffer': 4.2.2 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-middleware': 4.2.13 + '@smithy/util-middleware': 4.2.14 '@smithy/util-uri-escape': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/smithy-client@4.12.9': + '@smithy/smithy-client@4.12.12': dependencies: - '@smithy/core': 3.23.14 - '@smithy/middleware-endpoint': 4.4.29 - '@smithy/middleware-stack': 4.2.13 - '@smithy/protocol-http': 5.3.13 - '@smithy/types': 4.14.0 - '@smithy/util-stream': 4.5.22 + '@smithy/core': 3.23.16 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-stack': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.24 tslib: 2.8.1 - '@smithy/types@4.14.0': + '@smithy/types@4.14.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.13': + '@smithy/url-parser@4.2.14': dependencies: - '@smithy/querystring-parser': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/querystring-parser': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/util-base64@4.3.2': @@ -4393,49 +4433,49 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.45': + '@smithy/util-defaults-mode-browser@4.3.48': dependencies: - '@smithy/property-provider': 4.2.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 + '@smithy/property-provider': 4.2.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.49': + '@smithy/util-defaults-mode-node@4.2.53': dependencies: - '@smithy/config-resolver': 4.4.14 - '@smithy/credential-provider-imds': 4.2.13 - '@smithy/node-config-provider': 4.3.13 - '@smithy/property-provider': 4.2.13 - '@smithy/smithy-client': 4.12.9 - '@smithy/types': 4.14.0 + '@smithy/config-resolver': 4.4.17 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.3.4': + '@smithy/util-endpoints@3.4.2': dependencies: - '@smithy/node-config-provider': 4.3.13 - '@smithy/types': 4.14.0 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.13': + '@smithy/util-middleware@4.2.14': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-retry@4.3.1': + '@smithy/util-retry@4.3.3': dependencies: - '@smithy/service-error-classification': 4.2.13 - '@smithy/types': 4.14.0 + '@smithy/service-error-classification': 4.3.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.22': + '@smithy/util-stream@4.5.24': dependencies: - '@smithy/fetch-http-handler': 5.3.16 - '@smithy/node-http-handler': 4.5.2 - '@smithy/types': 4.14.0 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.0 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 '@smithy/util-buffer-from': 4.2.2 '@smithy/util-hex-encoding': 4.2.2 @@ -4456,9 +4496,9 @@ snapshots: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-waiter@4.2.15': + '@smithy/util-waiter@4.2.16': dependencies: - '@smithy/types': 4.14.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/uuid@1.1.2': @@ -4467,7 +4507,7 @@ snapshots: '@solidity-parser/parser@0.18.0': {} - '@talos/client@git+https://git@github.com:oplabs/talos.git#de368268930f62604ecc47e8a8486cb5c6ba22e9&path:packages/client(typescript@5.9.3)(zod@3.25.76)': + '@talos/client@git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client(typescript@5.9.3)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.14) croner: 9.1.0 @@ -4476,7 +4516,7 @@ snapshots: ethers-v6: ethers@6.13.2 hono: 4.12.14 pg: 8.20.0 - viem: 2.48.3(typescript@5.9.3)(zod@3.25.76) + viem: 2.48.4(typescript@5.9.3)(zod@3.25.76) transitivePeerDependencies: - '@aws-sdk/client-rds-data' - '@cloudflare/workers-types' @@ -4656,9 +4696,9 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios@1.15.0: + axios@1.15.2: dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -4697,12 +4737,12 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - brace-expansion@1.1.13: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.3: + brace-expansion@2.1.0: dependencies: balanced-match: 1.0.2 @@ -4970,7 +5010,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 escalade@3.2.0: {} @@ -5152,13 +5192,13 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-xml-builder@1.1.4: + fast-xml-builder@1.1.5: dependencies: path-expression-matcher: 1.5.0 fast-xml-parser@5.5.8: dependencies: - fast-xml-builder: 1.1.4 + fast-xml-builder: 1.1.5 path-expression-matcher: 1.5.0 strnum: 2.2.3 @@ -5193,7 +5233,7 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.15.11(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: debug: 4.4.3(supports-color@8.1.1) @@ -5211,7 +5251,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 fp-ts@1.19.3: {} @@ -5219,7 +5259,7 @@ snapshots: fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-extra@7.0.1: @@ -5251,7 +5291,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -5383,10 +5423,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -5465,7 +5501,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-docker@2.2.1: {} @@ -5561,7 +5597,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5616,7 +5652,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - lru-cache@11.3.3: {} + lru-cache@11.3.5: {} lru_map@0.3.3: {} @@ -5662,11 +5698,11 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.13 + brace-expansion: 1.1.14 minimatch@5.1.9: dependencies: - brace-expansion: 2.0.3 + brace-expansion: 2.1.0 minipass@7.1.3: {} @@ -5745,7 +5781,7 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.14.17(typescript@5.9.3)(zod@3.25.76): + ox@0.14.20(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -5792,7 +5828,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.3 + lru-cache: 11.3.5 minipass: 7.1.3 pathval@1.1.1: {} @@ -5861,7 +5897,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.2: {} + prettier@3.8.3: {} process-nextick-args@2.0.1: {} @@ -5922,8 +5958,9 @@ snapshots: dependencies: path-parse: 1.0.7 - resolve@1.22.11: + resolve@1.22.12: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5945,44 +5982,44 @@ snapshots: dependencies: bn.js: 5.2.3 - rollup-plugin-visualizer@5.14.0(rollup@4.60.1): + rollup-plugin-visualizer@5.14.0(rollup@4.60.2): dependencies: open: 8.4.2 picomatch: 4.0.4 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.60.1 + rollup: 4.60.2 - rollup@4.60.1: + rollup@4.60.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.1 - '@rollup/rollup-android-arm64': 4.60.1 - '@rollup/rollup-darwin-arm64': 4.60.1 - '@rollup/rollup-darwin-x64': 4.60.1 - '@rollup/rollup-freebsd-arm64': 4.60.1 - '@rollup/rollup-freebsd-x64': 4.60.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 - '@rollup/rollup-linux-arm-musleabihf': 4.60.1 - '@rollup/rollup-linux-arm64-gnu': 4.60.1 - '@rollup/rollup-linux-arm64-musl': 4.60.1 - '@rollup/rollup-linux-loong64-gnu': 4.60.1 - '@rollup/rollup-linux-loong64-musl': 4.60.1 - '@rollup/rollup-linux-ppc64-gnu': 4.60.1 - '@rollup/rollup-linux-ppc64-musl': 4.60.1 - '@rollup/rollup-linux-riscv64-gnu': 4.60.1 - '@rollup/rollup-linux-riscv64-musl': 4.60.1 - '@rollup/rollup-linux-s390x-gnu': 4.60.1 - '@rollup/rollup-linux-x64-gnu': 4.60.1 - '@rollup/rollup-linux-x64-musl': 4.60.1 - '@rollup/rollup-openbsd-x64': 4.60.1 - '@rollup/rollup-openharmony-arm64': 4.60.1 - '@rollup/rollup-win32-arm64-msvc': 4.60.1 - '@rollup/rollup-win32-ia32-msvc': 4.60.1 - '@rollup/rollup-win32-x64-gnu': 4.60.1 - '@rollup/rollup-win32-x64-msvc': 4.60.1 + '@rollup/rollup-android-arm-eabi': 4.60.2 + '@rollup/rollup-android-arm64': 4.60.2 + '@rollup/rollup-darwin-arm64': 4.60.2 + '@rollup/rollup-darwin-x64': 4.60.2 + '@rollup/rollup-freebsd-arm64': 4.60.2 + '@rollup/rollup-freebsd-x64': 4.60.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 + '@rollup/rollup-linux-arm-musleabihf': 4.60.2 + '@rollup/rollup-linux-arm64-gnu': 4.60.2 + '@rollup/rollup-linux-arm64-musl': 4.60.2 + '@rollup/rollup-linux-loong64-gnu': 4.60.2 + '@rollup/rollup-linux-loong64-musl': 4.60.2 + '@rollup/rollup-linux-ppc64-gnu': 4.60.2 + '@rollup/rollup-linux-ppc64-musl': 4.60.2 + '@rollup/rollup-linux-riscv64-gnu': 4.60.2 + '@rollup/rollup-linux-riscv64-musl': 4.60.2 + '@rollup/rollup-linux-s390x-gnu': 4.60.2 + '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@rollup/rollup-linux-x64-musl': 4.60.2 + '@rollup/rollup-openbsd-x64': 4.60.2 + '@rollup/rollup-openharmony-arm64': 4.60.2 + '@rollup/rollup-win32-arm64-msvc': 4.60.2 + '@rollup/rollup-win32-ia32-msvc': 4.60.2 + '@rollup/rollup-win32-x64-gnu': 4.60.2 + '@rollup/rollup-win32-x64-msvc': 4.60.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -6048,7 +6085,7 @@ snapshots: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -6214,7 +6251,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - viem@2.48.3(typescript@5.9.3)(zod@3.25.76): + viem@2.48.4(typescript@5.9.3)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -6222,7 +6259,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) isows: 1.0.7(ws@8.18.3) - ox: 0.14.17(typescript@5.9.3)(zod@3.25.76) + ox: 0.14.20(typescript@5.9.3)(zod@3.25.76) ws: 8.18.3 optionalDependencies: typescript: 5.9.3 From 6fb5ed6621b5c4c31141c69b699b332901c3d668 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 11:43:15 +0200 Subject: [PATCH 31/41] Raise Node heap cap to 8GB for memory-heavy hardhat actions --- dockerfile-actions | 1 + 1 file changed, 1 insertion(+) diff --git a/dockerfile-actions b/dockerfile-actions index 2aaa7dad..fb66a57f 100644 --- a/dockerfile-actions +++ b/dockerfile-actions @@ -3,6 +3,7 @@ FROM oven/bun:1 ENV DEBIAN_FRONTEND=noninteractive \ DEBUG_HIDE_DATE=true \ + NODE_OPTIONS=--max-old-space-size=8096 \ PNPM_STORE_DIR=/root/.local/share/pnpm/store RUN apt-get update \ From e79dc1b8e2243d7e8fde11fab2401447e5bdd7ca Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 11:50:46 +0200 Subject: [PATCH 32/41] Trigger Railway redeploy after image push --- .github/workflows/actions-image.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/actions-image.yml b/.github/workflows/actions-image.yml index ab392ae0..f130bd9d 100644 --- a/.github/workflows/actions-image.yml +++ b/.github/workflows/actions-image.yml @@ -49,3 +49,9 @@ jobs: tags: | ${{ steps.prep.outputs.image_name }}:latest ${{ steps.prep.outputs.image_name }}:${{ github.sha }} + + - name: Trigger Railway redeploy + if: success() && env.RAILWAY_DEPLOY_WEBHOOK != '' + env: + RAILWAY_DEPLOY_WEBHOOK: ${{ secrets.RAILWAY_DEPLOY_WEBHOOK }} + run: curl -fsS -X POST "$RAILWAY_DEPLOY_WEBHOOK" From 850b758578f092a15b45b39a666e2bbc57d3650c Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 12:05:37 +0200 Subject: [PATCH 33/41] Switch Railway redeploy trigger to CLI (webhook trigger retired) --- .github/workflows/actions-image.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/actions-image.yml b/.github/workflows/actions-image.yml index f130bd9d..acc26702 100644 --- a/.github/workflows/actions-image.yml +++ b/.github/workflows/actions-image.yml @@ -51,7 +51,10 @@ jobs: ${{ steps.prep.outputs.image_name }}:${{ github.sha }} - name: Trigger Railway redeploy - if: success() && env.RAILWAY_DEPLOY_WEBHOOK != '' + if: success() && env.RAILWAY_TOKEN != '' env: - RAILWAY_DEPLOY_WEBHOOK: ${{ secrets.RAILWAY_DEPLOY_WEBHOOK }} - run: curl -fsS -X POST "$RAILWAY_DEPLOY_WEBHOOK" + RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} + RAILWAY_SERVICE_ID: ${{ secrets.RAILWAY_SERVICE_ID }} + run: | + npm i -g @railway/cli + railway redeploy --service "$RAILWAY_SERVICE_ID" --yes From 920b65e73ca4b1b26da2a5fc7ebf1d4a1f1d0a1f Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 14:24:41 +0200 Subject: [PATCH 34/41] Wrap signer at source (utils/signers.ts) so all helpers queue tx events Actions that delegate to helper modules (src/js/tasks/*) previously re- fetched a raw signer via getSigner(), bypassing the nonce-queue Proxy that lib/action.ts set up on ctx.signer. Move the wrap into getSigner() itself so every caller, regardless of path, gets the wrapped signer. Every signer.sendTransaction in production now records a row in nonce_queue_transactions, populating the Transactions page. Also drops the now-redundant wrap from tasks/lib/action.ts and adds an ambient declare-module stub so tsc resolves @talos/client imports without chasing the private @talos/schema workspace dep. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/js/tasks/lib/action.ts | 27 +++++---------------------- src/js/types/talos-client.d.ts | 8 ++++++++ src/js/utils/signers.ts | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 25 deletions(-) create mode 100644 src/js/types/talos-client.d.ts diff --git a/src/js/tasks/lib/action.ts b/src/js/tasks/lib/action.ts index 06658b9f..0bc323a4 100644 --- a/src/js/tasks/lib/action.ts +++ b/src/js/tasks/lib/action.ts @@ -1,12 +1,6 @@ import type { Signer } from "ethers"; import { subtask, task } from "hardhat/config"; import type { ConfigurableTaskDefinition } from "hardhat/types"; -import { - createDb, - createPool, - type Db, - wrapSignerWithNonceQueueV6, -} from "@talos/client"; import { getSigner as defaultGetSigner } from "../../utils/signers"; @@ -16,16 +10,6 @@ export interface Logger { error(msg: unknown, ...rest: unknown[]): void; } -let dbInstance: Db | null = null; -function getNonceDb(): Db | null { - if (!process.env.DATABASE_URL) return null; - if (!dbInstance) { - const pool = createPool({ connectionString: process.env.DATABASE_URL }); - dbInstance = createDb(pool); - } - return dbInstance; -} - export interface ActionContext { signer: Signer; chainId: number; @@ -75,13 +59,12 @@ export function createActionHandler( let networkName: string | undefined; try { - const rawSigner = await getSigner(); - const network = await rawSigner.provider!.getNetwork(); + // Signer already wraps sendTransaction with the nonce queue when + // DATABASE_URL is set — see utils/signers.ts. Helper modules that + // call getSigner() directly get the same wrapped signer. + const signer = await getSigner(); + const network = await signer.provider!.getNetwork(); chainId = Number(network.chainId); - const db = getNonceDb(); - const signer = db - ? wrapSignerWithNonceQueueV6(rawSigner, { db, log }) - : rawSigner; networkName = CHAIN_NAMES[chainId] ?? `unknown-${chainId}`; log.info(`Running on ${networkName} (${chainId})`); diff --git a/src/js/types/talos-client.d.ts b/src/js/types/talos-client.d.ts new file mode 100644 index 00000000..10bd9c57 --- /dev/null +++ b/src/js/types/talos-client.d.ts @@ -0,0 +1,8 @@ +// Ambient declaration for @talos/client. +// +// The package ships a bundled dist/index.js without .d.ts. A proper fix +// would be emitting a bundled declaration (tsup --dts or similar) from +// the talos repo. Until then, treat imports as `any` so consumer tsc +// resolves the module without following the source graph (which pulls +// in the private @talos/schema workspace dep). +declare module "@talos/client"; diff --git a/src/js/utils/signers.ts b/src/js/utils/signers.ts index 17e2341d..8cbee831 100644 --- a/src/js/utils/signers.ts +++ b/src/js/utils/signers.ts @@ -1,12 +1,39 @@ import { JsonRpcProvider, Signer, Wallet } from "ethers"; import { Defender } from "@openzeppelin/defender-sdk"; import * as hhHelpers from "@nomicfoundation/hardhat-network-helpers"; +import { + createDb, + createPool, + wrapSignerWithNonceQueueV6, +} from "@talos/client"; import { ethereumAddress, privateKey } from "./regex"; // eslint-disable-next-line @typescript-eslint/no-var-requires const log = require("./logger")("utils:signers"); +// `@talos/client` ships without .d.ts so the ambient decl in +// src/js/types/talos-client.d.ts types imports as `any`; the Db handle +// is therefore typed loosely here but used opaquely. +let dbInstance: unknown = null; +function getNonceDb(): unknown { + if (!process.env.DATABASE_URL) return null; + if (!dbInstance) { + const pool = createPool({ connectionString: process.env.DATABASE_URL }); + dbInstance = createDb(pool); + } + return dbInstance; +} + +// Wrap a raw signer with the nonce-queue Proxy when DATABASE_URL is set. +// Dev / fork runs (DATABASE_URL unset) get the raw signer, preserving +// the gate invariant. +function maybeWrap(rawSigner: S): S { + const db = getNonceDb(); + if (!db) return rawSigner; + return wrapSignerWithNonceQueueV6(rawSigner, { db }); +} + // Use `hre` global injected by Hardhat at runtime. declare const hre: { ethers: { @@ -111,11 +138,11 @@ export async function getSigner(address?: string): Promise { } const wallet = new Wallet(pk, hre.ethers.provider); log(`Using signer ${await wallet.getAddress()} from private key`); - return wallet; + return maybeWrap(wallet); } if (hasAwsKmsCredentials()) { - return await getKmsSigner(); + return maybeWrap(await getKmsSigner()); } if (process.env.IMPERSONATE) { @@ -133,7 +160,7 @@ export async function getSigner(address?: string): Promise { // Defender Relayer if (process.env.DEFENDER_RELAYER_KEY && process.env.DEFENDER_RELAYER_SECRET) { - return await getDefenderSigner(); + return maybeWrap(await getDefenderSigner()); } const signers = await hre.ethers.getSigners(); From 2c868ba678fc5714b3ec4b2da367e04c7e001a87 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 14:53:23 +0200 Subject: [PATCH 35/41] empty commit to kick off build --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d8e53d7..d4863972 100644 --- a/README.md +++ b/README.md @@ -293,7 +293,7 @@ yarn hardhat tenderlySync --network sonic yarn hardhat tenderlyUpload --network sonic --name ORIGIN_ARM ``` -## Automated Actions (Talos) +## Automated Actions (Talos) The `src/js/tasks/actions/*.ts` files are hardhat tasks that handle operational jobs (allocations, fee collection, withdrawal requests, etc.). In production they're driven by a container that imports [`@talos/client`](https://github.com/oplabs/talos): From 0c938a44c3a7aacc3aa4ca36607cbbc74b693ef4 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 14:55:22 +0200 Subject: [PATCH 36/41] Bump @talos/client to pick up RUN_ID tx linking --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7afa077b..2140bfea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@talos/client': specifier: git+ssh://git@github.com/oplabs/talos.git#path:packages/client - version: git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client(typescript@5.9.3)(zod@3.25.76) + version: git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -1024,8 +1024,8 @@ packages: '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - '@talos/client@git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client': - resolution: {commit: 854cc43044ad222e83b7d1a3aa47453bae5bd475, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} + '@talos/client@git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client': + resolution: {commit: a7fe5c066578582e49aa3cc23a455536c45c868f, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} version: 0.0.1 '@tsconfig/node10@1.0.12': @@ -4507,7 +4507,7 @@ snapshots: '@solidity-parser/parser@0.18.0': {} - '@talos/client@git+https://git@github.com:oplabs/talos.git#854cc43044ad222e83b7d1a3aa47453bae5bd475&path:packages/client(typescript@5.9.3)(zod@3.25.76)': + '@talos/client@git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client(typescript@5.9.3)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.14) croner: 9.1.0 From 3c574a254302644645ad8ba7b1d8fb9cabfae861 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 15:08:10 +0200 Subject: [PATCH 37/41] Add workflow to auto-bump @talos/client every 6h --- .github/workflows/bump-talos-client.yml | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/workflows/bump-talos-client.yml diff --git a/.github/workflows/bump-talos-client.yml b/.github/workflows/bump-talos-client.yml new file mode 100644 index 00000000..95b83252 --- /dev/null +++ b/.github/workflows/bump-talos-client.yml @@ -0,0 +1,71 @@ +name: Bump @talos/client + +on: + schedule: + # Every 6 hours + - cron: '0 */6 * * *' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + bump: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: automation + + - name: Set up SSH agent for talos fetch + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.TALOS_DEPLOY_KEY }} + + - name: Trust github.com SSH host key + run: | + mkdir -p ~/.ssh + ssh-keyscan -t rsa,ecdsa,ed25519 github.com >> ~/.ssh/known_hosts + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.24.0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Update @talos/client and reconcile lockfile + run: | + pnpm update @talos/client + # pnpm update rewrites the package.json spec from git+ssh://... to + # github:... (HTTPS), which breaks Railway builds that rely on SSH + # forwarding. Revert the spec and reconcile the lockfile's specifier. + git checkout -- package.json + pnpm install + + - name: Resolve pinned talos commit + id: talos + run: | + commit=$(grep -oE "oplabs/talos\.git#[a-f0-9]{40}" pnpm-lock.yaml | head -1 | sed 's/.*#//') + echo "commit=$commit" >> "$GITHUB_OUTPUT" + + - name: Create or update pull request + uses: peter-evans/create-pull-request@v7 + with: + branch: auto/bump-talos-client + base: automation + title: "Bump @talos/client" + commit-message: "Bump @talos/client to ${{ steps.talos.outputs.commit }}" + body: | + Automated bump of `@talos/client` to the latest commit on `oplabs/talos` `main`. + + Pinned commit: [`${{ steps.talos.outputs.commit }}`](https://github.com/oplabs/talos/commit/${{ steps.talos.outputs.commit }}) + + Merging this PR triggers the actions image build + Railway redeploy for this runner. + delete-branch: true From ee7e77612ad5e0d7fac83dd499cda3986bbdfb99 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Wed, 22 Apr 2026 15:11:45 +0200 Subject: [PATCH 38/41] Remove unfired bump workflow (was on deploy branch, not default) --- .github/workflows/bump-talos-client.yml | 71 ------------------------- 1 file changed, 71 deletions(-) delete mode 100644 .github/workflows/bump-talos-client.yml diff --git a/.github/workflows/bump-talos-client.yml b/.github/workflows/bump-talos-client.yml deleted file mode 100644 index 95b83252..00000000 --- a/.github/workflows/bump-talos-client.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Bump @talos/client - -on: - schedule: - # Every 6 hours - - cron: '0 */6 * * *' - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - bump: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: automation - - - name: Set up SSH agent for talos fetch - uses: webfactory/ssh-agent@v0.9.0 - with: - ssh-private-key: ${{ secrets.TALOS_DEPLOY_KEY }} - - - name: Trust github.com SSH host key - run: | - mkdir -p ~/.ssh - ssh-keyscan -t rsa,ecdsa,ed25519 github.com >> ~/.ssh/known_hosts - - - name: Set up pnpm - uses: pnpm/action-setup@v4 - with: - version: 10.24.0 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - - name: Update @talos/client and reconcile lockfile - run: | - pnpm update @talos/client - # pnpm update rewrites the package.json spec from git+ssh://... to - # github:... (HTTPS), which breaks Railway builds that rely on SSH - # forwarding. Revert the spec and reconcile the lockfile's specifier. - git checkout -- package.json - pnpm install - - - name: Resolve pinned talos commit - id: talos - run: | - commit=$(grep -oE "oplabs/talos\.git#[a-f0-9]{40}" pnpm-lock.yaml | head -1 | sed 's/.*#//') - echo "commit=$commit" >> "$GITHUB_OUTPUT" - - - name: Create or update pull request - uses: peter-evans/create-pull-request@v7 - with: - branch: auto/bump-talos-client - base: automation - title: "Bump @talos/client" - commit-message: "Bump @talos/client to ${{ steps.talos.outputs.commit }}" - body: | - Automated bump of `@talos/client` to the latest commit on `oplabs/talos` `main`. - - Pinned commit: [`${{ steps.talos.outputs.commit }}`](https://github.com/oplabs/talos/commit/${{ steps.talos.outputs.commit }}) - - Merging this PR triggers the actions image build + Railway redeploy for this runner. - delete-branch: true From b1e045ced8e00c2c0fa7e11c891e9d5058456c74 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Wed, 22 Apr 2026 23:38:57 +0200 Subject: [PATCH 39/41] empty commit to kick off build --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4863972..a4e16c90 100644 --- a/README.md +++ b/README.md @@ -331,7 +331,7 @@ For this to work, a Defender Team API key with `Manage Actions` capabilities is The following will set the Defender Team API key and bundle the Actions code ready for upload. -```bash +```bash # Set the DEFENDER_TEAM_KEY and DEFENDER_TEAM_SECRET env vars in the .env file yarn rollup -c src/js/actions/rollup.config.cjs From 7095dc5726219ad250f953f0123f545c775c91e6 Mon Sep 17 00:00:00 2001 From: Christopher Jacobs Date: Tue, 28 Apr 2026 07:39:41 -0700 Subject: [PATCH 40/41] Bump @talos/client to pick up ethers retry parity (talos 7b106b4+) --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f58433c5..eb86da43 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "typescript": "^5.7.0" }, "dependencies": { - "@talos/client": "git+ssh://git@github.com/oplabs/talos.git#path:packages/client" + "@talos/client": "github:oplabs/talos#path:packages/client" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2140bfea..c94c2a29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@talos/client': - specifier: git+ssh://git@github.com/oplabs/talos.git#path:packages/client - version: git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client(typescript@5.9.3)(zod@3.25.76) + specifier: github:oplabs/talos#path:packages/client + version: git+https://git@github.com:oplabs/talos.git#72ecb561f313c600219eecd7cb3349823d6c2823&path:packages/client(typescript@5.9.3)(zod@3.25.76) devDependencies: '@apollo/client': specifier: ^3.11.4 @@ -1024,8 +1024,8 @@ packages: '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - '@talos/client@git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client': - resolution: {commit: a7fe5c066578582e49aa3cc23a455536c45c868f, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} + '@talos/client@git+https://git@github.com:oplabs/talos.git#72ecb561f313c600219eecd7cb3349823d6c2823&path:packages/client': + resolution: {commit: 72ecb561f313c600219eecd7cb3349823d6c2823, path: packages/client, repo: git@github.com:oplabs/talos.git, type: git} version: 0.0.1 '@tsconfig/node10@1.0.12': @@ -4507,7 +4507,7 @@ snapshots: '@solidity-parser/parser@0.18.0': {} - '@talos/client@git+https://git@github.com:oplabs/talos.git#a7fe5c066578582e49aa3cc23a455536c45c868f&path:packages/client(typescript@5.9.3)(zod@3.25.76)': + '@talos/client@git+https://git@github.com:oplabs/talos.git#72ecb561f313c600219eecd7cb3349823d6c2823&path:packages/client(typescript@5.9.3)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.14) croner: 9.1.0 From 896fc913ab68d487d9e3ff24f4f22599a2fc5cb7 Mon Sep 17 00:00:00 2001 From: Domen Grabec Date: Thu, 30 Apr 2026 00:44:18 +0200 Subject: [PATCH 41/41] Honor USE_DEFENDER_SIGNER env var to route this run via Defender Talos' per-action "Use Defender Relayer signer" checkbox sets this env var on the dispatch spawn when an operator opts in. Add a branch in getSigner() before the KMS check that honors it: if the env vars are missing throw a structured error (so it surfaces cleanly in talos run_logs instead of as a Defender SDK 401), otherwise call the existing getDefenderSigner(). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/js/utils/signers.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/js/utils/signers.ts b/src/js/utils/signers.ts index 8cbee831..e1c7f90f 100644 --- a/src/js/utils/signers.ts +++ b/src/js/utils/signers.ts @@ -141,6 +141,25 @@ export async function getSigner(address?: string): Promise { return maybeWrap(wallet); } + // Per-action override set by talos dispatch when the operator checked + // the "Use Defender Relayer signer" box on this action. Skip KMS and + // route through Defender for this run only. Throw a structured error + // if the env vars aren't actually present so the failure surfaces + // cleanly in run_logs instead of as an SDK 401. + if (process.env.USE_DEFENDER_SIGNER === "1") { + if ( + !process.env.DEFENDER_RELAYER_KEY || + !process.env.DEFENDER_RELAYER_SECRET + ) { + throw new Error( + "USE_DEFENDER_SIGNER=1 was requested but DEFENDER_RELAYER_KEY / " + + "DEFENDER_RELAYER_SECRET are not configured on this runner. " + + "Either uncheck the Defender option on this action or configure the env vars.", + ); + } + return maybeWrap(await getDefenderSigner()); + } + if (hasAwsKmsCredentials()) { return maybeWrap(await getKmsSigner()); }