diff --git a/.github/workflows/contracts-automaton-prod-image.yml b/.github/workflows/contracts-automaton-prod-image.yml new file mode 100644 index 0000000000..186a9b7437 --- /dev/null +++ b/.github/workflows/contracts-automaton-prod-image.yml @@ -0,0 +1,42 @@ +name: Contracts Actions Image + +on: + push: + branches: + - origin-automaton-production + 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 }}/contracts-automaton-prod" + 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: ./contracts + file: ./contracts/dockerfile-actions + push: true + tags: | + ${{ steps.prep.outputs.image_name }}:latest + ${{ steps.prep.outputs.image_name }}:${{ github.sha }} diff --git a/contracts/.eslintrc.js b/contracts/.eslintrc.js index eaf475fb2c..953d510ee9 100644 --- a/contracts/.eslintrc.js +++ b/contracts/.eslintrc.js @@ -24,4 +24,25 @@ module.exports = { "no-only-tests/no-only-tests": "error", "no-unused-vars": [2, { vars: "all", args: "after-used" }], }, + overrides: [ + { + files: ["**/*.ts"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + sourceType: "module", + }, + plugins: ["@typescript-eslint"], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + 2, + { vars: "all", args: "after-used" }, + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-require-imports": "off", + }, + }, + ], }; diff --git a/contracts/README.md b/contracts/README.md index 418f3fc0c2..1940b54290 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -246,8 +246,9 @@ If enabled, the gas usage will be output in a table after the tests have execute When using Hardhat tasks, there are a few options for specifying the wallet to send transactions from. 1. Primary key -2. Impersonate -3. Defender Relayer +2. AWS KMS signer +3. Impersonate +4. Defender Relayer ### Primary Key @@ -262,6 +263,24 @@ unset DEPLOYER_PK unset GOVERNOR_PK ``` +### AWS KMS Signer + +Hardhat tasks can sign transactions with AWS KMS when both `AWS_ACCESS_KEY_ID` and +`AWS_SECRET_ACCESS_KEY` are set. + +The default `relayer-id` is `origin-relayer-production-evm`. Some tasks can be mapped +to different defaults in code, and a user-provided task parameter always wins: + +``` +npx hardhat --network --relayer-id +``` + +The relayer resolution precedence is: + +1. `--relayer-id` +2. task-name based override map +3. global default (`origin-relayer-production-evm`) + ### Impersonate If using a fork test or node, you can impersonate any externally owned account or contract. Export `IMPERSONATE` with the address of the account you want to impersonate. The account will be funded with some Ether. For example diff --git a/contracts/cron/.gitignore b/contracts/cron/.gitignore new file mode 100644 index 0000000000..885df5d5c5 --- /dev/null +++ b/contracts/cron/.gitignore @@ -0,0 +1 @@ +cronjob \ No newline at end of file diff --git a/contracts/cron/README.md b/contracts/cron/README.md new file mode 100644 index 0000000000..0195db2fda --- /dev/null +++ b/contracts/cron/README.md @@ -0,0 +1,68 @@ +# Cron Actions + +Containerized scheduler for running hardhat tasks on a schedule. Replaces OpenZeppelin Defender actions. + +## How it works + +1. **`cron-jobs.json`** — Defines all scheduled jobs (name, cron schedule, command, enabled flag) +2. **`render-crontab.ts`** — Reads `cron-jobs.json`, filters to enabled jobs, writes a supercronic-compatible crontab file +3. **`cron-supervisor.ts`** — Starts supercronic with the generated crontab, runs an HTTP API for triggering actions on-demand and checking run status +4. **`cron-entrypoint.sh`** — Docker entrypoint that boots the supervisor + +Each job runs a hardhat task (e.g. `pnpm hardhat healthcheck`). Signing uses the existing KMS signer from `utils/signers.js` when `AWS_ACCESS_KEY_ID` is set. + +## Running locally + +```bash +cd contracts +docker compose up actions +``` + +## API + +The supervisor exposes an HTTP API (default port 8080): + +```bash +# Health check (no auth) +curl http://localhost:8080/healthz + +# List all actions (requires bearer token) +curl -H 'Authorization: Bearer $ACTION_API_BEARER_TOKEN' \ + http://localhost:8080/api/v1/actions + +# Trigger an action +curl -X POST -H 'Authorization: Bearer $ACTION_API_BEARER_TOKEN' \ + http://localhost:8080/api/v1/actions/healthcheck/runs + +# Check run status +curl -H 'Authorization: Bearer $ACTION_API_BEARER_TOKEN' \ + http://localhost:8080/api/v1/runs/ +``` + +## Adding a new job + +Add an entry to `cron-jobs.json`: + +```json +{ + "name": "my_new_job", + "schedule": "0 */6 * * *", + "enabled": true, + "command": "cd /app && pnpm hardhat myTask --network mainnet" +} +``` + +Set `enabled: false` to define a job that can only be triggered via the API. + +## Environment variables + +| Variable | Description | +|----------|-------------| +| `ACTION_API_BEARER_TOKEN` | Required. Auth token for the HTTP API | +| `PROVIDER_URL` | Mainnet RPC endpoint | +| `HARDHAT_NETWORK` | Default network for tasks | +| `LOKI_URL` | Grafana Loki push endpoint (optional) | +| `LOKI_USER` | Loki basic auth user (optional) | +| `LOKI_API_KEY` | Loki basic auth key (optional) | +| `AWS_ACCESS_KEY_ID` | For KMS signer (optional) | +| `AWS_SECRET_ACCESS_KEY` | For KMS signer (optional) | diff --git a/contracts/cron/TODO.md b/contracts/cron/TODO.md new file mode 100644 index 0000000000..ad08019cbf --- /dev/null +++ b/contracts/cron/TODO.md @@ -0,0 +1,21 @@ +# TODO List + +## Defender Actions which use compiled code: + +https://defender.openzeppelin.com/#/actions/automatic/076c59e4-4150-42c7-9ba0-9962069ac353 +https://defender.openzeppelin.com/#/actions/automatic/0b852456-96a0-4f1d-9d6c-39e1c6ae9dfc +https://defender.openzeppelin.com/#/actions/automatic/65b53496-e426-4850-8349-059e63eb2120 +https://defender.openzeppelin.com/#/actions/automatic/65f04f74-8da7-4fc5-94b3-96be31bac03b +https://defender.openzeppelin.com/#/actions/automatic/6a633bb0-aff8-4b37-aaae-b4c6f244ed87 +https://defender.openzeppelin.com/#/actions/automatic/6e4f764d-4126-45a5-b7d9-1ab90cd3ffd6 +https://defender.openzeppelin.com/#/actions/automatic/84988850-6816-4074-8e7b-c11cb2b32e7e +https://defender.openzeppelin.com/#/actions/automatic/a4f8ca5f-7144-469b-b84a-58b30fed72ce +https://defender.openzeppelin.com/#/actions/automatic/aa194c13-0dbf-49d2-8e87-70e61f3d71a8 +https://defender.openzeppelin.com/#/actions/automatic/b1d831f1-29d4-4943-bb2e-8e625b76e82c +https://defender.openzeppelin.com/#/actions/automatic/bb43e5da-f936-4185-84da-253394583665 +https://defender.openzeppelin.com/#/actions/automatic/e2929f53-db56-49b2-b054-35f7df7fc4fb +https://defender.openzeppelin.com/#/actions/automatic/e571409b-5399-48e4-bfb2-50b7af9903aa +https://defender.openzeppelin.com/#/actions/automatic/f74f24b4-d98b-4181-89cc-6608369b6f91 +https://defender.openzeppelin.com/#/actions/automatic/f92ea662-fc34-433b-8beb-b34e9ab74685 + +- [ ] Check hyper EVM network jobs for correct network usage diff --git a/contracts/cron/cron-entrypoint.sh b/contracts/cron/cron-entrypoint.sh new file mode 100644 index 0000000000..60c072e9f4 --- /dev/null +++ b/contracts/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/contracts/cron/cron-jobs.json b/contracts/cron/cron-jobs.json new file mode 100644 index 0000000000..e9c094e9e8 --- /dev/null +++ b/contracts/cron/cron-jobs.json @@ -0,0 +1,124 @@ +{ + "jobs": [ + { + "name": "healthcheck", + "schedule": "*/5 * * * *", + "enabled": true, + "command": "cd /app && pnpm hardhat healthcheck --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "hourly_snap_balances", + "schedule": "0 * * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat snapBalances --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "hourly_verify_balances", + "schedule": "8 * * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat verifyBalances --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "hourly_verify_deposits", + "schedule": "10 * * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat verifyDeposits --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "hourly_auto_validator_deposits", + "schedule": "12 * * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat autoValidatorDeposits --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "hourly_auto_validator_withdrawals", + "schedule": "14 * * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat autoValidatorWithdrawals --network ${HARDHAT_NETWORK:-mainnet}" + }, + { + "name": "daily_rebase_mainnet_oeth", + "schedule": "0 0 * * *", + "enabled": true, + "command": "cd /app && pnpm hardhat rebase --network mainnet --symbol OETH" + }, + { + "name": "daily_rebase_mainnet_ousd", + "schedule": "10 0 * * *", + "enabled": true, + "command": "cd /app && pnpm hardhat rebase --network mainnet --symbol OUSD" + }, + { + "name": "daily_rebase_base_oeth", + "schedule": "20 0 * * *", + "enabled": true, + "command": "cd /app && pnpm hardhat rebase --network base --symbol OETH" + }, + { + "name": "otoken_os_collectAndRelease", + "schedule": "50 23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-os-collectAndRelease --network sonic" + }, + { + "name": "otoken_ousd_autoWithdrawal", + "schedule": "40 11,23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-ousd-autoWithdrawal --network mainnet" + }, + { + "name": "otoken_oethb_updateWoethPrice", + "schedule": "10 21 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-oethb-updateWoethPrice --network mainnet" + }, + { + "name": "otoken_oethp_addWithdrawalQueueLiquidity", + "schedule": "5 0 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-oethp-addWithdrawalQueueLiquidity --network mainnet" + }, + { + "name": "otoken_oethb_rebase", + "schedule": "25 9,21 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-oethb-rebase --network base" + }, + { + "name": "otoken_os_sonicRestakeRewards", + "schedule": "55 23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-os-sonicRestakeRewards --network sonic" + }, + { + "name": "crossChainBalanceUpdate-base", + "schedule": "15 7,15,23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat crossChainBalanceUpdate-base --network base" + }, + { + "name": "crossChainBalanceUpdate-hyperevm", + "schedule": "15 7,15,23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat hyperevm-crossChainBalanceUpdate --network hyperevm" + }, + { + "name": "otoken_ousd_oeth_rebase", + "schedule": "50 11,23 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken_ousd_oeth_rebase --network mainnet" + }, + { + "name": "ogn_claimAndForwardRewards", + "schedule": "0 0 * * 2", + "enabled": false, + "command": "cd /app && pnpm hardhat ogn-claimAndForwardRewards --network mainnet" + }, + { + "name": "otoken_oethb_harvest", + "schedule": "50 11 * * *", + "enabled": false, + "command": "cd /app && pnpm hardhat otoken-oethb-harvest --network base" + } + ] +} diff --git a/contracts/cron/cron-supervisor.ts b/contracts/cron/cron-supervisor.ts new file mode 100644 index 0000000000..d75b1fed81 --- /dev/null +++ b/contracts/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/contracts/cron/render-crontab.ts b/contracts/cron/render-crontab.ts new file mode 100644 index 0000000000..e4c4cc848b --- /dev/null +++ b/contracts/cron/render-crontab.ts @@ -0,0 +1,108 @@ +import fs from "node:fs"; +import path from "node:path"; + +// Default to local paths +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/contracts/dev.env b/contracts/dev.env index 3548a2a64c..5cbed3b657 100644 --- a/contracts/dev.env +++ b/contracts/dev.env @@ -70,4 +70,9 @@ VALIDATOR_KEYS_S3_BUCKET_NAME=[validator-keys-test | validator-keys] VALIDATOR_MASTER_ENCRYPTED_PRIVATE_KEY= # Tenderly access token required to upload newly deployed and verified contracts to Tenderly -TENDERLY_ACCESS_TOKEN= \ No newline at end of file +TENDERLY_ACCESS_TOKEN= + +# Loki Logging +LOKI_URL= +LOKI_USER= +LOKI_API_KEY= \ No newline at end of file diff --git a/contracts/docker-compose.yml b/contracts/docker-compose.yml new file mode 100644 index 0000000000..ec887cd44e --- /dev/null +++ b/contracts/docker-compose.yml @@ -0,0 +1,23 @@ +services: + actions: + build: + context: . + dockerfile: dockerfile-actions + ports: + - "8080:8080" + environment: + - PROVIDER_URL=${PROVIDER_URL:-} + - SONIC_PROVIDER_URL=${SONIC_PROVIDER_URL:-} + - PLUME_PROVIDER_URL=${PLUME_PROVIDER_URL:-} + - HOODI_PROVIDER_URL=${HOODI_PROVIDER_URL:-} + - BEACON_PROVIDER_URL=${BEACON_PROVIDER_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=origin* diff --git a/contracts/dockerfile b/contracts/dockerfile index c1cc49c2dd..2ec998e7c7 100644 --- a/contracts/dockerfile +++ b/contracts/dockerfile @@ -1,4 +1,4 @@ -FROM node:22 +FROM node:20 ENV DEBIAN_FRONTEND=noninteractive \ DEBUG=origin* \ @@ -21,15 +21,21 @@ RUN mkdir -p /root/.ssh \ RUN git config --global url."https://github.com/".insteadOf "git@github.com:" -ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.39/supercronic-linux-amd64 \ - SUPERCRONIC_SHA1SUM=c98bbf82c5f648aaac8708c182cc83046fe48423 \ - SUPERCRONIC=supercronic-linux-amd64 +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" \ - && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \ + && grep "$SUPERCRONIC" /tmp/supercronic-checksums.txt | sha1sum -c - \ && chmod +x "$SUPERCRONIC" \ - && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \ - && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic + && mv "$SUPERCRONIC" /usr/local/bin/supercronic \ + && rm /tmp/supercronic-checksums.txt WORKDIR /app @@ -41,7 +47,8 @@ RUN corepack enable \ # Copy the rest of the contracts workspace. COPY . . -RUN pnpm hardhat compile +# Compile contracts on amd64 (production). Skip on arm64 (Mac) where solcjs WASM crashes. +RUN if [ "$TARGETARCH" = "amd64" ]; then pnpm hardhat compile; else echo "Skipping compile on $TARGETARCH"; fi ENV PROVIDER_URL="" \ SONIC_PROVIDER_URL="" \ @@ -62,4 +69,4 @@ RUN cat <<'EOF' > /etc/cronjob 14 * * * * cd /app && pnpm hardhat autoValidatorWithdrawals --network ${HARDHAT_NETWORK:-mainnet} EOF -ENTRYPOINT ["supercronic", "/etc/cronjob"] +ENTRYPOINT ["supercronic", "/etc/cronjob"] \ No newline at end of file diff --git a/contracts/dockerfile-actions b/contracts/dockerfile-actions new file mode 100644 index 0000000000..8050333809 --- /dev/null +++ b/contracts/dockerfile-actions @@ -0,0 +1,64 @@ +FROM node:20 + +ENV DEBIAN_FRONTEND=noninteractive \ + DEBUG=origin* \ + 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/* + +# Preload GitHub host key for SSH-based dependencies. +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 + +# Enable pnpm via corepack and install dependencies first for better caching. +COPY pnpm-lock.yaml package.json pnpm-workspace.yaml ./ +RUN corepack enable \ + && pnpm install --frozen-lockfile + +# Copy the rest of the contracts workspace. +COPY . . + +# Compile contracts on amd64 (production). Skip on arm64 (Mac) where solcjs WASM crashes. +RUN if [ "$TARGETARCH" = "amd64" ]; then pnpm hardhat compile; else echo "Skipping compile on $TARGETARCH"; fi + +ENV PROVIDER_URL="" \ + SONIC_PROVIDER_URL="" \ + PLUME_PROVIDER_URL="" \ + HOODI_PROVIDER_URL="" \ + BEACON_PROVIDER_URL="" \ + DEFENDER_API_KEY="" \ + DEFENDER_API_SECRET="" \ + HARDHAT_NETWORK="" + +RUN chmod +x /app/cron/cron-entrypoint.sh + +ENTRYPOINT ["/app/cron/cron-entrypoint.sh"] diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js index da3bbf1f5d..29d4a30f3d 100644 --- a/contracts/hardhat.config.js +++ b/contracts/hardhat.config.js @@ -1,3 +1,18 @@ +require("ts-node").register({ + transpileOnly: true, + // Use inline compilerOptions instead of tsconfig.json to avoid + // interfering with ESM-only packages (e.g. @lodestar/types). + skipProject: true, + compilerOptions: { + module: "CommonJS", + target: "ES2020", + esModuleInterop: true, + allowSyntheticDefaultImports: true, + resolveJsonModule: true, + strict: false, + }, +}); + const ethers = require("ethers"); const { task } = require("hardhat/config"); const { @@ -50,6 +65,19 @@ require("solidity-coverage"); require("@openzeppelin/hardhat-upgrades"); require("./tasks/tasks"); + +// Auto-load TypeScript action files — each self-registers as a hardhat task +const fs = require("fs"); +const path = require("path"); +const actionsDir = path.join(__dirname, "tasks", "actions"); +if (fs.existsSync(actionsDir)) { + for (const file of fs.readdirSync(actionsDir).sort()) { + if (file.endsWith(".ts")) { + require(path.join(actionsDir, file)); + } + } +} + const { accounts } = require("./tasks/account"); const addresses = require("./utils/addresses.js"); diff --git a/contracts/package.json b/contracts/package.json index b57127a4f6..479d10800c 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -30,13 +30,16 @@ "node:anvil:sonic": "anvil --fork-url $SONIC_PROVIDER_URL --port 8545 --block-base-fee-per-gas 0 --auto-impersonate --disable-block-gas-limit", "node:anvil:hoodi": "anvil --fork-url $HOODI_PROVIDER_URL --port 8545 --block-base-fee-per-gas 0 --auto-impersonate --disable-block-gas-limit", "node:anvil:hyperevm": "anvil --fork-url $HYPEREVM_PROVIDER_URL --port 8545 --block-base-fee-per-gas 0 --auto-impersonate --disable-block-gas-limit", - "lint": "yarn run lint:js && yarn run lint:sol", + "lint": "yarn run lint:js && yarn run lint:ts && yarn run lint:sol", "lint:js": "eslint \"test/**/*.js\" \"tasks/**/*.js\" \"deploy/**/*.js\"", "lint:sol": "solhint \"contracts/**/*.sol\"", - "prettier": "yarn run prettier:js && yarn run prettier:sol", + "lint:ts": "eslint \"tasks/actions/**/*.ts\" \"tasks/lib/**/*.ts\" \"cron/**/*.ts\"", + "prettier": "yarn run prettier:js && yarn run prettier:ts && yarn run prettier:sol", "prettier:check": "prettier -c \"*.js\" \"deploy/**/*.js\" \"scripts/**/*.js\" \"scripts/**/*.js\" \"tasks/**/*.js\" \"test/**/*.js\" \"utils/**/*.js\"", "prettier:js": "prettier --write \"*.js\" \"deploy/**/*.js\" \"scripts/**/*.js\" \"scripts/**/*.js\" \"tasks/**/*.js\" \"test/**/*.js\" \"utils/**/*.js\"", "prettier:sol": "prettier --write --plugin=prettier-plugin-solidity \"contracts/**/*.sol\"", + "prettier:ts": "prettier --write \"tasks/actions/**/*.ts\" \"tasks/lib/**/*.ts\" \"cron/**/*.ts\"", + "typecheck": "tsc --noEmit", "test": "rm -rf deployments/hardhat && IS_TEST=true npx hardhat test", "test:base": "rm -rf deployments/hardhat && UNIT_TESTS_NETWORK=base IS_TEST=true npx hardhat test", "test:sonic": "rm -rf deployments/hardhat && UNIT_TESTS_NETWORK=sonic IS_TEST=true npx hardhat test", @@ -72,9 +75,10 @@ "author": "Origin Protocol Inc ", "license": "MIT", "devDependencies": { - "@aws-sdk/client-kms": "3.598.0", + "@aws-sdk/client-kms": "^3.675.0", "@aws-sdk/client-s3": "3.600.0", "@chainsafe/persistent-merkle-tree": "^1.2.1", + "@lastdotnet/purrikey": "^1.0.0", "@layerzerolabs/oft-evm": "3.1.4", "@nomicfoundation/hardhat-network-helpers": "1.0.9", "@nomicfoundation/hardhat-verify": "2.1.1", @@ -88,6 +92,8 @@ "@rollup/plugin-commonjs": "29.0.0", "@rollup/plugin-json": "6.1.0", "@rollup/plugin-node-resolve": "16.0.3 ", + "@typescript-eslint/eslint-plugin": "^8.57.2", + "@typescript-eslint/parser": "^8.57.2", "@uniswap/v3-core": "1.0.1", "@uniswap/v3-periphery": "1.4.3", "axios": "1.4.0", @@ -118,9 +124,14 @@ "solidity-bytes-utils": "0.8.4", "solidity-coverage": "0.8.14", "ssv-keys": "1.1.0", - "ssv-scanner": "github:bloxapp/ssv-scanner#v1.0.5", + "ssv-scanner": "github:ssvlabs/ssv-scanner#v1.0.5", "sync-fetch": "0.5.2", - "uuid": "9.0.1" + "ts-node": "^10.9.2", + "typescript": "^5.7.0", + "uuid": "9.0.1", + "viem": "^2.27.0", + "winston": "^3.19.0", + "winston-loki": "^6.1.4" }, "husky": { "hooks": { diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml index 95c333434f..1f407b990c 100644 --- a/contracts/pnpm-lock.yaml +++ b/contracts/pnpm-lock.yaml @@ -52,32 +52,35 @@ importers: version: 1.41.0 devDependencies: '@aws-sdk/client-kms': - specifier: 3.598.0 - version: 3.598.0 + specifier: ^3.675.0 + version: 3.1013.0 '@aws-sdk/client-s3': specifier: 3.600.0 version: 3.600.0 '@chainsafe/persistent-merkle-tree': specifier: ^1.2.1 version: 1.2.1 + '@lastdotnet/purrikey': + specifier: ^1.0.0 + version: 1.0.0(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@layerzerolabs/oft-evm': specifier: 3.1.4 version: 3.1.4(c88efacc9580dc620f57bdff8a2cf4a7) '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.9 - version: 1.0.9(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 1.0.9(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': specifier: 2.1.1 - version: 2.1.1(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: 2.2.3 - version: 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-solhint': specifier: 2.0.1 - version: 2.0.1(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 2.0.1(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: 2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@4.9.5))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 4.4.2 version: 4.4.2 @@ -86,7 +89,7 @@ importers: version: 2.7.0(bufferutil@4.1.0)(debug@4.3.4)(utf-8-validate@5.0.10)(web3-core@1.10.4)(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@openzeppelin/hardhat-upgrades': specifier: 1.27.0 - version: 1.27.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 1.27.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@rigidity/bls-signatures': specifier: 2.0.5 version: 2.0.5 @@ -99,6 +102,12 @@ importers: '@rollup/plugin-node-resolve': specifier: '16.0.3 ' version: 16.0.3(rollup@4.54.0) + '@typescript-eslint/eslint-plugin': + specifier: ^8.57.2 + version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.57.2 + version: 8.57.2(eslint@8.57.1)(typescript@5.9.3) '@uniswap/v3-core': specifier: 1.0.1 version: 1.0.1 @@ -125,28 +134,28 @@ importers: version: 3.3.0 ethereum-waffle: specifier: 4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@4.9.5) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: specifier: 5.7.2 version: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) hardhat: specifier: 2.26.2 - version: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + version: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: 2.10.0 - version: 2.10.0(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-deploy: specifier: 0.11.30 version: 0.11.30(bufferutil@4.1.0)(utf-8-validate@5.0.10) hardhat-deploy-ethers: specifier: 0.3.0-beta.13 - version: 0.3.0-beta.13(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 0.3.0-beta.13(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: 2.3.0 - version: 2.3.0(bufferutil@4.1.0)(debug@4.3.4)(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))(typescript@4.9.5)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.3.0(bufferutil@4.1.0)(debug@4.3.4)(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) hardhat-tracer: specifier: 3.2.1 - version: 3.2.1(bufferutil@4.1.0)(chai@4.3.7)(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 3.2.1(bufferutil@4.1.0)(chai@4.3.7)(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) husky: specifier: 7.0.4 version: 7.0.4 @@ -176,7 +185,7 @@ importers: version: 0.8.6(debug@4.3.4) solhint: specifier: 3.4.1 - version: 3.4.1(typescript@4.9.5) + version: 3.4.1(typescript@5.9.3) solidifier: specifier: 2.2.3 version: 2.2.3 @@ -185,19 +194,34 @@ importers: version: 0.8.4 solidity-coverage: specifier: 0.8.14 - version: 0.8.14(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + version: 0.8.14(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ssv-keys: specifier: 1.1.0 version: 1.1.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) ssv-scanner: - specifier: github:bloxapp/ssv-scanner#v1.0.5 - version: git+https://git@github.com:bloxapp/ssv-scanner.git#45068c93b3de84495f6cfad2767787c91d98aa8f(bufferutil@4.1.0)(utf-8-validate@5.0.10) + specifier: github:ssvlabs/ssv-scanner#v1.0.5 + version: https://codeload.github.com/ssvlabs/ssv-scanner/tar.gz/45068c93b3de84495f6cfad2767787c91d98aa8f(bufferutil@4.1.0)(utf-8-validate@5.0.10) sync-fetch: specifier: 0.5.2 version: 0.5.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.0.3)(typescript@5.9.3) + typescript: + specifier: ^5.7.0 + version: 5.9.3 uuid: specifier: 9.0.1 version: 9.0.1 + viem: + specifier: ^2.27.0 + version: 2.43.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + winston: + specifier: ^3.19.0 + version: 3.19.0 + winston-loki: + specifier: ^6.1.4 + version: 6.1.4 packages: @@ -236,9 +260,9 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-kms@3.598.0': - resolution: {integrity: sha512-rTvtEMeS4p3NlA0oxSgpl4N9sg2fuJ23nbpMU1vIk8fo0+i8/72BfE5Z0vWknv3u1lvgh+umKOv8g0iyOaGPfw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-kms@3.1013.0': + resolution: {integrity: sha512-cDrwc6s7RLcRDR990383FdgpvkpjWhTrD1YyNYo1xZMmtgZ3aghAq2HBhs3adlxToXxEWmGCZn4HWcwPi+CjoQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/client-lambda@3.958.0': resolution: {integrity: sha512-gwEqpDkgPLbFfewQkRRgnqn9iCfnd5BUVFUZpUoyq8DxzPmNn/lEVMkBaNCqwIXx07jd46+qd1neWBrH2UYi2Q==} @@ -248,10 +272,6 @@ packages: resolution: {integrity: sha512-iYoKbJTputbf+ubkX6gSK/y/4uJEBRaXZ18jykLdBQ8UJuGrk2gqvV8h7OlGAhToCeysmmMqM0vDWyLt6lP8nw==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.598.0': - resolution: {integrity: sha512-jfdH1pAO9Tt8Nkta/JJLoUnwl7jaRdxToQTJfUtE+o3+0JP5sA4LfC2rBkJSWcU5BdAA+kyOs5Lv776DlN04Vg==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.600.0': resolution: {integrity: sha512-7+I8RWURGfzvChyNQSyj5/tKrqRbzRl7H+BnTOf/4Vsw1nFOi5ROhlhD4X/Y0QCTacxnaoNcIrqnY7uGGvVRzw==} engines: {node: '>=16.0.0'} @@ -264,10 +284,6 @@ packages: resolution: {integrity: sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.598.0': - resolution: {integrity: sha512-bXhz/cHL0iB9UH9IFtMaJJf4F8mV+HzncETCRFzZ9SyUMt5rP9j8A7VZknqGYSx/6mI8SsB1XJQkWSbhn6FiSQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.600.0': resolution: {integrity: sha512-KQG97B7LvTtTiGmjlrG1LRAY8wUvCQzrmZVV5bjrJ/1oXAU7DITYwVbSJeX9NWg6hDuSk0VE3MFwIXS2SvfLIA==} engines: {node: '>=16.0.0'} @@ -280,6 +296,10 @@ packages: resolution: {integrity: sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw==} engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.973.22': + resolution: {integrity: sha512-lY6g5L95jBNgOUitUhfV2N/W+i08jHEl3xuLODYSQH5Sf50V+LkVYBSyZRLtv2RyuXZXiV7yQ+acpswK1tlrOA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.598.0': resolution: {integrity: sha512-vi1khgn7yXzLCcgSIzQrrtd2ilUM0dWodxj3PQ6BLfP0O+q1imO3hG1nq7DVyJtq7rFHs6+9N8G4mYvTkxby2w==} engines: {node: '>=16.0.0'} @@ -288,6 +308,10 @@ packages: resolution: {integrity: sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.972.20': + resolution: {integrity: sha512-vI0QN96DFx3g9AunfOWF3CS4cMkqFiR/WM/FyP9QHr5rZ2dKPkYwP3tCgAOvGuu9CXI7dC1vU2FVUuZ+tfpNvQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.598.0': resolution: {integrity: sha512-N7cIafi4HVlQvEgvZSo1G4T9qb/JMLGMdBsDCT5XkeJrF0aptQWzTFH0jIdZcLrMYvzPcuEyO3yCBe6cy/ba0g==} engines: {node: '>=16.0.0'} @@ -296,6 +320,10 @@ packages: resolution: {integrity: sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.972.22': + resolution: {integrity: sha512-aS/81smalpe7XDnuQfOq4LIPuaV2PRKU2aMTrHcqO5BD4HwO5kESOHNcec2AYfBtLtIDqgF6RXisgBnfK/jt0w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.598.0': resolution: {integrity: sha512-/ppcIVUbRwDIwJDoYfp90X3+AuJo2mvE52Y1t2VSrvUovYn6N4v95/vXj6LS8CNDhz2jvEJYmu+0cTMHdhI6eA==} engines: {node: '>=16.0.0'} @@ -306,13 +334,17 @@ packages: resolution: {integrity: sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.972.22': + resolution: {integrity: sha512-rpF8fBT0LllMDp78s62aL2A/8MaccjyJ0ORzqu+ZADeECLSrrCWIeeXsuRam+pxiAMkI1uIyDZJmgLGdadkPXw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.958.0': resolution: {integrity: sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.598.0': - resolution: {integrity: sha512-sXTlqL5I/awlF9Dg2MQ17SfrEaABVnsj2mf4jF5qQrIRhfbvQOIYdEqdy8Rn1AWlJMz/N450SGzc0XJ5owxxqw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-login@3.972.22': + resolution: {integrity: sha512-u33CO9zeNznlVSg9tWTCRYxaGkqr1ufU6qeClpmzAabXZa8RZxQoVXxL5T53oZJFzQYj+FImORCSsi7H7B77gQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-node@3.600.0': resolution: {integrity: sha512-1pC7MPMYD45J7yFjA90SxpR0yaSvy+yZiq23aXhAPZLYgJBAxHLu0s0mDCk/piWGPh8+UGur5K0bVdx4B1D5hw==} @@ -322,6 +354,10 @@ packages: resolution: {integrity: sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.972.23': + resolution: {integrity: sha512-U8tyLbLOZItuVWTH0ay9gWo4xMqZwqQbg1oMzdU4FQSkTpqXemm4X0uoKBR6llqAStgBp30ziKFJHTA43l4qMw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.598.0': resolution: {integrity: sha512-rM707XbLW8huMk722AgjVyxu2tMZee++fNA8TJVNgs1Ma02Wx6bBrfIvlyK0rCcIRb0WdQYP6fe3Xhiu4e8IBA==} engines: {node: '>=16.0.0'} @@ -330,6 +366,10 @@ packages: resolution: {integrity: sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.972.20': + resolution: {integrity: sha512-QRfk7GbA4/HDRjhP3QYR6QBr/QKreVoOzvvlRHnOuGgYJkeoPgPY3LAI1kK1ZMgZ4hH9KiGp757/ntol+INAig==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.598.0': resolution: {integrity: sha512-5InwUmrAuqQdOOgxTccRayMMkSmekdLk6s+az9tmikq0QFAHUCtofI+/fllMXSR9iL6JbGYi1940+EUmS4pHJA==} engines: {node: '>=16.0.0'} @@ -338,6 +378,10 @@ packages: resolution: {integrity: sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.972.22': + resolution: {integrity: sha512-4vqlSaUbBj4aNPVKfB6yXuIQ2Z2mvLfIGba2OzzF6zUkN437/PGWsxBU2F8QPSFHti6seckvyCXidU3H+R8NvQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.598.0': resolution: {integrity: sha512-GV5GdiMbz5Tz9JO4NJtRoFXjW0GPEujA0j+5J/B723rTN+REHthJu48HdBKouHGhdzkDWkkh1bu52V02Wprw8w==} engines: {node: '>=16.0.0'} @@ -348,6 +392,10 @@ packages: resolution: {integrity: sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.22': + resolution: {integrity: sha512-/wN1CYg2rVLhW8/jLxMWacQrkpaynnL+4j/Z+e6X1PfoE6NiC0BeOw3i0JmtZrKun85wNV5GmspvuWJihfeeUw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.598.0': resolution: {integrity: sha512-PM7BcFfGUSkmkT6+LU9TyJiB4S8yI7dfuKQDwK5ZR3P7MKaK4Uj4yyDiv0oe5xvkF6+O2+rShj+eh8YuWkOZ/Q==} engines: {node: '>=16.0.0'} @@ -368,6 +416,10 @@ packages: resolution: {integrity: sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.972.8': + resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-location-constraint@3.598.0': resolution: {integrity: sha512-8oybQxN3F1ISOMULk7JKJz5DuAm5hCUcxMW9noWShbxTJuStNvuHf/WLUzXrf8oSITyYzIHPtf8VPlKR7I3orQ==} engines: {node: '>=16.0.0'} @@ -380,6 +432,10 @@ packages: resolution: {integrity: sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.972.8': + resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-recursion-detection@3.598.0': resolution: {integrity: sha512-vjT9BeFY9FeN0f8hm2l6F53tI0N5bUq6RcDkQXKNabXBnQxKptJRad6oP2X5y3FoVfBLOuDkQgiC2940GIPxtQ==} engines: {node: '>=16.0.0'} @@ -388,6 +444,10 @@ packages: resolution: {integrity: sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.8': + resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-sdk-s3@3.598.0': resolution: {integrity: sha512-5AGtLAh9wyK6ANPYfaKTqJY1IFJyePIxsEbxa7zS6REheAqyVmgJFaGu3oQ5XlxfGr5Uq59tFTRkyx26G1HkHA==} engines: {node: '>=16.0.0'} @@ -408,10 +468,18 @@ packages: resolution: {integrity: sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.972.23': + resolution: {integrity: sha512-HQu8QoqGZZTvg0Spl9H39QTsSMFwgu+8yz/QGKndXFLk9FZMiCiIgBCVlTVKMDvVbgqIzD9ig+/HmXsIL2Rb+g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.958.0': resolution: {integrity: sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==} engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.996.12': + resolution: {integrity: sha512-KLdQGJPSm98uLINolQ0Tol8OAbk7g0Y7zplHJ1K83vbMIH13aoCvR6Tho66xueW4l4aZlEgVGLWBnD8ifUMsGQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.598.0': resolution: {integrity: sha512-oYXhmTokSav4ytmWleCr3rs/1nyvZW/S0tdi6X7u+dLNL5Jee+uMxWGzgOrWK6wrQOzucLVjS4E/wA11Kv2GTw==} engines: {node: '>=16.0.0'} @@ -420,10 +488,18 @@ packages: resolution: {integrity: sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==} engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.972.8': + resolution: {integrity: sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.598.0': resolution: {integrity: sha512-1r/EyTrO1gSa1FirnR8V7mabr7gk+l+HkyTI0fcTSr8ucB7gmYyW6WjkY8JCz13VYHFK62usCEDS7yoJoJOzTA==} engines: {node: '>=16.0.0'} + '@aws-sdk/token-providers@3.1013.0': + resolution: {integrity: sha512-IL1c54UvbuERrs9oLm5rvkzMciwhhpn1FL0SlC3XUMoLlFhdBsWJgQKK8O5fsQLxbFVqjbjFx9OBkrn44X9PHw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.598.0': resolution: {integrity: sha512-TKY1EVdHVBnZqpyxyTHdpZpa1tUpb6nxVeRNn1zWG8QB5MvH4ALLd/jR+gtmWDNQbIG4cVuBOZFVL8hIYicKTA==} engines: {node: '>=16.0.0'} @@ -442,6 +518,10 @@ packages: resolution: {integrity: sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.973.6': + resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-arn-parser@3.568.0': resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} @@ -454,6 +534,10 @@ packages: resolution: {integrity: sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.996.5': + resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-locate-window@3.957.0': resolution: {integrity: sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw==} engines: {node: '>=18.0.0'} @@ -464,6 +548,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.957.0': resolution: {integrity: sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==} + '@aws-sdk/util-user-agent-browser@3.972.8': + resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} + '@aws-sdk/util-user-agent-node@3.598.0': resolution: {integrity: sha512-oyWGcOlfTdzkC6SVplyr0AGh54IMrDxbhg5RxJ5P+V4BKfcDoDcZV9xenUk9NsOi9MuUjxMumb9UJGkDhM1m0A==} engines: {node: '>=16.0.0'} @@ -482,6 +569,15 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.973.9': + resolution: {integrity: sha512-jeFqqp8KD/P5O+qeKxyGeu7WEVIZFNprnkaDjGmBOjwxYwafCBhpxTgV1TlW6L8e76Vh/siNylNmN/OmSIFBUQ==} + 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==} @@ -493,6 +589,10 @@ packages: resolution: {integrity: sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA==} engines: {node: '>=18.0.0'} + '@aws-sdk/xml-builder@3.972.14': + resolution: {integrity: sha512-G/Yd8Bnnyh8QrqLf8jWJbixEnScUFW24e/wOBGYdw1Cl4r80KX/DvHyM2GVZ2vTp7J4gTEr8IXJlTadA8+UfuQ==} + engines: {node: '>=20.0.0'} + '@aws/lambda-invoke-store@0.2.2': resolution: {integrity: sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==} engines: {node: '>=18.0.0'} @@ -756,9 +856,22 @@ packages: 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.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@ensdomains/ens@0.4.5': resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} deprecated: Please use @ensdomains/ens-contracts @@ -773,6 +886,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@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} @@ -1099,9 +1218,22 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@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@1.0.0': + resolution: {integrity: sha512-Y9ycl83T1ZrLSFZYT6V/QMFZjwc4fB+/WjuQygLAVSZAJNAaEtSRm9l4lMKazV/AE30qC/uKzyY9s/zoAtNx8w==} + engines: {node: '>=14.0.0'} + peerDependencies: + ethers: ^5.7.2 + '@layerzerolabs/devtools@0.4.10': resolution: {integrity: sha512-Y9kjUQuyNfm9Vs07+Mk0+KkqHPwHN2cLSzKhe5Tp+52R7d4fI5zsn33IaJsqqGWxSDL1sKq7gFMTdtglTdsA8A==} peerDependencies: @@ -1214,6 +1346,123 @@ packages: '@lodestar/utils@1.41.0': resolution: {integrity: sha512-D/KtN7qlQZe3sNDdSaCyD0bmwEHBmW9PYhROSsM2/JjIABOERH+1zJqj76a22igp3WcvrMCAkEs71mF9oLzWOQ==} + '@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] + libc: [glibc] + + '@napi-rs/snappy-linux-arm64-musl@7.3.3': + resolution: {integrity: sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/snappy-linux-ppc64-gnu@7.3.3': + resolution: {integrity: sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@napi-rs/snappy-linux-riscv64-gnu@7.3.3': + resolution: {integrity: sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@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] + libc: [glibc] + + '@napi-rs/snappy-linux-x64-gnu@7.3.3': + resolution: {integrity: sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/snappy-linux-x64-musl@7.3.3': + resolution: {integrity: sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@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.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -1449,6 +1698,36 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@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==} + '@resolver-engine/core@0.3.3': resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} @@ -1685,6 +1964,10 @@ packages: resolution: {integrity: sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==} engines: {node: '>=16.0.0'} + '@smithy/abort-controller@4.2.12': + resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} + engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.7': resolution: {integrity: sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==} engines: {node: '>=18.0.0'} @@ -1699,6 +1982,10 @@ packages: resolution: {integrity: sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==} engines: {node: '>=16.0.0'} + '@smithy/config-resolver@4.4.13': + resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} + engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.5': resolution: {integrity: sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==} engines: {node: '>=18.0.0'} @@ -1711,10 +1998,18 @@ packages: resolution: {integrity: sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==} engines: {node: '>=18.0.0'} + '@smithy/core@3.23.12': + resolution: {integrity: sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@3.2.8': resolution: {integrity: sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==} engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@4.2.12': + resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.7': resolution: {integrity: sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==} engines: {node: '>=18.0.0'} @@ -1764,6 +2059,10 @@ packages: '@smithy/fetch-http-handler@4.1.3': resolution: {integrity: sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==} + '@smithy/fetch-http-handler@5.3.15': + resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} + engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.3.8': resolution: {integrity: sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==} engines: {node: '>=18.0.0'} @@ -1775,6 +2074,10 @@ packages: resolution: {integrity: sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==} engines: {node: '>=16.0.0'} + '@smithy/hash-node@4.2.12': + resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} + engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.2.7': resolution: {integrity: sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==} engines: {node: '>=18.0.0'} @@ -1786,6 +2089,10 @@ packages: '@smithy/invalid-dependency@3.0.11': resolution: {integrity: sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==} + '@smithy/invalid-dependency@4.2.12': + resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} + engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.2.7': resolution: {integrity: sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==} engines: {node: '>=18.0.0'} @@ -1802,6 +2109,10 @@ packages: resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} + engines: {node: '>=18.0.0'} + '@smithy/md5-js@3.0.11': resolution: {integrity: sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==} @@ -1809,6 +2120,10 @@ packages: resolution: {integrity: sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==} engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@4.2.12': + resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.2.7': resolution: {integrity: sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==} engines: {node: '>=18.0.0'} @@ -1821,6 +2136,10 @@ packages: resolution: {integrity: sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.4.27': + resolution: {integrity: sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@3.0.34': resolution: {integrity: sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==} engines: {node: '>=16.0.0'} @@ -1829,10 +2148,18 @@ packages: resolution: {integrity: sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.44': + resolution: {integrity: sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@3.0.11': resolution: {integrity: sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==} engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.2.15': + resolution: {integrity: sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.8': resolution: {integrity: sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==} engines: {node: '>=18.0.0'} @@ -1841,6 +2168,10 @@ packages: resolution: {integrity: sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.2.12': + resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.7': resolution: {integrity: sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==} engines: {node: '>=18.0.0'} @@ -1849,6 +2180,10 @@ packages: resolution: {integrity: sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==} engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.3.12': + resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.7': resolution: {integrity: sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==} engines: {node: '>=18.0.0'} @@ -1861,10 +2196,18 @@ packages: resolution: {integrity: sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.5.0': + resolution: {integrity: sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@3.1.11': resolution: {integrity: sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==} engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.2.12': + resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.7': resolution: {integrity: sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==} engines: {node: '>=18.0.0'} @@ -1873,6 +2216,10 @@ packages: resolution: {integrity: sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==} engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.3.12': + resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.7': resolution: {integrity: sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==} engines: {node: '>=18.0.0'} @@ -1881,6 +2228,10 @@ packages: resolution: {integrity: sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==} engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.2.12': + resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.7': resolution: {integrity: sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==} engines: {node: '>=18.0.0'} @@ -1889,6 +2240,10 @@ packages: resolution: {integrity: sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==} engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.2.12': + resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.7': resolution: {integrity: sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==} engines: {node: '>=18.0.0'} @@ -1897,6 +2252,10 @@ packages: resolution: {integrity: sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==} engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@4.2.12': + resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.7': resolution: {integrity: sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==} engines: {node: '>=18.0.0'} @@ -1909,10 +2268,18 @@ packages: resolution: {integrity: sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.4.7': + resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@3.1.2': resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.3.12': + resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.7': resolution: {integrity: sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==} engines: {node: '>=18.0.0'} @@ -1925,6 +2292,10 @@ packages: resolution: {integrity: sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.12.7': + resolution: {integrity: sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ==} + engines: {node: '>=18.0.0'} + '@smithy/types@3.7.2': resolution: {integrity: sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==} engines: {node: '>=16.0.0'} @@ -1933,9 +2304,17 @@ packages: resolution: {integrity: sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==} engines: {node: '>=18.0.0'} + '@smithy/types@4.13.1': + resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@3.0.11': resolution: {integrity: sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==} + '@smithy/url-parser@4.2.12': + resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.7': resolution: {integrity: sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==} engines: {node: '>=18.0.0'} @@ -1948,6 +2327,10 @@ packages: resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} 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@3.0.0': resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} @@ -1955,6 +2338,10 @@ packages: resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} 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@3.0.0': resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} @@ -1963,6 +2350,10 @@ packages: resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} 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'} @@ -1975,6 +2366,10 @@ packages: resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.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@3.0.0': resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} @@ -1983,6 +2378,10 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} 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@3.0.34': resolution: {integrity: sha512-FumjjF631lR521cX+svMLBj3SwSDh9VdtyynTYDAiBDEf8YPP5xORNXKQ9j0105o5+ARAGnOOP/RqSl40uXddA==} engines: {node: '>= 10.0.0'} @@ -1991,6 +2390,10 @@ packages: resolution: {integrity: sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.43': + resolution: {integrity: sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@3.0.34': resolution: {integrity: sha512-vN6aHfzW9dVVzkI0wcZoUXvfjkl4CSbM9nE//08lmUMyf00S75uuCpTrqF9uD4bD9eldIXlt53colrlwKAT8Gw==} engines: {node: '>= 10.0.0'} @@ -1999,6 +2402,10 @@ packages: resolution: {integrity: sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.47': + resolution: {integrity: sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@2.1.7': resolution: {integrity: sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==} engines: {node: '>=16.0.0'} @@ -2007,6 +2414,10 @@ packages: resolution: {integrity: sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.3.3': + resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@3.0.0': resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} @@ -2015,10 +2426,18 @@ packages: resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} 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@3.0.11': resolution: {integrity: sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==} engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.2.12': + resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.7': resolution: {integrity: sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==} engines: {node: '>=18.0.0'} @@ -2027,6 +2446,10 @@ packages: resolution: {integrity: sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==} engines: {node: '>=16.0.0'} + '@smithy/util-retry@4.2.12': + resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.7': resolution: {integrity: sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==} engines: {node: '>=18.0.0'} @@ -2035,6 +2458,10 @@ packages: resolution: {integrity: sha512-SGhGBG/KupieJvJSZp/rfHHka8BFgj56eek9px4pp7lZbOF+fRiVr4U7A3y3zJD8uGhxq32C5D96HxsTC9BckQ==} engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.5.20': + resolution: {integrity: sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.8': resolution: {integrity: sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==} engines: {node: '>=18.0.0'} @@ -2047,6 +2474,10 @@ packages: resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} 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'} @@ -2059,6 +2490,10 @@ packages: resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@3.2.0': resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} engines: {node: '>=16.0.0'} @@ -2071,6 +2506,10 @@ packages: resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} 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==} @@ -2105,6 +2544,21 @@ packages: resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} engines: {node: '>= 10.0.0'} + '@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==} + '@typechain/ethers-v5@10.2.1': resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: @@ -2217,6 +2671,65 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@typescript-eslint/eslint-plugin@8.57.2': + resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.57.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.57.2': + resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.57.2': + resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.57.2': + resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -2285,6 +2798,10 @@ packages: 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@6.4.2: resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} engines: {node: '>=0.4.0'} @@ -2322,9 +2839,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - amazon-cognito-identity-js@6.3.16: resolution: {integrity: sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ==} @@ -2401,6 +2915,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2456,6 +2973,10 @@ packages: async-eventemitter@0.2.4: resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} @@ -2501,6 +3022,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -2553,9 +3078,6 @@ packages: bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - bn.js@5.2.3: - resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} - body-parser@1.20.4: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2573,6 +3095,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + 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'} @@ -2962,6 +3488,9 @@ packages: 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==} @@ -3019,6 +3548,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -3274,6 +3812,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@5.16.0: resolution: {integrity: sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==} engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} @@ -3467,6 +4009,9 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true @@ -3475,6 +4020,10 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true + fast-xml-parser@5.5.6: + resolution: {integrity: sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==} + hasBin: true + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -3700,20 +4249,22 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + 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@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@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -3721,7 +4272,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + 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==} @@ -3930,6 +4481,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -4346,6 +4901,9 @@ packages: 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==} + loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -4380,6 +4938,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + markdown-table@2.0.0: resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} @@ -4479,12 +5040,13 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@5.0.1: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} @@ -4811,6 +5373,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.2.0: + resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -4948,6 +5514,10 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -4982,14 +5552,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} - engines: {node: '>=0.6'} - - qs@6.15.0: - resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} - engines: {node: '>=0.6'} - qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -5336,6 +5898,10 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + snappy@7.3.3: + resolution: {integrity: sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ==} + engines: {node: '>= 10'} + snappyjs@0.7.0: resolution: {integrity: sha512-u5iEEXkMe2EInQio6Wv9LWHOQYRDbD2O9hzS27GpT/lwfIQhTCnHCTqedqHIHe9ZcvQo+9au6vngQayipz1NYw==} @@ -5410,8 +5976,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -5426,8 +5992,8 @@ packages: engines: {node: '>=12'} hasBin: true - ssv-scanner@git+https://git@github.com:bloxapp/ssv-scanner.git#45068c93b3de84495f6cfad2767787c91d98aa8f: - resolution: {commit: 45068c93b3de84495f6cfad2767787c91d98aa8f, repo: git@github.com:bloxapp/ssv-scanner.git, type: git} + ssv-scanner@https://codeload.github.com/ssvlabs/ssv-scanner/tar.gz/45068c93b3de84495f6cfad2767787c91d98aa8f: + resolution: {tarball: https://codeload.github.com/ssvlabs/ssv-scanner/tar.gz/45068c93b3de84495f6cfad2767787c91d98aa8f} version: 1.0.4 engines: {node: '>=18'} hasBin: true @@ -5623,6 +6189,12 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-command-line-args@2.5.1: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true @@ -5632,6 +6204,20 @@ packages: peerDependencies: typescript: '>=3.7.0' + 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==} @@ -5717,6 +6303,11 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -5768,6 +6359,9 @@ packages: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} + url-polyfill@1.1.14: + resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} + url-set-query@1.0.0: resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} @@ -5814,6 +6408,9 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -6043,6 +6640,9 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + 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'} @@ -6212,6 +6812,10 @@ packages: yargs@4.8.1: resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + 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'} @@ -6234,13 +6838,13 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.598.0 + '@aws-sdk/types': 3.957.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.598.0 + '@aws-sdk/types': 3.957.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': @@ -6257,7 +6861,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.598.0 + '@aws-sdk/types': 3.973.6 '@aws-sdk/util-locate-window': 3.957.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6271,7 +6875,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.598.0 + '@aws-sdk/types': 3.973.6 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6286,52 +6890,50 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.598.0 + '@aws-sdk/types': 3.957.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-kms@3.598.0': + '@aws-sdk/client-kms@3.1013.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.598.0(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/client-sts': 3.598.0 - '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/middleware-host-header': 3.598.0 - '@aws-sdk/middleware-logger': 3.598.0 - '@aws-sdk/middleware-recursion-detection': 3.598.0 - '@aws-sdk/middleware-user-agent': 3.598.0 - '@aws-sdk/region-config-resolver': 3.598.0 - '@aws-sdk/types': 3.598.0 - '@aws-sdk/util-endpoints': 3.598.0 - '@aws-sdk/util-user-agent-browser': 3.598.0 - '@aws-sdk/util-user-agent-node': 3.598.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.7 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.8 - '@smithy/middleware-retry': 3.0.34 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.3 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.7.0 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.34 - '@smithy/util-defaults-mode-node': 3.0.34 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/credential-provider-node': 3.972.23 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.23 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.9 + '@smithy/config-resolver': 4.4.13 + '@smithy/core': 3.23.12 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.15 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.5.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@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.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6390,8 +6992,8 @@ snapshots: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) - '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/client-sso-oidc': 3.600.0 + '@aws-sdk/client-sts': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/core': 3.598.0 '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-bucket-endpoint': 3.598.0 @@ -6448,57 +7050,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.598.0(@aws-sdk/client-sts@3.598.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.598.0 - '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/middleware-host-header': 3.598.0 - '@aws-sdk/middleware-logger': 3.598.0 - '@aws-sdk/middleware-recursion-detection': 3.598.0 - '@aws-sdk/middleware-user-agent': 3.598.0 - '@aws-sdk/region-config-resolver': 3.598.0 - '@aws-sdk/types': 3.598.0 - '@aws-sdk/util-endpoints': 3.598.0 - '@aws-sdk/util-user-agent-browser': 3.598.0 - '@aws-sdk/util-user-agent-node': 3.598.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.7 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.8 - '@smithy/middleware-retry': 3.0.34 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.3 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.7.0 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.34 - '@smithy/util-defaults-mode-node': 3.0.34 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)': + '@aws-sdk/client-sso-oidc@3.600.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/client-sts': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/core': 3.598.0 '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 @@ -6537,7 +7093,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.598.0': @@ -6626,56 +7181,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.598.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.598.0(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/middleware-host-header': 3.598.0 - '@aws-sdk/middleware-logger': 3.598.0 - '@aws-sdk/middleware-recursion-detection': 3.598.0 - '@aws-sdk/middleware-user-agent': 3.598.0 - '@aws-sdk/region-config-resolver': 3.598.0 - '@aws-sdk/types': 3.598.0 - '@aws-sdk/util-endpoints': 3.598.0 - '@aws-sdk/util-user-agent-browser': 3.598.0 - '@aws-sdk/util-user-agent-node': 3.598.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.7 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.8 - '@smithy/middleware-retry': 3.0.34 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.3 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.7.0 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.34 - '@smithy/util-defaults-mode-node': 3.0.34 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.600.0': + '@aws-sdk/client-sts@3.600.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/client-sso-oidc': 3.600.0 '@aws-sdk/core': 3.598.0 '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 @@ -6714,6 +7224,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.598.0': @@ -6742,6 +7253,22 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 + '@aws-sdk/core@3.973.22': + dependencies: + '@aws-sdk/types': 3.973.6 + '@aws-sdk/xml-builder': 3.972.14 + '@smithy/core': 3.23.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -6757,6 +7284,14 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.22 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -6782,27 +7317,22 @@ snapshots: '@smithy/util-stream': 4.5.8 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0)': + '@aws-sdk/credential-provider-http@3.972.22': dependencies: - '@aws-sdk/client-sts': 3.598.0 - '@aws-sdk/credential-provider-env': 3.598.0 - '@aws-sdk/credential-provider-http': 3.598.0 - '@aws-sdk/credential-provider-process': 3.598.0 - '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0) - '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/types': 3.598.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/types': 3.973.6 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.5.0 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.20 tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': dependencies: - '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/client-sts': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/credential-provider-env': 3.598.0 '@aws-sdk/credential-provider-http': 3.598.0 '@aws-sdk/credential-provider-process': 3.598.0 @@ -6837,6 +7367,25 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.972.22': + dependencies: + '@aws-sdk/core': 3.973.22 + '@aws-sdk/credential-provider-env': 3.972.20 + '@aws-sdk/credential-provider-http': 3.972.22 + '@aws-sdk/credential-provider-login': 3.972.22 + '@aws-sdk/credential-provider-process': 3.972.20 + '@aws-sdk/credential-provider-sso': 3.972.22 + '@aws-sdk/credential-provider-web-identity': 3.972.22 + '@aws-sdk/nested-clients': 3.996.12 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-login@3.958.0': dependencies: '@aws-sdk/core': 3.957.0 @@ -6850,23 +7399,17 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0)': + '@aws-sdk/credential-provider-login@3.972.22': dependencies: - '@aws-sdk/credential-provider-env': 3.598.0 - '@aws-sdk/credential-provider-http': 3.598.0 - '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0)(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/credential-provider-process': 3.598.0 - '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0) - '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/types': 3.598.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/nested-clients': 3.996.12 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': @@ -6905,6 +7448,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.972.23': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.20 + '@aws-sdk/credential-provider-http': 3.972.22 + '@aws-sdk/credential-provider-ini': 3.972.22 + '@aws-sdk/credential-provider-process': 3.972.20 + '@aws-sdk/credential-provider-sso': 3.972.22 + '@aws-sdk/credential-provider-web-identity': 3.972.22 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -6922,18 +7482,14 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.598.0)': + '@aws-sdk/credential-provider-process@3.972.20': dependencies: - '@aws-sdk/client-sso': 3.598.0 - '@aws-sdk/token-providers': 3.598.0(@aws-sdk/client-sso-oidc@3.598.0) - '@aws-sdk/types': 3.598.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: @@ -6961,17 +7517,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.598.0(@aws-sdk/client-sts@3.598.0)': + '@aws-sdk/credential-provider-sso@3.972.22': dependencies: - '@aws-sdk/client-sts': 3.598.0 - '@aws-sdk/types': 3.598.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/nested-clients': 3.996.12 + '@aws-sdk/token-providers': 3.1013.0 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/credential-provider-web-identity@3.598.0(@aws-sdk/client-sts@3.600.0)': dependencies: - '@aws-sdk/client-sts': 3.600.0 + '@aws-sdk/client-sts': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/types': 3.598.0 '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 @@ -6989,6 +7550,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.22': + dependencies: + '@aws-sdk/core': 3.973.22 + '@aws-sdk/nested-clients': 3.996.12 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/middleware-bucket-endpoint@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7031,6 +7604,13 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7049,6 +7629,12 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7064,6 +7650,14 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@aws/lambda-invoke-store': 0.2.2 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7110,6 +7704,17 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.23': + dependencies: + '@aws-sdk/core': 3.973.22 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@smithy/core': 3.23.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-retry': 4.2.12 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.958.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -7153,6 +7758,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.996.12': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.23 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.9 + '@smithy/config-resolver': 4.4.13 + '@smithy/core': 3.23.12 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-retry': 4.4.44 + '@smithy/middleware-serde': 4.2.15 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.5.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@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.43 + '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7170,6 +7818,14 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/config-resolver': 4.4.13 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.598.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.598.0 @@ -7179,18 +7835,21 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.598.0)': + '@aws-sdk/token-providers@3.1013.0': dependencies: - '@aws-sdk/client-sso-oidc': 3.598.0(@aws-sdk/client-sts@3.598.0) - '@aws-sdk/types': 3.598.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.973.22 + '@aws-sdk/nested-clients': 3.996.12 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/client-sso-oidc': 3.600.0 '@aws-sdk/types': 3.598.0 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 @@ -7219,6 +7878,11 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/types@3.973.6': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@aws-sdk/util-arn-parser@3.568.0': dependencies: tslib: 2.8.1 @@ -7238,6 +7902,14 @@ snapshots: '@smithy/util-endpoints': 3.2.7 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.996.5': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-endpoints': 3.3.3 + tslib: 2.8.1 + '@aws-sdk/util-locate-window@3.957.0': dependencies: tslib: 2.8.1 @@ -7256,6 +7928,13 @@ snapshots: bowser: 2.13.1 tslib: 2.8.1 + '@aws-sdk/util-user-agent-browser@3.972.8': + dependencies: + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + bowser: 2.13.1 + tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.598.0': dependencies: '@aws-sdk/types': 3.598.0 @@ -7271,6 +7950,15 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.973.9': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.23 + '@aws-sdk/types': 3.973.6 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 @@ -7286,6 +7974,12 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.14': + dependencies: + '@smithy/types': 4.13.1 + fast-xml-parser: 5.5.6 + tslib: 2.8.1 + '@aws/lambda-invoke-store@0.2.2': {} '@axelar-network/axelar-gmp-sdk-solidity@5.10.0': {} @@ -7474,12 +8168,32 @@ snapshots: '@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.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@ensdomains/ens@0.4.5': dependencies: bluebird: 3.7.2 @@ -7495,6 +8209,11 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@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': @@ -7556,18 +8275,18 @@ snapshots: - '@ensdomains/resolver' - supports-color - '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15(debug@4.3.4))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5)': + '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15(debug@4.3.4))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.13 ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) mkdirp: 0.5.6 node-fetch: 2.7.0 solc: 0.8.15(debug@4.3.4) - typechain: 8.3.2(typescript@4.9.5) + typechain: 8.3.2(typescript@5.9.3) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -8276,8 +8995,27 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.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@1.0.0(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@aws-sdk/client-kms': 3.1013.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@layerzerolabs/devtools@0.4.10(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.1.17(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.151)(zod@3.25.76)': dependencies: '@ethersproject/bytes': 5.8.0 @@ -8367,7 +9105,7 @@ snapshots: '@lodestar/types': 1.41.0 '@lodestar/utils': 1.41.0 eventsource: 2.0.2 - qs: 6.15.0 + qs: 6.14.0 transitivePeerDependencies: - '@vekexasia/bigint-uint8array' - vitest @@ -8430,6 +9168,69 @@ snapshots: transitivePeerDependencies: - '@vekexasia/bigint-uint8array' + '@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': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + 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.1': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@noble/ciphers@1.3.0': {} '@noble/curves@1.2.0': @@ -8496,18 +9297,18 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.3 '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 - '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.3.4(supports-color@8.1.1) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -8551,12 +9352,12 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 @@ -8564,7 +9365,7 @@ snapshots: chalk: 2.4.2 debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash: 4.17.21 semver: 6.3.1 table: 6.9.0 @@ -8572,20 +9373,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomiclabs/hardhat-solhint@2.0.1(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-solhint@2.0.1(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) solhint: 2.3.1 transitivePeerDependencies: - supports-color - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@4.9.5))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 - ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@4.9.5) + ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) '@openzeppelin/contracts-upgradeable@4.7.3': {} @@ -8781,16 +9582,16 @@ snapshots: - web3-core - web3-utils - '@openzeppelin/hardhat-upgrades@1.27.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@1.27.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/upgrades-core': 1.44.2 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) defender-base-client: 1.44.3(debug@4.3.4) ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) platform-deploy-client: 0.6.0(debug@4.3.4) proper-lockfile: 4.1.2 transitivePeerDependencies: @@ -8813,8 +9614,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@pkgjs/parseargs@0.11.0': - optional: true + '@pkgjs/parseargs@0.11.0': + optional: true + + '@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': {} '@resolver-engine/core@0.3.3': dependencies: @@ -9052,6 +9876,11 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/abort-controller@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/abort-controller@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9074,6 +9903,15 @@ snapshots: '@smithy/util-middleware': 3.0.11 tslib: 2.8.1 + '@smithy/config-resolver@4.4.13': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + tslib: 2.8.1 + '@smithy/config-resolver@4.4.5': dependencies: '@smithy/node-config-provider': 4.3.7 @@ -9107,6 +9945,19 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 + '@smithy/core@3.23.12': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.20 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + '@smithy/credential-provider-imds@3.2.8': dependencies: '@smithy/node-config-provider': 3.1.12 @@ -9115,6 +9966,14 @@ snapshots: '@smithy/url-parser': 3.0.11 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.12': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.7': dependencies: '@smithy/node-config-provider': 4.3.7 @@ -9199,6 +10058,14 @@ snapshots: '@smithy/util-base64': 3.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.3.15': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + tslib: 2.8.1 + '@smithy/fetch-http-handler@5.3.8': dependencies: '@smithy/protocol-http': 5.3.7 @@ -9221,6 +10088,13 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/hash-node@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/hash-node@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9239,6 +10113,11 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/invalid-dependency@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/invalid-dependency@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9256,6 +10135,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/is-array-buffer@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/md5-js@3.0.11': dependencies: '@smithy/types': 3.7.2 @@ -9268,6 +10151,12 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/middleware-content-length@4.2.12': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/middleware-content-length@4.2.7': dependencies: '@smithy/protocol-http': 5.3.7 @@ -9296,6 +10185,17 @@ snapshots: '@smithy/util-middleware': 4.2.7 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.4.27': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/middleware-serde': 4.2.15 + '@smithy/node-config-provider': 4.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-middleware': 4.2.12 + tslib: 2.8.1 + '@smithy/middleware-retry@3.0.34': dependencies: '@smithy/node-config-provider': 3.1.12 @@ -9320,11 +10220,30 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 + '@smithy/middleware-retry@4.4.44': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/service-error-classification': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + '@smithy/middleware-serde@3.0.11': dependencies: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/middleware-serde@4.2.15': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/middleware-serde@4.2.8': dependencies: '@smithy/protocol-http': 5.3.7 @@ -9336,6 +10255,11 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/middleware-stack@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/middleware-stack@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9348,6 +10272,13 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/node-config-provider@4.3.12': + dependencies: + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/node-config-provider@4.3.7': dependencies: '@smithy/property-provider': 4.2.7 @@ -9371,11 +10302,24 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.5.0': + dependencies: + '@smithy/abort-controller': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/property-provider@3.1.11': dependencies: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/property-provider@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/property-provider@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9386,6 +10330,11 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/protocol-http@5.3.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/protocol-http@5.3.7': dependencies: '@smithy/types': 4.11.0 @@ -9397,6 +10346,12 @@ snapshots: '@smithy/util-uri-escape': 3.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/util-uri-escape': 4.2.2 + tslib: 2.8.1 + '@smithy/querystring-builder@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9408,6 +10363,11 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/querystring-parser@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/querystring-parser@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9417,6 +10377,10 @@ snapshots: dependencies: '@smithy/types': 3.7.2 + '@smithy/service-error-classification@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + '@smithy/service-error-classification@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9431,6 +10395,11 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.4.7': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/signature-v4@3.1.2': dependencies: '@smithy/is-array-buffer': 3.0.0 @@ -9441,6 +10410,17 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.3.12': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/signature-v4@5.3.7': dependencies: '@smithy/is-array-buffer': 4.2.0 @@ -9472,6 +10452,16 @@ snapshots: '@smithy/util-stream': 4.5.8 tslib: 2.8.1 + '@smithy/smithy-client@4.12.7': + dependencies: + '@smithy/core': 3.23.12 + '@smithy/middleware-endpoint': 4.4.27 + '@smithy/middleware-stack': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.20 + tslib: 2.8.1 + '@smithy/types@3.7.2': dependencies: tslib: 2.8.1 @@ -9480,12 +10470,22 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/types@4.13.1': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@3.0.11': dependencies: '@smithy/querystring-parser': 3.0.11 '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/url-parser@4.2.12': + dependencies: + '@smithy/querystring-parser': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/url-parser@4.2.7': dependencies: '@smithy/querystring-parser': 4.2.7 @@ -9504,6 +10504,12 @@ snapshots: '@smithy/util-utf8': 4.2.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@3.0.0': dependencies: tslib: 2.8.1 @@ -9512,6 +10518,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-body-length-browser@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-body-length-node@3.0.0': dependencies: tslib: 2.8.1 @@ -9520,6 +10530,10 @@ snapshots: 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 @@ -9535,6 +10549,11 @@ snapshots: '@smithy/is-array-buffer': 4.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@3.0.0': dependencies: tslib: 2.8.1 @@ -9543,6 +10562,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-config-provider@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@3.0.34': dependencies: '@smithy/property-provider': 3.1.11 @@ -9558,6 +10581,13 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.3.43': + dependencies: + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@3.0.34': dependencies: '@smithy/config-resolver': 3.0.13 @@ -9578,6 +10608,16 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.2.47': + dependencies: + '@smithy/config-resolver': 4.4.13 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/util-endpoints@2.1.7': dependencies: '@smithy/node-config-provider': 3.1.12 @@ -9590,6 +10630,12 @@ snapshots: '@smithy/types': 4.11.0 tslib: 2.8.1 + '@smithy/util-endpoints@3.3.3': + dependencies: + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/util-hex-encoding@3.0.0': dependencies: tslib: 2.8.1 @@ -9598,11 +10644,20 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-hex-encoding@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-middleware@3.0.11': dependencies: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/util-middleware@4.2.12': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/util-middleware@4.2.7': dependencies: '@smithy/types': 4.11.0 @@ -9614,6 +10669,12 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@smithy/util-retry@4.2.12': + dependencies: + '@smithy/service-error-classification': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + '@smithy/util-retry@4.2.7': dependencies: '@smithy/service-error-classification': 4.2.7 @@ -9631,6 +10692,17 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/util-stream@4.5.20': + dependencies: + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.5.0 + '@smithy/types': 4.13.1 + '@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-stream@4.5.8': dependencies: '@smithy/fetch-http-handler': 5.3.8 @@ -9650,6 +10722,10 @@ snapshots: dependencies: 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 @@ -9665,6 +10741,11 @@ snapshots: '@smithy/util-buffer-from': 4.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@3.2.0': dependencies: '@smithy/abort-controller': 3.1.9 @@ -9681,6 +10762,10 @@ snapshots: dependencies: 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 @@ -9717,21 +10802,34 @@ snapshots: node-gyp-build: 4.3.0 optional: true - '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5)': + '@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 + + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@4.9.5) - typechain: 8.3.2(typescript@4.9.5) - typescript: 4.9.5 + ts-essentials: 7.0.3(typescript@5.9.3) + typechain: 8.3.2(typescript@5.9.3) + typescript: 5.9.3 '@types/abstract-leveldown@7.2.5': {} '@types/bn.js@4.11.6': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.0.3 '@types/bn.js@5.2.0': dependencies: @@ -9741,7 +10839,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 12.20.55 + '@types/node': 25.0.3 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -9764,7 +10862,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.0.3 '@types/level-errors@3.0.2': {} @@ -9813,7 +10911,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 12.20.55 + '@types/node': 25.0.3 '@types/secp256k1@4.0.7': dependencies: @@ -9840,6 +10938,97 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/type-utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 + eslint: 8.57.1 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 + debug: 4.4.3 + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.57.2': + dependencies: + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 + + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.57.2(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.57.2': {} + + '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.57.2(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.57.2': + dependencies: + '@typescript-eslint/types': 8.57.2 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} '@uniswap/lib@4.0.1-alpha': {} @@ -9862,9 +11051,9 @@ snapshots: abbrev@1.0.9: {} - abitype@1.2.3(typescript@4.9.5)(zod@3.25.76): + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 zod: 3.25.76 abortcontroller-polyfill@1.7.8: {} @@ -9898,6 +11087,10 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-walk@8.3.5: + dependencies: + acorn: 8.15.0 + acorn@6.4.2: {} acorn@8.15.0: {} @@ -9935,13 +11128,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ajv@8.18.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - amazon-cognito-identity-js@6.3.16: dependencies: '@aws-crypto/sha256-js': 1.2.2 @@ -10002,6 +11188,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -10050,6 +11238,8 @@ snapshots: dependencies: async: 2.6.4 + async-exit-hook@2.0.1: {} + async-limiter@1.0.1: {} async-retry@1.3.3: @@ -10100,6 +11290,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -10143,8 +11335,6 @@ snapshots: bn.js@5.2.2: {} - bn.js@5.2.3: {} - body-parser@1.20.4: dependencies: bytes: 3.1.2 @@ -10155,7 +11345,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.2 + qs: 6.14.0 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -10184,6 +11374,10 @@ snapshots: 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 @@ -10590,14 +11784,14 @@ snapshots: js-yaml: 3.14.2 parse-json: 4.0.0 - cosmiconfig@8.3.6(typescript@4.9.5): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 crc-32@1.2.2: {} @@ -10623,6 +11817,8 @@ snapshots: 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 @@ -10686,6 +11882,10 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decamelize@4.0.0: {} @@ -10934,6 +12134,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@5.0.1: {} + eslint@5.16.0: dependencies: '@babel/code-frame': 7.27.1 @@ -11133,15 +12335,15 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@4.9.5): + ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(debug@4.3.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3): dependencies: '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15(debug@4.3.4))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15(debug@4.3.4))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3) '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)) ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) solc: 0.8.15(debug@4.3.4) - typechain: 8.3.2(typescript@4.9.5) + typechain: 8.3.2(typescript@5.9.3) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -11296,7 +12498,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.2 + qs: 6.14.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -11343,6 +12545,10 @@ snapshots: fast-uri@3.1.0: {} + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.2.0 + fast-xml-parser@4.2.5: dependencies: strnum: 1.1.2 @@ -11351,6 +12557,12 @@ snapshots: dependencies: strnum: 2.1.2 + fast-xml-parser@5.5.6: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.2.0 + strnum: 2.1.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -11749,17 +12961,17 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - hardhat-contract-sizer@2.10.0(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)): + hardhat-contract-sizer@2.10.0(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 - hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)): + hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-deploy@0.11.30(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: @@ -11792,7 +13004,7 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@2.3.0(bufferutil@4.1.0)(debug@4.3.4)(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))(typescript@4.9.5)(utf-8-validate@5.0.10)(zod@3.25.76): + hardhat-gas-reporter@2.3.0(bufferutil@4.1.0)(debug@4.3.4)(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bytes': 5.8.0 @@ -11804,12 +13016,12 @@ snapshots: cli-table3: 0.6.5 ethereum-cryptography: 2.2.1 glob: 10.5.0 - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 markdown-table: 2.0.0 sha1: 1.1.1 - viem: 2.43.3(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.43.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - debug @@ -11817,20 +13029,20 @@ snapshots: - utf-8-validate - zod - hardhat-tracer@3.2.1(bufferutil@4.1.0)(chai@4.3.7)(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-tracer@3.2.1(bufferutil@4.1.0)(chai@4.3.7)(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: chai: 4.3.7 chalk: 4.1.2 debug: 4.3.4(supports-color@8.1.1) ethers: 5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10) - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) semver: 7.7.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10): + hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -11872,7 +13084,8 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@25.0.3)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - supports-color @@ -11975,6 +13188,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immediate@3.0.6: {} immediate@3.2.3: {} @@ -12370,6 +13585,8 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 + long@5.3.2: {} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 @@ -12396,6 +13613,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-error@1.3.6: {} + markdown-table@2.0.0: dependencies: repeat-string: 1.6.1 @@ -12488,11 +13707,11 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.1.2: + minimatch@10.2.4: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.5 - minimatch@3.1.5: + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -12745,7 +13964,7 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.11.1(typescript@4.9.5)(zod@3.25.76): + ox@0.11.1(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -12753,10 +13972,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@4.9.5)(zod@3.25.76) + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -12824,6 +14043,8 @@ snapshots: path-exists@4.0.0: {} + path-expression-matcher@1.2.0: {} + path-is-absolute@1.0.1: {} path-is-inside@1.0.2: {} @@ -12941,6 +14162,21 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + 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.0.3 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -12978,14 +14214,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.14.2: - dependencies: - side-channel: 1.1.0 - - qs@6.15.0: - dependencies: - side-channel: 1.1.0 - qs@6.5.3: {} query-string@5.1.1: @@ -13399,6 +14627,28 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + snappy@7.3.3: + 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 + optional: true + snappyjs@0.7.0: {} solc@0.4.26: @@ -13466,7 +14716,7 @@ snapshots: transitivePeerDependencies: - supports-color - solhint@3.4.1(typescript@4.9.5): + solhint@3.4.1(typescript@5.9.3): dependencies: '@solidity-parser/parser': 0.16.2 ajv: 6.12.6 @@ -13474,7 +14724,7 @@ snapshots: ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@4.9.5) + cosmiconfig: 8.3.6(typescript@5.9.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 @@ -13500,7 +14750,7 @@ snapshots: solidity-comments-extractor@0.0.7: {} - solidity-coverage@0.8.14(hardhat@2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.14(hardhat@2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.19.0 @@ -13511,7 +14761,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.26.2(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10) + hardhat: 2.26.2(bufferutil@4.1.0)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.2.0 @@ -13540,16 +14790,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.23: {} + spdx-license-ids@3.0.22: {} sprintf-js@1.0.3: {} @@ -13602,7 +14852,7 @@ snapshots: - supports-color - utf-8-validate - ssv-scanner@git+https://git@github.com:bloxapp/ssv-scanner.git#45068c93b3de84495f6cfad2767787c91d98aa8f(bufferutil@4.1.0)(utf-8-validate@5.0.10): + ssv-scanner@https://codeload.github.com/ssvlabs/ssv-scanner/tar.gz/45068c93b3de84495f6cfad2767787c91d98aa8f(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@types/figlet': 1.7.0 argparse: 2.0.1 @@ -13760,7 +15010,7 @@ snapshots: table@6.8.2: dependencies: - ajv: 8.18.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -13828,6 +15078,10 @@ snapshots: triple-beam@1.4.1: {} + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-command-line-args@2.5.1: dependencies: chalk: 4.1.2 @@ -13835,9 +15089,27 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 - ts-essentials@7.0.3(typescript@4.9.5): + ts-essentials@7.0.3(typescript@5.9.3): dependencies: - typescript: 4.9.5 + typescript: 5.9.3 + + ts-node@10.9.2(@types/node@25.0.3)(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.0.3 + acorn: 8.15.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 tslib@1.14.1: {} @@ -13856,7 +15128,7 @@ snapshots: diff: 4.0.2 glob: 7.2.3 js-yaml: 3.14.2 - minimatch: 3.1.5 + minimatch: 3.1.2 mkdirp: 0.5.6 resolve: 1.22.11 semver: 5.7.2 @@ -13900,7 +15172,7 @@ snapshots: type@2.7.3: {} - typechain@8.3.2(typescript@4.9.5): + typechain@8.3.2(typescript@5.9.3): dependencies: '@types/prettier': 2.7.3 debug: 4.3.4(supports-color@8.1.1) @@ -13911,8 +15183,8 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@4.9.5) - typescript: 4.9.5 + ts-essentials: 7.0.3(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13928,6 +15200,8 @@ snapshots: typescript@4.9.5: {} + typescript@5.9.3: {} + typical@4.0.0: {} typical@5.2.0: {} @@ -13963,6 +15237,8 @@ snapshots: dependencies: prepend-http: 2.0.0 + url-polyfill@1.1.14: {} + url-set-query@1.0.0: {} url@0.11.4: @@ -14001,6 +15277,8 @@ snapshots: uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -14018,18 +15296,18 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - viem@2.43.3(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.43.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(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@4.9.5)(zod@3.25.76) + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.11.1(typescript@4.9.5)(zod@3.25.76) + ox: 0.11.1(typescript@5.9.3)(zod@3.25.76) ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -14243,7 +15521,7 @@ snapshots: web3-eth-iban@1.10.4: dependencies: - bn.js: 5.2.3 + bn.js: 5.2.2 web3-utils: 1.10.4 web3-eth-iban@1.7.3: @@ -14479,6 +15757,16 @@ snapshots: window-size@0.2.0: {} + winston-loki@6.1.4: + 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 + winston-transport@4.9.0: dependencies: logform: 2.7.0 @@ -14655,6 +15943,8 @@ snapshots: y18n: 3.2.2 yargs-parser: 2.4.1 + yn@3.1.1: {} + yocto-queue@0.1.0: {} zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.1.0)(utf-8-validate@5.0.10)): diff --git a/contracts/scripts/defender-actions/claimBribes.js b/contracts/scripts/defender-actions/claimBribes.js deleted file mode 100644 index 381b0d4e82..0000000000 --- a/contracts/scripts/defender-actions/claimBribes.js +++ /dev/null @@ -1,105 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); - -const { logTxDetails } = require("../../utils/txLogger"); - -// ClaimBribesSafeModule1 for Coinbase AERO Locker Safe -const COINBASE_AERO_LOCKER_MODULE = - "0x60d3d6ec213d84dea193dbd79673340061178893"; - -// ClaimBribesSafeModule3 for Old Guardian Safe -const OLD_GUARDIAN_MODULE = "0x26179ada0f7cb714c11a8190e1f517988c28e759"; - -const moduleLabels = { - [COINBASE_AERO_LOCKER_MODULE]: "Coinbase AERO Locker Safe", - [OLD_GUARDIAN_MODULE]: "Old Guardian Safe", -}; - -const batchSizes = { - [COINBASE_AERO_LOCKER_MODULE]: 50, - [OLD_GUARDIAN_MODULE]: 50, -}; - -const MODULE_ABI = [ - "function getNFTIdsLength() external view returns (uint256)", - "function fetchNFTIds() external", - "function removeAllNFTIds() external", - "function claimBribes(uint256 nftIndexStart, uint256 nftIndexEnd, bool silent) external", -]; - -const handler = async (event) => { - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - const network = await provider.getNetwork(); - if (network.chainId != 8453) { - throw new Error("Only supported on Base"); - } - - const modules = [COINBASE_AERO_LOCKER_MODULE, OLD_GUARDIAN_MODULE]; - - for (const moduleAddr of modules) { - const module = new ethers.Contract(moduleAddr, MODULE_ABI, signer); - - console.log( - `Claiming bribes from ${moduleLabels[moduleAddr.toLowerCase()]}` - ); - await manageNFTsOnModule(module, signer); - await claimBribesFromModule(module, signer); - } -}; - -async function manageNFTsOnModule(module, signer) { - // Remove all NFTs from the module - console.log( - `Running removeAllNFTIds on module ${ - moduleLabels[module.address.toLowerCase()] - }` - ); - let tx = await module.connect(signer).removeAllNFTIds({ - gasLimit: 20000000, - }); - logTxDetails(tx, `removeAllNFTIds`); - await tx.wait(); - - // Fetch all NFTs from the veNFT contract - console.log( - `Running fetchNFTIds on module ${ - moduleLabels[module.address.toLowerCase()] - }` - ); - tx = await module.connect(signer).fetchNFTIds({ - gasLimit: 20000000, - }); - logTxDetails(tx, `fetchNFTIds`); - await tx.wait(); -} - -async function claimBribesFromModule(module, signer) { - const nftIdsLength = ( - await module.connect(signer).getNFTIdsLength() - ).toNumber(); - const batchSize = batchSizes[module.address.toLowerCase()] || 50; - const batchCount = Math.ceil(nftIdsLength / batchSize); - - console.log(`Found ${nftIdsLength} NFTs on the module`); - console.log(`Claiming bribes in ${batchCount} batches of ${batchSize}`); - - for (let i = 0; i < batchCount; i++) { - const start = i * batchSize; - const end = Math.min(start + batchSize, nftIdsLength); - - const tx = await module.connect(signer).claimBribes(start, end, true, { - gasLimit: 20000000, - }); - console.log(`claimBribes (batch ${i + 1} of ${batchCount})`); - await logTxDetails(tx, `claimBribes (batch ${i + 1} of ${batchCount})`); - } -} - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/crossChainRelay.js b/contracts/scripts/defender-actions/crossChainRelay.js deleted file mode 100644 index 121e48f48f..0000000000 --- a/contracts/scripts/defender-actions/crossChainRelay.js +++ /dev/null @@ -1,72 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const { processCctpBridgeTransactions } = require("../../tasks/crossChain"); -const { getNetworkName } = require("../../utils/hardhat-helpers"); -const { configuration } = require("../../utils/cctp"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - // Chain ID of the target contract relayer signer - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const { chainId } = await provider.getNetwork(); - let sourceProvider; - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - // destinatino chain is mainnet, source chain is base - if (chainId === 1) { - if (!event.secrets.BASE_PROVIDER_URL) { - throw new Error("BASE_PROVIDER_URL env var required"); - } - sourceProvider = new ethers.providers.JsonRpcProvider( - event.secrets.BASE_PROVIDER_URL - ); - } - // destination chain is base, source chain is mainnet - else if (chainId === 8453) { - if (!event.secrets.PROVIDER_URL) { - throw new Error("PROVIDER_URL env var required"); - } - sourceProvider = new ethers.providers.JsonRpcProvider( - event.secrets.PROVIDER_URL - ); - } else { - throw new Error(`Unsupported chain id: ${chainId}`); - } - - const networkName = await getNetworkName(sourceProvider); - const isMainnet = networkName === "mainnet"; - const isBase = networkName === "base"; - - let config; - if (isMainnet) { - config = configuration.mainnetBaseMorpho.mainnet; - } else if (isBase) { - config = configuration.mainnetBaseMorpho.base; - } else { - throw new Error(`Unsupported network name: ${networkName}`); - } - - await processCctpBridgeTransactions({ - destinationChainSigner: signer, - sourceChainProvider: sourceProvider, - store: client.keyValueStore, - networkName, - blockLookback: config.blockLookback, - cctpDestinationDomainId: config.cctpDestinationDomainId, - cctpSourceDomainId: config.cctpSourceDomainId, - cctpIntegrationContractAddress: config.cctpIntegrationContractAddress, - cctpIntegrationContractAddressDestination: - config.cctpIntegrationContractAddressDestination, - }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/crossChainRelayHyperEVM.js b/contracts/scripts/defender-actions/crossChainRelayHyperEVM.js deleted file mode 100644 index c50e4a14c2..0000000000 --- a/contracts/scripts/defender-actions/crossChainRelayHyperEVM.js +++ /dev/null @@ -1,72 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const { processCctpBridgeTransactions } = require("../../tasks/crossChain"); -const { getNetworkName } = require("../../utils/hardhat-helpers"); -const { configuration } = require("../../utils/cctp"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - // Chain ID of the target contract relayer signer - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const { chainId } = await provider.getNetwork(); - let sourceProvider; - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - // destination chain is mainnet, source chain is hyperevm - if (chainId === 1) { - if (!event.secrets.HYPEREVM_PROVIDER_URL) { - throw new Error("HYPEREVM_PROVIDER_URL env var required"); - } - sourceProvider = new ethers.providers.JsonRpcProvider( - event.secrets.HYPEREVM_PROVIDER_URL - ); - } - // destination chain is hyperevm, source chain is mainnet - else if (chainId === 999) { - if (!event.secrets.PROVIDER_URL) { - throw new Error("PROVIDER_URL env var required"); - } - sourceProvider = new ethers.providers.JsonRpcProvider( - event.secrets.PROVIDER_URL - ); - } else { - throw new Error(`Unsupported chain id: ${chainId}`); - } - - const networkName = await getNetworkName(sourceProvider); - const isMainnet = networkName === "mainnet"; - const isHyperEVM = networkName === "hyperevm"; - - let config; - if (isMainnet) { - config = configuration.mainnetHyperEVMMorpho.mainnet; - } else if (isHyperEVM) { - config = configuration.mainnetHyperEVMMorpho.hyperevm; - } else { - throw new Error(`Unsupported network name: ${networkName}`); - } - - await processCctpBridgeTransactions({ - destinationChainSigner: signer, - sourceChainProvider: sourceProvider, - store: client.keyValueStore, - networkName, - blockLookback: config.blockLookback, - cctpDestinationDomainId: config.cctpDestinationDomainId, - cctpSourceDomainId: config.cctpSourceDomainId, - cctpIntegrationContractAddress: config.cctpIntegrationContractAddress, - cctpIntegrationContractAddressDestination: - config.cctpIntegrationContractAddressDestination, - }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/doAccounting.js b/contracts/scripts/defender-actions/doAccounting.js deleted file mode 100644 index bbea98ce88..0000000000 --- a/contracts/scripts/defender-actions/doAccounting.js +++ /dev/null @@ -1,91 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const addresses = require("../../utils/addresses"); -const { logTxDetails } = require("../../utils/txLogger"); - -const { - address: mainnetConsolidationControllerAddress, - abi: consolidationControllerAbi, -} = require("../../deployments/mainnet/ConsolidationController.json"); -const { - address: hoodiConsolidationControllerAddress, -} = require("../../deployments/hoodi/ConsolidationController.json"); - -const log = require("../../utils/logger")("action:doAccounting"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - const network = await provider.getNetwork(); - const networkName = - network.chainId === 1 - ? "mainnet" - : network.chainId === 560048 - ? "hoodi" - : undefined; - if (!networkName) { - throw new Error( - `Action only supports mainnet and hoodi, not chainId ${network.chainId}` - ); - } - log(`Network: ${networkName} with chain id (${network.chainId})`); - - const consolidationControllerAddress = - networkName === "mainnet" - ? mainnetConsolidationControllerAddress - : hoodiConsolidationControllerAddress; - log( - `Resolved ConsolidationController address to ${consolidationControllerAddress}` - ); - const consolidationController = new ethers.Contract( - consolidationControllerAddress, - consolidationControllerAbi, - signer - ); - - await doAccounting( - "NativeStakingSSVStrategy2Proxy", - networkName, - signer, - consolidationController - ); - await doAccounting( - "NativeStakingSSVStrategy3Proxy", - networkName, - signer, - consolidationController - ); -}; - -const doAccounting = async ( - proxyName, - networkName, - signer, - consolidationController -) => { - const nativeStakingProxyAddress = addresses[networkName][proxyName]; - if (!nativeStakingProxyAddress) { - throw new Error( - `Failed to resolve ${proxyName} on the ${networkName} network` - ); - } - log(`Resolved ${proxyName} address to ${nativeStakingProxyAddress}`); - - const tx = await consolidationController - .connect(signer) - .doAccounting(nativeStakingProxyAddress); - await logTxDetails(tx, `doAccounting for ${proxyName} via controller`); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/harvest.js b/contracts/scripts/defender-actions/harvest.js deleted file mode 100644 index e66013426f..0000000000 --- a/contracts/scripts/defender-actions/harvest.js +++ /dev/null @@ -1,77 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); - -const addresses = require("../../utils/addresses"); -const { logTxDetails } = require("../../utils/txLogger"); -const { - shouldHarvestFromNativeStakingStrategy, - claimStrategyRewards, -} = require("../../utils/harvest"); -const { claimMerklRewards } = require("../../tasks/merkl"); - -const harvesterAbi = require("../../abi/harvester.json"); - -const log = require("../../utils/logger")("action:harvest"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - const { chainId } = await provider.getNetwork(); - if (chainId !== 1) { - throw new Error( - `Action should only be run on mainnet, not on network with chainId ${chainId}` - ); - } - - const harvesterAddress = addresses.mainnet.OETHHarvesterSimpleProxy; - log(`Resolved OETH Harvester Simple address to ${harvesterAddress}`); - const harvester = new ethers.Contract(harvesterAddress, harvesterAbi, signer); - - const nativeStakingStrategies = [ - // addresses[networkName].NativeStakingSSVStrategyProxy, - addresses.mainnet.NativeStakingSSVStrategy2Proxy, - addresses.mainnet.NativeStakingSSVStrategy3Proxy, - ]; - - const strategiesToHarvest = []; - for (const strategy of nativeStakingStrategies) { - log(`Resolved Native Staking Strategy address to ${strategy}`); - const shouldHarvest = await shouldHarvestFromNativeStakingStrategy( - strategy, - signer - ); - - if (shouldHarvest) { - // Harvest if there are sufficient rewards to be harvested - log(`Will harvest from ${strategy}`); - strategiesToHarvest.push(strategy); - } - } - - if (strategiesToHarvest.length > 0) { - const tx = await harvester - .connect(signer) - ["harvestAndTransfer(address[])"](strategiesToHarvest); - await logTxDetails(tx, `harvestAndTransfer`); - } else { - log("No native staking strategies require harvesting at this time"); - } - - // Claim MORPHO rewards to the Morpho OUSD v2 Strategy - await claimMerklRewards(addresses.mainnet.MorphoOUSDv2StrategyProxy, signer); - // Collect the CRV and MORPHO rewards from the strategies using the Safe module - await claimStrategyRewards(signer); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/manageBribeOnSonic.js b/contracts/scripts/defender-actions/manageBribeOnSonic.js deleted file mode 100644 index 54c8dc6a8f..0000000000 --- a/contracts/scripts/defender-actions/manageBribeOnSonic.js +++ /dev/null @@ -1,42 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); - -const poolBoosterSwapXAbi = require("../../abi/poolBoosterSwapX.json"); -const poolBoosterCentralRegistryAbi = require("../../abi/poolBoosterCentralRegistry.json"); -const { logTxDetails } = require("../../utils/txLogger"); -const log = require("../../utils/logger")("action:harvest"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - const poolBoosterCentralRegistryProxyAddress = - "0x4F3B656Aa5Fb5E708bF7B63D6ff71623eb4a218A"; - const poolBoosterCentralRegistryProxy = new ethers.Contract( - poolBoosterCentralRegistryProxyAddress, - poolBoosterCentralRegistryAbi, - signer - ); - - // Fetch all factories - const factories = await poolBoosterCentralRegistryProxy.getAllFactories(); - log(`Factories: ${factories}`); - - for (const f of factories) { - const factory = new ethers.Contract(f, poolBoosterSwapXAbi, signer); - const tx = await factory.connect(signer).bribeAll([]); - await logTxDetails(tx, `Bribed all pools in factory ${f}`); - } -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/manageBribes.js b/contracts/scripts/defender-actions/manageBribes.js deleted file mode 100644 index 6410895b81..0000000000 --- a/contracts/scripts/defender-actions/manageBribes.js +++ /dev/null @@ -1,38 +0,0 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); - -const { manageBribes } = require("../../tasks/poolBooster"); - -const log = require("../../utils/logger")("action:manageBribes"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - // Parse options from event - const skipRewardPerVote = event.request?.body?.skipRewardPerVote ?? false; - const targetEfficiency = event.request?.body?.targetEfficiency ?? 1; - const chunkSize = event.request?.body?.chunkSize ?? 4; - - log( - `Managing max reward per vote with target efficiency ${targetEfficiency}, skip reward per vote ${skipRewardPerVote}, and chunk size ${chunkSize}` - ); - await manageBribes({ - provider, - signer, - targetEfficiency, - skipRewardPerVote, - chunkSize, - }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/manageMerklBribes.js b/contracts/scripts/defender-actions/manageMerklBribes.js deleted file mode 100644 index 0049f57213..0000000000 --- a/contracts/scripts/defender-actions/manageMerklBribes.js +++ /dev/null @@ -1,32 +0,0 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); - -const { manageMerklBribes } = require("../../tasks/merklPoolBooster"); - -const log = require("../../utils/logger")("action:manageMerklBribes"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - // Parse options from event - const exclusionList = event.request?.body?.exclusionList ?? []; - - log(`Calling bribeAll with exclusion list: [${exclusionList.join(", ")}]`); - await manageMerklBribes({ - provider, - signer, - exclusionList, - }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/managePassThrough.js b/contracts/scripts/defender-actions/managePassThrough.js deleted file mode 100644 index 97e321c7f0..0000000000 --- a/contracts/scripts/defender-actions/managePassThrough.js +++ /dev/null @@ -1,21 +0,0 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); -const { transferTokens } = require("../../utils/managePassThrough"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - await transferTokens({ signer }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/registerValidators.js b/contracts/scripts/defender-actions/registerValidators.js deleted file mode 100644 index a78278f51b..0000000000 --- a/contracts/scripts/defender-actions/registerValidators.js +++ /dev/null @@ -1,96 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const { registerValidators } = require("../../utils/validator"); -const addresses = require("../../utils/addresses"); - -const nativeStakingStrategyAbi = require("../../abi/native_staking_SSV_strategy.json"); -const IWETH9Abi = require("../../abi/IWETH9.json"); - -const log = require("../../utils/logger")("action:registerValidators"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - const store = client.keyValueStore; - - const network = await provider.getNetwork(); - const networkName = network.chainId === 1 ? "mainnet" : "hoodi"; - log(`Network: ${networkName} with chain id (${network.chainId})`); - - const nativeStakingProxyAddress = - addresses[networkName].NativeStakingSSVStrategy3Proxy; - log( - `Resolved Native Staking Strategy address to ${nativeStakingProxyAddress}` - ); - const nativeStakingStrategy = new ethers.Contract( - nativeStakingProxyAddress, - nativeStakingStrategyAbi, - signer - ); - - const wethAddress = addresses[networkName].WETH; - log(`Resolved WETH address to ${wethAddress}`); - const WETH = new ethers.Contract(wethAddress, IWETH9Abi, signer); - - const feeAccumulatorAddress = - await nativeStakingStrategy.FEE_ACCUMULATOR_ADDRESS(); - - const p2p_api_key = - network.chainId === 1 - ? event.secrets.P2P_MAINNET_API_KEY - : event.secrets.P2P_HOLESKY_API_KEY; - if (!p2p_api_key) { - throw new Error( - "Secret with P2P API key not set. Add the P2P_MAINNET_API_KEY or P2P_HOLESKY_API_KEY secret" - ); - } - const p2p_base_url = - network.chainId === 1 ? "api.p2p.org" : "api-test-holesky.p2p.org"; - - const awsS3AccessKeyId = event.secrets.AWS_ACCESS_S3_KEY_ID; - const awsS3SexcretAccessKeyId = event.secrets.AWS_SECRET_S3_ACCESS_KEY; - const s3BucketName = event.secrets.VALIDATOR_KEYS_S3_BUCKET_NAME; - - if (!awsS3AccessKeyId) { - throw new Error("Secret AWS_ACCESS_S3_KEY_ID not set"); - } - if (!awsS3SexcretAccessKeyId) { - throw new Error("Secret AWS_SECRET_S3_ACCESS_KEY not set"); - } - if (!s3BucketName) { - throw new Error("Secret VALIDATOR_KEYS_S3_BUCKET_NAME not set"); - } - - await registerValidators({ - signer, - store, - nativeStakingStrategy, - WETH, - feeAccumulatorAddress, - p2p_api_key, - p2p_base_url, - // how much SSV (expressed in days of runway) gets deposited into the - // SSV Network contract on validator registration. This is calculated - // at a Cluster level rather than a single validator. - validatorSpawnOperationalPeriodInDays: 1, - // this overrides validatorSpawnOperationalPeriodInDays - ssvAmount: 0, - clear: true, - // maxValidatorsToRegister: 1, - awsS3AccessKeyId, - awsS3SexcretAccessKeyId, - s3BucketName, - }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/rollup.config.cjs b/contracts/scripts/defender-actions/rollup.config.cjs deleted file mode 100644 index 121f97523d..0000000000 --- a/contracts/scripts/defender-actions/rollup.config.cjs +++ /dev/null @@ -1,58 +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, exportConditions: ["node"] }), - commonjs(), - json({ compact: true }), - visualizer(), - ], - // Do not bundle these packages. - // ethers is required to be bundled even though its an Autotask package. - external: [ - ...builtins, - "axios", - "chai", - "@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", - "fsevents", - "ethers", - "web3", - "mocha", - ], -}; - -const actions = [ - "doAccounting", - "harvest", - "manageBribeOnSonic", - "managePassThrough", - "sonicRequestWithdrawal", - "sonicClaimWithdrawals", - "claimBribes", - "crossChainRelay", - "crossChainRelayHyperEVM", - "manageBribes", - "manageMerklBribes", - "claimSSVRewards" -]; - -module.exports = actions.map((action) => ({ - input: path.resolve(__dirname, `${action}.js`), - output: { - file: path.resolve(__dirname, `dist/${action}/index.js`), - inlineDynamicImports: true, - format: "cjs", - }, - ...commonConfig, -})); diff --git a/contracts/scripts/defender-actions/sonicClaimWithdrawals.js b/contracts/scripts/defender-actions/sonicClaimWithdrawals.js deleted file mode 100644 index 8f3c9efee7..0000000000 --- a/contracts/scripts/defender-actions/sonicClaimWithdrawals.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); - -const { withdrawFromSFC } = require("../../utils/sonicActions"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - await withdrawFromSFC({ signer }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/sonicRequestWithdrawal.js b/contracts/scripts/defender-actions/sonicRequestWithdrawal.js deleted file mode 100644 index ac71f60c43..0000000000 --- a/contracts/scripts/defender-actions/sonicRequestWithdrawal.js +++ /dev/null @@ -1,25 +0,0 @@ -const { Defender } = require("@openzeppelin/defender-sdk"); - -const { undelegateValidator } = require("../../utils/sonicActions"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - // The vault buffer in basis points, so 100 = 1% - const bufferPct = 50; - - await undelegateValidator({ signer, bufferPct }); -}; - -module.exports = { handler }; diff --git a/contracts/scripts/defender-actions/stakeValidators.js b/contracts/scripts/defender-actions/stakeValidators.js deleted file mode 100644 index bd8d873078..0000000000 --- a/contracts/scripts/defender-actions/stakeValidators.js +++ /dev/null @@ -1,88 +0,0 @@ -const { ethers } = require("ethers"); -const { Defender } = require("@openzeppelin/defender-sdk"); -const { - KeyValueStoreClient, -} = require("@openzeppelin/defender-kvstore-client"); -const { stakeValidators } = require("../../utils/validator"); -const addresses = require("../../utils/addresses"); - -const nativeStakingStrategyAbi = require("../../abi/native_staking_SSV_strategy.json"); -const IWETH9Abi = require("../../abi/IWETH9.json"); - -const log = require("../../utils/logger")("action:stakeValidators"); - -// Entrypoint for the Defender Action -const handler = async (event) => { - console.log( - `DEBUG env var in handler before being set: "${process.env.DEBUG}"` - ); - - const store = new KeyValueStoreClient(event); - - // Initialize defender relayer provider and signer - const client = new Defender(event); - const provider = client.relaySigner.getProvider({ ethersVersion: "v5" }); - const signer = await client.relaySigner.getSigner(provider, { - speed: "fastest", - ethersVersion: "v5", - }); - - const network = await provider.getNetwork(); - const networkName = network.chainId === 1 ? "mainnet" : "holesky"; - log(`Network: ${networkName} with chain id (${network.chainId})`); - - const nativeStakingProxyAddress = - addresses[networkName].NativeStakingSSVStrategy3Proxy; - log( - `Resolved Native Staking Strategy address to ${nativeStakingProxyAddress}` - ); - const nativeStakingStrategy = new ethers.Contract( - nativeStakingProxyAddress, - nativeStakingStrategyAbi, - signer - ); - - const wethAddress = addresses[networkName].WETH; - log(`Resolved WETH address to ${wethAddress}`); - const WETH = new ethers.Contract(wethAddress, IWETH9Abi, signer); - - const p2p_api_key = - network.chainId === 1 - ? event.secrets.P2P_MAINNET_API_KEY - : event.secrets.P2P_HOLESKY_API_KEY; - if (!p2p_api_key) { - throw new Error( - "Secret with P2P API key not set. Add the P2P_MAINNET_API_KEY or P2P_HOLESKY_API_KEY secret" - ); - } - const p2p_base_url = - network.chainId === 1 ? "api.p2p.org" : "api-test-holesky.p2p.org"; - - const awsS3AccessKeyId = event.secrets.AWS_ACCESS_S3_KEY_ID; - const awsS3SexcretAccessKeyId = event.secrets.AWS_SECRET_S3_ACCESS_KEY; - const s3BucketName = event.secrets.VALIDATOR_KEYS_S3_BUCKET_NAME; - - if (!awsS3AccessKeyId) { - throw new Error("Secret AWS_ACCESS_S3_KEY_ID not set"); - } - if (!awsS3SexcretAccessKeyId) { - throw new Error("Secret AWS_SECRET_S3_ACCESS_KEY not set"); - } - if (!s3BucketName) { - throw new Error("Secret VALIDATOR_KEYS_S3_BUCKET_NAME not set"); - } - - await stakeValidators({ - signer, - store, - nativeStakingStrategy, - WETH, - p2p_api_key, - p2p_base_url, - awsS3AccessKeyId, - awsS3SexcretAccessKeyId, - s3BucketName, - }); -}; - -module.exports = { handler }; diff --git a/contracts/tasks/actions/claimBribes.ts b/contracts/tasks/actions/claimBribes.ts new file mode 100644 index 0000000000..8fc170ace6 --- /dev/null +++ b/contracts/tasks/actions/claimBribes.ts @@ -0,0 +1,86 @@ +import { ethers } from "ethers"; +import type { Logger } from "winston"; +import { logTxDetails } from "../../utils/txLogger"; +import { action } from "../lib/action"; + +const COINBASE_AERO_LOCKER_MODULE = + "0x60d3d6ec213d84dea193dbd79673340061178893"; +const OLD_GUARDIAN_MODULE = "0x26179ada0f7cb714c11a8190e1f517988c28e759"; + +const moduleLabels: Record = { + [COINBASE_AERO_LOCKER_MODULE]: "Coinbase AERO Locker Safe", + [OLD_GUARDIAN_MODULE]: "Old Guardian Safe", +}; + +const batchSizes: Record = { + [COINBASE_AERO_LOCKER_MODULE]: 50, + [OLD_GUARDIAN_MODULE]: 50, +}; + +const MODULE_ABI = [ + "function getNFTIdsLength() external view returns (uint256)", + "function fetchNFTIds() external", + "function removeAllNFTIds() external", + "function claimBribes(uint256 nftIndexStart, uint256 nftIndexEnd, bool silent) external", +]; + +async function manageNFTsOnModule( + module: ethers.Contract, + signer: ethers.Signer, + log: Logger +) { + const label = moduleLabels[module.address.toLowerCase()]; + + log.info(`Running removeAllNFTIds on module ${label}`); + let tx = await module.connect(signer).removeAllNFTIds({ gasLimit: 20000000 }); + logTxDetails(tx, "removeAllNFTIds"); + await tx.wait(); + + log.info(`Running fetchNFTIds on module ${label}`); + tx = await module.connect(signer).fetchNFTIds({ gasLimit: 20000000 }); + logTxDetails(tx, "fetchNFTIds"); + await tx.wait(); +} + +async function claimBribesFromModule( + module: ethers.Contract, + signer: ethers.Signer, + log: Logger +) { + const nftIdsLength = ( + await module.connect(signer).getNFTIdsLength() + ).toNumber(); + const batchSize = batchSizes[module.address.toLowerCase()] || 50; + const batchCount = Math.ceil(nftIdsLength / batchSize); + + log.info(`Found ${nftIdsLength} NFTs on the module`); + log.info(`Claiming bribes in ${batchCount} batches of ${batchSize}`); + + for (let i = 0; i < batchCount; i++) { + const start = i * batchSize; + const end = Math.min(start + batchSize, nftIdsLength); + + const tx = await module.connect(signer).claimBribes(start, end, true, { + gasLimit: 20000000, + }); + await logTxDetails(tx, `claimBribes (batch ${i + 1} of ${batchCount})`); + } +} + +action({ + name: "claimBribes", + description: "Claim bribes from Aerodrome veNFT lockers on Base", + chains: [8453], + run: async ({ signer, log }) => { + const modules = [COINBASE_AERO_LOCKER_MODULE, OLD_GUARDIAN_MODULE]; + + for (const moduleAddr of modules) { + const module = new ethers.Contract(moduleAddr, MODULE_ABI, signer); + log.info( + `Claiming bribes from ${moduleLabels[moduleAddr.toLowerCase()]}` + ); + await manageNFTsOnModule(module, signer, log); + await claimBribesFromModule(module, signer, log); + } + }, +}); diff --git a/contracts/tasks/actions/crossChainBalanceUpdate-base.ts b/contracts/tasks/actions/crossChainBalanceUpdate-base.ts new file mode 100644 index 0000000000..ac25d9da84 --- /dev/null +++ b/contracts/tasks/actions/crossChainBalanceUpdate-base.ts @@ -0,0 +1,21 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const CROSS_CHAIN_CONTROLLER = "0xB1d624fc40824683e2bFBEfd19eB208DbBE00866"; +const abi = parseAbi(["function sendBalanceUpdate() external"]); + +action({ + name: "crossChainBalanceUpdate-base", + description: "Send cross-chain balance update from Base", + chains: [8453], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: CROSS_CHAIN_CONTROLLER, + data: encodeFunctionData({ abi, functionName: "sendBalanceUpdate" }), + gasLimit: 1000000, + }); + log.info(`sendBalanceUpdate tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/crossChainBalanceUpdate-hyperevm.ts b/contracts/tasks/actions/crossChainBalanceUpdate-hyperevm.ts new file mode 100644 index 0000000000..d09ce08367 --- /dev/null +++ b/contracts/tasks/actions/crossChainBalanceUpdate-hyperevm.ts @@ -0,0 +1,21 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const CROSS_CHAIN_CONTROLLER = "0xE0228DB13F8C4Eb00fD1e08e076b09eF5cD0EA1e"; +const abi = parseAbi(["function sendBalanceUpdate() external"]); + +action({ + name: "crossChainBalanceUpdate-hyperevm", + description: "Send cross-chain balance update from HyperEVM", + chains: [999], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: CROSS_CHAIN_CONTROLLER, + data: encodeFunctionData({ abi, functionName: "sendBalanceUpdate" }), + gasLimit: 1000000, + }); + log.info(`sendBalanceUpdate tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/crossChainRelay.ts b/contracts/tasks/actions/crossChainRelay.ts new file mode 100644 index 0000000000..b7f7855e77 --- /dev/null +++ b/contracts/tasks/actions/crossChainRelay.ts @@ -0,0 +1,60 @@ +import { ethers } from "ethers"; +import { configuration } from "../../utils/cctp"; +import { keyValueStoreLocalClient } from "../../utils/defender"; +import { getNetworkName } from "../../utils/hardhat-helpers"; +import { processCctpBridgeTransactions } from "../crossChain"; +import { action } from "../lib/action"; + +action({ + name: "crossChainRelay", + description: "Relay CCTP bridge transactions between mainnet and Base", + chains: [1, 8453], + run: async ({ signer, chainId, log }) => { + let sourceProvider: ethers.providers.JsonRpcProvider; + + if (chainId === 1) { + if (!process.env.BASE_PROVIDER_URL) { + throw new Error("BASE_PROVIDER_URL env var required"); + } + sourceProvider = new ethers.providers.JsonRpcProvider( + process.env.BASE_PROVIDER_URL + ); + } else { + if (!process.env.PROVIDER_URL) { + throw new Error("PROVIDER_URL env var required"); + } + sourceProvider = new ethers.providers.JsonRpcProvider( + process.env.PROVIDER_URL + ); + } + + const networkName = await getNetworkName(sourceProvider); + + let config: any; + if (networkName === "mainnet") { + config = configuration.mainnetBaseMorpho.mainnet; + } else if (networkName === "base") { + config = configuration.mainnetBaseMorpho.base; + } else { + throw new Error(`Unsupported source network: ${networkName}`); + } + + log.info(`Relaying CCTP from ${networkName}`); + const store = keyValueStoreLocalClient({ + _storePath: ".store/crossChainRelay.json", + }); + + await processCctpBridgeTransactions({ + destinationChainSigner: signer, + sourceChainProvider: sourceProvider, + store, + networkName, + blockLookback: config.blockLookback, + cctpDestinationDomainId: config.cctpDestinationDomainId, + cctpSourceDomainId: config.cctpSourceDomainId, + cctpIntegrationContractAddress: config.cctpIntegrationContractAddress, + cctpIntegrationContractAddressDestination: + config.cctpIntegrationContractAddressDestination, + }); + }, +}); diff --git a/contracts/tasks/actions/crossChainRelayHyperEVM.ts b/contracts/tasks/actions/crossChainRelayHyperEVM.ts new file mode 100644 index 0000000000..0729a48614 --- /dev/null +++ b/contracts/tasks/actions/crossChainRelayHyperEVM.ts @@ -0,0 +1,60 @@ +import { ethers } from "ethers"; +import { configuration } from "../../utils/cctp"; +import { keyValueStoreLocalClient } from "../../utils/defender"; +import { getNetworkName } from "../../utils/hardhat-helpers"; +import { processCctpBridgeTransactions } from "../crossChain"; +import { action } from "../lib/action"; + +action({ + name: "crossChainRelayHyperEVM", + description: "Relay CCTP bridge transactions between mainnet and HyperEVM", + chains: [1, 999], + run: async ({ signer, chainId, log }) => { + let sourceProvider: ethers.providers.JsonRpcProvider; + + if (chainId === 1) { + if (!process.env.HYPEREVM_PROVIDER_URL) { + throw new Error("HYPEREVM_PROVIDER_URL env var required"); + } + sourceProvider = new ethers.providers.JsonRpcProvider( + process.env.HYPEREVM_PROVIDER_URL + ); + } else { + if (!process.env.PROVIDER_URL) { + throw new Error("PROVIDER_URL env var required"); + } + sourceProvider = new ethers.providers.JsonRpcProvider( + process.env.PROVIDER_URL + ); + } + + const networkName = await getNetworkName(sourceProvider); + + let config: any; + if (networkName === "mainnet") { + config = configuration.mainnetHyperEVMMorpho.mainnet; + } else if (networkName === "hyperevm") { + config = configuration.mainnetHyperEVMMorpho.hyperevm; + } else { + throw new Error(`Unsupported source network: ${networkName}`); + } + + log.info(`Relaying CCTP from ${networkName}`); + const store = keyValueStoreLocalClient({ + _storePath: ".store/crossChainRelayHyperEVM.json", + }); + + await processCctpBridgeTransactions({ + destinationChainSigner: signer, + sourceChainProvider: sourceProvider, + store, + networkName, + blockLookback: config.blockLookback, + cctpDestinationDomainId: config.cctpDestinationDomainId, + cctpSourceDomainId: config.cctpSourceDomainId, + cctpIntegrationContractAddress: config.cctpIntegrationContractAddress, + cctpIntegrationContractAddressDestination: + config.cctpIntegrationContractAddressDestination, + }); + }, +}); diff --git a/contracts/tasks/actions/doAccounting.ts b/contracts/tasks/actions/doAccounting.ts new file mode 100644 index 0000000000..e9cf303646 --- /dev/null +++ b/contracts/tasks/actions/doAccounting.ts @@ -0,0 +1,79 @@ +import { ethers } from "ethers"; +import { types } from "hardhat/config"; +import type { Logger } from "winston"; +import { address as hoodiConsolidationControllerAddress } from "../../deployments/hoodi/ConsolidationController.json"; +import { + abi as consolidationControllerAbi, + address as mainnetConsolidationControllerAddress, +} from "../../deployments/mainnet/ConsolidationController.json"; +import addresses from "../../utils/addresses"; +import { logTxDetails } from "../../utils/txLogger"; +import { action } from "../lib/action"; + +async function doAccountingForProxy( + proxyName: string, + networkName: string, + signer: ethers.Signer, + consolidationController: ethers.Contract, + log: Logger +) { + const nativeStakingProxyAddress = (addresses as any)[networkName][proxyName]; + if (!nativeStakingProxyAddress) { + throw new Error(`Failed to resolve ${proxyName} on ${networkName}`); + } + log.info(`Resolved ${proxyName} address to ${nativeStakingProxyAddress}`); + + const tx = await consolidationController + .connect(signer) + .doAccounting(nativeStakingProxyAddress); + await logTxDetails(tx, `doAccounting for ${proxyName} via controller`); +} + +action({ + name: "doAccounting", + description: + "Account for consensus rewards and validator exits in the Native Staking Strategy", + chains: [1, 560048], + params: (t) => { + t.addOptionalParam( + "index", + "The number of the Native Staking Contract deployed.", + undefined, + types.int + ); + t.addOptionalParam( + "consol", + "Call the consolidation controller instead of the strategy", + false, + types.boolean + ); + }, + run: async ({ signer, networkName, log }) => { + const controllerAddress = + networkName === "mainnet" + ? mainnetConsolidationControllerAddress + : hoodiConsolidationControllerAddress; + log.info(`ConsolidationController: ${controllerAddress}`); + + const consolidationController = new ethers.Contract( + controllerAddress, + consolidationControllerAbi, + signer + ); + + await doAccountingForProxy( + "NativeStakingSSVStrategy2Proxy", + networkName, + signer, + consolidationController, + log + ); + await doAccountingForProxy( + "NativeStakingSSVStrategy3Proxy", + networkName, + signer, + consolidationController, + log + ); + }, +}); diff --git a/contracts/tasks/actions/harvest.ts b/contracts/tasks/actions/harvest.ts new file mode 100644 index 0000000000..8a0f2cdb6c --- /dev/null +++ b/contracts/tasks/actions/harvest.ts @@ -0,0 +1,61 @@ +import { ethers } from "ethers"; +import addresses from "../../utils/addresses"; +import { + claimStrategyRewards, + shouldHarvestFromNativeStakingStrategy, +} from "../../utils/harvest"; +import { logTxDetails } from "../../utils/txLogger"; +import { action } from "../lib/action"; +import { claimMerklRewards } from "../merkl"; + +const harvesterAbi = require("../../abi/harvester.json"); + +action({ + name: "harvest", + description: "Harvest and swap rewards from native staking strategies", + chains: [1], + run: async ({ signer, log }) => { + const harvesterAddress = addresses.mainnet.OETHHarvesterSimpleProxy; + log.info(`Resolved OETH Harvester Simple address to ${harvesterAddress}`); + const harvester = new ethers.Contract( + harvesterAddress, + harvesterAbi, + signer + ); + + const nativeStakingStrategies = [ + addresses.mainnet.NativeStakingSSVStrategy2Proxy, + // TODO: NativeStakingSSVStrategy3Proxy will soon be obsolete + addresses.mainnet.NativeStakingSSVStrategy3Proxy, + ]; + + const strategiesToHarvest: string[] = []; + for (const strategy of nativeStakingStrategies) { + log.info(`Checking strategy ${strategy}`); + const shouldHarvest = await shouldHarvestFromNativeStakingStrategy( + strategy, + signer + ); + if (shouldHarvest) { + log.info(`Will harvest from ${strategy}`); + strategiesToHarvest.push(strategy); + } + } + + if (strategiesToHarvest.length > 0) { + const connection = harvester.connect(signer); + const tx = await connection["harvestAndTransfer(address[])"]( + strategiesToHarvest + ); + await logTxDetails(tx, "harvestAndTransfer"); + } else { + log.info("No native staking strategies require harvesting at this time"); + } + + await claimMerklRewards( + addresses.mainnet.MorphoOUSDv2StrategyProxy, + signer + ); + await claimStrategyRewards(signer); + }, +}); diff --git a/contracts/tasks/actions/healthcheck.ts b/contracts/tasks/actions/healthcheck.ts new file mode 100644 index 0000000000..0bf36ef16c --- /dev/null +++ b/contracts/tasks/actions/healthcheck.ts @@ -0,0 +1,24 @@ +import { action } from "../lib/action"; + +action({ + name: "healthcheck", + description: + "Verify the action execution pipeline (signer, network, logging)", + run: async ({ log, signer, chainId, networkName }) => { + log.info(`Node version: ${process.version}`); + log.info(`Network: ${networkName} (${chainId})`); + + const address = await signer.getAddress(); + log.info(`Signer address: ${address}`); + + const balance = await signer.provider!.getBalance(address); + log.info(`Signer balance: ${balance.toString()} wei`); + + log.info( + `AWS KMS available: ${!!( + process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY + )}` + ); + log.info("Healthcheck passed"); + }, +}); diff --git a/contracts/tasks/actions/manageBribeOnSonic.ts b/contracts/tasks/actions/manageBribeOnSonic.ts new file mode 100644 index 0000000000..13f2581ab1 --- /dev/null +++ b/contracts/tasks/actions/manageBribeOnSonic.ts @@ -0,0 +1,30 @@ +import { ethers } from "ethers"; +import { logTxDetails } from "../../utils/txLogger"; +import { action } from "../lib/action"; + +const poolBoosterSwapXAbi = require("../../abi/poolBoosterSwapX.json"); +const poolBoosterCentralRegistryAbi = require("../../abi/poolBoosterCentralRegistry.json"); + +action({ + name: "manageBribeOnSonic", + description: "Manage bribes on all Sonic pool booster factories", + chains: [146], + run: async ({ signer, log }) => { + const poolBoosterCentralRegistryProxyAddress = + "0x4F3B656Aa5Fb5E708bF7B63D6ff71623eb4a218A"; + const poolBoosterCentralRegistryProxy = new ethers.Contract( + poolBoosterCentralRegistryProxyAddress, + poolBoosterCentralRegistryAbi, + signer + ); + + const factories = await poolBoosterCentralRegistryProxy.getAllFactories(); + log.info(`Factories: ${factories}`); + + for (const f of factories) { + const factory = new ethers.Contract(f, poolBoosterSwapXAbi, signer); + const tx = await factory.connect(signer).bribeAll([]); + await logTxDetails(tx, `Bribed all pools in factory ${f}`); + } + }, +}); diff --git a/contracts/tasks/actions/manageBribes.ts b/contracts/tasks/actions/manageBribes.ts new file mode 100644 index 0000000000..2fe85d97eb --- /dev/null +++ b/contracts/tasks/actions/manageBribes.ts @@ -0,0 +1,42 @@ +import { types } from "hardhat/config"; +import { action } from "../lib/action"; +import { manageBribes } from "../poolBooster"; + +action({ + name: "manageBribes", + description: + "Calls manageBribes on the CurvePoolBoosterBribesModule and calculates the rewards per vote based on the target efficiency", + chains: [1], + params: (t) => { + t.addOptionalParam( + "efficiency", + "Target efficiency (0-10, e.g. 1 for 100%, 0.5 for 50%)", + "1", + types.string + ); + t.addOptionalParam( + "skipRewardPerVote", + "Skip setting RewardPerVote (pass array of zeros)", + false, + types.boolean + ); + t.addOptionalParam( + "chunkSize", + "Number of pool boosters to manage per transaction", + 4, + types.int + ); + }, + run: async ({ signer, log, args }) => { + log.info( + `Managing max reward per vote with target efficiency ${args.efficiency}, skip reward per vote ${args.skipRewardPerVote}, chunk size ${args.chunkSize}` + ); + await manageBribes({ + signer, + provider: signer.provider!, + targetEfficiency: args.efficiency, + skipRewardPerVote: args.skipRewardPerVote, + chunkSize: args.chunkSize, + }); + }, +}); diff --git a/contracts/tasks/actions/manageMerklBribes.ts b/contracts/tasks/actions/manageMerklBribes.ts new file mode 100644 index 0000000000..ff961de86d --- /dev/null +++ b/contracts/tasks/actions/manageMerklBribes.ts @@ -0,0 +1,32 @@ +import { types } from "hardhat/config"; +import { action } from "../lib/action"; +import { manageMerklBribes } from "../merklPoolBooster"; + +action({ + name: "manageMerklBribes", + description: + "Calls bribeAll on the MerklPoolBoosterBribesModule through the Gnosis Safe", + chains: [1, 8453], + params: (t) => { + t.addOptionalParam( + "exclusionList", + "Comma-separated list of pool booster addresses to exclude", + "", + types.string + ); + }, + run: async ({ signer, log, args }) => { + const exclusionList = args.exclusionList + ? args.exclusionList.split(",").map((s: string) => s.trim()) + : []; + + log.info( + `Calling bribeAll with exclusion list: [${exclusionList.join(", ")}]` + ); + await manageMerklBribes({ + provider: signer.provider!, + signer, + exclusionList, + }); + }, +}); diff --git a/contracts/tasks/actions/managePassThrough.ts b/contracts/tasks/actions/managePassThrough.ts new file mode 100644 index 0000000000..9b4a97078d --- /dev/null +++ b/contracts/tasks/actions/managePassThrough.ts @@ -0,0 +1,11 @@ +import { transferTokens } from "../../utils/managePassThrough"; +import { action } from "../lib/action"; + +action({ + name: "managePassThrough", + description: "Transfer tokens via pass-through mechanism", + chains: [1], + run: async ({ signer }) => { + await transferTokens({ signer }); + }, +}); diff --git a/contracts/tasks/actions/ogn-claimAndForwardRewards.ts b/contracts/tasks/actions/ogn-claimAndForwardRewards.ts new file mode 100644 index 0000000000..41aca63e8e --- /dev/null +++ b/contracts/tasks/actions/ogn-claimAndForwardRewards.ts @@ -0,0 +1,32 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const MODULE_ADDRESSES = [ + "0x15228dAE3B228175fBD9639d049265eFb08e60b6", + "0x8e32A930CcFE108DC560eC9e630BA6b5f7E179c9", + "0x460e4a0B14bD3F1e12f0c2194830c0204E5Bb147", + "0xFbBb82c4F3B6f479DE1451C04A76ea80da4ff010", + "0xAE67b612bD859378b7d0f6314E7Ee39ad4c6aBE6", + "0x046750A8106461d9826a8Ab32890B23753A5245e", +] as const; + +const abi = parseAbi(["function claimAndForward() external"]); + +action({ + name: "ogn-claimAndForwardRewards", + description: "Claim and forward OGN rewards from all modules", + chains: [1], + run: async ({ signer, log }) => { + for (const moduleAddress of MODULE_ADDRESSES) { + log.info(`Calling claimAndForward on ${moduleAddress}`); + const tx = await signer.sendTransaction({ + to: moduleAddress, + data: encodeFunctionData({ abi, functionName: "claimAndForward" }), + gasLimit: 500000, + }); + log.info(`claimAndForward tx: ${tx.hash}`); + await tx.wait(); + } + }, +}); diff --git a/contracts/tasks/actions/otoken-oethb-harvest.ts b/contracts/tasks/actions/otoken-oethb-harvest.ts new file mode 100644 index 0000000000..b3bf624ca2 --- /dev/null +++ b/contracts/tasks/actions/otoken-oethb-harvest.ts @@ -0,0 +1,32 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const HARVESTER = "0x0CbEAcf86232fC04050cD679d860516F7254c22E"; +const STRATEGIES = [ + "0x9cfcaf81600155e01c63e4d2993a8a81a8205829", + "0xf611cc500eee7e4e4763a05fe623e2363c86d2af", +] as const; + +const abi = parseAbi([ + "function harvestAndTransfer(address[] strategies) external", +]); + +action({ + name: "otoken-oethb-harvest", + description: "Harvest strategies on Base OETHb", + chains: [8453], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: HARVESTER, + data: encodeFunctionData({ + abi, + functionName: "harvestAndTransfer", + args: [[...STRATEGIES]], + }), + gasLimit: 800000, + }); + log.info(`harvestAndTransfer tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-oethb-rebase.ts b/contracts/tasks/actions/otoken-oethb-rebase.ts new file mode 100644 index 0000000000..7e00958ed8 --- /dev/null +++ b/contracts/tasks/actions/otoken-oethb-rebase.ts @@ -0,0 +1,21 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const VAULT = "0x98a0CbeF61bD2D21435f433bE4CD42B56B38CC93"; +const abi = parseAbi(["function rebase() external"]); + +action({ + name: "otoken-oethb-rebase", + description: "Rebase OETHb vault on Base", + chains: [8453], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: VAULT, + data: encodeFunctionData({ abi, functionName: "rebase" }), + gasLimit: 300000, + }); + log.info(`rebase tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-oethb-updateWoethPrice.ts b/contracts/tasks/actions/otoken-oethb-updateWoethPrice.ts new file mode 100644 index 0000000000..39cbf282dc --- /dev/null +++ b/contracts/tasks/actions/otoken-oethb-updateWoethPrice.ts @@ -0,0 +1,21 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const WOETH_ON_BASE = "0x80c864704DD06C3693ed5179190786EE38ACf835"; +const abi = parseAbi(["function updateWOETHPrice() external"]); + +action({ + name: "otoken-oethb-updateWoethPrice", + description: "Update WOETH price on Base", + chains: [8453], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: WOETH_ON_BASE, + data: encodeFunctionData({ abi, functionName: "updateWOETHPrice" }), + gasLimit: 200000, + }); + log.info(`updateWOETHPrice tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-oethp-addWithdrawalQueueLiquidity.ts b/contracts/tasks/actions/otoken-oethp-addWithdrawalQueueLiquidity.ts new file mode 100644 index 0000000000..b17aacf458 --- /dev/null +++ b/contracts/tasks/actions/otoken-oethp-addWithdrawalQueueLiquidity.ts @@ -0,0 +1,24 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const VAULT = "0xc8c8F8bEA5631A8AF26440AF32a55002138cB76a"; +const abi = parseAbi(["function addWithdrawalQueueLiquidity() external"]); + +action({ + name: "otoken-oethp-addWithdrawalQueueLiquidity", + description: "Add liquidity to Plume OETH withdrawal queue", + chains: [1], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: VAULT, + data: encodeFunctionData({ + abi, + functionName: "addWithdrawalQueueLiquidity", + }), + gasLimit: 400000, + }); + log.info(`addWithdrawalQueueLiquidity tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-os-collectAndRelease.ts b/contracts/tasks/actions/otoken-os-collectAndRelease.ts new file mode 100644 index 0000000000..6a9307aeff --- /dev/null +++ b/contracts/tasks/actions/otoken-os-collectAndRelease.ts @@ -0,0 +1,41 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const OS_VAULT = "0xa3c0eca00d2b76b4d1f170b0ab3fdea16c180186"; +const OS_HARVESTER = "0x7B0383b31C7662E3f6B6E9C743Bc87b93C1f4498"; +const SONIC_STAKING_STRATEGY = "0xbe19cc5654e30daf04ad3b5e06213d70f4e882ee"; + +const vaultAbi = parseAbi(["function rebase() external"]); +const harvesterAbi = parseAbi([ + "function harvestAndTransfer(address strategy) external", +]); + +action({ + name: "otoken-os-collectAndRelease", + description: "Rebase OS vault and harvest on Sonic", + chains: [146], + run: async ({ signer, log }) => { + // Rebase the vault + const rebaseTx = await signer.sendTransaction({ + to: OS_VAULT, + data: encodeFunctionData({ abi: vaultAbi, functionName: "rebase" }), + gasLimit: 400000, + }); + log.info(`rebase tx: ${rebaseTx.hash}`); + await rebaseTx.wait(); + + // Harvest and transfer + const harvestTx = await signer.sendTransaction({ + to: OS_HARVESTER, + data: encodeFunctionData({ + abi: harvesterAbi, + functionName: "harvestAndTransfer", + args: [SONIC_STAKING_STRATEGY], + }), + gasLimit: 400000, + }); + log.info(`harvestAndTransfer tx: ${harvestTx.hash}`); + await harvestTx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-os-sonicRestakeRewards.ts b/contracts/tasks/actions/otoken-os-sonicRestakeRewards.ts new file mode 100644 index 0000000000..81ecb806fd --- /dev/null +++ b/contracts/tasks/actions/otoken-os-sonicRestakeRewards.ts @@ -0,0 +1,30 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const SONIC_STAKING_STRATEGY = "0x596B0401479f6DfE1cAF8c12838311FeE742B95c"; +const VALIDATOR_IDS = [15n, 16n, 17n, 18n, 45n]; + +const abi = parseAbi([ + "function restakeRewards(uint256[] validatorIds) external", +]); + +action({ + name: "otoken-os-sonicRestakeRewards", + description: "Restake rewards for Sonic validators", + chains: [146], + run: async ({ signer, log }) => { + log.info(`Restaking rewards for validators: ${VALIDATOR_IDS.join(", ")}`); + const tx = await signer.sendTransaction({ + to: SONIC_STAKING_STRATEGY, + data: encodeFunctionData({ + abi, + functionName: "restakeRewards", + args: [VALIDATOR_IDS], + }), + gasLimit: 300000, + }); + log.info(`restakeRewards tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-ousd-autoWithdrawal.ts b/contracts/tasks/actions/otoken-ousd-autoWithdrawal.ts new file mode 100644 index 0000000000..4b18c4ee1e --- /dev/null +++ b/contracts/tasks/actions/otoken-ousd-autoWithdrawal.ts @@ -0,0 +1,21 @@ +import { encodeFunctionData, parseAbi } from "viem"; + +import { action } from "../lib/action"; + +const VAULT = "0x90d588fc0eC3DB9c4b417dB4537fE08e063D2ae5"; +const abi = parseAbi(["function autoWithdraw() external"]); + +action({ + name: "otoken-ousd-autoWithdrawal", + description: "Auto-process OUSD withdrawals", + chains: [1], + run: async ({ signer, log }) => { + const tx = await signer.sendTransaction({ + to: VAULT, + data: encodeFunctionData({ abi, functionName: "autoWithdraw" }), + gasLimit: 4000000, + }); + log.info(`autoWithdraw tx: ${tx.hash}`); + await tx.wait(); + }, +}); diff --git a/contracts/tasks/actions/otoken-ousd-oeth-rebase.ts b/contracts/tasks/actions/otoken-ousd-oeth-rebase.ts new file mode 100644 index 0000000000..95b62d25f4 --- /dev/null +++ b/contracts/tasks/actions/otoken-ousd-oeth-rebase.ts @@ -0,0 +1,44 @@ +import { ethers } from "ethers"; + +import { action } from "../lib/action"; + +const OETH_DRIPPER = "0xe3B3b4Fc77505EcfAACf6dD21619a8Cc12fcc501"; +const OUSD_VAULT = "0xe75d77b1865ae93c7eaa3040b038d7aa7bc02f70"; + +const abi = [ + "function rebase() external", + "function collectAndRebase() external", +]; + +const GAS_MULTIPLIER = 1.1; + +action({ + name: "otoken-ousd-oeth-rebase", + description: + "Rebase both OETH (collectAndRebase) and OUSD (rebase) on mainnet", + chains: [1], + run: async ({ signer, log }) => { + const oethDripper = new ethers.Contract(OETH_DRIPPER, abi, signer); + const ousdVault = new ethers.Contract(OUSD_VAULT, abi, signer); + + // OETH collectAndRebase with gas estimation + 10% buffer + log.info("Estimating gas for OETH collectAndRebase"); + const oethGas = await oethDripper.estimateGas.collectAndRebase(); + const oethGasLimit = oethGas.mul(Math.floor(GAS_MULTIPLIER * 100)).div(100); + const oethTx = await oethDripper.collectAndRebase({ + gasLimit: oethGasLimit, + }); + log.info( + `OETH collectAndRebase tx: ${oethTx.hash} (gasLimit: ${oethGasLimit})` + ); + await oethTx.wait(); + + // OUSD rebase with gas estimation + 10% buffer + log.info("Estimating gas for OUSD rebase"); + const ousdGas = await ousdVault.estimateGas.rebase(); + const ousdGasLimit = ousdGas.mul(Math.floor(GAS_MULTIPLIER * 100)).div(100); + const ousdTx = await ousdVault.rebase({ gasLimit: ousdGasLimit }); + log.info(`OUSD rebase tx: ${ousdTx.hash} (gasLimit: ${ousdGasLimit})`); + await ousdTx.wait(); + }, +}); diff --git a/contracts/tasks/actions/registerValidators.ts b/contracts/tasks/actions/registerValidators.ts new file mode 100644 index 0000000000..9eb3694ad9 --- /dev/null +++ b/contracts/tasks/actions/registerValidators.ts @@ -0,0 +1,109 @@ +import { ethers } from "ethers"; +import { types } from "hardhat/config"; +import addresses from "../../utils/addresses"; +import { keyValueStoreLocalClient } from "../../utils/defender"; +import { registerValidators } from "../../utils/validator"; +import { action } from "../lib/action"; + +const nativeStakingStrategyAbi = require("../../abi/native_staking_SSV_strategy.json"); +const IWETH9Abi = require("../../abi/IWETH9.json"); + +action({ + name: "registerValidators", + description: + "Creates the required amount of new SSV validators and stakes ETH", + chains: [1, 560048], + params: (t) => { + t.addOptionalParam( + "days", + "SSV Cluster operational time in days", + 2, + types.int + ); + t.addOptionalParam( + "validators", + "The number of validators to register. defaults to the max that can be registered", + undefined, + types.int + ); + t.addOptionalParam("clear", "Clear storage", false, types.boolean); + t.addOptionalParam( + "eth", + "Override the days option and set the amount of ETH to deposit to the cluster.", + undefined, + types.float + ); + t.addOptionalParam( + "uuid", + "uuid of P2P's request SSV validator API call.", + undefined, + types.string + ); + t.addOptionalParam( + "index", + "The number of the Native Staking Contract deployed.", + undefined, + types.int + ); + }, + run: async ({ signer, chainId, networkName, log, args }) => { + const store = keyValueStoreLocalClient({ + _storePath: ".store/registerValidators.json", + }); + + const nativeStakingProxyAddress = (addresses as any)[networkName] + .NativeStakingSSVStrategy3Proxy; + log.info(`NativeStakingStrategy: ${nativeStakingProxyAddress}`); + const nativeStakingStrategy = new ethers.Contract( + nativeStakingProxyAddress, + nativeStakingStrategyAbi, + signer + ); + + const wethAddress = (addresses as any)[networkName].WETH; + log.info(`WETH: ${wethAddress}`); + const WETH = new ethers.Contract(wethAddress, IWETH9Abi, signer); + + const feeAccumulatorAddress = + await nativeStakingStrategy.FEE_ACCUMULATOR_ADDRESS(); + + const p2p_api_key = + chainId === 1 + ? process.env.P2P_MAINNET_API_KEY + : process.env.P2P_HOLESKY_API_KEY; + if (!p2p_api_key) { + throw new Error( + "Secret with P2P API key not set. Add P2P_MAINNET_API_KEY or P2P_HOLESKY_API_KEY" + ); + } + const p2p_base_url = + chainId === 1 ? "api.p2p.org" : "api-test-holesky.p2p.org"; + + const awsS3AccessKeyId = process.env.AWS_ACCESS_S3_KEY_ID; + const awsS3SecretAccessKeyId = process.env.AWS_SECRET_S3_ACCESS_KEY; + const s3BucketName = process.env.VALIDATOR_KEYS_S3_BUCKET_NAME; + + if (!awsS3AccessKeyId) throw new Error("AWS_ACCESS_S3_KEY_ID not set"); + if (!awsS3SecretAccessKeyId) + throw new Error("AWS_SECRET_S3_ACCESS_KEY not set"); + if (!s3BucketName) throw new Error("VALIDATOR_KEYS_S3_BUCKET_NAME not set"); + + await registerValidators({ + signer, + store, + nativeStakingStrategy, + WETH, + feeAccumulatorAddress, + p2p_api_key, + p2p_base_url, + validatorSpawnOperationalPeriodInDays: args.days, + clear: args.clear, + uuid: args.uuid, + maxValidatorsToRegister: args.validators, + ethAmount: args.eth, + awsS3AccessKeyId, + awsS3SecretAccessKeyId, + s3BucketName, + }); + }, +}); diff --git a/contracts/tasks/actions/sonicClaimWithdrawals.ts b/contracts/tasks/actions/sonicClaimWithdrawals.ts new file mode 100644 index 0000000000..da0de122d4 --- /dev/null +++ b/contracts/tasks/actions/sonicClaimWithdrawals.ts @@ -0,0 +1,11 @@ +import { withdrawFromSFC } from "../../utils/sonicActions"; +import { action } from "../lib/action"; + +action({ + name: "sonicClaimWithdrawals", + description: "Withdraw native S from a previously undelegated validator", + chains: [146], + run: async ({ signer }) => { + await withdrawFromSFC({ signer }); + }, +}); diff --git a/contracts/tasks/actions/stakeValidators.ts b/contracts/tasks/actions/stakeValidators.ts new file mode 100644 index 0000000000..21dfd927d0 --- /dev/null +++ b/contracts/tasks/actions/stakeValidators.ts @@ -0,0 +1,82 @@ +import { ethers } from "ethers"; +import { types } from "hardhat/config"; +import addresses from "../../utils/addresses"; +import { keyValueStoreLocalClient } from "../../utils/defender"; +import { stakeValidators } from "../../utils/validator"; +import { action } from "../lib/action"; + +const nativeStakingStrategyAbi = require("../../abi/native_staking_SSV_strategy.json"); +const IWETH9Abi = require("../../abi/IWETH9.json"); + +action({ + name: "stakeValidators", + description: + "Creates the required amount of new SSV validators and stakes ETH", + chains: [1, 17000], + params: (t) => { + t.addOptionalParam( + "uuid", + "uuid of P2P's request SSV validator API call", + undefined, + types.string + ); + t.addOptionalParam( + "index", + "The number of the Native Staking Contract deployed.", + undefined, + types.int + ); + }, + run: async ({ signer, chainId, networkName, log, args }) => { + const store = keyValueStoreLocalClient({ + _storePath: ".store/stakeValidators.json", + }); + + const nativeStakingProxyAddress = (addresses as any)[networkName] + .NativeStakingSSVStrategy3Proxy; + log.info(`NativeStakingStrategy: ${nativeStakingProxyAddress}`); + const nativeStakingStrategy = new ethers.Contract( + nativeStakingProxyAddress, + nativeStakingStrategyAbi, + signer + ); + + const wethAddress = (addresses as any)[networkName].WETH; + log.info(`WETH: ${wethAddress}`); + const WETH = new ethers.Contract(wethAddress, IWETH9Abi, signer); + + const p2p_api_key = + chainId === 1 + ? process.env.P2P_MAINNET_API_KEY + : process.env.P2P_HOLESKY_API_KEY; + if (!p2p_api_key) { + throw new Error( + "Secret with P2P API key not set. Add P2P_MAINNET_API_KEY or P2P_HOLESKY_API_KEY" + ); + } + const p2p_base_url = + chainId === 1 ? "api.p2p.org" : "api-test-holesky.p2p.org"; + + const awsS3AccessKeyId = process.env.AWS_ACCESS_S3_KEY_ID; + const awsS3SexcretAccessKeyId = process.env.AWS_SECRET_S3_ACCESS_KEY; + const s3BucketName = process.env.VALIDATOR_KEYS_S3_BUCKET_NAME; + + if (!awsS3AccessKeyId) throw new Error("AWS_ACCESS_S3_KEY_ID not set"); + if (!awsS3SexcretAccessKeyId) + throw new Error("AWS_SECRET_S3_ACCESS_KEY not set"); + if (!s3BucketName) throw new Error("VALIDATOR_KEYS_S3_BUCKET_NAME not set"); + + await stakeValidators({ + signer, + store, + nativeStakingStrategy, + WETH, + p2p_api_key, + p2p_base_url, + uuid: args.uuid, + awsS3AccessKeyId, + awsS3SexcretAccessKeyId, + s3BucketName, + }); + }, +}); diff --git a/contracts/tasks/actions/undelegateValidator.ts b/contracts/tasks/actions/undelegateValidator.ts new file mode 100644 index 0000000000..7a5055e1d2 --- /dev/null +++ b/contracts/tasks/actions/undelegateValidator.ts @@ -0,0 +1,36 @@ +import { types } from "hardhat/config"; +import { undelegateValidator } from "../../utils/sonicActions"; +import { action } from "../lib/action"; + +action({ + name: "sonicUndelegate", + description: "Remove liquidity from a Sonic validator", + chains: [146], + params: (t) => { + t.addOptionalParam( + "id", + "Validator identifier. 15, 16, 17 or 18", + undefined, + types.int + ); + t.addOptionalParam( + "amount", + "Amount of liquidity to remove", + undefined, + types.float + ); + t.addOptionalParam( + "buffer", + "Percentage of total assets to keep as buffer in basis points. 100 = 1%", + 50, + types.float + ); + }, + run: async ({ signer, args }) => { + await undelegateValidator({ + ...args, + bufferPct: args.buffer, + signer, + }); + }, +}); diff --git a/contracts/tasks/lib/action.ts b/contracts/tasks/lib/action.ts new file mode 100644 index 0000000000..db1d79848b --- /dev/null +++ b/contracts/tasks/lib/action.ts @@ -0,0 +1,82 @@ +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", + 8453: "base", + 146: "sonic", + 560048: "hoodi", + 999: "hyperevm", + 17000: "holesky", + 42161: "arbitrum", +}; + +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/contracts/tasks/lib/addresses.ts b/contracts/tasks/lib/addresses.ts new file mode 100644 index 0000000000..fb816858e5 --- /dev/null +++ b/contracts/tasks/lib/addresses.ts @@ -0,0 +1,18 @@ +import type { Address } from "viem"; +import addresses from "../../utils/addresses"; + +/** + * Look up a contract address from the contracts/utils/addresses.js registry. + * Throws if the network or contract name is not found. + */ +export function getAddress(network: string, name: string): Address { + const networkAddresses = (addresses as Record)[network]; + if (!networkAddresses || typeof networkAddresses !== "object") { + throw new Error(`Unknown network "${network}" in address registry`); + } + const addr = (networkAddresses as Record)[name]; + if (!addr) { + throw new Error(`Address "${name}" not found on network "${network}"`); + } + return addr as Address; +} diff --git a/contracts/tasks/lib/client.ts b/contracts/tasks/lib/client.ts new file mode 100644 index 0000000000..87e46aec6d --- /dev/null +++ b/contracts/tasks/lib/client.ts @@ -0,0 +1,77 @@ +import { + type Chain, + createPublicClient, + createWalletClient, + http, + type LocalAccount, +} from "viem"; +import { base, holesky, hoodi, hyperEvm, mainnet, sonic } from "viem/chains"; +import { requireEnv } from "./env"; + +const CHAIN_CONFIG: Record = { + [mainnet.id]: { chain: mainnet, envVar: "PROVIDER_URL" }, + [base.id]: { chain: base, envVar: "BASE_PROVIDER_URL" }, + [sonic.id]: { chain: sonic, envVar: "SONIC_PROVIDER_URL" }, + [hoodi.id]: { chain: hoodi, envVar: "HOODI_PROVIDER_URL" }, + [holesky.id]: { chain: holesky, envVar: "HOLESKY_PROVIDER_URL" }, + [hyperEvm.id]: { chain: hyperEvm, envVar: "HYPEREVM_PROVIDER_URL" }, +}; + +const CHAIN_BY_NAME: Record = Object.fromEntries( + Object.values(CHAIN_CONFIG).map((c) => [c.chain.name.toLowerCase(), c.chain]) +); +const CHAIN_BY_ID: Record = Object.fromEntries( + Object.values(CHAIN_CONFIG).map((c) => [c.chain.id, c.chain]) +); + +/** + * Resolve a chain from a name (e.g. "mainnet") or chain ID (e.g. "1" or 1). + */ +export function resolveChain(nameOrId: string | number): Chain { + if (typeof nameOrId === "number") { + const chain = CHAIN_BY_ID[nameOrId]; + if (!chain) throw new Error(`Unknown chain id ${nameOrId}`); + return chain; + } + // Try as number first, then as name + const asNum = Number(nameOrId); + if (!Number.isNaN(asNum)) { + const chain = CHAIN_BY_ID[asNum]; + if (chain) return chain; + } + const chain = CHAIN_BY_NAME[nameOrId.toLowerCase()]; + if (!chain) { + const supported = Object.values(CHAIN_CONFIG) + .map((c) => `${c.chain.name.toLowerCase()} (${c.chain.id})`) + .join(", "); + throw new Error(`Unknown chain "${nameOrId}". Supported: ${supported}`); + } + return chain; +} + +function getConfig(chain: Chain) { + const config = CHAIN_CONFIG[chain.id]; + if (!config) { + throw new Error(`No config for chain id ${chain.id}`); + } + return config; +} + +export function getRpcUrl(chain: Chain): string { + return requireEnv(getConfig(chain).envVar); +} + +export function getPublicClient(chain: Chain) { + return createPublicClient({ + chain, + transport: http(getRpcUrl(chain)), + }); +} + +export function getWalletClient(chain: Chain, account: LocalAccount) { + return createWalletClient({ + chain, + account, + transport: http(getRpcUrl(chain)), + }); +} diff --git a/contracts/tasks/lib/env.ts b/contracts/tasks/lib/env.ts new file mode 100644 index 0000000000..70eff0a0a4 --- /dev/null +++ b/contracts/tasks/lib/env.ts @@ -0,0 +1,18 @@ +/** + * Typed environment variable access with validation. + * Bun loads .env automatically — no dotenv needed. + */ +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/contracts/tasks/lib/logger.ts b/contracts/tasks/lib/logger.ts new file mode 100644 index 0000000000..26ff27c745 --- /dev/null +++ b/contracts/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: "origin-dollar" }, + 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/contracts/tasks/lib/signer.ts b/contracts/tasks/lib/signer.ts new file mode 100644 index 0000000000..489c431902 --- /dev/null +++ b/contracts/tasks/lib/signer.ts @@ -0,0 +1,237 @@ +import { + GetPublicKeyCommand, + KMSClient, + SignCommand, +} from "@aws-sdk/client-kms"; +import { DirectKmsTransactionSigner } from "@lastdotnet/purrikey"; +import { ethers } from "ethers"; +import { + type Hex, + hashMessage, + hashTypedData, + hexToBytes, + keccak256, + type LocalAccount, + recoverAddress, + serializeTransaction, + signatureToHex, + type TransactionSerializable, + type TypedDataDefinition, +} from "viem"; +import { toAccount } from "viem/accounts"; +import { optionalEnv } from "./env"; + +const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; +const AWS_KMS_REGION = "us-east-1"; + +// secp256k1 curve order +const SECP256K1_N = + 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n; + +function getKmsKeyId(): string { + return optionalEnv("KMS_RELAYER_ID") ?? DEFAULT_KMS_RELAYER_ID; +} + +/** + * Decode a DER-encoded ECDSA signature into (r, s) as bigints. + */ +function decodeDerSignature(der: Uint8Array): { r: bigint; s: bigint } { + let pos = 0; + + if (der[pos++] !== 0x30) + throw new Error("Invalid DER: expected SEQUENCE (0x30)"); + pos++; // skip sequence length + + if (der[pos++] !== 0x02) + throw new Error("Invalid DER: expected INTEGER (0x02) for r"); + const rLen = der[pos++]; + let rBytes = der.slice(pos, pos + rLen); + pos += rLen; + + if (der[pos++] !== 0x02) + throw new Error("Invalid DER: expected INTEGER (0x02) for s"); + const sLen = der[pos++]; + let sBytes = der.slice(pos, pos + sLen); + + // Strip leading zero padding (DER uses it to avoid negative interpretation) + while (rBytes.length > 1 && rBytes[0] === 0x00) rBytes = rBytes.slice(1); + while (sBytes.length > 1 && sBytes[0] === 0x00) sBytes = sBytes.slice(1); + + const r = BigInt(`0x${Buffer.from(rBytes).toString("hex")}`); + const s = BigInt(`0x${Buffer.from(sBytes).toString("hex")}`); + + return { r, s }; +} + +/** + * Extract the uncompressed secp256k1 public key from a DER-encoded + * SubjectPublicKeyInfo blob (as returned by KMS GetPublicKey). + * Returns the 65-byte uncompressed key (04 ‖ x ‖ y). + */ +function extractPublicKeyFromDer(der: Uint8Array): Uint8Array { + // AWS KMS returns a SubjectPublicKeyInfo structure. The last 65 bytes + // are the uncompressed EC point (0x04 prefix + 32-byte x + 32-byte y). + if (der.length < 65) { + throw new Error(`DER public key too short: ${der.length} bytes`); + } + const pubKey = der.slice(-65); + if (pubKey[0] !== 0x04) { + throw new Error( + `Expected uncompressed public key prefix 0x04, got 0x${pubKey[0].toString( + 16 + )}` + ); + } + return pubKey; +} + +/** + * Derive an Ethereum address from an uncompressed secp256k1 public key. + * address = last 20 bytes of keccak256(x ‖ y) + */ +function publicKeyToAddress(uncompressedKey: Uint8Array): `0x${string}` { + // Strip the 0x04 prefix — keccak256 the raw 64-byte (x, y) + const xy = uncompressedKey.slice(1); + const xyHex = `0x${Buffer.from(xy).toString("hex")}` as Hex; + const hash = keccak256(xyHex); + // Last 20 bytes of the hash + return `0x${hash.slice(-40)}` as `0x${string}`; +} + +/** + * Resolve the Ethereum address for a KMS key via GetPublicKey. + */ +async function resolveKmsAddress( + kmsClient: KMSClient, + keyId: string +): Promise<`0x${string}`> { + const response = await kmsClient.send( + new GetPublicKeyCommand({ KeyId: keyId }) + ); + if (!response.PublicKey) { + throw new Error("No public key returned from KMS"); + } + const pubKey = extractPublicKeyFromDer(new Uint8Array(response.PublicKey)); + return publicKeyToAddress(pubKey); +} + +function bigintToHex32(value: bigint): Hex { + return `0x${value.toString(16).padStart(64, "0")}` as Hex; +} + +/** + * Sign a 32-byte digest with AWS KMS and return {r, s, yParity}. + * Handles low-s canonicalization (EIP-2) and recovery parity detection. + */ +async function kmsSign( + kmsClient: KMSClient, + keyId: string, + digest: Hex, + expectedAddress: `0x${string}` +): Promise<{ r: Hex; s: Hex; yParity: 0 | 1 }> { + const response = await kmsClient.send( + new SignCommand({ + KeyId: keyId, + Message: Buffer.from(hexToBytes(digest)), + MessageType: "DIGEST", + SigningAlgorithm: "ECDSA_SHA_256", + }) + ); + + if (!response.Signature) { + throw new Error("No signature returned from KMS"); + } + + const { r, s: rawS } = decodeDerSignature(new Uint8Array(response.Signature)); + let s = rawS; + + // EIP-2: canonicalize s to lower half of curve order + if (s > SECP256K1_N / 2n) { + s = SECP256K1_N - s; + } + + const rHex = bigintToHex32(r); + const sHex = bigintToHex32(s); + + // Try all recovery parities to find the one matching our address + for (const yParity of [0, 1] as const) { + const recovered = await recoverAddress({ + hash: digest, + signature: { r: rHex, s: sHex, v: BigInt(yParity + 27) }, + }); + + if (recovered.toLowerCase() === expectedAddress.toLowerCase()) { + return { r: rHex, s: sHex, yParity }; + } + } + + throw new Error( + `KMS signature recovery failed: could not recover ${expectedAddress}` + ); +} + +/** + * Create a viem LocalAccount backed by AWS KMS. + * Chain-agnostic — chain context comes from the walletClient, not the account. + * Address is resolved once via GetPublicKey and cached in the closure. + */ +export async function getKmsAccount(): Promise { + const keyId = getKmsKeyId(); + const kmsClient = new KMSClient({ region: AWS_KMS_REGION }); + const address = await resolveKmsAddress(kmsClient, keyId); + + return toAccount({ + address, + + async signMessage({ message }) { + const digest = hashMessage(message); + const sig = await kmsSign(kmsClient, keyId, digest, address); + return signatureToHex({ + r: sig.r, + s: sig.s, + yParity: sig.yParity, + }); + }, + + async signTransaction(tx) { + const serialized = serializeTransaction(tx as TransactionSerializable); + const digest = keccak256(serialized); + const sig = await kmsSign(kmsClient, keyId, digest, address); + return serializeTransaction(tx as TransactionSerializable, { + r: sig.r, + s: sig.s, + yParity: sig.yParity, + }); + }, + + async signTypedData(typedData) { + const digest = hashTypedData(typedData as TypedDataDefinition); + const sig = await kmsSign(kmsClient, keyId, digest, address); + return signatureToHex({ + r: sig.r, + s: sig.s, + yParity: sig.yParity, + }); + }, + }) as LocalAccount; +} + +/** + * Create an ethers v5 Signer backed by AWS KMS. + * Used for contracts/ utility functions that expect ethers.Signer. + */ +export function getEthersSigner( + provider: ethers.providers.JsonRpcProvider +): DirectKmsTransactionSigner { + const keyId = getKmsKeyId(); + return new DirectKmsTransactionSigner(keyId, provider, AWS_KMS_REGION); +} + +/** + * Create an ethers v5 JsonRpcProvider from an RPC URL. + */ +export function getEthersProvider( + rpcUrl: string +): ethers.providers.JsonRpcProvider { + return new ethers.providers.JsonRpcProvider(rpcUrl); +} diff --git a/contracts/tasks/lib/store.ts b/contracts/tasks/lib/store.ts new file mode 100644 index 0000000000..02ece0cb5d --- /dev/null +++ b/contracts/tasks/lib/store.ts @@ -0,0 +1,55 @@ +import fs from "node:fs"; +import path from "node:path"; + +export interface KeyValueStore { + get(key: string): Promise; + put(key: string, value: string): Promise; + del(key: string): Promise; +} + +// WARNING +// TODO: Replace with persistent KV storage. + +/** + * File-based key-value store, compatible with the Defender KeyValueStoreClient + * interface. Reuses the pattern from contracts/utils/defender.js. + * + * Persists to actions/.store/{name}.json + */ +export function createStore(name: string): KeyValueStore { + const storeDir = path.resolve(__dirname, "../../.store"); + const storePath = path.join(storeDir, `${name}.json`); + + function getStore(): Record { + try { + if (!fs.existsSync(storePath)) return {}; + const contents = fs.readFileSync(storePath, "utf8"); + return contents ? JSON.parse(contents) : {}; + } catch { + return {}; + } + } + + function updateStore(updater: (store: Record) => void) { + const store = getStore(); + updater(store); + fs.mkdirSync(path.dirname(storePath), { recursive: true }); + fs.writeFileSync(storePath, JSON.stringify(store, null, 2)); + } + + return { + async get(key: string) { + return getStore()[key]; + }, + async put(key: string, value: string) { + updateStore((store) => { + store[key] = value; + }); + }, + async del(key: string) { + updateStore((store) => { + delete store[key]; + }); + }, + }; +} diff --git a/contracts/tasks/lib/transaction.ts b/contracts/tasks/lib/transaction.ts new file mode 100644 index 0000000000..4bff888495 --- /dev/null +++ b/contracts/tasks/lib/transaction.ts @@ -0,0 +1,40 @@ +import { + formatEther, + type Hash, + type PublicClient, + type TransactionReceipt, +} from "viem"; +import type { Logger } from "winston"; + +/** + * Wait for a transaction to be mined, log its details, and throw if it failed. + */ +export async function validateTransaction( + client: PublicClient, + hash: Hash, + method: string, + log: Logger +): Promise { + const tx = await client.getTransaction({ hash }); + log.info( + `Sent ${method} tx ${hash} from ${tx.from} (${ + tx.gasPrice ? Number(tx.gasPrice) / 1e9 : "unknown" + } Gwei)` + ); + + const receipt = await client.waitForTransactionReceipt({ hash }); + + if (receipt.status !== "success") { + throw new Error(`Transaction ${method} failed`); + } + + const txCost = + receipt.gasUsed * (receipt.effectiveGasPrice ?? tx.gasPrice ?? 0n); + log.info( + `Processed ${method} in block ${receipt.blockNumber}, ${ + receipt.gasUsed + } gas, ${formatEther(txCost)} ETH` + ); + + return receipt; +} diff --git a/contracts/tasks/tasks.js b/contracts/tasks/tasks.js index 1363d381cd..82fa5b0119 100644 --- a/contracts/tasks/tasks.js +++ b/contracts/tasks/tasks.js @@ -1,4 +1,8 @@ -const { subtask, task, types } = require("hardhat/config"); +const { + subtask: baseSubtask, + task: baseTask, + types, +} = require("hardhat/config"); const { env } = require("./env"); const { setActionVars, updateAction } = require("./defender"); const { execute, executeOnFork, proposal, governors } = require("./governance"); @@ -16,7 +20,7 @@ const { encryptMasterPrivateKey, decryptMasterPrivateKey, } = require("./amazon"); -const { getSigner, getDefenderSigner } = require("../utils/signers"); +const { getSigner, getKmsSigner } = require("../utils/signers"); const { snapMorpho } = require("../utils/morpho"); const { snapAero } = require("./aero"); const { @@ -62,8 +66,7 @@ const { curveSwapTask, curvePoolTask, } = require("./curve"); -const { calculateMaxPricePerVoteTask, manageBribes } = require("./poolBooster"); -const { manageMerklBribesTask } = require("./merklPoolBooster"); +const { calculateMaxPricePerVoteTask } = require("./poolBooster"); const { depositSSV, migrateClusterToETH, @@ -90,9 +93,7 @@ const { transferToken, } = require("./strategy"); const { - validatorOperationsConfig, exitValidator, - doAccounting, manuallyFixAccounting, resetStakeETHTally, setStakeETHThreshold, @@ -117,12 +118,6 @@ const { } = require("./validatorCompound"); const { tenderlySync, tenderlyUpload } = require("./tenderly"); const { setDefaultValidator, snapSonicStaking } = require("../utils/sonic"); -const { - undelegateValidator, - withdrawFromSFC, -} = require("../utils/sonicActions"); -const { registerValidators, stakeValidators } = require("../utils/validator"); -const { harvestAndSwap } = require("./harvest"); const { deployForceEtherSender, forceSend } = require("./simulation"); const { sleep } = require("../utils/time"); const { lzBridgeToken, lzSetConfig } = require("./layerzero"); @@ -153,8 +148,65 @@ const { const { processCctpBridgeTransactions } = require("./crossChain"); const { keyValueStoreLocalClient } = require("../utils/defender"); const { configuration } = require("../utils/cctp"); +const { + withTaskSignerContext, + DEFAULT_KMS_RELAYER_ID, +} = require("../utils/signersNoHardhat"); const log = require("../utils/logger")("tasks"); +const RELAYER_ID_PARAM = "relayerId"; + +const withTaskContext = (taskName, action) => { + return async (taskArgs, hre, runSuper) => { + return withTaskSignerContext( + { + relayerId: taskArgs?.[RELAYER_ID_PARAM], + taskName, + }, + async () => action(taskArgs, hre, runSuper) + ); + }; +}; + +const decorateTaskDefinition = (definition, taskName) => { + const originalSetAction = definition.setAction.bind(definition); + definition.setAction = (action) => { + return originalSetAction(withTaskContext(taskName, action)); + }; + + if (definition.paramDefinitions?.[RELAYER_ID_PARAM] === undefined) { + definition.addOptionalParam( + RELAYER_ID_PARAM, + "KMS relayer id. Defaults to task map override or origin-relayer-production-evm", + DEFAULT_KMS_RELAYER_ID, + types.string + ); + } + return definition; +}; + +const buildTask = (factory) => (name, descriptionOrAction, maybeAction) => { + let description = descriptionOrAction; + let action = maybeAction; + + if (typeof descriptionOrAction === "function" && action === undefined) { + action = descriptionOrAction; + description = undefined; + } + + const definition = + description === undefined ? factory(name) : factory(name, description); + const decorated = decorateTaskDefinition(definition, name); + + if (action) { + decorated.setAction(action); + } + + return decorated; +}; + +const task = buildTask(baseTask); +const subtask = buildTask(baseSubtask); // Environment tasks. task("env", "Check env vars are properly set for a Mainnet deployment", env); @@ -681,64 +733,6 @@ task("calculateMaxPricePerVote").setAction(async (_, __, runSuper) => { return runSuper(); }); -subtask( - "manageCurvePoolBoosterBribes", - "Calls manageBribes on the CurvePoolBoosterBribesModule and calculates the rewards per vote based on the target efficiency" -) - .addOptionalParam( - "efficiency", - "Target efficiency (0-10, e.g. 1 for 100%, 0.5 for 50%)", - "1", - types.string - ) - .addOptionalParam( - "skipRewardPerVote", - "Skip setting RewardPerVote (pass array of zeros)", - false, - types.boolean - ) - .addOptionalParam( - "chunkSize", - "Number of pool boosters to manage per transaction", - 4, - types.int - ) - .setAction(async (taskArgs) => { - // This action only works with the Defender Relayer signer - const signer = await getDefenderSigner(); - await manageBribes({ - signer, - provider: signer.provider, - targetEfficiency: taskArgs.efficiency, - skipRewardPerVote: taskArgs.skipRewardPerVote, - chunkSize: taskArgs.chunkSize, - }); - }); -task("manageCurvePoolBoosterBribes").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - -subtask( - "manageMerklPoolBoosterBribes", - "Calls bribeAll on the MerklPoolBoosterBribesModule through the Gnosis Safe" -) - .addOptionalParam( - "exclusionList", - "Comma-separated list of pool booster addresses to exclude", - "", - types.string - ) - .addOptionalParam( - "moduleAddress", - "Override module address (default: resolved from chain)", - undefined, - types.string - ) - .setAction(manageMerklBribesTask); -task("manageMerklPoolBoosterBribes").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - // Curve Pools subtask("amoStrat", "Dumps the current state of an AMO strategy") .addParam("pool", "Symbol of the curve Metapool. OUSD or OETH") @@ -1069,21 +1063,6 @@ task("setRewardTokenAddresses", "Sets the reward token of a strategy") // Harvester -task("harvest", "Harvest and swap rewards for a strategy") - .addParam( - "strategy", - "Name of the strategy proxy contract or address. eg NativeStakingSSVStrategyProxy", - undefined, - types.string - ) - .addOptionalParam( - "harvester", - "Name of the harvester proxy contract or address", - "OETHHarvesterProxy", - types.string - ) - .setAction(harvestAndSwap); - // SSV subtask("getClusterInfo", "Print out information regarding SSV cluster") @@ -1234,75 +1213,6 @@ task("deployStakingProxy").setAction(async (_, __, runSuper) => { // Validator Operations -subtask( - "registerValidators", - "Creates the required amount of new SSV validators and stakes ETH" -) - .addOptionalParam( - "days", - "SSV Cluster operational time in days", - 2, - types.int - ) - .addOptionalParam( - "validators", - "The number of validators to register. defaults to the max that can be registered", - undefined, - types.int - ) - .addOptionalParam("clear", "Clear storage", false, types.boolean) - .addOptionalParam( - "eth", - "Override the days option and set the amount of ETH to deposit to the cluster.", - undefined, - types.float - ) - .addOptionalParam( - "uuid", - "uuid of P2P's request SSV validator API call. Used to reprocess a registration that failed to get the SSV request status.", - undefined, - types.string - ) - .addOptionalParam( - "index", - "The number of the Native Staking Contract deployed.", - undefined, - types.int - ) - .setAction(async (taskArgs) => { - const config = await validatorOperationsConfig(taskArgs); - const signer = await getSigner(); - await registerValidators({ ...config, signer }); - }); -task("registerValidators").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - -subtask( - "stakeValidators", - "Creates the required amount of new SSV validators and stakes ETH" -) - .addOptionalParam( - "uuid", - "uuid of P2P's request SSV validator API call", - undefined, - types.string - ) - .addOptionalParam( - "index", - "The number of the Native Staking Contract deployed.", - undefined, - types.int - ) - .setAction(async (taskArgs) => { - const config = await validatorOperationsConfig(taskArgs); - const signer = await getSigner(); - await stakeValidators({ ...config, signer }); - }); -task("stakeValidators").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - /** * This function relays the messages between mainnet and base networks. * @@ -1337,8 +1247,9 @@ task( `.localKeyValueStorage.${networkName}` ); - // This action only works with the Defender Relayer signer - const signer = await getDefenderSigner(); + // This action used to only work with defender relayer signer, + // in future it will work with KMS signer + const signer = await getKmsSigner(); const store = keyValueStoreLocalClient({ _storePath: storeFilePath }); const isMainnet = networkName === "mainnet"; @@ -1494,39 +1405,6 @@ task("removeValidators").setAction(async (_, __, runSuper) => { return runSuper(); }); -subtask( - "doAccounting", - "Account for consensus rewards and validator exits in the Native Staking Strategy" -) - .addOptionalParam( - "index", - "The number of the Native Staking Contract deployed.", - undefined, - types.int - ) - .addOptionalParam( - "consol", - "Call the consolidation controller instead of the strategy", - false, - types.boolean - ) - .setAction(async ({ index, consol }) => { - const signer = await getSigner(); - - const nativeStakingStrategy = await resolveNativeStakingStrategyProxy( - index - ); - - await doAccounting({ - consol, - signer, - nativeStakingStrategy, - }); - }); -task("doAccounting").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - subtask( "manuallyFixAccounting", "Fix an accounting failure in a Native Staking Strategy" @@ -1995,50 +1873,6 @@ task("sonicDefaultValidator").setAction(async (_, __, runSuper) => { return runSuper(); }); -subtask("sonicUndelegate", "Remove liquidity from a Sonic validator") - .addOptionalParam( - "id", - "Validator identifier. 15, 16, 17 or 18", - undefined, - types.int - ) - .addOptionalParam( - "amount", - "Amount of liquidity to remove", - undefined, - types.float - ) - .addOptionalParam( - "buffer", - "Percentage of total assets to keep as buffer in basis points. 100 = 1%", - 50, - types.float - ) - .setAction(async (taskArgs) => { - const signer = await getSigner(); - - await undelegateValidator({ - ...taskArgs, - bufferPct: taskArgs.buffer, - signer, - }); - }); -task("sonicUndelegate").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - -subtask( - "sonicWithdraw", - "Withdraw native S from a previously undelegated validator" -).setAction(async () => { - const signer = await getSigner(); - - await withdrawFromSFC({ signer }); -}); -task("sonicWithdraw").setAction(async (_, __, runSuper) => { - return runSuper(); -}); - subtask("sonicStaking", "Snap of the Sonic Staking Strategy") .addOptionalParam( "block", diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json new file mode 100644 index 0000000000..f31ba81313 --- /dev/null +++ b/contracts/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "outDir": "dist", + "types": ["node"] + }, + "include": ["tasks/actions/**/*.ts", "tasks/lib/**/*.ts", "scripts/**/*.ts", "cron/cron-supervisor.ts", "cron/render-crontab.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/contracts/utils/signers.js b/contracts/utils/signers.js index 412ee879fe..e77eb33ae6 100644 --- a/contracts/utils/signers.js +++ b/contracts/utils/signers.js @@ -1,7 +1,12 @@ const { Wallet } = require("ethers"); const { parseEther } = require("ethers/lib/utils"); const hhHelpers = require("@nomicfoundation/hardhat-network-helpers"); -const { getDefenderSigner } = require("./signersNoHardhat"); +const { + getDefenderSigner, + getKmsAddress, + getKmsSigner, + hasAwsKmsCredentials, +} = require("./signersNoHardhat"); const { ethereumAddress, privateKey } = require("./regex"); const log = require("./logger")("utils:signers"); @@ -9,6 +14,7 @@ const log = require("./logger")("utils:signers"); /** * Signer factory that gets a signer for a hardhat test or task * If address is passed, use that address as signer. + * If AWS IAM KMS credentials are set, use a KMS-backed 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. @@ -22,6 +28,13 @@ async function getSigner(address = undefined) { } return await hre.ethers.provider.getSigner(address); } + + if (hasAwsKmsCredentials()) { + const address = await getKmsAddress({ provider: hre.ethers.provider }); + log(`Using KMS signer ${address}`); + return await getKmsSigner(hre); + } + const pk = process.env.DEPLOYER_PK || process.env.GOVERNOR_PK; if (pk) { if (!pk.match(privateKey)) { @@ -90,4 +103,5 @@ module.exports = { impersonateAccount, impersonateAndFund, getDefenderSigner, + getKmsSigner, }; diff --git a/contracts/utils/signersNoHardhat.js b/contracts/utils/signersNoHardhat.js index f55752502f..8269f372d1 100644 --- a/contracts/utils/signersNoHardhat.js +++ b/contracts/utils/signersNoHardhat.js @@ -1,7 +1,85 @@ const ethers = require("ethers"); +const { DirectKmsTransactionSigner } = require("@lastdotnet/purrikey"); const { Defender } = require("@openzeppelin/defender-sdk"); const log = require("./logger")("utils:signers"); +// origin-relayer-production-evm +const DEFAULT_KMS_RELAYER_ID = "mrk-248128595151466bb7f7b9a56501a98f"; +const AWS_KMS_REGION = "us-east-1"; + +// Task specific relayer overrides. +const TASK_KMS_RELAYER_ID_OVERRIDES = {}; + +let signerContext = { + relayerId: undefined, + taskName: undefined, +}; + +const hasAwsKmsCredentials = () => { + return !!process.env.AWS_ACCESS_KEY_ID && !!process.env.AWS_SECRET_ACCESS_KEY; +}; + +const resolveKmsRelayerId = (context = signerContext) => { + if (context.relayerId) { + return context.relayerId; + } + if ( + context.taskName && + TASK_KMS_RELAYER_ID_OVERRIDES[context.taskName] !== undefined + ) { + return TASK_KMS_RELAYER_ID_OVERRIDES[context.taskName]; + } + return DEFAULT_KMS_RELAYER_ID; +}; + +const withTaskSignerContext = async (context, fn) => { + const previousContext = signerContext; + signerContext = { + ...previousContext, + ...context, + }; + try { + return await fn(); + } finally { + signerContext = previousContext; + } +}; + +const getKmsSigner = async (hre) => { + const relayerId = resolveKmsRelayerId(); + return new DirectKmsTransactionSigner( + relayerId, + hre.ethers.provider, + AWS_KMS_REGION + ); +}; + +/** + * Resolve the Ethereum address for a KMS key. + * If relayerId is not provided, task context / defaults are used. + * @param {object} params + * @param {string} params.relayerId optional explicit relayer id / kms key id + * @param {string} params.taskName optional task name for task-map resolution + * @param {object} params.provider optional ethers provider for signer construction + * @returns {Promise} ethereum address + */ +const getKmsAddress = async ({ relayerId, taskName, provider } = {}) => { + const keyId = resolveKmsRelayerId({ + ...signerContext, + relayerId, + taskName, + }); + const signer = new DirectKmsTransactionSigner( + keyId, + provider || ethers.getDefaultProvider(), + AWS_KMS_REGION + ); + const address = await signer.getAddress(); + + log(`Resolved KMS Ethereum address ${address} from relayer-id "${keyId}"`); + return address; +}; + const getDefenderSigner = async () => { const speed = process.env.SPEED || "fastest"; if (!["safeLow", "average", "fast", "fastest"].includes(speed)) { @@ -44,4 +122,9 @@ const getDefenderSigner = async () => { module.exports = { getDefenderSigner, + getKmsSigner, + getKmsAddress, + hasAwsKmsCredentials, + withTaskSignerContext, + DEFAULT_KMS_RELAYER_ID, }; diff --git a/contracts/utils/validator.js b/contracts/utils/validator.js index 733d24dc1c..aab18dabf5 100644 --- a/contracts/utils/validator.js +++ b/contracts/utils/validator.js @@ -57,7 +57,7 @@ const registerValidators = async ({ maxValidatorsToRegister, ethAmount, awsS3AccessKeyId, - awsS3SexcretAccessKeyId, + awsS3SecretAccessKeyId, s3BucketName, }) => { if (uuid && clear) { @@ -135,7 +135,7 @@ const registerValidators = async ({ p2p_api_key, p2p_base_url, awsS3AccessKeyId, - awsS3SexcretAccessKeyId, + awsS3SecretAccessKeyId, s3BucketName ); currentState = await getState(store);