diff --git a/.env.test b/.env.test new file mode 100644 index 00000000..259dd5d1 --- /dev/null +++ b/.env.test @@ -0,0 +1,8 @@ +DATABASE_HOST=postgres +DATABASE_PORT=5432 +DATABASE_USER=user +DATABASE_PASSWORD=password +DATABASE_NAME=indexer-test-database + +REDIS_HOST=redis +REDIS_PORT=6379 \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 072012bf..5bd9cafc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,10 +26,8 @@ jobs: cache: 'pnpm' - name: Install dependencies run: pnpm install - - name: Build - run: pnpm build - - name: Test - run: pnpm test + - name: Run tests using docker + run: pnpm test:e2e:docker build: name: Build timeout-minutes: 15 diff --git a/.husky/pre-commit b/.husky/pre-commit index 5d5f6cd3..61d3c1b3 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -pnpm turbo run check test +pnpm turbo run check diff --git a/docker-compose.e2e.yml b/docker-compose.e2e.yml new file mode 100644 index 00000000..bf5975b0 --- /dev/null +++ b/docker-compose.e2e.yml @@ -0,0 +1,43 @@ +services: + # Indexer Service + indexer-scraper-e2e: + build: + context: . + container_name: indexer_service_e2e + volumes: + - .:/usr/src/app + - indexer-e2e-node-modules:/usr/src/app/node_modules + command: [sh, -c, "pnpm build && pnpm db:indexer-database:migrate:run && pnpm test"] + env_file: + - .env.test + tty: true + depends_on: + - postgres + - redis + + # PostgreSQL Service + postgres: + image: postgres:13-alpine + container_name: postgres_e2e + env_file: + - .env.test + environment: + TZ: GMT + POSTGRES_DB: ${DATABASE_NAME} + POSTGRES_USER: ${DATABASE_USER} + POSTGRES_PASSWORD: ${DATABASE_PASSWORD} + volumes: + - indexer-e2e-pgdata:/var/lib/postgresql/data + ports: + - 5432:5432 + + # Redis Service + redis: + image: redis:6-alpine + container_name: redis_cache_e2e + volumes: + - indexer-e2e-redis-volume:/data +volumes: + indexer-e2e-node-modules: + indexer-e2e-pgdata: + indexer-e2e-redis-volume: diff --git a/package.json b/package.json index 71258cd6..b9830478 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "fix": "turbo fix", "check": "turbo check", "test": "turbo test", + "test:e2e:docker": "docker compose --env-file .env.test -f docker-compose.e2e.yml up --abort-on-container-exit --exit-code-from indexer-scraper-e2e", + "test:e2e:docker:prune": "docker compose --env-file .env.test -f docker-compose.e2e.yml down -v", "start:indexer": "APP=indexer pnpm --filter @repo/node-app start", "start:indexer:prod": "APP=indexer pnpm --filter @repo/node-app start:prod", "start:indexer-api": "APP=indexer-api pnpm --filter @repo/node-app start", @@ -25,7 +27,7 @@ "turbo": "^2.0.10", "husky": "^9.1.4" }, - "packageManager": "pnpm@8.15.6", + "packageManager": "pnpm@9.15.5", "engines": { "node": ">=18" } diff --git a/packages/error-handling/src/utils/assert.ts b/packages/error-handling/src/utils/assert.ts index f0910b1d..8a9ca098 100644 --- a/packages/error-handling/src/utils/assert.ts +++ b/packages/error-handling/src/utils/assert.ts @@ -8,7 +8,10 @@ import { AssertError } from "../errors/AssertError"; * @returns An assertion of `value`. * @throws {@link AssertError} if assert's validity fails */ -export function assert(value: unknown, message: string): asserts value { +export function assert( + value: unknown, + message: string, +): asserts value is NonNullable { try { return assertModule.ok(value, message); } catch (e: unknown) { diff --git a/packages/indexer-api/.mocharc.json b/packages/indexer-api/.mocharc.json index f56d1f99..9f04cc27 100644 --- a/packages/indexer-api/.mocharc.json +++ b/packages/indexer-api/.mocharc.json @@ -4,7 +4,7 @@ ], "spec": "**/*.test.ts", "require": [ - "ts-node/register" + "ts-node/register","dotenv/config" ], "recursive": true } diff --git a/packages/indexer-api/package.json b/packages/indexer-api/package.json index 5b2ea49b..c8a54803 100644 --- a/packages/indexer-api/package.json +++ b/packages/indexer-api/package.json @@ -14,7 +14,7 @@ "lint": "eslint --fix", "lint:check": "eslint", "check": "pnpm format:check && pnpm lint:check && pnpm build:check", - "test": "mocha", + "test": "DOTENV_CONFIG_PATH=./../../.env.test mocha", "coverage": "nyc mocha", "test:watch": "mocha --watch" }, @@ -24,12 +24,13 @@ "dependencies": { "@repo/error-handling": "workspace:*", "@repo/indexer": "workspace:*", - "@repo/webhooks": "workspace:*", "@repo/indexer-database": "workspace:*", + "@repo/webhooks": "workspace:*", "@types/express": "^4.17.21", "@types/supertest": "^6.0.2", "body-parser": "^1.20.2", "cors": "^2.8.5", + "dotenv": "^16.4.5", "ejs": "^3.1.10", "express": "^4.19.2", "ioredis": "^5.4.1", diff --git a/packages/indexer-api/src/controllers/deposits.ts b/packages/indexer-api/src/controllers/deposits.ts index c4655cb9..d8afcf95 100644 --- a/packages/indexer-api/src/controllers/deposits.ts +++ b/packages/indexer-api/src/controllers/deposits.ts @@ -1,7 +1,11 @@ import { Request, Response, NextFunction } from "express"; import * as s from "superstruct"; import { DepositsService } from "../services/deposits"; -import { DepositsParams, DepositParams } from "../dtos/deposits.dto"; +import { + DepositsParams, + DepositParams, + FilterDepositsParams, +} from "../dtos/deposits.dto"; export class DepositsController { constructor(private service: DepositsService) {} @@ -33,4 +37,31 @@ export class DepositsController { next(err); } }; + + public getUnfilledDeposits = async ( + req: Request, + res: Response, + next: NextFunction, + ) => { + try { + const params = s.create(req.query, FilterDepositsParams); + const result = await this.service.getUnfilledDeposits(params); + return res.json(result); + } catch (err) { + next(err); + } + }; + public getFilledDeposits = async ( + req: Request, + res: Response, + next: NextFunction, + ) => { + try { + const params = s.create(req.query, FilterDepositsParams); + const result = await this.service.getFilledDeposits(params); + return res.json(result); + } catch (err) { + next(err); + } + }; } diff --git a/packages/indexer-api/src/controllers/fills.ts b/packages/indexer-api/src/controllers/fills.ts new file mode 100644 index 00000000..51e527bf --- /dev/null +++ b/packages/indexer-api/src/controllers/fills.ts @@ -0,0 +1,22 @@ +import { Request, Response, NextFunction } from "express"; +import * as s from "superstruct"; +import { FillsService } from "../services/fills"; +import { UnmatchedFillsParams } from "../dtos/fills.dto"; + +export class FillsController { + constructor(private service: FillsService) {} + + public getUnmatchedFills = async ( + req: Request, + res: Response, + next: NextFunction, + ) => { + try { + const params = s.create(req.query, UnmatchedFillsParams); + const result = await this.service.getUnmatchedFills(params); + return res.json(result); + } catch (err) { + next(err); + } + }; +} diff --git a/packages/indexer-api/src/dtos/deposits.dto.ts b/packages/indexer-api/src/dtos/deposits.dto.ts index d64cf386..c78e8917 100644 --- a/packages/indexer-api/src/dtos/deposits.dto.ts +++ b/packages/indexer-api/src/dtos/deposits.dto.ts @@ -21,13 +21,17 @@ export const DepositsParams = s.object({ // some kind of pagination options, skip could be the start point skip: s.optional(stringToInt), // pagination limit, how many to return after the start, note we convert string to number - limit: s.defaulted(stringToInt, 50), + limit: s.refine( + s.defaulted(stringToInt, 50), + "maxLimit", + (value) => value <= 1000 || "Limit must not exceed 1000", + ), }); export type DepositsParams = s.Infer; export const DepositParams = s.object({ - depositId: s.optional(stringToInt), + depositId: s.optional(s.string()), originChainId: s.optional(stringToInt), depositTxHash: s.optional(s.string()), relayDataHash: s.optional(s.string()), @@ -39,3 +43,74 @@ export const DepositParams = s.object({ }); export type DepositParams = s.Infer; + +export const FilterDepositsParams = s.object({ + originChainId: s.optional(stringToInt), + destinationChainId: s.optional(stringToInt), + startTimestamp: s.optional(stringToInt), + endTimestamp: s.optional(stringToInt), + skip: s.defaulted(stringToInt, 0), + limit: s.refine( + s.defaulted(stringToInt, 50), + "maxLimit", + (value) => value <= 1000 || "Limit must not exceed 1000", + ), + minSecondsToFill: s.optional(stringToInt), +}); + +export type FilterDepositsParams = s.Infer; + +export type DepositReturnType = { + // Fields from V3FundsDeposited + id: number; + relayHash: string; + depositId: string; + originChainId: number; + destinationChainId: number; + depositor: string; + recipient: string; + inputToken: string; + inputAmount: string; + outputToken: string; + outputAmount: string; + message: string; + messageHash?: string; + exclusiveRelayer: string; + exclusivityDeadline?: Date; + fillDeadline: Date; + quoteTimestamp: Date; + + depositTransactionHash: string; + depositBlockNumber: number; + depositBlockTimestamp?: Date; + + // Fields from RelayHashInfo + status: entities.RelayStatus; + depositRefundTxHash?: string; + swapTokenPriceUsd?: string; + swapFeeUsd?: string; + bridgeFeeUsd?: string; + inputPriceUsd?: string; + outputPriceUsd?: string; + fillGasFee?: string; + fillGasFeeUsd?: string; + fillGasTokenPriceUsd?: string; + + // from fill + relayer?: string; + fillBlockTimestamp?: Date; + fillTransactionHash?: string; + + // from swap + swapTransactionHash?: string; + swapToken?: string; + swapTokenAmount?: string; + + speedups?: { + transactionHash: string; + updatedRecipient: string; + updatedOutputAmount: string; + updatedMessage: string; + blockNumber: number; + }[]; +}; diff --git a/packages/indexer-api/src/dtos/fills.dto.ts b/packages/indexer-api/src/dtos/fills.dto.ts new file mode 100644 index 00000000..5f9f26f2 --- /dev/null +++ b/packages/indexer-api/src/dtos/fills.dto.ts @@ -0,0 +1,25 @@ +import * as s from "superstruct"; + +const stringToInt = s.coerce(s.number(), s.string(), (value) => { + // Ensure the value is a valid integer string + if (!/^-?\d+$/.test(value)) { + return value; + } + return parseInt(value, 10); +}); + +export const UnmatchedFillsParams = s.object({ + originChainId: s.optional(stringToInt), + destinationChainId: s.optional(stringToInt), + startTimestamp: s.optional(stringToInt), + endTimestamp: s.optional(stringToInt), + relayer: s.optional(s.string()), + skip: s.defaulted(stringToInt, 0), + limit: s.refine( + s.defaulted(stringToInt, 50), + "maxLimit", + (value) => value <= 1000 || "Limit must not exceed 1000", + ), +}); + +export type UnmatchedFillsParams = s.Infer; diff --git a/packages/indexer-api/src/main.ts b/packages/indexer-api/src/main.ts index 080f3c7f..c743073a 100644 --- a/packages/indexer-api/src/main.ts +++ b/packages/indexer-api/src/main.ts @@ -7,74 +7,7 @@ import { type Router } from "express"; import Redis from "ioredis"; import * as Indexer from "@repo/indexer"; import * as Webhooks from "@repo/webhooks"; - -async function initializeRedis( - config: Indexer.RedisConfig, - logger: winston.Logger, -) { - const redis = new Redis({ - ...config, - }); - - return new Promise((resolve, reject) => { - redis.on("ready", () => { - logger.debug({ - at: "IndexerAPI#initializeRedis", - message: "Redis connection established", - config, - }); - resolve(redis); - }); - - redis.on("error", (err) => { - logger.error({ - at: "IndexerAPI#initializeRedis", - message: "Redis connection failed", - notificationPath: "across-indexer-error", - error: err, - }); - reject(err); - }); - }); -} -export async function connectToDatabase( - databaseConfig: DatabaseConfig, - logger: winston.Logger, -) { - try { - const database = await createDataSource(databaseConfig).initialize(); - logger.debug({ - at: "IndexerAPI#connectToDatabase", - message: "Postgres connection established", - }); - return database; - } catch (error) { - logger.error({ - at: "IndexerAPI#connectToDatabase", - message: "Unable to connect to database", - notificationPath: "across-indexer-error", - error, - }); - throw error; - } -} - -function getPostgresConfig( - env: Record, -): DatabaseConfig { - assert(env.DATABASE_HOST, "requires DATABASE_HOST"); - assert(env.DATABASE_PORT, "requires DATABASE_PORT"); - assert(env.DATABASE_USER, "requires DATABASE_USER"); - assert(env.DATABASE_PASSWORD, "requires DATABASE_PASSWORD"); - assert(env.DATABASE_NAME, "requires DATABASE_NAME"); - return { - host: env.DATABASE_HOST, - port: env.DATABASE_PORT, - user: env.DATABASE_USER, - password: env.DATABASE_PASSWORD, - dbName: env.DATABASE_NAME, - }; -} +import * as utils from "./utils"; export async function Main( env: Record, @@ -83,10 +16,10 @@ export async function Main( const { PORT = "8080" } = env; const port = Number(PORT); - const postgresConfig = getPostgresConfig(env); - const postgres = await connectToDatabase(postgresConfig, logger); + const postgresConfig = utils.getPostgresConfig(env); + const postgres = await utils.connectToDatabase(postgresConfig, logger); const redisConfig = Indexer.parseRedisConfig(env); - const redis = await initializeRedis(redisConfig, logger); + const redis = await utils.initializeRedis(redisConfig, logger); const webhooks = await Webhooks.WebhookFactory( { enabledWebhooks: [Webhooks.WebhookTypes.DepositStatus], @@ -101,6 +34,7 @@ export async function Main( deposits: routers.deposits.getRouter(postgres, redis), balances: routers.balances.getRouter(redis), statsPage: routers.statsPage.getRouter(postgres), + fills: routers.fills.getRouter(postgres), // Added fills router webhook: webhooks.router, }; const app = ExpressApp(allRouters); diff --git a/packages/indexer-api/src/routers/deposits.ts b/packages/indexer-api/src/routers/deposits.ts index 16ed1793..44af523f 100644 --- a/packages/indexer-api/src/routers/deposits.ts +++ b/packages/indexer-api/src/routers/deposits.ts @@ -10,5 +10,7 @@ export function getRouter(db: DataSource, redis: Redis): Router { const controller = new DepositsController(service); router.get("/deposits", controller.getDeposits); router.get("/deposit/status", controller.getDepositStatus); + router.get("/deposits/unfilled", controller.getUnfilledDeposits); + router.get("/deposits/filled", controller.getFilledDeposits); return router; } diff --git a/packages/indexer-api/src/routers/fills.ts b/packages/indexer-api/src/routers/fills.ts new file mode 100644 index 00000000..d5ee0ea0 --- /dev/null +++ b/packages/indexer-api/src/routers/fills.ts @@ -0,0 +1,12 @@ +import { Router } from "express"; +import { DataSource } from "@repo/indexer-database"; +import { FillsController } from "../controllers/fills"; +import { FillsService } from "../services/fills"; + +export function getRouter(db: DataSource): Router { + const router = Router(); + const service = new FillsService(db); + const controller = new FillsController(service); + router.get("/fills/unmatched", controller.getUnmatchedFills); + return router; +} diff --git a/packages/indexer-api/src/routers/index.ts b/packages/indexer-api/src/routers/index.ts index 3d4192cd..0f4657cf 100644 --- a/packages/indexer-api/src/routers/index.ts +++ b/packages/indexer-api/src/routers/index.ts @@ -1,3 +1,4 @@ export * as deposits from "./deposits"; export * as balances from "./balances"; export * as statsPage from "./stats-page"; +export * as fills from "./fills"; diff --git a/packages/indexer-api/src/services/deposits.ts b/packages/indexer-api/src/services/deposits.ts index d36de052..e41f7d5e 100644 --- a/packages/indexer-api/src/services/deposits.ts +++ b/packages/indexer-api/src/services/deposits.ts @@ -1,6 +1,11 @@ import { Redis } from "ioredis"; import { DataSource, entities } from "@repo/indexer-database"; -import type { DepositParams, DepositsParams } from "../dtos/deposits.dto"; +import type { + DepositParams, + DepositsParams, + FilterDepositsParams, + DepositReturnType, +} from "../dtos/deposits.dto"; import { DepositNotFoundException, IncorrectQueryParamsException, @@ -10,7 +15,54 @@ import { type APIHandler = ( params?: JSON, ) => Promise | JSON | never | Promise | void | Promise; +// use in typeorm select statement to match DepositReturnType +const DepositFields = [ + `deposit.id as "id"`, + `deposit.relayHash as "relayHash"`, + `deposit.depositId as "depositId"`, + `deposit.originChainId as "originChainId"`, + `deposit.destinationChainId as "destinationChainId"`, + `deposit.depositor as "depositor"`, + `deposit.recipient as "recipient"`, + `deposit.inputToken as "inputToken"`, + `deposit.inputAmount as "inputAmount"`, + `deposit.outputToken as "outputToken"`, + `deposit.outputAmount as "outputAmount"`, + `deposit.message as "message"`, + `deposit.messageHash as "messageHash"`, + `deposit.exclusiveRelayer as "exclusiveRelayer"`, + `deposit.exclusivityDeadline as "exclusivityDeadline"`, + `deposit.fillDeadline as "fillDeadline"`, + `deposit.quoteTimestamp as "quoteTimestamp"`, + `deposit.transactionHash as "depositTransactionHash"`, + `deposit.blockNumber as "depositBlockNumber"`, + `deposit.blockTimestamp as "depositBlockTimestamp"`, +]; +const RelayHashInfoFields = [ + `rhi.status as "status"`, + `rhi.depositRefundTxHash as "depositRefundTxHash"`, + `rhi.swapTokenPriceUsd as "swapTokenPriceUsd"`, + `rhi.swapFeeUsd as "swapFeeUsd"`, + `rhi.bridgeFeeUsd as "bridgeFeeUsd"`, + `rhi.inputPriceUsd as "inputPriceUsd"`, + `rhi.outputPriceUsd as "outputPriceUsd"`, + `rhi.fillGasFee as "fillGasFee"`, + `rhi.fillGasFeeUsd as "fillGasFeeUsd"`, + `rhi.fillGasTokenPriceUsd as "fillGasTokenPriceUsd"`, +]; + +const FilledRelayFields = [ + `fill.relayer as "relayer"`, + `fill.blockTimestamp as "fillBlockTimestamp"`, + `fill.transactionHash as "fillTransactionHash"`, +]; + +const SwapBeforeBridgeFields = [ + `swap.transactionHash as "swapTransactionHash"`, + `swap.swapToken as "swapToken"`, + `swap.swapTokenAmount as "swapTokenAmount"`, +]; export class DepositsService { constructor( private db: DataSource, @@ -19,22 +71,32 @@ export class DepositsService { public async getDeposits( params: DepositsParams, - ): Promise { + ): Promise { const repo = this.db.getRepository(entities.V3FundsDeposited); const queryBuilder = repo .createQueryBuilder("deposit") - .leftJoinAndSelect( + .innerJoinAndSelect( entities.RelayHashInfo, "rhi", "rhi.depositEventId = deposit.id", ) + .leftJoinAndSelect( + entities.SwapBeforeBridge, + "swap", + "swap.id = rhi.swapBeforeBridgeEventId", + ) + .leftJoinAndSelect( + entities.FilledV3Relay, + "fill", + "fill.id = rhi.fillEventId", + ) + .orderBy("deposit.blockTimestamp", "DESC") .select([ - `deposit.*`, - `rhi.status as status`, - `rhi.fillTxHash as "fillTxHash"`, - `rhi.depositRefundTxHash as "depositRefundTxHash"`, - ]) - .orderBy("deposit.quoteTimestamp", "DESC"); + ...DepositFields, + ...RelayHashInfoFields, + ...SwapBeforeBridgeFields, + ...FilledRelayFields, + ]); if (params.depositor) { queryBuilder.andWhere("deposit.depositor = :depositor", { @@ -88,14 +150,45 @@ export class DepositsService { } if (params.skip) { - queryBuilder.skip(params.skip); + queryBuilder.offset(params.skip); } if (params.limit) { queryBuilder.limit(params.limit); } - return queryBuilder.execute(); + const deposits: DepositReturnType[] = await queryBuilder.execute(); + + // Fetch speedup events for each deposit + const speedupRepo = this.db.getRepository( + entities.RequestedSpeedUpV3Deposit, + ); + return Promise.all( + deposits.map(async (deposit) => { + const speedups = await speedupRepo + .createQueryBuilder("speedup") + .where( + "speedup.depositId = :depositId AND speedup.originChainId = :originChainId", + { + depositId: deposit.depositId, + originChainId: deposit.originChainId, + }, + ) + .select([ + "speedup.transactionHash as transactionHash", + "speedup.updatedRecipient as updatedRecipient", + "speedup.updatedMessage as updatedMessage", + "speedup.blockNumber as blockNumber", + "speedup.updatedOutputAmount as updatedOutputAmount", + ]) + .getRawMany(); + + return { + ...deposit, + speedups, + }; + }), + ); } public async getDepositStatus(params: DepositParams) { @@ -145,7 +238,9 @@ export class DepositsService { }); } - const matchingRelays = await queryBuilder.getMany(); + const matchingRelays = await queryBuilder + .orderBy("rhi.depositEventId", "ASC") + .getMany(); const numberMatchingRelays = matchingRelays.length; if (numberMatchingRelays === 0) throw new DepositNotFoundException(); const relay = matchingRelays[params.index]; @@ -156,7 +251,10 @@ export class DepositsService { } const result = { - status: relay.status, + status: + relay.status === entities.RelayStatus.Unfilled + ? "pending" + : relay.status, originChainId: relay.originChainId, depositId: relay.depositId, depositTxHash: relay.depositTxHash, @@ -180,6 +278,191 @@ export class DepositsService { return result; } + public async getUnfilledDeposits( + params: FilterDepositsParams, + ): Promise { + const { + originChainId, + destinationChainId, + startTimestamp = Date.now() - 5 * 60 * 1000, + endTimestamp = Date.now(), + skip, + limit, + } = params; + + const startDate = new Date(startTimestamp); + const endDate = new Date(endTimestamp); + + const repo = this.db.getRepository(entities.V3FundsDeposited); + const queryBuilder = repo + .createQueryBuilder("deposit") + .leftJoinAndSelect( + entities.RelayHashInfo, + "rhi", + "rhi.depositEventId = deposit.id", + ) + .where("rhi.status IN (:...unfilledStatuses)", { + unfilledStatuses: [ + entities.RelayStatus.Unfilled, + entities.RelayStatus.SlowFillRequested, + ], + }) + .andWhere("deposit.blockTimestamp BETWEEN :startDate AND :endDate", { + startDate, + endDate, + }) + .orderBy("deposit.blockTimestamp", "DESC") + .select([...DepositFields, ...RelayHashInfoFields]); + + if (originChainId) { + queryBuilder.andWhere("deposit.originChainId = :originChainId", { + originChainId, + }); + } + + if (destinationChainId) { + queryBuilder.andWhere( + "deposit.destinationChainId = :destinationChainId", + { + destinationChainId, + }, + ); + } + + queryBuilder.offset(skip); + queryBuilder.limit(limit); + + const deposits: DepositReturnType[] = await queryBuilder.execute(); + + // Fetch speedup events for each deposit + const speedupRepo = this.db.getRepository( + entities.RequestedSpeedUpV3Deposit, + ); + return Promise.all( + deposits.map(async (deposit) => { + const speedups = await speedupRepo + .createQueryBuilder("speedup") + .where( + "speedup.depositId = :depositId AND speedup.originChainId = :originChainId", + { + depositId: deposit.depositId, + originChainId: deposit.originChainId, + }, + ) + .select([ + "speedup.transactionHash as transactionHash", + "speedup.updatedRecipient as updatedRecipient", + "speedup.updatedMessage as updatedMessage", + "speedup.blockNumber as blockNumber", + "speedup.updatedOutputAmount as updatedOutputAmount", + ]) + .getRawMany(); + + return { + ...deposit, + speedups, + }; + }), + ); + } + + public async getFilledDeposits( + params: FilterDepositsParams, + ): Promise { + const { + originChainId, + destinationChainId, + startTimestamp = Date.now() - 5 * 60 * 1000, + endTimestamp = Date.now(), + skip, + limit, + minSecondsToFill, + } = params; + + const startDate = new Date(startTimestamp); + const endDate = new Date(endTimestamp); + + const repo = this.db.getRepository(entities.RelayHashInfo); + const queryBuilder = repo + .createQueryBuilder("rhi") + .leftJoinAndSelect( + entities.V3FundsDeposited, + "deposit", + "deposit.id = rhi.depositEventId", + ) + .leftJoinAndSelect( + entities.FilledV3Relay, + "fill", + "fill.id = rhi.fillEventId", + ) + .where("rhi.status = :status", { status: entities.RelayStatus.Filled }) + .andWhere("deposit.blockTimestamp BETWEEN :startDate AND :endDate", { + startDate, + endDate, + }) + .orderBy("deposit.blockTimestamp", "DESC") + .select([...DepositFields, ...RelayHashInfoFields, ...FilledRelayFields]); + + if (originChainId) { + queryBuilder.andWhere("deposit.originChainId = :originChainId", { + originChainId, + }); + } + + if (destinationChainId) { + queryBuilder.andWhere( + "deposit.destinationChainId = :destinationChainId", + { + destinationChainId, + }, + ); + } + + if (minSecondsToFill !== undefined) { + queryBuilder.andWhere( + "EXTRACT(EPOCH FROM (fill.blockTimestamp - deposit.blockTimestamp)) >= :minSecondsToFill", + { minSecondsToFill }, + ); + } + + queryBuilder.offset(skip); + queryBuilder.limit(limit); + + const deposits: DepositReturnType[] = await queryBuilder.execute(); + + // Fetch speedup events for each deposit + const speedupRepo = this.db.getRepository( + entities.RequestedSpeedUpV3Deposit, + ); + + return Promise.all( + deposits.map(async (deposit) => { + const speedups = await speedupRepo + .createQueryBuilder("speedup") + .where( + "speedup.depositId = :depositId AND speedup.originChainId = :originChainId", + { + depositId: deposit.depositId, + originChainId: deposit.originChainId, + }, + ) + .select([ + "speedup.transactionHash as transactionHash", + "speedup.updatedRecipient as updatedRecipient", + "speedup.updatedMessage as updatedMessage", + "speedup.blockNumber as blockNumber", + "speedup.updatedOutputAmount as updatedOutputAmount", + ]) + .getRawMany(); + + return { + ...deposit, + speedups, + }; + }), + ); + } + private getDepositStatusCacheTTLSeconds(status: entities.RelayStatus) { const minute = 60; const hour = 60 * minute; @@ -194,8 +477,6 @@ export class DepositsService { return day; case entities.RelayStatus.SlowFillRequested: return minute * 5; - case entities.RelayStatus.SlowFilled: - return day; default: return 0; } @@ -207,19 +488,18 @@ export class DepositsService { entities.RelayStatus.Filled, entities.RelayStatus.Refunded, entities.RelayStatus.SlowFillRequested, - entities.RelayStatus.SlowFilled, ].includes(status); } private getDepositStatusCacheKey(params: DepositParams) { if (params.depositId && params.originChainId) { - return `depositStatus-${params.depositId}-${params.originChainId}`; + return `depositStatus-${params.depositId}-${params.originChainId}-${params.index}`; } if (params.depositTxHash) { return `depositStatus-${params.depositTxHash}-${params.index}`; } if (params.relayDataHash) { - return `depositStatus-${params.relayDataHash}`; + return `depositStatus-${params.relayDataHash}-${params.index}`; } // in theory this should never happen because we have already checked diff --git a/packages/indexer-api/src/services/fills.ts b/packages/indexer-api/src/services/fills.ts new file mode 100644 index 00000000..001d5c3e --- /dev/null +++ b/packages/indexer-api/src/services/fills.ts @@ -0,0 +1,63 @@ +import { DataSource, entities } from "@repo/indexer-database"; +import type { UnmatchedFillsParams } from "../dtos/fills.dto"; + +export class FillsService { + constructor(private db: DataSource) {} + + public async getUnmatchedFills( + params: UnmatchedFillsParams, + ): Promise< + Array + > { + const { + originChainId, + destinationChainId, + startTimestamp = 0, + endTimestamp = Date.now(), + relayer, + skip, + limit, + } = params; + + const startDate = new Date(startTimestamp); + const endDate = new Date(endTimestamp); + + const relayHashInfoRepo = this.db.getRepository(entities.RelayHashInfo); + const queryBuilder = relayHashInfoRepo + .createQueryBuilder("rhi") + .leftJoinAndSelect( + entities.FilledV3Relay, + "fill", + "fill.id = rhi.fillEventId", + ) + .where("rhi.fillEventId IS NOT NULL") + .andWhere("rhi.depositEventId IS NULL") + .andWhere("fill.blockTimestamp BETWEEN :startDate AND :endDate", { + startDate, + endDate, + }) + .select(["fill.*", `rhi.status as status`]) + .orderBy("fill.blockTimestamp", "DESC"); + + if (originChainId) { + queryBuilder.andWhere("fill.originChainId = :originChainId", { + originChainId, + }); + } + + if (destinationChainId) { + queryBuilder.andWhere("fill.destinationChainId = :destinationChainId", { + destinationChainId, + }); + } + + if (relayer) { + queryBuilder.andWhere("fill.relayer = :relayer", { relayer }); + } + + queryBuilder.offset(skip); + queryBuilder.limit(limit); + + return queryBuilder.execute(); + } +} diff --git a/packages/indexer-api/src/tests/deposits.test.ts b/packages/indexer-api/src/tests/deposits.test.ts new file mode 100644 index 00000000..6ddc3d75 --- /dev/null +++ b/packages/indexer-api/src/tests/deposits.test.ts @@ -0,0 +1,268 @@ +import { expect } from "chai"; +import winston from "winston"; +import { + createDataSource, + DataSource, + Repository, + entities, + fixtures, +} from "@repo/indexer-database"; +// import { parsePostgresConfig } from "../parseEnv"; +import { DepositsService } from "../services/deposits"; // Assuming this is the new service file +import Redis from "ioredis"; +import * as Indexer from "@repo/indexer"; +import * as utils from "../utils"; + +describe("Deposits Service Tests", () => { + // Set up + const logger = winston.createLogger({ + transports: [new winston.transports.Console()], + }); + + let dataSource: DataSource; + let depositsService: DepositsService; + let redis: Redis; + + // Fixtures + let depositsFixture: fixtures.FundsDepositedFixture; + let fillsFixture: fixtures.FilledRelayFixture; + let slowFillsFixture: fixtures.RequestedSlowFillFixture; + let swapBeforeBridgeFixture: fixtures.SwapBeforeBridgeFixture; + let relayHashInfoFixture: fixtures.RelayHashInfoFixture; + + // Events + let deposit: entities.V3FundsDeposited; + let fill: entities.FilledV3Relay; + let slowFill: entities.RequestedV3SlowFill; + + before(async () => { + const databaseConfig = utils.getPostgresConfig(process.env); + dataSource = await createDataSource(databaseConfig).initialize(); + + // Initialize Redis + const redisConfig = Indexer.parseRedisConfig(process.env); + redis = new Redis(redisConfig); + + // Instantiate service + depositsService = new DepositsService(dataSource, redis); + + // Instantiate fixtures + depositsFixture = new fixtures.FundsDepositedFixture(dataSource); + fillsFixture = new fixtures.FilledRelayFixture(dataSource); + slowFillsFixture = new fixtures.RequestedSlowFillFixture(dataSource); + swapBeforeBridgeFixture = new fixtures.SwapBeforeBridgeFixture(dataSource); + relayHashInfoFixture = new fixtures.RelayHashInfoFixture(dataSource); + + // Store events to use across tests + [deposit] = await depositsFixture.insertDeposits([ + { internalHash: "0x123" }, + ]); + [fill] = await fillsFixture.insertFills([{ internalHash: "0x123" }]); + [slowFill] = await slowFillsFixture.insertRequestedSlowFills([ + { internalHash: "0x123" }, + ]); + }); + + afterEach(async () => { + // Reset state after each test + await depositsFixture.deleteAllDeposits(); + await fillsFixture.deleteAllFilledRelays(); + await slowFillsFixture.deleteAllRequestedSlowFills(); + await swapBeforeBridgeFixture.deleteAllSwaps(); + await relayHashInfoFixture.deleteAllRelayHashInfoRows(); + }); + + after(async () => { + // Close connections after all tests + await dataSource.destroy(); + await redis.quit(); + }); + + it("should show the deposits table is empty when calling getDeposits", async () => { + // Ensure the deposits table is empty + await depositsFixture.deleteAllDeposits(); + + // Call getDeposits to retrieve all deposits + const deposits = await depositsService.getDeposits({ limit: 1 }); + + // Verify that the deposits array is empty + expect(deposits).to.be.an("array").that.is.empty; + }); + it("should create a single deposit and verify it exists", async () => { + // Insert a single deposit + const [newDeposit] = await depositsFixture.insertDeposits([ + { depositor: "0x456" }, + ]); + + // Call getDeposits to retrieve all deposits + const deposits = await depositsService.getDeposits({ limit: 10 }); + + // Verify that the deposits array contains one deposit + expect(deposits).to.be.an("array").that.has.lengthOf(1); + + // Verify that the retrieved deposit matches the inserted deposit + expect(deposits[0]?.depositId).to.equal(newDeposit.depositId); + expect(deposits[0]?.depositor).to.equal("0x456"); + }); + it("should add 10 deposits and query them in two pages", async () => { + // Insert 10 deposits + const depositsData = Array.from({ length: 10 }, (_, i) => ({ + depositor: `0x${(i + 1).toString(16).padStart(3, "0")}`, + relayHash: `0xrelay${i}`, + depositId: (i + 1).toString(), + originChainId: i + 1, + destinationChainId: i + 2, + internalHash: `0xinternal${i}`, + transactionHash: `0xtransaction${i}`, + transactionIndex: i, + logIndex: i, + blockNumber: i + 1000, + finalised: i % 2 === 0, + createdAt: new Date(), + blockTimestamp: new Date(Date.now() - i * 1000), + })); + const insertedDeposits = await depositsFixture.insertDeposits(depositsData); + + // Query the first page (0-4) + const firstPageDeposits = await depositsService.getDeposits({ + limit: 5, + skip: 0, + }); + + // Verify that the first page contains 5 deposits + expect(firstPageDeposits).to.be.an("array").that.has.lengthOf(5); + + // Verify that the retrieved deposits match the inserted deposits for the first page + for (let i = 0; i < 5; i++) { + expect(firstPageDeposits[i]?.depositId).to.equal( + insertedDeposits[i]?.depositId, + ); + expect(firstPageDeposits[i]?.depositor).to.equal( + depositsData[i]?.depositor, + ); + } + + // Query the second page (5-9) + const secondPageDeposits = await depositsService.getDeposits({ + limit: 5, + skip: 5, + }); + + // Verify that the second page contains 5 deposits + expect(secondPageDeposits).to.be.an("array").that.has.lengthOf(5); + + // Verify that the retrieved deposits match the inserted deposits for the second page + for (let i = 0; i < 5; i++) { + expect(secondPageDeposits[i]?.depositId).to.equal( + insertedDeposits[i + 5]?.depositId, + ); + expect(secondPageDeposits[i]?.depositor).to.equal( + depositsData[i + 5]?.depositor, + ); + } + }); + it("should add a deposit with related entities and verify the data", async () => { + const swapData = { + id: 1, + swapToken: "0xswapToken", + acrossInputToken: "0xacrossInputToken", + acrossOutputToken: "0xacrossOutputToken", + swapTokenAmount: "100", + acrossInputAmount: "90", + acrossOutputAmount: "85", + exchange: "0xexchange", + blockHash: "0xblockHash", + blockNumber: 1010, + transactionHash: "0xtransaction10", + logIndex: 10, + chainId: 1, + finalised: true, + createdAt: new Date(), + }; + + const filledRelayData = { + id: 1, + relayHash: "0xrelay10", + internalHash: "0xinternal10", + depositId: "11", + originChainId: 1, + destinationChainId: 2, + depositor: "0x789", + recipient: "0xrecipient", + inputToken: "0xinputToken", + inputAmount: "10", + outputToken: "0xoutputToken", + outputAmount: "9", + message: "0xmessage", + exclusiveRelayer: "0xexclusiveRelayer", + exclusivityDeadline: new Date(), + fillDeadline: new Date(), + updatedRecipient: "0xupdatedRecipient", + updatedMessage: "0xupdatedMessage", + updatedOutputAmount: "9", + fillType: 0, + relayer: "0xrelayer", + repaymentChainId: 1, + transactionHash: "0xtransaction10", + transactionIndex: 10, + logIndex: 10, + blockNumber: 1010, + finalised: true, + blockTimestamp: new Date(), + }; + + const depositData = { + id: 1, + depositor: "0x789", + relayHash: filledRelayData.relayHash, + depositId: "11", + originChainId: 1, + destinationChainId: 2, + internalHash: "0xinternal10", + transactionHash: "0xtransaction10", + transactionIndex: 10, + logIndex: 10, + blockNumber: 1010, + finalised: true, + createdAt: new Date(), + blockTimestamp: new Date(), + }; + + const relayHashInfoData = { + id: 1, + depositEventId: depositData.id, + status: entities.RelayStatus.Filled, + swapBeforeBridgeEventId: swapData.id, + fillEventId: filledRelayData.id, + swapTokenPriceUsd: "1.0", + swapFeeUsd: "0.1", + bridgeFeeUsd: "0.05", + inputPriceUsd: "1.0", + outputPriceUsd: "0.9", + fillGasFee: "0.01", + fillGasFeeUsd: "0.01", + fillGasTokenPriceUsd: "1.0", + }; + await depositsFixture.insertDeposits([depositData]); + await swapBeforeBridgeFixture.insertSwaps([swapData]); + await fillsFixture.insertFills([filledRelayData]); + await relayHashInfoFixture.insertRelayHashInfos([relayHashInfoData]); + + // Query the deposit + const queriedDeposits = await depositsService.getDeposits({ + limit: 1, + skip: 0, + }); + + // Verify that the deposit and related entities exist + expect(queriedDeposits).to.be.an("array").that.has.lengthOf(1); + const queriedDeposit = queriedDeposits[0]; + expect(queriedDeposit?.depositId).to.equal(depositData.depositId); + expect(queriedDeposit?.depositor).to.equal(depositData.depositor); + expect(queriedDeposit?.relayHash).to.equal(depositData.relayHash); + expect(queriedDeposit?.swapToken).to.equal(swapData.swapToken); + expect(queriedDeposit?.swapTokenAmount).to.equal(swapData.swapTokenAmount); + expect(queriedDeposit?.relayer).to.equal(filledRelayData.relayer); + expect(queriedDeposit?.status).to.equal(relayHashInfoData.status); + }); +}); diff --git a/packages/indexer-api/src/utils.ts b/packages/indexer-api/src/utils.ts new file mode 100644 index 00000000..aa813196 --- /dev/null +++ b/packages/indexer-api/src/utils.ts @@ -0,0 +1,74 @@ +import { assert } from "@repo/error-handling"; +import { createDataSource, DatabaseConfig } from "@repo/indexer-database"; +import Redis from "ioredis"; +import winston from "winston"; +import * as Indexer from "@repo/indexer"; + +export async function initializeRedis( + config: Indexer.RedisConfig, + logger: winston.Logger, +) { + const redis = new Redis({ + ...config, + }); + + return new Promise((resolve, reject) => { + redis.on("ready", () => { + logger.debug({ + at: "IndexerAPI#initializeRedis", + message: "Redis connection established", + config, + }); + resolve(redis); + }); + + redis.on("error", (err) => { + logger.error({ + at: "IndexerAPI#initializeRedis", + message: "Redis connection failed", + notificationPath: "across-indexer-error", + error: err, + }); + reject(err); + }); + }); +} + +export async function connectToDatabase( + databaseConfig: DatabaseConfig, + logger: winston.Logger, +) { + try { + const database = await createDataSource(databaseConfig).initialize(); + logger.debug({ + at: "IndexerAPI#connectToDatabase", + message: "Postgres connection established", + }); + return database; + } catch (error) { + logger.error({ + at: "IndexerAPI#connectToDatabase", + message: "Unable to connect to database", + notificationPath: "across-indexer-error", + error, + }); + throw error; + } +} + +export function getPostgresConfig( + env: Record, +): DatabaseConfig { + assert(env.DATABASE_HOST, "requires DATABASE_HOST"); + assert(env.DATABASE_PORT, "requires DATABASE_PORT"); + assert(env.DATABASE_USER, "requires DATABASE_USER"); + assert(env.DATABASE_PASSWORD, "requires DATABASE_PASSWORD"); + assert(env.DATABASE_NAME, "requires DATABASE_NAME"); + return { + host: env.DATABASE_HOST, + port: env.DATABASE_PORT, + user: env.DATABASE_USER, + password: env.DATABASE_PASSWORD, + dbName: env.DATABASE_NAME, + }; +} diff --git a/packages/indexer-database/package.json b/packages/indexer-database/package.json index d72e4fcb..38be72b9 100644 --- a/packages/indexer-database/package.json +++ b/packages/indexer-database/package.json @@ -18,13 +18,14 @@ "test:watch": "mocha --watch", "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js", "db:migration:generate": "pnpm typeorm migration:generate -d migrations.config.ts", - "db:migration:run": "pnpm typeorm migration:run -d migrations.config.ts" + "db:migration:run": "pnpm typeorm migration:run -d migrations.config.ts", + "db:migration:revert": "pnpm typeorm migration:revert -d migrations.config.ts" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@across-protocol/sdk": "^3.3.23", + "@across-protocol/sdk": "^4.1.30", "pg": "^8.4.0", "reflect-metadata": "^0.1.13", "superstruct": "2.0.3-1", diff --git a/packages/indexer-database/src/entities/BundleEvent.ts b/packages/indexer-database/src/entities/BundleEvent.ts index c9391434..f8f1d253 100644 --- a/packages/indexer-database/src/entities/BundleEvent.ts +++ b/packages/indexer-database/src/entities/BundleEvent.ts @@ -16,7 +16,6 @@ export enum BundleEventType { } @Entity() -@Unique("UK_bundleEvent_eventType_relayHash", ["type", "relayHash"]) export class BundleEvent { @PrimaryGeneratedColumn() id: number; @@ -33,6 +32,15 @@ export class BundleEvent { @Column() relayHash: string; + @Column({ type: "decimal", nullable: true }) + repaymentChainId: string; + + @Column({ nullable: true }) + eventChainId: number; + + @Column({ nullable: true }) + eventBlockNumber: number; + @Column({ nullable: true }) - repaymentChainId: number; + eventLogIndex: number; } diff --git a/packages/indexer-database/src/entities/HistoricPrice.ts b/packages/indexer-database/src/entities/HistoricPrice.ts new file mode 100644 index 00000000..f35ad61b --- /dev/null +++ b/packages/indexer-database/src/entities/HistoricPrice.ts @@ -0,0 +1,33 @@ +import { + Column, + CreateDateColumn, + Entity, + PrimaryGeneratedColumn, + Unique, +} from "typeorm"; + +@Entity() +@Unique("UK_hp_baseCurrency_quoteCurrency_date", [ + "baseCurrency", + "quoteCurrency", + "date", +]) +export class HistoricPrice { + @PrimaryGeneratedColumn() + id: number; + + @Column() + baseCurrency: string; + + @Column({ default: "usd" }) + quoteCurrency: string; + + @Column({ type: "date" }) + date: Date; + + @Column({ type: "decimal" }) + price: string; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/packages/indexer-database/src/entities/IndexerProgressInfo.ts b/packages/indexer-database/src/entities/IndexerProgressInfo.ts new file mode 100644 index 00000000..edabc413 --- /dev/null +++ b/packages/indexer-database/src/entities/IndexerProgressInfo.ts @@ -0,0 +1,42 @@ +import { + Column, + CreateDateColumn, + Entity, + PrimaryColumn, + UpdateDateColumn, +} from "typeorm"; + +@Entity() +export class IndexerProgressInfo { + /** + * The identifier of the blockchain indexer. + * Usually this id has the format of `-`. + */ + @PrimaryColumn() + id: string; + + /** + * The last finalised block number that has been processed by the indexer. + */ + @Column() + lastFinalisedBlock: number; + + /** + * The latest onchain block number at the time of the last + * indexer progress info update. + */ + @Column() + latestBlockNumber: number; + + /** + * Whether the indexer is still backfilling. + */ + @Column() + isBackfilling: boolean; + + @UpdateDateColumn() + updatedAt: Date; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/packages/indexer-database/src/entities/RelayHashInfo.ts b/packages/indexer-database/src/entities/RelayHashInfo.ts index ff4272ad..b010fcee 100644 --- a/packages/indexer-database/src/entities/RelayHashInfo.ts +++ b/packages/indexer-database/src/entities/RelayHashInfo.ts @@ -13,6 +13,8 @@ import { import { V3FundsDeposited } from "./evm/V3FundsDeposited"; import { FilledV3Relay } from "./evm/FilledV3Relay"; import { RequestedV3SlowFill } from "./evm/RequestedV3SlowFill"; +import { HistoricPrice } from "./HistoricPrice"; +import { SwapBeforeBridge } from "./evm/SwapBeforeBridge"; export enum RelayStatus { Unfilled = "unfilled", @@ -24,18 +26,30 @@ export enum RelayStatus { } @Entity() -@Unique("UK_relayHashInfo_relayHash", ["relayHash"]) +@Unique("UK_relayHashInfo_internalHash_depositEvent", [ + "internalHash", + "depositEventId", +]) @Index("IX_rhi_originChainId_depositId", ["originChainId", "depositId"]) @Index("IX_rhi_depositTxHash", ["depositTxHash"]) +@Index("IX_rhi_origin_deadline_status", [ + "originChainId", + "fillDeadline", + "status", +]) +@Index("IX_rhi_status", ["status"]) export class RelayHashInfo { @PrimaryGeneratedColumn() id: number; - @Column() + @Column({ nullable: true }) relayHash: string; @Column() - depositId: number; + internalHash: string; + + @Column({ type: "decimal" }) + depositId: string; @Column() originChainId: number; @@ -43,11 +57,11 @@ export class RelayHashInfo { @Column() destinationChainId: number; - @Column({ nullable: true }) - depositTxHash: string; + @Column({ type: "varchar", nullable: true }) + depositTxHash: string | null; @Column({ nullable: true }) - depositEventId: number; + depositEventId: number | null; @OneToOne(() => V3FundsDeposited, { nullable: true }) @JoinColumn({ @@ -79,6 +93,16 @@ export class RelayHashInfo { }) slowFillRequestEvent: RequestedV3SlowFill; + @Column({ nullable: true }) + swapBeforeBridgeEventId: number; + + @OneToOne(() => SwapBeforeBridge, { nullable: true }) + @JoinColumn({ + name: "swapBeforeBridgeEventId", + foreignKeyConstraintName: "FK_relayHashInfo_swapBeforeBridgeEventId", + }) + swapBeforeBridgeEvent: SwapBeforeBridge; + @Column() fillDeadline: Date; @@ -88,9 +112,34 @@ export class RelayHashInfo { @Column({ nullable: true }) depositRefundTxHash: string; + // swap vars + @Column({ nullable: true, type: "decimal" }) + swapTokenPriceUsd: string; + + @Column({ nullable: true, type: "decimal" }) + swapFeeUsd: string; + @CreateDateColumn() createdAt: Date; + @Column({ nullable: true, type: "decimal" }) + bridgeFeeUsd: string; + + @Column({ nullable: true, type: "decimal" }) + inputPriceUsd: string; + + @Column({ nullable: true, type: "decimal" }) + outputPriceUsd: string; + + @Column({ nullable: true, type: "decimal" }) + fillGasFee: string; + + @Column({ nullable: true, type: "decimal" }) + fillGasFeeUsd: string; + + @Column({ nullable: true, type: "decimal" }) + fillGasTokenPriceUsd: string; + @UpdateDateColumn() updatedAt: Date; } diff --git a/packages/indexer-database/src/entities/evm/ExecutedRelayerRefundRoot.ts b/packages/indexer-database/src/entities/evm/ExecutedRelayerRefundRoot.ts index 0e853760..f4c14da3 100644 --- a/packages/indexer-database/src/entities/evm/ExecutedRelayerRefundRoot.ts +++ b/packages/indexer-database/src/entities/evm/ExecutedRelayerRefundRoot.ts @@ -37,6 +37,9 @@ export class ExecutedRelayerRefundRoot { @Column({ type: "jsonb" }) refundAddresses: string[]; + @Column({ nullable: true }) + deferredRefunds: boolean; + @Column() caller: string; diff --git a/packages/indexer-database/src/entities/evm/FilledV3Relay.ts b/packages/indexer-database/src/entities/evm/FilledV3Relay.ts index cda1464b..8bf544d8 100644 --- a/packages/indexer-database/src/entities/evm/FilledV3Relay.ts +++ b/packages/indexer-database/src/entities/evm/FilledV3Relay.ts @@ -8,16 +8,19 @@ import { import { interfaces } from "@across-protocol/sdk"; @Entity({ schema: "evm" }) -@Unique("UK_filledV3Relay_relayHash", ["relayHash"]) +@Unique("UK_filledV3Relay_internalHash", ["internalHash"]) export class FilledV3Relay { @PrimaryGeneratedColumn() id: number; - @Column() - relayHash: string; + @Column({ nullable: true }) + relayHash?: string; @Column() - depositId: number; + internalHash: string; + + @Column({ type: "decimal" }) + depositId: string; @Column() originChainId: number; @@ -70,7 +73,7 @@ export class FilledV3Relay { @Column() relayer: string; - @Column() + @Column({ type: "decimal" }) repaymentChainId: number; @Column() diff --git a/packages/indexer-database/src/entities/evm/RequestedSpeedUpV3Deposit.ts b/packages/indexer-database/src/entities/evm/RequestedSpeedUpV3Deposit.ts index 39ed4837..ca24d876 100644 --- a/packages/indexer-database/src/entities/evm/RequestedSpeedUpV3Deposit.ts +++ b/packages/indexer-database/src/entities/evm/RequestedSpeedUpV3Deposit.ts @@ -20,8 +20,8 @@ export class RequestedSpeedUpV3Deposit { @Column() originChainId: number; - @Column() - depositId: number; + @Column({ type: "decimal" }) + depositId: string; @Column() depositor: string; diff --git a/packages/indexer-database/src/entities/evm/RequestedV3SlowFill.ts b/packages/indexer-database/src/entities/evm/RequestedV3SlowFill.ts index 3a9fe7e8..6f70959b 100644 --- a/packages/indexer-database/src/entities/evm/RequestedV3SlowFill.ts +++ b/packages/indexer-database/src/entities/evm/RequestedV3SlowFill.ts @@ -7,16 +7,19 @@ import { } from "typeorm"; @Entity({ schema: "evm" }) -@Unique("UK_requestedV3SlowFill_relayHash", ["relayHash"]) +@Unique("UK_requestedV3SlowFill_internalHash", ["internalHash"]) export class RequestedV3SlowFill { @PrimaryGeneratedColumn() id: number; - @Column() - relayHash: string; + @Column({ nullable: true }) + relayHash?: string; @Column() - depositId: number; + internalHash: string; + + @Column({ type: "decimal" }) + depositId: string; @Column() originChainId: number; diff --git a/packages/indexer-database/src/entities/evm/SwapBeforeBridge.ts b/packages/indexer-database/src/entities/evm/SwapBeforeBridge.ts new file mode 100644 index 00000000..f1a21fbb --- /dev/null +++ b/packages/indexer-database/src/entities/evm/SwapBeforeBridge.ts @@ -0,0 +1,67 @@ +import { + Column, + CreateDateColumn, + DeleteDateColumn, + Entity, + Index, + PrimaryGeneratedColumn, + Unique, +} from "typeorm"; + +@Entity({ schema: "evm" }) +@Unique("UK_swapBeforeBridge_blockNumber_chainId_logIndex", [ + "blockNumber", + "chainId", + "logIndex", +]) +@Index("IX_swapBeforeBridge_finalised", ["finalised"]) +@Index("IX_swapBeforeBridge_deletedAt", ["deletedAt"]) +export class SwapBeforeBridge { + @PrimaryGeneratedColumn() + id: number; + + @Column() + swapToken: string; + + @Column() + acrossInputToken: string; + + @Column() + acrossOutputToken: string; + + @Column({ type: "decimal" }) + swapTokenAmount: string; + + @Column({ type: "decimal" }) + acrossInputAmount: string; + + @Column({ type: "decimal" }) + acrossOutputAmount: string; + + @Column() + exchange: string; + + @Column() + blockHash: string; + + @Column() + blockNumber: number; + + @Column() + transactionHash: string; + + @Column() + logIndex: number; + + @Column() + chainId: number; + + @Column() + finalised: boolean; + + @CreateDateColumn() + createdAt: Date; + + @DeleteDateColumn({ nullable: true }) + deletedAt?: Date; +} diff --git a/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts b/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts index 0718b9cf..2e3fa62f 100644 --- a/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts +++ b/packages/indexer-database/src/entities/evm/V3FundsDeposited.ts @@ -1,16 +1,29 @@ import { Column, CreateDateColumn, + DeleteDateColumn, Entity, + Index, PrimaryGeneratedColumn, Unique, } from "typeorm"; @Entity({ schema: "evm" }) -@Unique("UK_v3FundsDeposited_depositId_originChainId", [ - "depositId", +@Unique("UK_FundsDeposited_relayHash_block_txnHash_logIdx", [ + "relayHash", + "blockNumber", + "transactionHash", + "logIndex", +]) +@Index("IX_v3FundsDeposited_deletedAt", ["deletedAt"]) +@Index("IX_v3FundsDeposited_finalised", ["finalised"]) +@Index("IX_deposits_block_chain_logIndex", [ + "blockNumber", "originChainId", + "logIndex", ]) +@Index("IX_v3FundsDeposited_blockTimestamp", ["blockTimestamp"]) +@Index("IX_v3FundsDeposited_depositor", ["depositor"]) export class V3FundsDeposited { @PrimaryGeneratedColumn() id: number; @@ -18,8 +31,8 @@ export class V3FundsDeposited { @Column() relayHash: string; - @Column() - depositId: number; + @Column({ type: "decimal" }) + depositId: string; @Column() originChainId: number; @@ -54,6 +67,12 @@ export class V3FundsDeposited { @Column() message: string; + @Column({ nullable: true }) + messageHash?: string; + + @Column() + internalHash: string; + @Column() exclusiveRelayer: string; @@ -66,9 +85,6 @@ export class V3FundsDeposited { @Column() quoteTimestamp: Date; - @Column() - quoteBlockNumber: number; - @Column({ nullable: true }) integratorId?: string; @@ -92,4 +108,7 @@ export class V3FundsDeposited { @Column({ nullable: true }) blockTimestamp?: Date; + + @DeleteDateColumn({ nullable: true }) + deletedAt?: Date; } diff --git a/packages/indexer-database/src/entities/index.ts b/packages/indexer-database/src/entities/index.ts index 19148c7e..47b7068e 100644 --- a/packages/indexer-database/src/entities/index.ts +++ b/packages/indexer-database/src/entities/index.ts @@ -12,6 +12,7 @@ export * from "./evm/RequestedSpeedUpV3Deposit"; export * from "./evm/RelayedRootBundle"; export * from "./evm/ExecutedRelayerRefundRoot"; export * from "./evm/TokensBridged"; +export * from "./evm/SwapBeforeBridge"; // Others export * from "./Bundle"; @@ -22,3 +23,6 @@ export * from "./RelayHashInfo"; export * from "./WebhookRequest"; export * from "./WebhookClient"; + +export * from "./IndexerProgressInfo"; +export * from "./HistoricPrice"; diff --git a/packages/indexer-database/src/fixtures/BundleFixture.ts b/packages/indexer-database/src/fixtures/BundleFixture.ts new file mode 100644 index 00000000..040b243a --- /dev/null +++ b/packages/indexer-database/src/fixtures/BundleFixture.ts @@ -0,0 +1,293 @@ +import { + Bundle, + BundleStatus, + ProposedRootBundle, + RelayedRootBundle, + ExecutedRelayerRefundRoot, + BundleEvent, + BundleEventType, +} from "../entities"; +import { DataSource, Repository } from "typeorm"; + +/** + * Utility class for creating bundle related events and entities. + * Events supported: + * - ProposedRootBundle + * - RelayedRootBundle + * - ExecutedRelayerRefundRoot + * - BundleEvent + * Entities supported: + * - Bundle + * Important: When creating entities with foreign key relationships, + * the referenced entities must already exist in the database. + * Example: Creating a Bundle requires an existing ProposedRootBundle ID. + */ +export class BundleFixture { + private bundleRepository: Repository; + public constructor(private dataSource: DataSource) { + this.bundleRepository = this.dataSource.getRepository(Bundle); + } + + /** + * Creates a mock ProposedRootBundle with default values + * @param overrides - Partial object to override default values + * @returns Mock ProposedRootBundle object with default and overridden values + */ + public mockBundleProposal(overrides: Partial) { + return { + challengePeriodEndTimestamp: new Date(), + poolRebalanceLeafCount: 1, + bundleEvaluationBlockNumbers: [10, 20, 30], + chainIds: [1, 2, 3], + poolRebalanceRoot: "0xPoolRebalanceRoot", + relayerRefundRoot: "0xRelayerRefundRoot", + slowRelayRoot: "0xSlowRelayRoot", + proposer: "0xProposer", + transactionHash: "0xabc", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + ...overrides, + }; + } + + /** + * Inserts one or more ProposedRootBundle records into the database + * @param proposals - Array of partial ProposedRootBundle objects to insert + * @returns Array of inserted ProposedRootBundle objects + */ + public async insertBundleProposals(proposals: Partial[]) { + if (proposals.length === 0) { + proposals.push(this.mockBundleProposal({})); + } + const result = await this.dataSource + .getRepository(ProposedRootBundle) + .createQueryBuilder() + .insert() + .values(proposals.map((proposal) => this.mockBundleProposal(proposal))) + .returning("*") + .execute(); + return result.generatedMaps as [ + ProposedRootBundle, + ...ProposedRootBundle[], + ]; + } + + /** + * Creates a mock Bundle object with default values + * Requires an existing ProposedRootBundle in the database. + * @param proposalId - ID of the associated ProposedRootBundle to link with this bundle + * @param overrides - Partial object to override default values of the Bundle + * @returns Promise - Mock Bundle object with values from the proposal and any overrides + * @throws Error if the ProposedRootBundle with the given ID is not found + */ + public async mockBundle(proposalId: number, overrides: Partial) { + const proposal = await this.dataSource + .getRepository(ProposedRootBundle) + .findOne({ where: { id: proposalId } }); + if (!proposal) { + throw new Error("Proposal not found"); + } + return { + poolRebalanceRoot: proposal.poolRebalanceRoot, + relayerRefundRoot: proposal.relayerRefundRoot, + slowRelayRoot: proposal.slowRelayRoot, + proposalId: proposalId, + status: BundleStatus.Executed, + eventsAssociated: true, + ...overrides, + }; + } + + /** + * Inserts a Bundle record into the database + * @param proposalId - ID of the associated ProposedRootBundle + * @param bundle - Partial Bundle object to insert + * @returns Saved Bundle object + */ + public async insertBundle(proposalId: number, bundle: Partial) { + const result = await this.bundleRepository + .createQueryBuilder() + .insert() + .values(await this.mockBundle(proposalId, bundle)) + .returning("*") + .execute(); + const savedBundle = result.generatedMaps[0] as Bundle; + return savedBundle; + } + + /** + * Creates a mock RelayedRootBundle with default values + * @param overrides - Partial object to override default values + * @returns Mock RelayedRootBundle object with default and overridden values + */ + public mockRelayedRootBundle(overrides: Partial) { + return { + chainId: 1, + rootBundleId: 1, + relayerRefundRoot: "0xRelayerRefundRoot", + slowRelayRoot: "0xSlowRelayRoot", + transactionHash: "0xabc", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + ...overrides, + }; + } + + /** + * Inserts one or more RelayedRootBundle records into the database + * @param relayedRootBundles - Array of partial RelayedRootBundle objects to insert + * @returns Array of inserted RelayedRootBundle + */ + public async insertRelayedRootBundle( + relayedRootBundles: Partial[], + ) { + if (relayedRootBundles.length === 0) { + relayedRootBundles.push(this.mockRelayedRootBundle({})); + } + const result = await this.dataSource + .getRepository(RelayedRootBundle) + .createQueryBuilder() + .insert() + .values( + relayedRootBundles.map((relayedRootBundle) => + this.mockRelayedRootBundle(relayedRootBundle), + ), + ) + .returning("*") + .execute(); + return result.generatedMaps as RelayedRootBundle[]; + } + + /** + * Creates a mock ExecutedRelayerRefundRoot with default values + * @param overrides - Partial object to override default values + * @returns Mock ExecutedRelayerRefundRoot object with default and overridden values + */ + public mockExecutedRelayerRefundRoot( + overrides: Partial, + ) { + return { + chainId: 1, + rootBundleId: 1, + leafId: 1, + l2TokenAddress: "0xL2TokenAddress", + amountToReturn: "10", + refundAmounts: ["10"], + refundAddresses: ["0xrefund1"], + deferredRefunds: false, + caller: "0x123", + transactionHash: "0xabc", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + ...overrides, + }; + } + + /** + * Inserts one or more ExecutedRelayerRefundRoot records into the database + * @param executedRelayerRefundRoots - Array of partial ExecutedRelayerRefundRoot objects to insert + * @returns Array of inserted ExecutedRelayerRefundRoot objects + */ + public async insertExecutedRelayerRefundRoot( + executedRelayerRefundRoots: Partial[], + ) { + if (executedRelayerRefundRoots.length === 0) { + executedRelayerRefundRoots.push(this.mockExecutedRelayerRefundRoot({})); + } + const result = await this.dataSource + .getRepository(ExecutedRelayerRefundRoot) + .createQueryBuilder() + .insert() + .values( + executedRelayerRefundRoots.map((executedRelayerRefundRoot) => + this.mockExecutedRelayerRefundRoot(executedRelayerRefundRoot), + ), + ) + .returning("*") + .execute(); + return result.generatedMaps as ExecutedRelayerRefundRoot[]; + } + + /** + * Creates a mock BundleEvent with default values + * Requires an existing Bundle in the database. + * @param bundleId - ID of the associated Bundle + * @param overrides - Partial object to override default values + * @returns Mock BundleEvent object with default and overridden values + * @throws Error if the Bundle with the given ID is not found + */ + public async mockBundleEvents( + bundleId: number, + overrides: Partial, + ) { + const bundle = await this.bundleRepository.findOne({ + where: { id: bundleId }, + }); + if (!bundle) { + throw new Error("Bundle not found"); + } + return { + bundleId: bundleId, + type: BundleEventType.Deposit, + relayHash: "0xaaa", + repaymentChainId: "1", + eventChainId: 1, + eventBlockNumber: 1, + eventLogIndex: 1, + ...overrides, + }; + } + + /** + * Inserts one or more BundleEvent records into the database + * @param bundleId - ID of the associated Bundle + * @param events - Array of partial BundleEvent objects to insert + * @returns Array of inserted BundleEvent objects + */ + public async insertBundleEvents( + bundleId: number, + events: Partial[], + ) { + if (events.length === 0) { + events.push(await this.mockBundleEvents(bundleId, {})); + } + const mockedRows = await Promise.all( + events.map(async (event) => await this.mockBundleEvents(bundleId, event)), + ); + const result = await this.dataSource + .getRepository(BundleEvent) + .createQueryBuilder() + .insert() + .values(mockedRows) + .returning("*") + .execute(); + return result.generatedMaps as BundleEvent[]; + } + + /** + * Cleans up all bundle-related tables by truncating them + */ + public async cleanUpBundleEvents() { + await this.dataSource.query( + `truncate table bundle_event restart identity cascade`, + ); + await this.dataSource.query( + `truncate table "evm"."executed_relayer_refund_root" restart identity cascade`, + ); + await this.dataSource.query( + `truncate table "evm"."relayed_root_bundle" restart identity cascade`, + ); + await this.dataSource.query( + `truncate table bundle restart identity cascade`, + ); + await this.dataSource.query( + `truncate table "evm"."proposed_root_bundle" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/FilledRelayFixture.ts b/packages/indexer-database/src/fixtures/FilledRelayFixture.ts new file mode 100644 index 00000000..a36ebf3d --- /dev/null +++ b/packages/indexer-database/src/fixtures/FilledRelayFixture.ts @@ -0,0 +1,81 @@ +import { interfaces } from "@across-protocol/sdk"; +import { FilledV3Relay } from "../entities"; +import { getRandomInt } from "../utils/FixtureUtils"; +import { DataSource, DeleteResult, InsertResult, Repository } from "typeorm"; + +export class FilledRelayFixture { + private repository: Repository; + public constructor(private dataSource: DataSource) { + this.repository = this.dataSource.getRepository(FilledV3Relay); + } + + /** + * Creates a mock FilledV3Relay object with default values. + * @param overrides - Partial object to override default values + * @returns Mock FilledV3Relay object + */ + public mockFilledRelay(overrides: Partial) { + return { + relayHash: "0xaaa", + internalHash: "0xaaa", + depositId: getRandomInt().toString(), + originChainId: 1, + destinationChainId: 10, + depositor: "0x", + recipient: "0x", + inputToken: "0x", + inputAmount: "10", + outputToken: "0x", + outputAmount: "9", + message: "0x", + exclusiveRelayer: "0x", + exclusivityDeadline: new Date(), + fillDeadline: new Date(), + updatedRecipient: "0x", + updatedMessage: "0x", + updatedOutputAmount: "9", + fillType: interfaces.FillType.FastFill, + relayer: "0x", + repaymentChainId: 1, + transactionHash: "0x", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + blockTimestamp: new Date(), + ...overrides, + }; + } + + /** + * Inserts one or more fills into the database. If no fills are provided, + * a single mock fill with default values will be inserted. + * @param fills - Array of partial FilledV3Relay objects to insert + * @returns Promise containing the result of the insert operation + */ + public async insertFills( + fills: Partial[], + ): Promise<[FilledV3Relay, ...FilledV3Relay[]]> { + if (fills.length === 0) { + fills.push(this.mockFilledRelay({})); + } + const result = await this.repository + .createQueryBuilder() + .insert() + .values(fills.map((fill) => this.mockFilledRelay(fill))) + .returning("*") + .execute(); + + return result.generatedMaps as [FilledV3Relay, ...FilledV3Relay[]]; + } + + /** + * Deletes all fills from the database. + * @returns Promise containing the result of the delete operation + */ + public deleteAllFilledRelays(): Promise { + return this.repository.query( + `truncate table "evm"."filled_v3_relay" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/FundsDepositedFixture.ts b/packages/indexer-database/src/fixtures/FundsDepositedFixture.ts new file mode 100644 index 00000000..8875132a --- /dev/null +++ b/packages/indexer-database/src/fixtures/FundsDepositedFixture.ts @@ -0,0 +1,78 @@ +import { V3FundsDeposited } from "../entities"; +import { getRandomInt } from "../utils/FixtureUtils"; +import { DataSource, DeleteResult, InsertResult, Repository } from "typeorm"; + +export class FundsDepositedFixture { + private repository: Repository; + public constructor(private dataSource: DataSource) { + this.repository = this.dataSource.getRepository(V3FundsDeposited); + } + + /** + * Creates a mock V3FundsDeposited object with default values. + * @param overrides - Partial object to override default values + * @returns Mock V3FundsDeposited object + */ + public mockFundsDeposited(overrides: Partial) { + return { + relayHash: "0xaaa", + internalHash: "0xaaa", + depositId: getRandomInt().toString(), + originChainId: 1, + destinationChainId: 10, + fromLiteChain: false, + toLiteChain: false, + depositor: "0x", + recipient: "0x", + inputToken: "0x", + inputAmount: "10", + outputToken: "0x", + outputAmount: "9", + message: "0x", + messageHash: "0x", + exclusiveRelayer: "0x", + exclusivityDeadline: new Date(), + fillDeadline: new Date(), + quoteTimestamp: new Date(), + transactionHash: "0x", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + blockTimestamp: new Date(), + ...overrides, + }; + } + + /** + * Inserts one or more deposits into the database. If no deposits are provided, + * a single mock deposit with default values will be inserted. + * @param deposits - Array of partial V3FundsDeposited objects to insert + * @returns Promise containing the result of the insert operation + */ + public async insertDeposits( + deposits: Partial[], + ): Promise<[V3FundsDeposited, ...V3FundsDeposited[]]> { + if (deposits.length === 0) { + deposits.push(this.mockFundsDeposited({})); + } + const result = await this.repository + .createQueryBuilder() + .insert() + .values(deposits.map((deposit) => this.mockFundsDeposited(deposit))) + .returning("*") + .execute(); + + return result.generatedMaps as [V3FundsDeposited, ...V3FundsDeposited[]]; + } + + /** + * Deletes all deposits from the database. + * @returns Promise containing the result of the delete operation + */ + public deleteAllDeposits(): Promise { + return this.repository.query( + `truncate table "evm"."v3_funds_deposited" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/RelayHashInfoFixture.ts b/packages/indexer-database/src/fixtures/RelayHashInfoFixture.ts new file mode 100644 index 00000000..7115bfde --- /dev/null +++ b/packages/indexer-database/src/fixtures/RelayHashInfoFixture.ts @@ -0,0 +1,74 @@ +import { RelayHashInfo, RelayStatus } from "../entities"; +import { getRandomInt } from "../utils/FixtureUtils"; +import { DataSource, DeleteResult, InsertResult, Repository } from "typeorm"; + +export class RelayHashInfoFixture { + private repository: Repository; + public constructor(private dataSource: DataSource) { + this.repository = this.dataSource.getRepository(RelayHashInfo); + } + + /** + * Creates a mock RelayHashInfo object with default values. + * @param overrides - Partial object to override default values + * @returns Mock RelayHashInfo object + */ + public mockRelayHashInfo(overrides: Partial) { + return { + id: 1, + relayHash: "0xaaa", + internalHash: "0xaaa", + depositId: getRandomInt().toString(), + originChainId: 1, + destinationChainId: 10, + depositTxHash: "0x", + fillTxHash: "0x", + fillDeadline: new Date(), + status: RelayStatus.Unfilled, + depositRefundTxHash: "0x", + swapTokenPriceUsd: "1.0", + swapFeeUsd: "0.1", + bridgeFeeUsd: "0.05", + inputPriceUsd: "1.0", + outputPriceUsd: "0.9", + fillGasFee: "0.01", + fillGasFeeUsd: "0.01", + fillGasTokenPriceUsd: "1.0", + createdAt: new Date(), + updatedAt: new Date(), + ...overrides, + }; + } + + /** + * Inserts one or more relay hash infos into the database. If no relay hash infos are provided, + * a single mock relay hash info with default values will be inserted. + * @param relayHashInfos - Array of partial RelayHashInfo objects to insert + * @returns Promise containing the result of the insert operation + */ + public async insertRelayHashInfos( + relayHashInfos: Partial[], + ): Promise<[RelayHashInfo, ...RelayHashInfo[]]> { + if (relayHashInfos.length === 0) { + relayHashInfos.push(this.mockRelayHashInfo({})); + } + const result = await this.repository + .createQueryBuilder() + .insert() + .values(relayHashInfos.map((info) => this.mockRelayHashInfo(info))) + .returning("*") + .execute(); + + return result.generatedMaps as [RelayHashInfo, ...RelayHashInfo[]]; + } + + /** + * Deletes all relay hash infos from the database. + * @returns Promise containing the result of the delete operation + */ + public deleteAllRelayHashInfoRows(): Promise { + return this.repository.query( + `truncate table "relay_hash_info" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/RequestedSlowFillFixture.ts b/packages/indexer-database/src/fixtures/RequestedSlowFillFixture.ts new file mode 100644 index 00000000..62355e25 --- /dev/null +++ b/packages/indexer-database/src/fixtures/RequestedSlowFillFixture.ts @@ -0,0 +1,85 @@ +import { RequestedV3SlowFill } from "../entities"; +import { getRandomInt } from "../utils/FixtureUtils"; +import { DataSource, DeleteResult, InsertResult, Repository } from "typeorm"; + +export class RequestedSlowFillFixture { + private repository: Repository; + public constructor(private dataSource: DataSource) { + this.repository = this.dataSource.getRepository(RequestedV3SlowFill); + } + + /** + * Creates a mock RequestedV3SlowFill object with default values. + * @param overrides - Partial object to override default values + * @returns Mock RequestedV3SlowFill object + */ + public mockRequestedSlowFill(overrides: Partial) { + return { + relayHash: "0xaaa", + internalHash: "0xaaa", + depositId: getRandomInt().toString(), + originChainId: 1, + destinationChainId: 10, + fromLiteChain: false, + toLiteChain: false, + depositor: "0x", + recipient: "0x", + inputToken: "0x", + inputAmount: "10", + outputToken: "0x", + outputAmount: "9", + message: "0x", + messageHash: "0x", + exclusiveRelayer: "0x", + exclusivityDeadline: new Date(), + fillDeadline: new Date(), + quoteTimestamp: new Date(), + transactionHash: "0x", + transactionIndex: 1, + logIndex: 1, + blockNumber: 1, + finalised: true, + blockTimestamp: new Date(), + ...overrides, + }; + } + + /** + * Inserts one or more requestedSlowFills into the database. If no requestedSlowFills are provided, + * a single mock requestedSlowFill with default values will be inserted. + * @param requestedSlowFills - Array of partial RequestedV3SlowFill objects to insert + * @returns Promise containing the result of the insert operation + */ + public async insertRequestedSlowFills( + requestedSlowFills: Partial[], + ): Promise<[RequestedV3SlowFill, ...RequestedV3SlowFill[]]> { + if (requestedSlowFills.length === 0) { + requestedSlowFills.push(this.mockRequestedSlowFill({})); + } + const result = await this.repository + .createQueryBuilder() + .insert() + .values( + requestedSlowFills.map((requestedSlowFill) => + this.mockRequestedSlowFill(requestedSlowFill), + ), + ) + .returning("*") + .execute(); + + return result.generatedMaps as [ + RequestedV3SlowFill, + ...RequestedV3SlowFill[], + ]; + } + + /** + * Deletes all requestedSlowFills from the database. + * @returns Promise containing the result of the delete operation + */ + public deleteAllRequestedSlowFills(): Promise { + return this.repository.query( + `truncate table "evm"."requested_v3_slow_fill" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/SwapBeforeBridgeFixture.ts b/packages/indexer-database/src/fixtures/SwapBeforeBridgeFixture.ts new file mode 100644 index 00000000..4c3a605c --- /dev/null +++ b/packages/indexer-database/src/fixtures/SwapBeforeBridgeFixture.ts @@ -0,0 +1,67 @@ +import { SwapBeforeBridge } from "../entities/evm/SwapBeforeBridge"; +import { getRandomInt } from "../utils/FixtureUtils"; +import { DataSource, DeleteResult, Repository } from "typeorm"; + +export class SwapBeforeBridgeFixture { + private repository: Repository; + public constructor(private dataSource: DataSource) { + this.repository = this.dataSource.getRepository(SwapBeforeBridge); + } + + /** + * Creates a mock SwapBeforeBridge object with default values. + * @param overrides - Partial object to override default values + * @returns Mock SwapBeforeBridge object + */ + public mockSwapBeforeBridge(overrides: Partial) { + return { + swapToken: "0x", + acrossInputToken: "0x", + acrossOutputToken: "0x", + swapTokenAmount: "100", + acrossInputAmount: "90", + acrossOutputAmount: "85", + exchange: "0x", + blockHash: "0x", + blockNumber: getRandomInt(), + transactionHash: "0x", + logIndex: getRandomInt(), + chainId: 1, + finalised: true, + createdAt: new Date(), + ...overrides, + }; + } + + /** + * Inserts one or more swaps into the database. If no swaps are provided, + * a single mock swap with default values will be inserted. + * @param swaps - Array of partial SwapBeforeBridge objects to insert + * @returns Promise containing the result of the insert operation + */ + public async insertSwaps( + swaps: Partial[], + ): Promise<[SwapBeforeBridge, ...SwapBeforeBridge[]]> { + if (swaps.length === 0) { + swaps.push(this.mockSwapBeforeBridge({})); + } + const result = await this.repository + .createQueryBuilder() + .insert() + .values(swaps.map((swap) => this.mockSwapBeforeBridge(swap))) + .returning("*") + .execute(); + + return result.generatedMaps as [SwapBeforeBridge, ...SwapBeforeBridge[]]; + } + + /** + * Deletes all swaps from the database. + * @returns Promise containing the result of the delete operation + */ + public deleteAllSwaps(): Promise { + return this.repository.query( + `truncate table "evm"."swap_before_bridge" restart identity cascade`, + ); + } +} diff --git a/packages/indexer-database/src/fixtures/index.ts b/packages/indexer-database/src/fixtures/index.ts new file mode 100644 index 00000000..8ff66fd7 --- /dev/null +++ b/packages/indexer-database/src/fixtures/index.ts @@ -0,0 +1,6 @@ +export * from "./BundleFixture"; +export * from "./FilledRelayFixture"; +export * from "./FundsDepositedFixture"; +export * from "./RequestedSlowFillFixture"; +export * from "./RelayHashInfoFixture"; +export * from "./SwapBeforeBridgeFixture"; diff --git a/packages/indexer-database/src/index.ts b/packages/indexer-database/src/index.ts index f4791a07..71181d35 100644 --- a/packages/indexer-database/src/index.ts +++ b/packages/indexer-database/src/index.ts @@ -1,4 +1,5 @@ export * from "./main"; export * as entities from "./entities"; +export * as fixtures from "./fixtures"; export * as utils from "./utils"; export * from "./model"; diff --git a/packages/indexer-database/src/main.ts b/packages/indexer-database/src/main.ts index 96c9bf46..770ad33e 100644 --- a/packages/indexer-database/src/main.ts +++ b/packages/indexer-database/src/main.ts @@ -1,9 +1,25 @@ import "reflect-metadata"; -import { DataSource, LessThan, Not, In } from "typeorm"; +import { + DataSource, + Repository, + InsertResult, + UpdateResult, + In, + LessThan, + Not, +} from "typeorm"; import * as entities from "./entities"; import { DatabaseConfig } from "./model"; -export { DataSource, LessThan, Not, In }; +export { + DataSource, + Repository, + InsertResult, + UpdateResult, + In, + LessThan, + Not, +}; export const createDataSource = (config: DatabaseConfig): DataSource => { return new DataSource({ @@ -29,6 +45,7 @@ export const createDataSource = (config: DatabaseConfig): DataSource => { entities.RequestedV3SlowFill, entities.TokensBridged, entities.V3FundsDeposited, + entities.SwapBeforeBridge, // Bundle entities.Bundle, entities.BundleBlockRange, @@ -39,6 +56,10 @@ export const createDataSource = (config: DatabaseConfig): DataSource => { // Webhooks entities.WebhookRequest, entities.WebhookClient, + // Indexer + entities.IndexerProgressInfo, + // Historic Price + entities.HistoricPrice, ], migrationsTableName: "_migrations", migrations: ["migrations/*.ts"], diff --git a/packages/indexer-database/src/migrations/1734616435674-HistoricPrice.ts b/packages/indexer-database/src/migrations/1734616435674-HistoricPrice.ts new file mode 100644 index 00000000..24d6f530 --- /dev/null +++ b/packages/indexer-database/src/migrations/1734616435674-HistoricPrice.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class HistoricPrice1734616435674 implements MigrationInterface { + name = "HistoricPrice1734616435674"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE "historic_price" ( + "id" SERIAL NOT NULL, + "baseCurrency" character varying NOT NULL, + "quoteCurrency" character varying NOT NULL DEFAULT 'usd', + "date" date NOT NULL, + "price" double precision NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + CONSTRAINT "UK_hp_baseCurrency_quoteCurrency_date" UNIQUE ("baseCurrency", "quoteCurrency", "date"), + CONSTRAINT "PK_77dc3f4978cdfb03f1bb3a7444b" PRIMARY KEY ("id")) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "historic_price"`); + } +} diff --git a/packages/indexer-database/src/migrations/1735922359359-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1735922359359-RelayHashInfo.ts new file mode 100644 index 00000000..a1514ed1 --- /dev/null +++ b/packages/indexer-database/src/migrations/1735922359359-RelayHashInfo.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1735922359359 implements MigrationInterface { + name = "RelayHashInfo1735922359359"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "bridgeFeeUsd" double precision`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "inputPriceUsd" double precision`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "outputPriceUsd" double precision`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "bridgeFeeUsd"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "outputPriceUsd"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "inputPriceUsd"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737488614948-SpeedUpAndSlowFillDepositId.ts b/packages/indexer-database/src/migrations/1737488614948-SpeedUpAndSlowFillDepositId.ts new file mode 100644 index 00000000..8e70c884 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737488614948-SpeedUpAndSlowFillDepositId.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositId1737488614948 implements MigrationInterface { + name = "DepositId1737488614948"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.requested_speed_up_v3_deposit alter column "depositId" type numeric`, + ); + await queryRunner.query( + `alter table evm.requested_v3_slow_fill alter column "depositId" type numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.requested_speed_up_v3_deposit alter column "depositId" type integer`, + ); + await queryRunner.query( + `alter table evm.requested_v3_slow_fill alter column "depositId" type integer`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737488614949-FillsDepositId.ts b/packages/indexer-database/src/migrations/1737488614949-FillsDepositId.ts new file mode 100644 index 00000000..0db53823 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737488614949-FillsDepositId.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositId1737488614949 implements MigrationInterface { + name = "DepositId1737488614949"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.filled_v3_relay alter column "depositId" type numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.filled_v3_relay alter column "depositId" type integer`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737488614950-DepositsDepositId.ts b/packages/indexer-database/src/migrations/1737488614950-DepositsDepositId.ts new file mode 100644 index 00000000..ff2d2e6b --- /dev/null +++ b/packages/indexer-database/src/migrations/1737488614950-DepositsDepositId.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositId1737488614950 implements MigrationInterface { + name = "DepositId1737488614950"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.v3_funds_deposited alter column "depositId" type numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.v3_funds_deposited alter column "depositId" type integer`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737488614951-RelayHashInfoDepositId.ts b/packages/indexer-database/src/migrations/1737488614951-RelayHashInfoDepositId.ts new file mode 100644 index 00000000..ae20f275 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737488614951-RelayHashInfoDepositId.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositId1737488614951 implements MigrationInterface { + name = "DepositId1737488614951"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table relay_hash_info alter column "depositId" type numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table relay_hash_info alter column "depositId" type integer`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737573949409-RepaymentChainId.ts b/packages/indexer-database/src/migrations/1737573949409-RepaymentChainId.ts new file mode 100644 index 00000000..832f0608 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737573949409-RepaymentChainId.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RepaymentChainId1737573949409 implements MigrationInterface { + name = "RepaymentChainId1737573949409"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.filled_v3_relay alter column "repaymentChainId" type numeric`, + ); + await queryRunner.query( + `alter table bundle_event alter column "repaymentChainId" type numeric`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."executed_relayer_refund_root" ADD "deferredRefunds" boolean`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `alter table evm.filled_v3_relay alter column "repaymentChainId" type integer`, + ); + await queryRunner.query( + `alter table bundle_event alter column "repaymentChainId" type integer`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."executed_relayer_refund_root" DROP COLUMN "deferredRefunds"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737589453070-IndexerProgressInfo.ts b/packages/indexer-database/src/migrations/1737589453070-IndexerProgressInfo.ts new file mode 100644 index 00000000..02f29ae3 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737589453070-IndexerProgressInfo.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class IndexerProgressInfo1737589453070 implements MigrationInterface { + name = "IndexerProgressInfo1737589453070"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE "indexer_progress_info" ( + "id" character varying NOT NULL, + "lastFinalisedBlock" integer NOT NULL, + "latestBlockNumber" integer NOT NULL, + "isBackfilling" boolean NOT NULL, + "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + CONSTRAINT "PK_7c077a22af710355c7d83c00096" PRIMARY KEY ("id")) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "indexer_progress_info"`); + } +} diff --git a/packages/indexer-database/src/migrations/1737650752958-DepositsUniqueConstraint.ts b/packages/indexer-database/src/migrations/1737650752958-DepositsUniqueConstraint.ts new file mode 100644 index 00000000..837547da --- /dev/null +++ b/packages/indexer-database/src/migrations/1737650752958-DepositsUniqueConstraint.ts @@ -0,0 +1,37 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositsUniqueConstraint1737650752958 + implements MigrationInterface +{ + name = "DepositsUniqueConstraint1737650752958"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP CONSTRAINT "UK_v3FundsDeposited_depositId_originChainId"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_relayHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD CONSTRAINT "UK_v3FundsDeposited_relayHash_block_logIdx" UNIQUE ("relayHash", "blockNumber", "logIndex")`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_relayHash_depositEvent" UNIQUE ("relayHash", "depositEventId")`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_relayHash_depositEvent"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP CONSTRAINT "UK_v3FundsDeposited_relayHash_block_logIdx"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_relayHash" UNIQUE ("relayHash")`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD CONSTRAINT "UK_v3FundsDeposited_depositId_originChainId" UNIQUE ("depositId", "originChainId")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737658101626-V3FundsDeposited.ts b/packages/indexer-database/src/migrations/1737658101626-V3FundsDeposited.ts new file mode 100644 index 00000000..f99f8f3a --- /dev/null +++ b/packages/indexer-database/src/migrations/1737658101626-V3FundsDeposited.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V3FundsDeposited1737658101626 implements MigrationInterface { + name = "V3FundsDeposited1737658101626"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP COLUMN "quoteBlockNumber"`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD "quoteBlockNumber" integer NOT NULL`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1737752107825-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1737752107825-RelayHashInfo.ts new file mode 100644 index 00000000..a5429f68 --- /dev/null +++ b/packages/indexer-database/src/migrations/1737752107825-RelayHashInfo.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1737752107825 implements MigrationInterface { + name = "RelayHashInfo1737752107825"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE INDEX "IX_rhi_origin_deadline_status" ON "relay_hash_info" ("originChainId", "fillDeadline", "status") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "public"."IX_rhi_origin_deadline_status"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738721858386-DepositsDeletedAt.ts b/packages/indexer-database/src/migrations/1738721858386-DepositsDeletedAt.ts new file mode 100644 index 00000000..74fd121e --- /dev/null +++ b/packages/indexer-database/src/migrations/1738721858386-DepositsDeletedAt.ts @@ -0,0 +1,21 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositsDeletedAt1738721858386 implements MigrationInterface { + name = "DepositsDeletedAt1738721858386"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD "deletedAt" TIMESTAMP`, + ); + await queryRunner.query( + `CREATE INDEX "IX_v3FundsDeposited_deletedAt" ON "evm"."v3_funds_deposited" ("deletedAt") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "evm"."IX_v3FundsDeposited_deletedAt"`); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP COLUMN "deletedAt"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738876966722-Deposits.ts b/packages/indexer-database/src/migrations/1738876966722-Deposits.ts new file mode 100644 index 00000000..80a0830c --- /dev/null +++ b/packages/indexer-database/src/migrations/1738876966722-Deposits.ts @@ -0,0 +1,21 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Deposits1738876966722 implements MigrationInterface { + name = "Deposits1738876966722"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE INDEX "IX_deposits_block_chain_logIndex" ON "evm"."v3_funds_deposited" ("blockNumber", "originChainId", "logIndex") `, + ); + await queryRunner.query( + `CREATE INDEX "IX_v3FundsDeposited_finalised" ON "evm"."v3_funds_deposited" ("finalised") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "evm"."IX_v3FundsDeposited_finalised"`); + await queryRunner.query( + `DROP INDEX "evm"."IX_deposits_block_chain_logIndex"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738878727887-BundleEvents.ts b/packages/indexer-database/src/migrations/1738878727887-BundleEvents.ts new file mode 100644 index 00000000..fe4d8b79 --- /dev/null +++ b/packages/indexer-database/src/migrations/1738878727887-BundleEvents.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class BundleEvents1738878727887 implements MigrationInterface { + name = "BundleEvents1738878727887"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "bundle_event" DROP CONSTRAINT "UK_bundleEvent_eventType_relayHash"`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" ADD "eventChainId" integer`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" ADD "eventBlockNumber" integer`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" ADD "eventLogIndex" integer`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "bundle_event" DROP COLUMN "eventLogIndex"`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" DROP COLUMN "eventBlockNumber"`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" DROP COLUMN "eventChainId"`, + ); + await queryRunner.query( + `ALTER TABLE "bundle_event" ADD CONSTRAINT "UK_bundleEvent_eventType_relayHash" UNIQUE ("type", "relayHash")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738886982008-V3FundsDeposited.ts b/packages/indexer-database/src/migrations/1738886982008-V3FundsDeposited.ts new file mode 100644 index 00000000..6fd03ffb --- /dev/null +++ b/packages/indexer-database/src/migrations/1738886982008-V3FundsDeposited.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V3FundsDeposited1738886982008 implements MigrationInterface { + name = "V3FundsDeposited1738886982008"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD "messageHash" character varying`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD "internalHash" character varying`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP COLUMN "internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP COLUMN "messageHash"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738886982009-V3FundsDeposited.ts b/packages/indexer-database/src/migrations/1738886982009-V3FundsDeposited.ts new file mode 100644 index 00000000..55d8f161 --- /dev/null +++ b/packages/indexer-database/src/migrations/1738886982009-V3FundsDeposited.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V3FundsDeposited1738886982009 implements MigrationInterface { + name = "V3FundsDeposited1738886982009"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `update evm.v3_funds_deposited set "internalHash" = "relayHash" where "relayHash" is not null;`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `update evm.v3_funds_deposited set "internalHash" = null where "internalHash" is not null;`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738886982010-FilledV3Relay.ts b/packages/indexer-database/src/migrations/1738886982010-FilledV3Relay.ts new file mode 100644 index 00000000..cf0c9ef7 --- /dev/null +++ b/packages/indexer-database/src/migrations/1738886982010-FilledV3Relay.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class FilledV3Relay1738886982010 implements MigrationInterface { + name = "FilledV3Relay1738886982010"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ADD "internalHash" character varying`, + ); + await queryRunner.query( + `update evm.filled_v3_relay set "internalHash" = "relayHash" where "relayHash" is not null;`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ADD CONSTRAINT "UK_filledV3Relay_internalHash" UNIQUE ("internalHash")`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" DROP CONSTRAINT "UK_filledV3Relay_relayHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ALTER COLUMN "relayHash" DROP NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" DROP CONSTRAINT "UK_filledV3Relay_internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" DROP COLUMN "internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ADD CONSTRAINT "UK_filledV3Relay_relayHash" UNIQUE ("relayHash")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738886982011-RequestedV3SlowFill.ts b/packages/indexer-database/src/migrations/1738886982011-RequestedV3SlowFill.ts new file mode 100644 index 00000000..daf59e30 --- /dev/null +++ b/packages/indexer-database/src/migrations/1738886982011-RequestedV3SlowFill.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RequestedV3SlowFill1738886982011 implements MigrationInterface { + name = "RequestedV3SlowFill1738886982011"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ADD "internalHash" character varying`, + ); + await queryRunner.query( + `update "evm"."requested_v3_slow_fill" set "internalHash" = "relayHash" where "relayHash" is not null;`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ADD CONSTRAINT "UK_requestedV3SlowFill_internalHash" UNIQUE ("internalHash")`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" DROP CONSTRAINT "UK_requestedV3SlowFill_relayHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ALTER COLUMN "relayHash" DROP NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" DROP CONSTRAINT "UK_requestedV3SlowFill_internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" DROP COLUMN "internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ADD CONSTRAINT "UK_requestedV3SlowFill_relayHash" UNIQUE ("relayHash")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1738886982012-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1738886982012-RelayHashInfo.ts new file mode 100644 index 00000000..f684460c --- /dev/null +++ b/packages/indexer-database/src/migrations/1738886982012-RelayHashInfo.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1738886982012 implements MigrationInterface { + name = "RelayHashInfo1738886982012"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "internalHash" character varying`, + ); + await queryRunner.query( + `update "relay_hash_info" set "internalHash" = "relayHash" where "relayHash" is not null;`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent" UNIQUE ("internalHash", "depositEventId")`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_relayHash_depositEvent"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "relayHash" DROP NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "internalHash"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_relayHash_depositEvent" UNIQUE ("relayHash", "depositEventId")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1739306949453-InternalHashNotNull.ts b/packages/indexer-database/src/migrations/1739306949453-InternalHashNotNull.ts new file mode 100644 index 00000000..0ebe3aa0 --- /dev/null +++ b/packages/indexer-database/src/migrations/1739306949453-InternalHashNotNull.ts @@ -0,0 +1,47 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class InternalHashNotNull1739306949453 implements MigrationInterface { + name = "InternalHashNotNull1739306949453"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ALTER COLUMN "internalHash" SET NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ALTER COLUMN "internalHash" SET NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ALTER COLUMN "internalHash" SET NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "internalHash" SET NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent" UNIQUE ("internalHash", "depositEventId")`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "internalHash" DROP NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UK_relayHashInfo_internalHash_depositEvent" UNIQUE ("depositEventId", "internalHash")`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."requested_v3_slow_fill" ALTER COLUMN "internalHash" DROP NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."filled_v3_relay" ALTER COLUMN "internalHash" DROP NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ALTER COLUMN "internalHash" DROP NOT NULL`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1739385066933-DecimalPriceColumns.ts b/packages/indexer-database/src/migrations/1739385066933-DecimalPriceColumns.ts new file mode 100644 index 00000000..8af50559 --- /dev/null +++ b/packages/indexer-database/src/migrations/1739385066933-DecimalPriceColumns.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DecimalPriceColumns1739385066933 implements MigrationInterface { + name = "DecimalPriceColumns1739385066933"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "bridgeFeeUsd" TYPE numeric`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "inputPriceUsd" TYPE numeric`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "outputPriceUsd" TYPE numeric`, + ); + await queryRunner.query( + `ALTER TABLE "historic_price" ALTER COLUMN "price" TYPE numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "bridgeFeeUsd" TYPE double precision`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "inputPriceUsd" TYPE double precision`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ALTER COLUMN "outputPriceUsd" TYPE double precision`, + ); + await queryRunner.query( + `ALTER TABLE "historic_price" ALTER COLUMN "price" TYPE double precision`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1739967812685-SwapBeforeBridge.ts b/packages/indexer-database/src/migrations/1739967812685-SwapBeforeBridge.ts new file mode 100644 index 00000000..fe69131d --- /dev/null +++ b/packages/indexer-database/src/migrations/1739967812685-SwapBeforeBridge.ts @@ -0,0 +1,43 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class SwapBeforeBridge1739967812685 implements MigrationInterface { + name = "SwapBeforeBridge1739967812685"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "evm"."swap_before_bridge" ( + "id" SERIAL NOT NULL, + "swapToken" character varying NOT NULL, + "acrossInputToken" character varying NOT NULL, + "acrossOutputToken" character varying NOT NULL, + "swapTokenAmount" numeric NOT NULL, + "acrossInputAmount" numeric NOT NULL, + "acrossOutputAmount" numeric NOT NULL, + "exchange" character varying NOT NULL, + "blockHash" character varying NOT NULL, + "blockNumber" integer NOT NULL, + "transactionHash" character varying NOT NULL, + "logIndex" integer NOT NULL, + "chainId" integer NOT NULL, + "finalised" boolean NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + "deletedAt" TIMESTAMP, + CONSTRAINT "UK_swapBeforeBridge_blockNumber_chainId_logIndex" UNIQUE ("blockNumber", "chainId", "logIndex"), + CONSTRAINT "PK_4d800cfe04c9c412fb76e62e21f" PRIMARY KEY ("id")) + `); + await queryRunner.query( + `CREATE INDEX "IX_swapBeforeBridge_deletedAt" ON "evm"."swap_before_bridge" ("deletedAt") `, + ); + await queryRunner.query( + `CREATE INDEX "IX_swapBeforeBridge_finalised" ON "evm"."swap_before_bridge" ("finalised") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "evm"."IX_swapBeforeBridge_finalised"`); + await queryRunner.query(`DROP INDEX "evm"."IX_swapBeforeBridge_deletedAt"`); + await queryRunner.query( + `DROP INDEX "evm"."IX_swapBeforeBridge_blockNumber"`, + ); + await queryRunner.query(`DROP TABLE "evm"."swap_before_bridge"`); + } +} diff --git a/packages/indexer-database/src/migrations/1739967812686-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1739967812686-RelayHashInfo.ts new file mode 100644 index 00000000..b4f2856b --- /dev/null +++ b/packages/indexer-database/src/migrations/1739967812686-RelayHashInfo.ts @@ -0,0 +1,31 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1739967812686 implements MigrationInterface { + name = "RelayHashInfo1739967812686"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "swapBeforeBridgeEventId" integer`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD CONSTRAINT "UQ_0e578ee118b0d02c181f4a39c71" UNIQUE ("swapBeforeBridgeEventId")`, + ); + await queryRunner.query(` + ALTER TABLE "relay_hash_info" + ADD CONSTRAINT "FK_relayHashInfo_swapBeforeBridgeEventId" + FOREIGN KEY ("swapBeforeBridgeEventId") REFERENCES "evm"."swap_before_bridge"("id") ON DELETE NO ACTION ON UPDATE NO ACTION + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "FK_relayHashInfo_swapBeforeBridgeEventId"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP CONSTRAINT "UQ_0e578ee118b0d02c181f4a39c71"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "swapBeforeBridgeEventId"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1740568455373-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1740568455373-RelayHashInfo.ts new file mode 100644 index 00000000..78dcb712 --- /dev/null +++ b/packages/indexer-database/src/migrations/1740568455373-RelayHashInfo.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1740568455373 implements MigrationInterface { + name = "RelayHashInfo1740568455373"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "swapTokenPriceUsd" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "swapFeeUsd" numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "swapFeeUsd"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "swapTokenPriceUsd"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1742390524038-RelayHashInfo.ts b/packages/indexer-database/src/migrations/1742390524038-RelayHashInfo.ts new file mode 100644 index 00000000..5a31133b --- /dev/null +++ b/packages/indexer-database/src/migrations/1742390524038-RelayHashInfo.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RelayHashInfo1742390524038 implements MigrationInterface { + name = "RelayHashInfo1742390524038"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "fillGasTokenPriceUsd" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "fillGasFee" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" ADD "fillGasFeeUsd" numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "fillGasTokenPriceUsd"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "fillGasFee"`, + ); + await queryRunner.query( + `ALTER TABLE "relay_hash_info" DROP COLUMN "fillGasFeeUsd"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1742571428156-V3DepositIndexes.ts b/packages/indexer-database/src/migrations/1742571428156-V3DepositIndexes.ts new file mode 100644 index 00000000..ec466d1a --- /dev/null +++ b/packages/indexer-database/src/migrations/1742571428156-V3DepositIndexes.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Migrations1742571428156 implements MigrationInterface { + name = "Migrations1742571428156"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE INDEX "IX_v3FundsDeposited_blockTimestamp" ON "evm"."v3_funds_deposited" ("blockTimestamp") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "evm"."IX_v3FundsDeposited_blockTimestamp"`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1742921797170-Deposits.ts b/packages/indexer-database/src/migrations/1742921797170-Deposits.ts new file mode 100644 index 00000000..9e87323c --- /dev/null +++ b/packages/indexer-database/src/migrations/1742921797170-Deposits.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Deposits1742921797170 implements MigrationInterface { + name = "Deposits1742921797170"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP CONSTRAINT "UK_v3FundsDeposited_relayHash_block_logIdx"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD CONSTRAINT "UK_FundsDeposited_relayHash_block_txnHash_logIdx" UNIQUE ("relayHash", "blockNumber", "transactionHash", "logIndex")`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" DROP CONSTRAINT "UK_FundsDeposited_relayHash_block_txnHash_logIdx"`, + ); + await queryRunner.query( + `ALTER TABLE "evm"."v3_funds_deposited" ADD CONSTRAINT "UK_v3FundsDeposited_relayHash_block_logIdx" UNIQUE ("relayHash", "logIndex", "blockNumber")`, + ); + } +} diff --git a/packages/indexer-database/src/migrations/1744307085174-V3FundsDeposited.ts b/packages/indexer-database/src/migrations/1744307085174-V3FundsDeposited.ts new file mode 100644 index 00000000..46a1b383 --- /dev/null +++ b/packages/indexer-database/src/migrations/1744307085174-V3FundsDeposited.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V3FundsDeposited1744307085174 implements MigrationInterface { + name = "V3FundsDeposited1744307085174"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE INDEX "IX_v3FundsDeposited_depositor" ON "evm"."v3_funds_deposited" ("depositor") `, + ); + await queryRunner.query( + `CREATE INDEX "IX_rhi_status" ON "relay_hash_info" ("status") `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "public"."IX_rhi_status"`); + await queryRunner.query(`DROP INDEX "evm"."IX_v3FundsDeposited_depositor"`); + } +} diff --git a/packages/indexer-database/src/utils/BlockchainEventRepository.ts b/packages/indexer-database/src/utils/BlockchainEventRepository.ts index b295f3b7..288d0f39 100644 --- a/packages/indexer-database/src/utils/BlockchainEventRepository.ts +++ b/packages/indexer-database/src/utils/BlockchainEventRepository.ts @@ -66,10 +66,8 @@ export class BlockchainEventRepository { }, {} as Record, ); - const dbEntity = await this.postgres - .getRepository(entity) - .findOne({ where }); const repository = this.postgres.getRepository(entity); + const dbEntity = await repository.findOne({ where }); if (!dbEntity) { await repository.insert(data); @@ -111,4 +109,48 @@ export class BlockchainEventRepository { result: SaveQueryResultType.Nothing, }; } + + /** + * @warning Migrating this implementation from soft delete to hard delete might have deeper implications. The raw events + * should be deleted after their references are removed from the `relay_hash_info` table, otherwise DELETE queries will fail + * because of foreign key constraints. + */ + protected async deleteUnfinalisedEvents( + chainId: number, + chainIdColumnIdentifier: string, + lastFinalisedBlock: number, + entity: EntityTarget, + ): Promise { + const entityMetadata = this.postgres.getMetadata(entity); + const columns = entityMetadata.columns.map((column) => column.propertyName); + const hasChainIdTargetColumn = columns.includes(chainIdColumnIdentifier); + const hasDeletedAtColumn = columns.includes("deletedAt"); + + if ( + entityMetadata.schema !== "evm" || + !hasChainIdTargetColumn || + !hasDeletedAtColumn + ) { + this.logger.error({ + at: "BlockchainEventRepository#deleteUnfinalisedEvents", + message: `Cannot delete events of ${entityMetadata.name} entity`, + schema: entityMetadata.schema, + hasChainIdTargetColumn, + hasDeletedAtColumn, + }); + throw new Error(`Cannot delete events of ${entityMetadata.name} entity`); + } + + const repository = this.postgres.getRepository(entity); + const deletedRows = await repository + .createQueryBuilder() + .softDelete() + .where(`${chainIdColumnIdentifier} = :chainId`, { chainId }) + .andWhere("blockNumber < :lastFinalisedBlock", { lastFinalisedBlock }) + .andWhere("finalised IS FALSE") + .andWhere("deletedAt IS NULL") + .returning("*") + .execute(); + return deletedRows.raw; + } } diff --git a/packages/indexer-database/src/utils/FixtureUtils.ts b/packages/indexer-database/src/utils/FixtureUtils.ts new file mode 100644 index 00000000..259bcecc --- /dev/null +++ b/packages/indexer-database/src/utils/FixtureUtils.ts @@ -0,0 +1,5 @@ +export const getRandomInt = (min = 0, max = 1000000) => { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +}; diff --git a/packages/indexer/.mocharc.json b/packages/indexer/.mocharc.json index f56d1f99..0b248e87 100644 --- a/packages/indexer/.mocharc.json +++ b/packages/indexer/.mocharc.json @@ -4,7 +4,7 @@ ], "spec": "**/*.test.ts", "require": [ - "ts-node/register" + "ts-node/register", "dotenv/config" ], "recursive": true } diff --git a/packages/indexer/README.md b/packages/indexer/README.md index 1e4de20f..6410153b 100644 --- a/packages/indexer/README.md +++ b/packages/indexer/README.md @@ -51,4 +51,7 @@ ENABLE_HUBPOOL_INDEXER=true ENABLE_BUNDLE_EVENTS_PROCESSOR=true ENABLE_BUNDLE_INCLUDED_EVENTS_SERVICE=true ENABLE_BUNDLE_BUILDER=true +ENABLE_PRICE_WORKER=false + +COINGECKO_API_KEY= ``` diff --git a/packages/indexer/package.json b/packages/indexer/package.json index 645d7c64..f698dfa8 100644 --- a/packages/indexer/package.json +++ b/packages/indexer/package.json @@ -13,7 +13,7 @@ "lint": "eslint --fix", "lint:check": "eslint", "check": "pnpm format:check && pnpm lint:check && pnpm build:check", - "test": "mocha", + "test": "DOTENV_CONFIG_PATH=./../../.env.test mocha", "coverage": "nyc mocha", "test:watch": "mocha --watch" }, @@ -21,19 +21,22 @@ "author": "", "license": "ISC", "dependencies": { - "@across-protocol/constants": "^3.1.25", - "@across-protocol/contracts": "^3.0.19", - "@across-protocol/sdk": "^3.3.23", + "@across-protocol/constants": "^3.1.44", + "@across-protocol/contracts": "^4.0.4", + "@across-protocol/sdk": "^4.1.30", "@repo/error-handling": "workspace:*", "@repo/webhooks": "workspace:*", + "@solana/kit": "^2.1.0", "@types/express": "^4.17.21", "@types/lodash": "^4.17.7", + "@types/luxon": "^3.4.2", "bullmq": "^5.12.12", - "ethers": "^5.7.2", + "ethers": "^5.8.0", "express": "^4.19.2", "express-bearer-token": "^3.0.0", "ioredis": "^5.4.1", "lodash": "^4.17.21", + "luxon": "^3.5.0", "redis": "^4.7.0", "superstruct": "^2.0.3-1", "winston": "^3.13.1" @@ -49,6 +52,7 @@ "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", "chai": "^4.5.0", + "dotenv": "^16.4.5", "eslint": "^8.57.0", "mocha": "^10.7.0", "nyc": "^17.0.0", diff --git a/packages/indexer/src/data-indexing/service/AcrossIndexerManager.ts b/packages/indexer/src/data-indexing/service/AcrossIndexerManager.ts index b45a488b..60386292 100644 --- a/packages/indexer/src/data-indexing/service/AcrossIndexerManager.ts +++ b/packages/indexer/src/data-indexing/service/AcrossIndexerManager.ts @@ -1,33 +1,41 @@ import { Logger } from "winston"; - +import * as across from "@across-protocol/sdk"; import { DataSource } from "@repo/indexer-database"; import { eventProcessorManager } from "@repo/webhooks"; import { Config } from "../../parseEnv"; -import { HubPoolRepository } from "../../database/HubPoolRepository"; -import { RedisCache } from "../../redis/redisCache"; -import { RetryProvidersFactory } from "../../web3/RetryProvidersFactory"; -import { SpokePoolRepository } from "../../database/SpokePoolRepository"; -import { IndexerQueuesService } from "../../messaging/service"; -import { SpokePoolProcessor } from "../../services/spokePoolProcessor"; - +import { + getFinalisedBlockBufferDistance, + getLoopWaitTimeSeconds, +} from "./constants"; +// Indexers +import { Indexer, SvmIndexer, EvmIndexer } from "./Indexer"; import { HubPoolIndexerDataHandler } from "./HubPoolIndexerDataHandler"; import { SpokePoolIndexerDataHandler } from "./SpokePoolIndexerDataHandler"; +import { SvmSpokePoolIndexerDataHandler } from "./SvmSpokePoolIndexerDataHandler"; +// Factories import { ConfigStoreClientFactory, HubPoolClientFactory, SpokePoolClientFactory, } from "../../utils"; -import { Indexer } from "./Indexer"; import { - getFinalisedBlockBufferDistance, - getLoopWaitTimeSeconds, -} from "./constants"; + RetryProvidersFactory, + SvmProvider, +} from "../../web3/RetryProvidersFactory"; +// Processors +import { BundleEventsProcessor, SpokePoolProcessor } from "../../services"; +import { IndexerQueuesService } from "../../messaging/service"; +// Repositories +import { BundleRepository } from "../../database/BundleRepository"; +import { HubPoolRepository } from "../../database/HubPoolRepository"; +import { SpokePoolRepository } from "../../database/SpokePoolRepository"; +import { SwapBeforeBridgeRepository } from "../../database/SwapBeforeBridgeRepository"; export class AcrossIndexerManager { private hubPoolIndexer?: Indexer; - private spokePoolIndexers: Indexer[] = []; - + private evmSpokePoolIndexers: Indexer[] = []; + private svmSpokePoolIndexers: Indexer[] = []; constructor( private logger: Logger, private config: Config, @@ -38,7 +46,8 @@ export class AcrossIndexerManager { private retryProvidersFactory: RetryProvidersFactory, private hubPoolRepository: HubPoolRepository, private spokePoolRepository: SpokePoolRepository, - private redisCache: RedisCache, + private swapBeforeBridgeRepository: SwapBeforeBridgeRepository, + private bundleRepository: BundleRepository, private indexerQueuesService: IndexerQueuesService, private webhookWriteFn?: eventProcessorManager.WebhookWriteFn, ) {} @@ -46,13 +55,15 @@ export class AcrossIndexerManager { public async start() { return Promise.all([ this.startHubPoolIndexer(), - this.startSpokePoolIndexers(), + this.startEvmSpokePoolIndexers(), + this.startSvmSpokePoolIndexers(), ]); } public async stopGracefully() { this.hubPoolIndexer?.stopGracefully(); - this.spokePoolIndexers.map((indexer) => indexer.stopGracefully()); + this.evmSpokePoolIndexers.map((indexer) => indexer.stopGracefully()); + this.svmSpokePoolIndexers.map((indexer) => indexer.stopGracefully()); } private startHubPoolIndexer() { @@ -69,8 +80,9 @@ export class AcrossIndexerManager { this.configStoreClientFactory, this.hubPoolClientFactory, this.hubPoolRepository, + new BundleEventsProcessor(this.logger, this.bundleRepository), ); - this.hubPoolIndexer = new Indexer( + this.hubPoolIndexer = new EvmIndexer( { loopWaitTimeSeconds: getLoopWaitTimeSeconds(this.config.hubChainId), finalisedBlockBufferDistance: getFinalisedBlockBufferDistance( @@ -78,59 +90,111 @@ export class AcrossIndexerManager { ), }, hubPoolIndexerDataHandler, - this.retryProvidersFactory.getProviderForChainId(this.config.hubChainId), - this.redisCache, this.logger, + this.postgres, + this.retryProvidersFactory.getProviderForChainId( + this.config.hubChainId, + ) as across.providers.RetryProvider, ); return this.hubPoolIndexer.start(); } - private async startSpokePoolIndexers() { - const spokePoolIndexers = this.config.spokePoolChainsEnabled.map( + private async startEvmSpokePoolIndexers() { + const evmSpokePoolIndexers = this.config.evmSpokePoolChainsEnabled.map( (chainId) => { const spokePoolIndexerDataHandler = new SpokePoolIndexerDataHandler( this.logger, chainId, this.config.hubChainId, - this.retryProvidersFactory.getProviderForChainId(chainId), + this.retryProvidersFactory.getProviderForChainId( + chainId, + ) as across.providers.RetryProvider, this.configStoreClientFactory, this.hubPoolClientFactory, this.spokePoolClientFactory, this.spokePoolRepository, + this.swapBeforeBridgeRepository, new SpokePoolProcessor( this.postgres, - this.logger, chainId, + this.logger, this.webhookWriteFn, ), this.indexerQueuesService, ); - const spokePoolIndexer = new Indexer( + const spokePoolIndexer = new EvmIndexer( { loopWaitTimeSeconds: getLoopWaitTimeSeconds(chainId), finalisedBlockBufferDistance: getFinalisedBlockBufferDistance(chainId), + maxBlockRangeSize: this.config.maxBlockRangeSize, }, spokePoolIndexerDataHandler, - this.retryProvidersFactory.getProviderForChainId(chainId), - this.redisCache, this.logger, + this.postgres, + this.retryProvidersFactory.getProviderForChainId( + chainId, + ) as across.providers.RetryProvider, ); return spokePoolIndexer; }, ); - this.spokePoolIndexers = spokePoolIndexers; + this.evmSpokePoolIndexers = evmSpokePoolIndexers; - if (this.spokePoolIndexers.length === 0) { + if (this.evmSpokePoolIndexers.length === 0) { this.logger.warn({ - at: "Indexer#AcrossIndexerManager#startSpokePoolIndexers", - message: "No spoke pool indexers to start", + at: "Indexer#AcrossIndexerManager#startEvmSpokePoolIndexers", + message: "No EVM spoke pool indexers to start", }); return; } return Promise.all( - this.spokePoolIndexers.map((indexer) => indexer.start()), + this.evmSpokePoolIndexers.map((indexer) => indexer.start()), + ); + } + + private startSvmSpokePoolIndexers() { + const svmSpokePoolIndexers = this.config.svmSpokePoolChainsEnabled.map( + (chainId) => { + const svmSpokePoolIndexerDataHandler = + new SvmSpokePoolIndexerDataHandler( + this.logger, + chainId, + this.config.hubChainId, + this.retryProvidersFactory.getProviderForChainId( + chainId, + ) as SvmProvider, + ); + const svmIndexer = new SvmIndexer( + { + loopWaitTimeSeconds: getLoopWaitTimeSeconds(chainId), + finalisedBlockBufferDistance: + getFinalisedBlockBufferDistance(chainId), + maxBlockRangeSize: this.config.maxBlockRangeSize, + }, + svmSpokePoolIndexerDataHandler, + this.logger, + this.postgres, + this.retryProvidersFactory.getProviderForChainId( + chainId, + ) as SvmProvider, + ); + return svmIndexer; + }, + ); + this.svmSpokePoolIndexers = svmSpokePoolIndexers; + + if (this.svmSpokePoolIndexers.length === 0) { + this.logger.warn({ + at: "Indexer#AcrossIndexerManager#startSvmSpokePoolIndexers", + message: "No SVM spoke pool indexers to start", + }); + return; + } + + return Promise.all( + this.svmSpokePoolIndexers.map((indexer) => indexer.start()), ); } } diff --git a/packages/indexer/src/data-indexing/service/HubPoolIndexerDataHandler.ts b/packages/indexer/src/data-indexing/service/HubPoolIndexerDataHandler.ts index 6d9d86af..1e2f6205 100644 --- a/packages/indexer/src/data-indexing/service/HubPoolIndexerDataHandler.ts +++ b/packages/indexer/src/data-indexing/service/HubPoolIndexerDataHandler.ts @@ -9,6 +9,7 @@ import { import { IndexerDataHandler } from "./IndexerDataHandler"; import { BlockRange } from "../model"; import { HubPoolRepository } from "../../database/HubPoolRepository"; +import { BundleEventsProcessor } from "../../services"; type FetchEventsResult = { proposedRootBundleEvents: (across.interfaces.ProposedRootBundle & { @@ -33,6 +34,7 @@ export class HubPoolIndexerDataHandler implements IndexerDataHandler { private configStoreFactory: utils.ConfigStoreClientFactory, private hubPoolFactory: utils.HubPoolClientFactory, private hubPoolRepository: HubPoolRepository, + private bundleProcessor: BundleEventsProcessor, ) { this.isInitialized = false; } @@ -88,6 +90,7 @@ export class HubPoolIndexerDataHandler implements IndexerDataHandler { identifier: this.getDataIdentifier(), }); await this.storeEvents(events, lastFinalisedBlock); + await this.bundleProcessor.process(); this.logger.debug({ at: "Indexer#HubPoolIndexerDataHandler#processBlockRange", message: `Finished processing block range ${this.getDataIdentifier()}`, diff --git a/packages/indexer/src/data-indexing/service/Indexer.ts b/packages/indexer/src/data-indexing/service/Indexer.ts index be2fd80b..1283d9a0 100644 --- a/packages/indexer/src/data-indexing/service/Indexer.ts +++ b/packages/indexer/src/data-indexing/service/Indexer.ts @@ -2,15 +2,24 @@ import * as across from "@across-protocol/sdk"; import { ethers } from "ethers"; import { Logger } from "winston"; +import { entities, DataSource } from "@repo/indexer-database"; + import { IndexerDataHandler } from "./IndexerDataHandler"; import { BlockRange } from "../model"; -import { RedisCache } from "../../redis/redisCache"; +import { SvmProvider } from "../../web3/RetryProvidersFactory"; + +const DEFAULT_MAX_BLOCK_RANGE_SIZE = 50_000; export type ConstructorConfig = { /** Time to wait before going to the next block ranges. */ loopWaitTimeSeconds: number; /** Distance from the latest block to consider onchain data finalised. */ finalisedBlockBufferDistance: number; + /** + * Maximum block range size to process in a single call. This is mainly for debugging purposes. + * If not set, the max block range size is set to {@link DEFAULT_MAX_BLOCK_RANGE_SIZE}. + */ + maxBlockRangeSize?: number; }; type BlockRangeResult = { @@ -31,9 +40,8 @@ export class Indexer { constructor( private config: ConstructorConfig, private dataHandler: IndexerDataHandler, - private rpcProvider: ethers.providers.JsonRpcProvider, - private redisCache: RedisCache, private logger: Logger, + private dataSource: DataSource, ) { this.stopRequested = false; } @@ -61,11 +69,13 @@ export class Indexer { await this.dataHandler.processBlockRange( blockRangeResult.blockRange, blockRangeResult.lastFinalisedBlock, + blockRangeResult.isBackfilling, ); - await this.redisCache.set( - this.getLastFinalisedBlockCacheKey(), - blockRangeResult.lastFinalisedBlock, - ); + // When the block range is processed successfully and the indexer is ready to start + // processing the next block range, save the progress in the database. The most important + // information to save is the last finalised block, as this is the block that will be used + // as the starting point for the next block range. + await this.saveProgressInDatabase(blockRangeResult); } blockRangeProcessedSuccessfully = true; } catch (error) { @@ -76,8 +86,11 @@ export class Indexer { blockRangeResult, dataIdentifier: this.dataHandler.getDataIdentifier(), error, + errorJson: JSON.stringify(error), }); blockRangeProcessedSuccessfully = false; + // Introduce an additional delay if errors are encountered + await across.utils.delay(30); } finally { if (!blockRangeResult?.isBackfilling) { await across.utils.delay(this.config.loopWaitTimeSeconds); @@ -104,6 +117,18 @@ export class Indexer { this.stopRequested = true; } + private async saveProgressInDatabase(blockRangeResult: BlockRangeResult) { + return this.dataSource.getRepository(entities.IndexerProgressInfo).upsert( + { + id: this.dataHandler.getDataIdentifier(), + lastFinalisedBlock: blockRangeResult.lastFinalisedBlock, + latestBlockNumber: blockRangeResult.latestBlockNumber, + isBackfilling: blockRangeResult.isBackfilling, + }, + { conflictPaths: ["id"], skipUpdateIfNoValuesChanged: true }, + ); + } + /** * Gets the next block range to process. * `from` block is the last finalised block stored in redis + 1 or the start block number for the data handler. @@ -112,14 +137,18 @@ export class Indexer { * i.e no new blocks have been mined, then the block range is `undefined`. */ private async getBlockRange(): Promise { - const lastBlockFinalisedStored = await this.redisCache.get( - this.getLastFinalisedBlockCacheKey(), - ); - const latestBlockNumber = await this.rpcProvider.getBlockNumber(); + const databaseProgress = await this.dataSource + .getRepository(entities.IndexerProgressInfo) + .findOne({ + where: { + id: this.dataHandler.getDataIdentifier(), + }, + }); + const latestBlockNumber = await this.getLatestBlockNumber(); const lastFinalisedBlockOnChain = latestBlockNumber - this.config.finalisedBlockBufferDistance; - if (lastBlockFinalisedStored === lastFinalisedBlockOnChain) { + if (databaseProgress?.lastFinalisedBlock === lastFinalisedBlockOnChain) { return { latestBlockNumber, blockRange: undefined, @@ -127,16 +156,27 @@ export class Indexer { isBackfilling: false, }; } - const fromBlock = lastBlockFinalisedStored - ? lastBlockFinalisedStored + 1 + + const fromBlock = databaseProgress?.lastFinalisedBlock + ? databaseProgress.lastFinalisedBlock + 1 : this.dataHandler.getStartIndexingBlockNumber(); - const toBlock = Math.min(fromBlock + 50_000, latestBlockNumber); + const toBlock = Math.min( + fromBlock + + (this.config.maxBlockRangeSize ?? DEFAULT_MAX_BLOCK_RANGE_SIZE), + latestBlockNumber, + ); const blockRange: BlockRange = { from: fromBlock, to: toBlock }; const lastFinalisedBlockInBlockRange = Math.min( blockRange.to, lastFinalisedBlockOnChain, ); - const isBackfilling = latestBlockNumber - blockRange.to > 100_000; + + // If we specifically set the max block range then do not consider this + // run to be a backfilling run + const isBackfilling = + !this.config.maxBlockRangeSize && + latestBlockNumber - blockRange.to > 100_000; + return { latestBlockNumber, blockRange, @@ -145,7 +185,41 @@ export class Indexer { }; } - private getLastFinalisedBlockCacheKey() { - return `indexer:lastBlockFinalised:${this.dataHandler.getDataIdentifier()}`; + protected async getLatestBlockNumber(): Promise { + throw new Error("getLatestBlockNumber not implemented"); + } +} + +export class EvmIndexer extends Indexer { + constructor( + config: ConstructorConfig, + dataHandler: IndexerDataHandler, + logger: Logger, + dataSource: DataSource, + private rpcProvider: ethers.providers.JsonRpcProvider, + ) { + super(config, dataHandler, logger, dataSource); + } + + protected async getLatestBlockNumber(): Promise { + const latestBlockNumber = await this.rpcProvider.getBlockNumber(); + return latestBlockNumber; + } +} + +export class SvmIndexer extends Indexer { + constructor( + config: ConstructorConfig, + dataHandler: IndexerDataHandler, + logger: Logger, + dataSource: DataSource, + private rpcProvider: SvmProvider, + ) { + super(config, dataHandler, logger, dataSource); + } + + protected async getLatestBlockNumber(): Promise { + const latestBlockNumber = await this.rpcProvider.getSlot().send(); + return Number(latestBlockNumber); } } diff --git a/packages/indexer/src/data-indexing/service/IndexerDataHandler.ts b/packages/indexer/src/data-indexing/service/IndexerDataHandler.ts index fa7e50eb..b2a856bd 100644 --- a/packages/indexer/src/data-indexing/service/IndexerDataHandler.ts +++ b/packages/indexer/src/data-indexing/service/IndexerDataHandler.ts @@ -21,5 +21,6 @@ export interface IndexerDataHandler { processBlockRange: ( blockRange: BlockRange, lastFinalisedBlock: number, + isBackfilling?: boolean, ) => Promise; } diff --git a/packages/indexer/src/data-indexing/service/SpokePoolIndexerDataHandler.ts b/packages/indexer/src/data-indexing/service/SpokePoolIndexerDataHandler.ts index d5681936..babd5f73 100644 --- a/packages/indexer/src/data-indexing/service/SpokePoolIndexerDataHandler.ts +++ b/packages/indexer/src/data-indexing/service/SpokePoolIndexerDataHandler.ts @@ -4,22 +4,25 @@ import { getDeployedAddress, getDeployedBlockNumber, } from "@across-protocol/contracts"; +import { providers } from "ethers"; import { entities, utils as indexerDatabaseUtils, SaveQueryResult, + SaveQueryResultType, } from "@repo/indexer-database"; -import { SaveQueryResultType } from "@repo/indexer-database"; - import { BlockRange } from "../model"; import { IndexerDataHandler } from "./IndexerDataHandler"; import * as utils from "../../utils"; -import { getIntegratorId } from "../../utils/spokePoolUtils"; import { SpokePoolRepository } from "../../database/SpokePoolRepository"; +import { SwapBeforeBridgeRepository } from "../../database/SwapBeforeBridgeRepository"; import { SpokePoolProcessor } from "../../services/spokePoolProcessor"; import { IndexerQueues, IndexerQueuesService } from "../../messaging/service"; import { IntegratorIdMessage } from "../../messaging/IntegratorIdWorker"; +import { getMaxBlockLookBack } from "../../web3/constants"; +import { PriceMessage } from "../../messaging/priceWorker"; +import { EventDecoder } from "../../web3/EventDecoder"; export type FetchEventsResult = { v3FundsDepositedEvents: utils.V3FundsDepositedWithIntegradorId[]; @@ -27,7 +30,7 @@ export type FetchEventsResult = { requestedV3SlowFillEvents: across.interfaces.SlowFillRequestWithBlock[]; requestedSpeedUpV3Events: { [depositorAddress: string]: { - [depositId: number]: across.interfaces.SpeedUpWithBlock[]; + [depositId: string]: across.interfaces.SpeedUpWithBlock[]; }; }; relayedRootBundleEvents: across.interfaces.RootBundleRelayWithBlock[]; @@ -43,6 +46,11 @@ export type StoreEventsResult = { executedRefundRoots: SaveQueryResult[]; }; +export type DepositSwapPair = { + deposit: entities.V3FundsDeposited; + swapBeforeBridge: entities.SwapBeforeBridge; +}; + export class SpokePoolIndexerDataHandler implements IndexerDataHandler { private isInitialized: boolean; private configStoreClient: across.clients.AcrossConfigStoreClient; @@ -57,12 +65,25 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { private hubPoolFactory: utils.HubPoolClientFactory, private spokePoolFactory: utils.SpokePoolClientFactory, private spokePoolClientRepository: SpokePoolRepository, + private swapBeforeBridgeRepository: SwapBeforeBridgeRepository, private spokePoolProcessor: SpokePoolProcessor, private indexerQueuesService: IndexerQueuesService, ) { this.isInitialized = false; } + private initialize() { + this.configStoreClient = this.configStoreFactory.get(this.hubPoolChainId); + this.hubPoolClient = this.hubPoolFactory.get( + this.hubPoolChainId, + undefined, + undefined, + { + configStoreClient: this.configStoreClient, + }, + ); + } + public getDataIdentifier() { return `${getDeployedAddress("SpokePool", this.chainId)}:${this.chainId}`; } @@ -73,12 +94,14 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { public async processBlockRange( blockRange: BlockRange, lastFinalisedBlock: number, + isBackfilling: boolean = false, ) { this.logger.debug({ at: "Indexer#SpokePoolIndexerDataHandler#processBlockRange", message: `Processing block range ${this.getDataIdentifier()}`, blockRange, lastFinalisedBlock, + isBackfilling, }); if (!this.isInitialized) { @@ -86,12 +109,19 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { this.isInitialized = true; } - const events = await this.fetchEventsByRange(blockRange); + //FIXME: Remove performance timing + const startPerfTime = performance.now(); + + const events = await this.fetchEventsByRange(blockRange, isBackfilling); const requestedSpeedUpV3EventsCount = Object.values( events.requestedSpeedUpV3Events, ).reduce((acc, speedUps) => { return acc + Object.values(speedUps).length; }, 0); + + //FIXME: Remove performance timing + const timeToFetchEvents = performance.now(); + this.logger.debug({ at: "Indexer#SpokePoolIndexerDataHandler#processBlockRange", message: `Found events for ${this.getDataIdentifier()}`, @@ -112,9 +142,203 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { storedEvents.deposits, SaveQueryResultType.Inserted, ); + const newInsertedFills = indexerDatabaseUtils.filterSaveQueryResults( + storedEvents.fills, + SaveQueryResultType.Inserted, + ); + + // Fetch transaction receipts associated only to new inserted events: + // (1) deposits for getting the swap before bridge events, (2) fills for getting the gas fee + const transactionReceipts = await this.getTransactionReceiptsForEvents([ + ...newInsertedDeposits, + ...newInsertedFills, + ]); + + const depositSwapPairs = await this.matchDepositEventsWithSwapEvents( + newInsertedDeposits, + transactionReceipts, + lastFinalisedBlock, + ); + + //FIXME: Remove performance timing + const timeToStoreEvents = performance.now(); + + // Delete unfinalised events + const [deletedDeposits, _] = await Promise.all([ + this.spokePoolClientRepository.deleteUnfinalisedDepositEvents( + this.chainId, + lastFinalisedBlock, + ), + this.swapBeforeBridgeRepository.deleteUnfinalisedSwapEvents( + this.chainId, + lastFinalisedBlock, + ), + ]); + const timeToDeleteDeposits = performance.now(); await this.updateNewDepositsWithIntegratorId(newInsertedDeposits); - await this.spokePoolProcessor.process(storedEvents); + + //FIXME: Remove performance timing + const timeToUpdateDepositIds = performance.now(); + + await this.spokePoolProcessor.process( + storedEvents, + deletedDeposits, + depositSwapPairs, + transactionReceipts, + ); + + //FIXME: Remove performance timing + const timeToProcessDeposits = performance.now(); + this.profileStoreEvents(storedEvents); + + // publish new relays to workers to fill in prices + await this.publishNewRelays(storedEvents); + await this.publishSwaps(depositSwapPairs); + + //FIXME: Remove performance timing + const finalPerfTime = performance.now(); + + this.logger.debug({ + at: "Indexer#SpokePoolIndexerDataHandler#processBlockRange", + message: + "System Time Log for SpokePoolIndexerDataHandler#processBlockRange", + spokeChainId: this.chainId, + blockRange: blockRange, + timeToFetchEvents: timeToFetchEvents - startPerfTime, + timeToStoreEvents: timeToStoreEvents - timeToFetchEvents, + timeToDeleteDeposits: timeToDeleteDeposits - timeToStoreEvents, + timeToUpdateDepositIds: timeToUpdateDepositIds - timeToDeleteDeposits, + timeToProcessDeposits: timeToProcessDeposits - timeToUpdateDepositIds, + timeToProcessAnciliaryEvents: finalPerfTime - timeToProcessDeposits, + finalTime: finalPerfTime - startPerfTime, + }); + } + + /** + * Function that matches the new deposit events with swap events + * 1. for all new deposits transactions, fetch the transaction receipt + * 2. for each tx receipt, get SwapBeforeBridge events + * 3. insert the swap events into the database + * 4. group the deposit events and swap events by the transaction hash + */ + private async matchDepositEventsWithSwapEvents( + deposits: entities.V3FundsDeposited[], + transactionReceipts: Record, + lastFinalisedBlock: number, + ) { + const transactionReceiptsList = Object.values(transactionReceipts); + const swapBeforeBridgeEvents = transactionReceiptsList + .map((transactionReceipt) => + EventDecoder.decodeSwapBeforeBridgeEvents(transactionReceipt), + ) + .flat(); + /** + * this calls `saveAndHandleFinalisation()` from the `BlockchainEventRepository`. Not sure if this is the best way to do it + * because if the event is already in the database, it will not be returned (result: 'nothing'). + */ + const saveResult = + await this.swapBeforeBridgeRepository.formatAndSaveSwapBeforeBridgeEvents( + swapBeforeBridgeEvents, + this.chainId, + lastFinalisedBlock, + ); + const insertedSwapBeforeBridgeEvents = + indexerDatabaseUtils.filterSaveQueryResults( + saveResult, + SaveQueryResultType.Inserted, + ); + const depositsAndSwapsByTxHash = insertedSwapBeforeBridgeEvents.reduce( + (acc, swapBeforeBridge) => { + acc[swapBeforeBridge.transactionHash] = { + deposits: deposits.filter( + (d) => + d.transactionHash.toLowerCase() === + swapBeforeBridge.transactionHash.toLowerCase(), + ), + swapBeforeBridges: insertedSwapBeforeBridgeEvents.filter( + (s) => + s.transactionHash.toLowerCase() === + swapBeforeBridge.transactionHash.toLowerCase(), + ), + }; + return acc; + }, + {} as Record< + string, + { + deposits: entities.V3FundsDeposited[]; + swapBeforeBridges: entities.SwapBeforeBridge[]; + } + >, + ); + + // match the deposit with the swap before + const depositSwapMap = Object.values(depositsAndSwapsByTxHash) + .map((depositAndSwap) => { + const { deposits, swapBeforeBridges } = depositAndSwap; + const sortedDeposits = deposits.sort((a, b) => a.logIndex - b.logIndex); + const sortedSwapBeforeBridges = swapBeforeBridges.sort( + (a, b) => a.logIndex - b.logIndex, + ); + const matchedPairs: DepositSwapPair[] = []; + const usedSwaps = new Set(); // Track used swaps by their log index + + sortedDeposits.forEach((deposit) => { + const matchingSwap = sortedSwapBeforeBridges.find( + (swap) => + swap.logIndex < deposit.logIndex && !usedSwaps.has(swap.logIndex), + ); + if (matchingSwap) { + matchedPairs.push({ deposit, swapBeforeBridge: matchingSwap }); + usedSwaps.add(matchingSwap.logIndex); // Mark this swap as used + } + }); + + return matchedPairs; + }) + .flat(); + return depositSwapMap; + } + + /** + * Fetches the transaction receipts for the given events and returns a map of transaction hash to transaction receipt. + * The transaction hash key is lowercased. + */ + private async getTransactionReceiptsForEvents( + events: (entities.V3FundsDeposited | entities.FilledV3Relay)[], + ) { + // avoid fetching the same transaction receipt multiple times + const uniqueTxHashes = [ + ...new Set(events.map((e) => e.transactionHash.toLowerCase())), + ]; + const transactionReceipts = await across.utils.mapAsync( + uniqueTxHashes, + async (txHash) => { + const receipt = await this.provider.getTransactionReceipt(txHash); + if (!receipt) { + this.logger.warn({ + at: "SpokePoolIndexerDataHandler#matchDepositEventsWithSwapEvents", + message: `Transaction receipt not found`, + txHash, + chainId: this.chainId, + }); + } + return receipt; + }, + ); + const validTransactionReceipts = transactionReceipts.filter( + (receipt) => !!receipt, + ); + const transactionReceiptsByTxHash = validTransactionReceipts.reduce( + (acc, receipt) => { + acc[receipt.transactionHash.toLowerCase()] = receipt; + return acc; + }, + {} as Record, + ); + + return transactionReceiptsByTxHash; } /** @@ -185,7 +409,7 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { if (timestamps[index] === undefined) { throw new Error(`Block time for block ${blockNumber} not found`); } - acc[blockNumber] = timestamps[index]; + acc[blockNumber] = timestamps[index]!; return acc; }, {} as Record, @@ -195,31 +419,66 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { private async fetchEventsByRange( blockRange: BlockRange, + isBackfilling: boolean, ): Promise { const { configStoreClient, hubPoolClient } = this; + + // If we are in a backfilling state then we should grab the largest + // lookback available to us. Otherwise, for this specific indexer we + // only need exactly what we're looking for, plus some padding to be + // sure + const maxBlockLookback = isBackfilling + ? getMaxBlockLookBack(this.chainId) + : Math.min( + getMaxBlockLookBack(this.chainId), + (blockRange.to - blockRange.from) * 2, + ); + const spokePoolClient = this.spokePoolFactory.get( this.chainId, blockRange.from, blockRange.to, { hubPoolClient: this.hubPoolClient, + disableQuoteBlockLookup: true, + maxBlockLookback, }, + false, ); + const initialTime = performance.now(); + await configStoreClient.update(); await hubPoolClient.update([ "SetPoolRebalanceRoute", "CrossChainContractsSet", ]); - await spokePoolClient.update(); + + const timeToUpdateProtocolClients = performance.now(); + // We aim to avoid the unneeded update events + // Specifically, we avoid the EnabledDepositRoute event because this + // requires a lookback to the deployment block of the SpokePool contract. + await spokePoolClient.update([ + "V3FundsDeposited", + "FilledV3Relay", + "RequestedV3SlowFill", + "RequestedSpeedUpV3Deposit", + "RelayedRootBundle", + "ExecutedRelayerRefundRoot", + "TokensBridged", + "FundsDeposited", + "RequestedSpeedUpDeposit", + "RequestedSlowFill", + "FilledRelay", + ]); + const timeToUpdateSpokePoolClient = performance.now(); const v3FundsDepositedEvents = spokePoolClient.getDeposits({ fromBlock: blockRange.from, toBlock: blockRange.to, }); const filledV3RelayEvents = spokePoolClient.getFills(); - const requestedV3SlowFillEvents = - spokePoolClient.getSlowFillRequestsForOriginChain(this.chainId); + const requestedV3SlowFillEvents = spokePoolClient.getSlowFillRequests(); const requestedSpeedUpV3Events = spokePoolClient.getSpeedUps(); const relayedRootBundleEvents = spokePoolClient.getRootBundleRelays(); const executedRelayerRefundRootEvents = @@ -230,7 +489,24 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { ...v3FundsDepositedEvents.map((deposit) => deposit.blockNumber), ...filledV3RelayEvents.map((fill) => fill.blockNumber), ]; + + const startTimeToGetBlockTimes = performance.now(); const blockTimes = await this.getBlockTimes(blockNumbers); + const endTimeToGetBlockTimes = performance.now(); + + this.logger.debug({ + at: "SpokePoolIndexerDataHandler#fetchEventsByRange", + message: "Time to update protocol clients", + timeToUpdateProtocolClients: timeToUpdateProtocolClients - initialTime, + timeToUpdateSpokePoolClient: + timeToUpdateSpokePoolClient - timeToUpdateProtocolClients, + timeToGetBlockTimes: endTimeToGetBlockTimes - startTimeToGetBlockTimes, + totalTime: endTimeToGetBlockTimes - initialTime, + spokeChainId: this.chainId, + blockRange: blockRange, + isBackfilling, + dynamicMaxBlockLookback: maxBlockLookback, + }); return { v3FundsDepositedEvents, @@ -259,41 +535,44 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { tokensBridgedEvents, blockTimes, } = params; - const savedV3FundsDepositedEvents = - await spokePoolClientRepository.formatAndSaveV3FundsDepositedEvents( + const [ + savedV3FundsDepositedEvents, + savedV3RequestedSlowFills, + savedFilledV3RelayEvents, + savedExecutedRelayerRefundRootEvents, + ] = await Promise.all([ + spokePoolClientRepository.formatAndSaveV3FundsDepositedEvents( v3FundsDepositedEvents, lastFinalisedBlock, blockTimes, - ); - const savedV3RequestedSlowFills = - await spokePoolClientRepository.formatAndSaveRequestedV3SlowFillEvents( + ), + spokePoolClientRepository.formatAndSaveRequestedV3SlowFillEvents( requestedV3SlowFillEvents, lastFinalisedBlock, - ); - const savedFilledV3RelayEvents = - await spokePoolClientRepository.formatAndSaveFilledV3RelayEvents( + ), + spokePoolClientRepository.formatAndSaveFilledV3RelayEvents( filledV3RelayEvents, lastFinalisedBlock, blockTimes, - ); - const savedExecutedRelayerRefundRootEvents = - await spokePoolClientRepository.formatAndSaveExecutedRelayerRefundRootEvents( + ), + spokePoolClientRepository.formatAndSaveExecutedRelayerRefundRootEvents( executedRelayerRefundRootEvents, lastFinalisedBlock, - ); - await spokePoolClientRepository.formatAndSaveRequestedSpeedUpV3Events( - requestedSpeedUpV3Events, - lastFinalisedBlock, - ); - await spokePoolClientRepository.formatAndSaveRelayedRootBundleEvents( - relayedRootBundleEvents, - this.chainId, - lastFinalisedBlock, - ); - await spokePoolClientRepository.formatAndSaveTokensBridgedEvents( - tokensBridgedEvents, - lastFinalisedBlock, - ); + ), + spokePoolClientRepository.formatAndSaveRequestedSpeedUpV3Events( + requestedSpeedUpV3Events, + lastFinalisedBlock, + ), + spokePoolClientRepository.formatAndSaveRelayedRootBundleEvents( + relayedRootBundleEvents, + this.chainId, + lastFinalisedBlock, + ), + spokePoolClientRepository.formatAndSaveTokensBridgedEvents( + tokensBridgedEvents, + lastFinalisedBlock, + ), + ]); return { deposits: savedV3FundsDepositedEvents, fills: savedFilledV3RelayEvents, @@ -302,23 +581,11 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { }; } - private initialize() { - this.configStoreClient = this.configStoreFactory.get(this.hubPoolChainId); - this.hubPoolClient = this.hubPoolFactory.get( - this.hubPoolChainId, - undefined, - undefined, - { - configStoreClient: this.configStoreClient, - }, - ); - } - private async updateNewDepositsWithIntegratorId( deposits: entities.V3FundsDeposited[], ) { await across.utils.forEachAsync(deposits, async (deposit) => { - const integratorId = await getIntegratorId( + const integratorId = await utils.getIntegratorId( this.provider, deposit.quoteTimestamp, deposit.transactionHash, @@ -332,6 +599,32 @@ export class SpokePoolIndexerDataHandler implements IndexerDataHandler { }); } + private async publishNewRelays(storedEvents: StoreEventsResult) { + // fetch prices only for new fills + const fills = indexerDatabaseUtils.filterSaveQueryResults( + storedEvents.fills, + SaveQueryResultType.Inserted, + ); + const messages: PriceMessage[] = fills.map((fill) => ({ + fillEventId: fill.id, + })); + + await this.indexerQueuesService.publishMessagesBulk( + IndexerQueues.PriceQuery, + IndexerQueues.PriceQuery, // Use queue name as job name + messages, + ); + } + private async publishSwaps(swapDepositPairs: DepositSwapPair[]) { + const messages = swapDepositPairs.map((pair) => ({ + swapEventId: pair.swapBeforeBridge.id, + })); + await this.indexerQueuesService.publishMessagesBulk( + IndexerQueues.SwapMessage, + IndexerQueues.SwapMessage, // Use queue name as job name + messages, + ); + } private async publishIntegratorIdMessages( deposits: entities.V3FundsDeposited[], ) { diff --git a/packages/indexer/src/data-indexing/service/SvmSpokePoolIndexerDataHandler.ts b/packages/indexer/src/data-indexing/service/SvmSpokePoolIndexerDataHandler.ts new file mode 100644 index 00000000..7aa590f8 --- /dev/null +++ b/packages/indexer/src/data-indexing/service/SvmSpokePoolIndexerDataHandler.ts @@ -0,0 +1,175 @@ +import { Logger } from "winston"; +import * as across from "@across-protocol/sdk"; +import { + getDeployedAddress, + getDeployedBlockNumber, + SvmSpokeClient, +} from "@across-protocol/contracts"; +import { Signature, Address, UnixTimestamp } from "@solana/kit"; + +import * as utils from "../../utils"; +import { BlockRange } from "../model"; +import { IndexerDataHandler } from "./IndexerDataHandler"; +import { getMaxBlockLookBack } from "../../web3/constants"; +import { SvmProvider } from "../../web3/RetryProvidersFactory"; + +export type FetchEventsResult = { + depositEvents: any; // TODO: fix type. Needs SDK changes + fillEvents: any; // TODO: fix type. Needs SDK changes +}; + +// TODO: Export this type from the SDK and use it from there. +export type EventData = + | SvmSpokeClient.FilledRelay + | SvmSpokeClient.FundsDeposited; + +// TODO: Export this type from the SDK and use it from there. +export enum SVMEventNames { + FilledRelay = "FilledRelay", + FundsDeposited = "FundsDeposited", +} + +// TODO: Export this type from the SDK and use it from there. +export type EventName = keyof typeof SVMEventNames; + +// TODO: Export this type from the SDK and use it from there. +export type EventWithData = { + confirmationStatus: string | null; + blockTime: UnixTimestamp | null; + signature: Signature; + slot: bigint; + name: EventName; + data: T; + program: Address; +}; + +// Teach BigInt how to be represented as JSON. +(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; + +export class SvmSpokePoolIndexerDataHandler implements IndexerDataHandler { + constructor( + private logger: Logger, + private chainId: number, + private hubPoolChainId: number, + private provider: SvmProvider, + ) {} + + public getDataIdentifier() { + return `${getDeployedAddress("SvmSpoke", this.chainId)}:${this.chainId}`; + } + + public getStartIndexingBlockNumber() { + return getDeployedBlockNumber("SvmSpoke", this.chainId); + } + + public async processBlockRange( + blockRange: BlockRange, + lastFinalisedBlock: number, + isBackfilling: boolean = false, + ) { + this.logger.debug({ + at: "Indexer#SvmSpokePoolIndexerDataHandler#processBlockRange", + message: `Processing block range ${this.getDataIdentifier()}`, + blockRange, + lastFinalisedBlock, + isBackfilling, + }); + + const events = await this.fetchEventsByRange(blockRange, isBackfilling); + + await this.updateNewDepositsWithIntegratorId(events.depositEvents); + + this.logger.debug({ + at: "Indexer#SpokePoolIndexerDataHandler#processBlockRange", + message: `Found events for ${this.getDataIdentifier()}`, + events: { + depositEvents: events.depositEvents.length, + fillEvents: events.fillEvents.length, + }, + blockRange, + }); + + // TODO: + // - store events + // - get block times + // - delete unfinalised events + // - process events + // - publish price messages + } + + private async fetchEventsByRange( + blockRange: BlockRange, + isBackfilling: boolean, + ): Promise { + // NOTE: maxBlockLookback is not a supported config in the svm client. Add when supported. + // If we are in a backfilling state then we should grab the largest + // lookback available to us. Otherwise, for this specific indexer we + // only need exactly what we're looking for, plus some padding to be sure + const maxBlockLookback = isBackfilling + ? getMaxBlockLookBack(this.chainId) + : Math.min( + getMaxBlockLookBack(this.chainId), + (blockRange.to - blockRange.from) * 2, + ); + + const spokePoolClient = await across.svm.SvmSpokeEventsClient.create( + this.provider, + ); + // NOTE: svm spoke client uses bigint + const fromSlot = BigInt(blockRange.from); + const toSlot = BigInt(blockRange.to); + + const depositEvents = + await spokePoolClient.queryEvents( + "FundsDeposited", + fromSlot, + toSlot, + ); + const fillEvents = + await spokePoolClient.queryEvents( + "FilledRelay", + fromSlot, + toSlot, + ); + + // NOTE: we can log events for now as it should be a short list + if (depositEvents.length > 0) { + this.logger.debug({ + at: "Indexer#SvmSpokePoolIndexerDataHandler#processBlockRange", + message: `Found deposit events for ${this.getDataIdentifier()}`, + depositEvents, + blockRange, + }); + } + + if (fillEvents.length > 0) { + this.logger.debug({ + at: "Indexer#SvmSpokePoolIndexerDataHandler#processBlockRange", + message: `Found fill events for ${this.getDataIdentifier()}`, + fillEvents, + blockRange, + }); + } + + return { + depositEvents, + fillEvents, + }; + } + + private async updateNewDepositsWithIntegratorId( + deposits: EventWithData[], + ) { + await across.utils.forEachAsync(deposits, async (deposit) => { + const integratorId = await utils.getSvmIntegratorId( + this.provider, + deposit.signature, + ); + if (integratorId) { + // TODO: update deposit with integrator id when we are storing them in the database + } + }); + } +} diff --git a/packages/indexer/src/data-indexing/service/constants.ts b/packages/indexer/src/data-indexing/service/constants.ts index 37f77edc..7f9dea90 100644 --- a/packages/indexer/src/data-indexing/service/constants.ts +++ b/packages/indexer/src/data-indexing/service/constants.ts @@ -2,24 +2,31 @@ import { CHAIN_IDs } from "@across-protocol/constants"; // taken from https://github.com/UMAprotocol/bot-configs/blob/ed878f5f80509ad4ca55c8200e40670ba50e3b26/serverless-bots/across-v2-bot-config.json#L330C1-L342C25 const finalisedBlockBufferDistances: Record = { - [CHAIN_IDs.MAINNET]: 8, - [CHAIN_IDs.OPTIMISM]: 60, - [CHAIN_IDs.REDSTONE]: 60, + // Mainnets + [CHAIN_IDs.ALEPH_ZERO]: 80, + [CHAIN_IDs.ARBITRUM]: 240, [CHAIN_IDs.BASE]: 60, [CHAIN_IDs.BLAST]: 60, [CHAIN_IDs.INK]: 60, + [CHAIN_IDs.LENS]: 120, + [CHAIN_IDs.LINEA]: 40, + [CHAIN_IDs.LISK]: 120, + [CHAIN_IDs.MAINNET]: 8, [CHAIN_IDs.MODE]: 120, + [CHAIN_IDs.OPTIMISM]: 60, [CHAIN_IDs.POLYGON]: 128, - [CHAIN_IDs.ZK_SYNC]: 120, - [CHAIN_IDs.LISK]: 120, - [CHAIN_IDs.ALEPH_ZERO]: 80, - [CHAIN_IDs.ARBITRUM]: 240, - [CHAIN_IDs.LINEA]: 40, + [CHAIN_IDs.REDSTONE]: 60, [CHAIN_IDs.SCROLL]: 40, + [CHAIN_IDs.SOLANA]: 40, + [CHAIN_IDs.SONEIUM]: 60, + [CHAIN_IDs.UNICHAIN]: 60, [CHAIN_IDs.WORLD_CHAIN]: 60, + [CHAIN_IDs.ZK_SYNC]: 120, [CHAIN_IDs.ZORA]: 60, // BOBA is disabled [CHAIN_IDs.BOBA]: 0, + // Testnets: + [CHAIN_IDs.SOLANA_DEVNET]: 40, }; export function getFinalisedBlockBufferDistance(chainId: number) { @@ -35,24 +42,31 @@ export function getFinalisedBlockBufferDistance(chainId: number) { } const loopWaitTimeSeconds: Record = { - [CHAIN_IDs.MAINNET]: 10, - [CHAIN_IDs.OPTIMISM]: 4, - [CHAIN_IDs.REDSTONE]: 4, + // Mainnets + [CHAIN_IDs.ALEPH_ZERO]: 2, + [CHAIN_IDs.ARBITRUM]: 2, [CHAIN_IDs.BASE]: 4, [CHAIN_IDs.BLAST]: 4, [CHAIN_IDs.INK]: 4, - [CHAIN_IDs.MODE]: 3, - [CHAIN_IDs.POLYGON]: 3, - [CHAIN_IDs.ZK_SYNC]: 3, + [CHAIN_IDs.LENS]: 3, [CHAIN_IDs.LISK]: 3, - [CHAIN_IDs.ALEPH_ZERO]: 2, - [CHAIN_IDs.ARBITRUM]: 2, [CHAIN_IDs.LINEA]: 6, + [CHAIN_IDs.MAINNET]: 10, + [CHAIN_IDs.MODE]: 3, + [CHAIN_IDs.OPTIMISM]: 4, + [CHAIN_IDs.POLYGON]: 3, + [CHAIN_IDs.REDSTONE]: 4, [CHAIN_IDs.SCROLL]: 6, + [CHAIN_IDs.SOLANA]: 2, + [CHAIN_IDs.SONEIUM]: 4, + [CHAIN_IDs.UNICHAIN]: 4, [CHAIN_IDs.WORLD_CHAIN]: 4, + [CHAIN_IDs.ZK_SYNC]: 3, [CHAIN_IDs.ZORA]: 4, // BOBA is disabled [CHAIN_IDs.BOBA]: 0, + // Testnets: + [CHAIN_IDs.SOLANA_DEVNET]: 2, }; export function getLoopWaitTimeSeconds(chainId: number) { diff --git a/packages/indexer/src/database/BundleRepository.ts b/packages/indexer/src/database/BundleRepository.ts index c020b420..f7529157 100644 --- a/packages/indexer/src/database/BundleRepository.ts +++ b/packages/indexer/src/database/BundleRepository.ts @@ -8,6 +8,7 @@ import { Not, In, } from "@repo/indexer-database"; +import { getInternalHash } from "../utils/spokePoolUtils"; export type BlockRangeInsertType = { bundleId: number; @@ -32,6 +33,14 @@ export type PickRangeType< "blockNumber" | "transactionHash" | "logIndex" | "transactionIndex" | "id" >; +type BundleEventRow = { + bundleId: number; + relayHash: string; + eventBlockNumber: number; + eventLogIndex: number; + type: entities.BundleEventType; +}; + /** * An abstraction class for interacting with the database for bundle-related operations. */ @@ -66,6 +75,7 @@ export class BundleRepository extends utils.BaseRepository { ]) .leftJoin("crb.bundle", "b") .where("b.cancelationId IS NULL") + .andWhere("crb.finalised = true") .getMany(); } @@ -91,6 +101,7 @@ export class BundleRepository extends utils.BaseRepository { ]) .leftJoin("drb.bundle", "b") .where("b.disputeId IS NULL") + .andWhere("drb.finalised = true") .getMany(); } @@ -119,6 +130,7 @@ export class BundleRepository extends utils.BaseRepository { ]) .leftJoin("prb.bundle", "b") .where("b.proposalId IS NULL") + .andWhere("prb.finalised = true") .getMany(); } @@ -163,6 +175,7 @@ export class BundleRepository extends utils.BaseRepository { "rbe.transactionIndex", ]) .where("be.executionId IS NULL") + .andWhere("rbe.finalised = true") .orderBy("rbe.blockNumber", "ASC") .getMany(); } @@ -188,6 +201,7 @@ export class BundleRepository extends utils.BaseRepository { where: [ { blockNumber: LessThan(blockNumber), + finalised: true, bundle: { status: Not( In([ @@ -200,6 +214,7 @@ export class BundleRepository extends utils.BaseRepository { { blockNumber, transactionIndex: LessThan(transactionIndex), + finalised: true, bundle: { status: Not( In([ @@ -213,6 +228,7 @@ export class BundleRepository extends utils.BaseRepository { blockNumber, transactionIndex, logIndex: LessThan(logIndex), + finalised: true, bundle: { status: Not( In([ @@ -492,6 +508,14 @@ export class BundleRepository extends utils.BaseRepository { bundleId: number, ) { const eventsRepo = this.postgres.getRepository(entities.BundleEvent); + // Delete any rows related to the bundleId we are processing to avoid storing the same bundle twice + const deletedRows = await eventsRepo.delete({ bundleId }); + if (deletedRows.affected) { + this.logger.warn({ + at: "BundleRepository#storeBundleEvents", + message: `Deleted ${deletedRows.affected} bundle events previously associated to bundle with id ${bundleId}`, + }); + } // Store bundle deposits const deposits = this.formatBundleEvents( @@ -501,11 +525,7 @@ export class BundleRepository extends utils.BaseRepository { ); const chunkedDeposits = across.utils.chunk(deposits, this.chunkSize); await Promise.all( - chunkedDeposits.map((eventsChunk) => - eventsRepo.upsert(eventsChunk, { - conflictPaths: { relayHash: true, type: true }, - }), - ), + chunkedDeposits.map((eventsChunk) => eventsRepo.insert(eventsChunk)), ); // Store bundle refunded deposits @@ -516,11 +536,7 @@ export class BundleRepository extends utils.BaseRepository { ); const chunkedRefunds = across.utils.chunk(expiredDeposits, this.chunkSize); await Promise.all( - chunkedRefunds.map((eventsChunk) => - eventsRepo.upsert(eventsChunk, { - conflictPaths: { relayHash: true, type: true }, - }), - ), + chunkedRefunds.map((eventsChunk) => eventsRepo.insert(eventsChunk)), ); // Store bundle slow fills @@ -531,11 +547,7 @@ export class BundleRepository extends utils.BaseRepository { ); const chunkedSlowFills = across.utils.chunk(slowFills, this.chunkSize); await Promise.all( - chunkedSlowFills.map((eventsChunk) => - eventsRepo.upsert(eventsChunk, { - conflictPaths: { relayHash: true, type: true }, - }), - ), + chunkedSlowFills.map((eventsChunk) => eventsRepo.insert(eventsChunk)), ); // Store bundle unexecutable slow fills @@ -550,9 +562,7 @@ export class BundleRepository extends utils.BaseRepository { ); await Promise.all( chunkedUnexecutableSlowFills.map((eventsChunk) => - eventsRepo.upsert(eventsChunk, { - conflictPaths: { relayHash: true, type: true }, - }), + eventsRepo.insert(eventsChunk), ), ); @@ -564,11 +574,7 @@ export class BundleRepository extends utils.BaseRepository { ); const chunkedFills = across.utils.chunk(fills, this.chunkSize); await Promise.all( - chunkedFills.map((eventsChunk) => - eventsRepo.upsert(eventsChunk, { - conflictPaths: { relayHash: true, type: true }, - }), - ), + chunkedFills.map((eventsChunk) => eventsRepo.insert(eventsChunk)), ); return { @@ -588,17 +594,28 @@ export class BundleRepository extends utils.BaseRepository { | across.interfaces.BundleExcessSlowFills | across.interfaces.ExpiredDepositsToRefundV3, bundleId: number, - ): { - bundleId: number; - relayHash: string; - type: entities.BundleEventType; - }[] { + ): BundleEventRow[] { return Object.values(bundleEvents).flatMap((tokenEvents) => Object.values(tokenEvents).flatMap((events) => events.map((event) => { return { bundleId, - relayHash: across.utils.getRelayHashFromEvent(event), + relayHash: getInternalHash( + event, + event.messageHash, + event.destinationChainId, + ), + // eventChainId must match the chain the event was emmitted on + // For deposits and expired deposits use originChainId + // For slowFills and unexecutableSlowFills use destinationChainId + eventChainId: [ + entities.BundleEventType.Deposit, + entities.BundleEventType.ExpiredDeposit, + ].includes(eventsType) + ? event.originChainId + : event.destinationChainId, + eventBlockNumber: event.blockNumber, + eventLogIndex: event.logIndex, type: eventsType, }; }), @@ -610,19 +627,22 @@ export class BundleRepository extends utils.BaseRepository { eventsType: entities.BundleEventType.Fill, bundleEvents: across.interfaces.BundleFillsV3, bundleId: number, - ): { - bundleId: number; - relayHash: string; - type: entities.BundleEventType.Fill; - }[] { + ): (BundleEventRow & { repaymentChainId: string })[] { return Object.entries(bundleEvents).flatMap(([chainId, tokenEvents]) => Object.values(tokenEvents).flatMap((fillsData) => fillsData.fills.map((event) => { return { bundleId, - relayHash: across.utils.getRelayHashFromEvent(event), + relayHash: getInternalHash( + event, + event.messageHash, + event.destinationChainId, + ), + eventChainId: event.destinationChainId, + eventBlockNumber: event.blockNumber, + eventLogIndex: event.logIndex, type: eventsType, - repaymentChainId: Number(chainId), + repaymentChainId: chainId, }; }), ), diff --git a/packages/indexer/src/database/HubPoolRepository.ts b/packages/indexer/src/database/HubPoolRepository.ts index 48e86308..4a814ff5 100644 --- a/packages/indexer/src/database/HubPoolRepository.ts +++ b/packages/indexer/src/database/HubPoolRepository.ts @@ -2,11 +2,9 @@ import winston from "winston"; import * as across from "@across-protocol/sdk"; import { DataSource, entities, utils } from "@repo/indexer-database"; -export class HubPoolRepository extends utils.BaseRepository { - private chunkSize = 1000; - +export class HubPoolRepository extends utils.BlockchainEventRepository { constructor(postgres: DataSource, logger: winston.Logger) { - super(postgres, logger, true); + super(postgres, logger); } public async formatAndSaveProposedRootBundleEvents( @@ -25,18 +23,15 @@ export class HubPoolRepository extends utils.BaseRepository { finalised: event.blockNumber <= lastFinalisedBlock, }; }); - - const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); - await Promise.all( - chunkedEvents.map((eventsChunk) => - this.postgres - .createQueryBuilder(entities.ProposedRootBundle, "b") - .insert() - .values(eventsChunk) - .orUpdate(["finalised"], ["transactionHash"]) - .execute(), - ), - ); + const savedEvents = + await this.saveAndHandleFinalisationBatch( + entities.ProposedRootBundle, + formattedEvents, + ["transactionHash"], + [], + ); + + return savedEvents; } public async formatAndSaveRootBundleDisputedEvents( @@ -50,17 +45,15 @@ export class HubPoolRepository extends utils.BaseRepository { finalised: event.blockNumber <= lastFinalisedBlock, }; }); - const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); - await Promise.all( - chunkedEvents.map((eventsChunk) => - this.postgres - .createQueryBuilder(entities.RootBundleDisputed, "b") - .insert() - .values(eventsChunk) - .orUpdate(["finalised"], ["transactionHash"]) - .execute(), - ), - ); + const savedEvents = + await this.saveAndHandleFinalisationBatch( + entities.RootBundleDisputed, + formattedEvents, + ["transactionHash"], + [], + ); + + return savedEvents; } public async formatAndSaveRootBundleCanceledEvents( @@ -75,18 +68,15 @@ export class HubPoolRepository extends utils.BaseRepository { finalised: event.blockNumber <= lastFinalisedBlock, }; }); - - const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); - await Promise.all( - chunkedEvents.map((eventsChunk) => - this.postgres - .createQueryBuilder(entities.RootBundleCanceled, "b") - .insert() - .values(eventsChunk) - .orUpdate(["finalised"], ["transactionHash"]) - .execute(), - ), - ); + const savedEvents = + await this.saveAndHandleFinalisationBatch( + entities.RootBundleCanceled, + formattedEvents, + ["transactionHash"], + [], + ); + + return savedEvents; } public async formatAndSaveRootBundleExecutedEvents( @@ -104,20 +94,15 @@ export class HubPoolRepository extends utils.BaseRepository { finalised: event.blockNumber <= lastFinalisedBlock, }; }); - const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); - await Promise.all( - chunkedEvents.map((eventsChunk) => - this.postgres - .createQueryBuilder(entities.RootBundleExecuted, "b") - .insert() - .values(eventsChunk) - .orUpdate( - ["finalised"], - ["chainId", "leafId", "groupIndex", "transactionHash"], - ) - .execute(), - ), - ); + const savedEvents = + await this.saveAndHandleFinalisationBatch( + entities.RootBundleExecuted, + formattedEvents, + ["chainId", "leafId", "groupIndex", "transactionHash"], + [], + ); + + return savedEvents; } public async formatAndSaveSetPoolRebalanceRouteEvents( @@ -127,29 +112,27 @@ export class HubPoolRepository extends utils.BaseRepository { lastFinalisedBlock: number, ) { const formattedEvents = setPoolRebalanceRouteEvents.map((event) => { - return { - ...event, + const dbEvent = { destinationChainId: event.l2ChainId, - destinationToken: event.l2Token, l1Token: event.l1Token, + destinationToken: event.l2Token, + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + transactionIndex: event.transactionIndex, + logIndex: event.logIndex, finalised: event.blockNumber <= lastFinalisedBlock, }; + return dbEvent; }); - - const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); - await Promise.all( - chunkedEvents.map((eventsChunk) => - this.postgres - .createQueryBuilder(entities.SetPoolRebalanceRoute, "b") - .insert() - .values(eventsChunk) - .orUpdate( - ["finalised"], - ["transactionHash", "transactionIndex", "logIndex"], - ) - .execute(), - ), - ); + const savedEvents = + await this.saveAndHandleFinalisationBatch( + entities.SetPoolRebalanceRoute, + formattedEvents, + ["transactionHash", "transactionIndex", "logIndex"], + [], + ); + + return savedEvents; } /** diff --git a/packages/indexer/src/database/SpokePoolRepository.ts b/packages/indexer/src/database/SpokePoolRepository.ts index 0158c71d..6d111546 100644 --- a/packages/indexer/src/database/SpokePoolRepository.ts +++ b/packages/indexer/src/database/SpokePoolRepository.ts @@ -25,6 +25,7 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { | across.interfaces.SlowFillRequestWithBlock, ) { return { + depositId: event.depositId.toString(), inputAmount: event.inputAmount.toString(), outputAmount: event.outputAmount.toString(), fillDeadline: new Date(event.fillDeadline * 1000), @@ -46,10 +47,17 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { delete event.updatedRecipient; delete event.updatedOutputAmount; delete event.updatedMessage; + delete (event as { quoteBlockNumber?: number }).quoteBlockNumber; const blockTimestamp = new Date(blockTimes[event.blockNumber]! * 1000); return { ...event, relayHash: across.utils.getRelayHashFromEvent(event), + messageHash: event.messageHash, + internalHash: utils.getInternalHash( + event, + event.messageHash, + event.destinationChainId, + ), ...this.formatRelayData(event), quoteTimestamp: new Date(event.quoteTimestamp * 1000), finalised: event.blockNumber <= lastFinalisedBlock, @@ -62,8 +70,8 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { this.saveAndHandleFinalisationBatch( entities.V3FundsDeposited, eventsChunk, - ["depositId", "originChainId"], - ["relayHash", "transactionHash"], + ["relayHash", "blockNumber", "transactionHash", "logIndex"], + [], ), ), ); @@ -78,6 +86,8 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { ) { const formattedEvents = filledV3RelayEvents.map((event) => { const blockTimestamp = new Date(blockTimes[event.blockNumber]! * 1000); + const messageHash = event.messageHash; + delete (event as { messageHash?: string }).messageHash; return { ...Object.keys(event).reduce( (acc, key) => { @@ -88,12 +98,19 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { }, {} as { [key: string]: any }, ), - relayHash: across.utils.getRelayHashFromEvent(event), + internalHash: utils.getInternalHash( + event, + messageHash, + event.destinationChainId, + ), ...this.formatRelayData(event), + message: messageHash, updatedRecipient: event.relayExecutionInfo.updatedRecipient, updatedOutputAmount: event.relayExecutionInfo.updatedOutputAmount.toString(), - updatedMessage: event.relayExecutionInfo.updatedMessage, + updatedMessage: + event.relayExecutionInfo.updatedMessageHash || + event.relayExecutionInfo.updatedMessage, fillType: event.relayExecutionInfo.fillType, finalised: event.blockNumber <= lastFinalisedBlock, blockTimestamp, @@ -105,7 +122,7 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { this.saveAndHandleFinalisationBatch( entities.FilledV3Relay, eventsChunk, - ["relayHash"], + ["internalHash"], ["transactionHash"], ), ), @@ -118,10 +135,17 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { lastFinalisedBlock: number, ) { const formattedEvents = requestedV3SlowFillEvents.map((event) => { + const messageHash = event.messageHash; + delete (event as { messageHash?: string }).messageHash; return { ...event, - relayHash: across.utils.getRelayHashFromEvent(event), + internalHash: utils.getInternalHash( + event, + messageHash, + event.destinationChainId, + ), ...this.formatRelayData(event), + message: messageHash, finalised: event.blockNumber <= lastFinalisedBlock, }; }); @@ -131,8 +155,8 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { this.saveAndHandleFinalisationBatch( entities.RequestedV3SlowFill, eventsChunk, - ["depositId", "originChainId"], - ["relayHash", "transactionHash"], + ["internalHash"], + ["transactionHash"], ), ), ); @@ -142,7 +166,7 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { public async formatAndSaveRequestedSpeedUpV3Events( requestedSpeedUpV3Events: { [depositorAddress: string]: { - [depositId: number]: across.interfaces.SpeedUpWithBlock[]; + [depositId: string]: across.interfaces.SpeedUpWithBlock[]; }; }, lastFinalisedBlock: number, @@ -153,6 +177,7 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { events.map((event) => { return { ...event, + depositId: event.depositId.toString(), updatedOutputAmount: event.updatedOutputAmount.toString(), finalised: event.blockNumber <= lastFinalisedBlock, }; @@ -250,4 +275,18 @@ export class SpokePoolRepository extends dbUtils.BlockchainEventRepository { ); return savedEvents.flat(); } + + public async deleteUnfinalisedDepositEvents( + chainId: number, + lastFinalisedBlock: number, + ) { + const chainIdColumn = "originChainId"; + const deletedDeposits = await this.deleteUnfinalisedEvents( + chainId, + chainIdColumn, + lastFinalisedBlock, + entities.V3FundsDeposited, + ); + return deletedDeposits; + } } diff --git a/packages/indexer/src/database/SwapBeforeBridgeRepository.ts b/packages/indexer/src/database/SwapBeforeBridgeRepository.ts new file mode 100644 index 00000000..3bd73128 --- /dev/null +++ b/packages/indexer/src/database/SwapBeforeBridgeRepository.ts @@ -0,0 +1,65 @@ +import winston from "winston"; +import * as across from "@across-protocol/sdk"; +import { DataSource, entities, utils as dbUtils } from "@repo/indexer-database"; +import { SwapBeforeBridgeEvent } from "../web3/model/events"; + +export class SwapBeforeBridgeRepository extends dbUtils.BlockchainEventRepository { + constructor( + postgres: DataSource, + logger: winston.Logger, + private chunkSize = 100, + ) { + super(postgres, logger); + } + + public async formatAndSaveSwapBeforeBridgeEvents( + swapBeforeBridgeEvents: SwapBeforeBridgeEvent[], + chainId: number, + lastFinalisedBlock: number, + ) { + const formattedEvents = swapBeforeBridgeEvents.map((event) => { + const entity = new entities.SwapBeforeBridge(); + entity.swapToken = event.args.swapToken; + entity.acrossInputToken = event.args.acrossInputToken; + entity.acrossOutputToken = event.args.acrossOutputToken; + entity.swapTokenAmount = event.args.swapTokenAmount.toString(); + entity.acrossInputAmount = event.args.acrossInputAmount.toString(); + entity.acrossOutputAmount = event.args.acrossOutputAmount.toString(); + entity.exchange = event.args.exchange; + entity.blockHash = event.blockHash; + entity.blockNumber = event.blockNumber; + entity.transactionHash = event.transactionHash; + entity.logIndex = event.logIndex; + entity.chainId = chainId; + entity.finalised = event.blockNumber <= lastFinalisedBlock; + return entity; + }); + const chunkedEvents = across.utils.chunk(formattedEvents, this.chunkSize); + const savedEvents = await Promise.all( + chunkedEvents.map((eventsChunk) => + this.saveAndHandleFinalisationBatch( + entities.SwapBeforeBridge, + eventsChunk, + ["blockNumber", "chainId", "logIndex"], + [], + ), + ), + ); + const result = savedEvents.flat(); + return result; + } + + public async deleteUnfinalisedSwapEvents( + chainId: number, + lastFinalisedBlock: number, + ) { + const chainIdColumn = "chainId"; + const deletedSwapEvents = await this.deleteUnfinalisedEvents( + chainId, + chainIdColumn, + lastFinalisedBlock, + entities.SwapBeforeBridge, + ); + return deletedSwapEvents; + } +} diff --git a/packages/indexer/src/main.ts b/packages/indexer/src/main.ts index b896f931..93381a8e 100644 --- a/packages/indexer/src/main.ts +++ b/packages/indexer/src/main.ts @@ -4,21 +4,28 @@ import * as across from "@across-protocol/sdk"; import { WebhookFactory, WebhookTypes } from "@repo/webhooks"; import { connectToDatabase } from "./database/database.provider"; +import { RedisCache } from "./redis/redisCache"; import * as parseEnv from "./parseEnv"; +// Factories import { RetryProvidersFactory } from "./web3/RetryProvidersFactory"; -import { RedisCache } from "./redis/redisCache"; -import { HubPoolRepository } from "./database/HubPoolRepository"; -import { SpokePoolRepository } from "./database/SpokePoolRepository"; import { ConfigStoreClientFactory, HubPoolClientFactory, SpokePoolClientFactory, } from "./utils/contractFactoryUtils"; +// Managers +import { AcrossIndexerManager } from "./data-indexing/service/AcrossIndexerManager"; +import { BundleServicesManager } from "./services/BundleServicesManager"; +// Repositories import { BundleRepository } from "./database/BundleRepository"; +import { HubPoolRepository } from "./database/HubPoolRepository"; +import { SpokePoolRepository } from "./database/SpokePoolRepository"; +import { SwapBeforeBridgeRepository } from "./database/SwapBeforeBridgeRepository"; +// Queues Workers import { IndexerQueuesService } from "./messaging/service"; import { IntegratorIdWorker } from "./messaging/IntegratorIdWorker"; -import { AcrossIndexerManager } from "./data-indexing/service/AcrossIndexerManager"; -import { BundleServicesManager } from "./services/BundleServicesManager"; +import { PriceWorker } from "./messaging/priceWorker"; +import { SwapWorker } from "./messaging/swapWorker"; async function initializeRedis( config: parseEnv.RedisConfig, @@ -93,7 +100,8 @@ export async function Main(config: parseEnv.Config, logger: winston.Logger) { retryProvidersFactory, new HubPoolRepository(postgres, logger), new SpokePoolRepository(postgres, logger), - redisCache, + new SwapBeforeBridgeRepository(postgres, logger), + new BundleRepository(postgres, logger, true), indexerQueuesService, write, ); @@ -116,6 +124,21 @@ export async function Main(config: parseEnv.Config, logger: winston.Logger) { logger, retryProvidersFactory, ); + const priceWorker = config.enablePriceWorker + ? new PriceWorker(redis, postgres, logger, { + coingeckoApiKey: config.coingeckoApiKey, + }) + : undefined; + + const swapWorker = new SwapWorker( + redis, + postgres, + retryProvidersFactory, + logger, + { + coingeckoApiKey: config.coingeckoApiKey, + }, + ); let exitRequested = false; process.on("SIGINT", () => { @@ -125,10 +148,13 @@ export async function Main(config: parseEnv.Config, logger: winston.Logger) { message: "Wait for shutdown, or press Ctrl+C again to forcefully exit.", }); integratorIdWorker.close(); + priceWorker?.close(); + swapWorker.close(); acrossIndexerManager.stopGracefully(); bundleServicesManager.stop(); } else { integratorIdWorker.close(); + swapWorker.close(); logger.info({ at: "Indexer#Main", message: "Forcing exit..." }); redis?.quit(); postgres?.destroy(); diff --git a/packages/indexer/src/messaging/IntegratorIdWorker.ts b/packages/indexer/src/messaging/IntegratorIdWorker.ts index 9093dbac..e9654574 100644 --- a/packages/indexer/src/messaging/IntegratorIdWorker.ts +++ b/packages/indexer/src/messaging/IntegratorIdWorker.ts @@ -1,6 +1,7 @@ import Redis from "ioredis"; import winston from "winston"; import { Job, Worker } from "bullmq"; +import { providers } from "@across-protocol/sdk"; import { DataSource, entities } from "@repo/indexer-database"; import { IndexerQueues } from "./service"; import { getIntegratorId } from "../utils"; @@ -70,7 +71,7 @@ export class IntegratorIdWorker { deposit.originChainId, ); const integratorId = await getIntegratorId( - provider, + provider as providers.RetryProvider, deposit.quoteTimestamp, deposit.transactionHash, ); diff --git a/packages/indexer/src/messaging/priceWorker.ts b/packages/indexer/src/messaging/priceWorker.ts new file mode 100644 index 00000000..d845854e --- /dev/null +++ b/packages/indexer/src/messaging/priceWorker.ts @@ -0,0 +1,398 @@ +import Redis from "ioredis"; +import { DateTime } from "luxon"; +import winston from "winston"; +import { Job, Worker } from "bullmq"; +import { DataSource, entities } from "@repo/indexer-database"; +import { ethers } from "ethers"; +import { assert } from "@repo/error-handling"; +import * as across from "@across-protocol/sdk"; +import * as constants from "@across-protocol/constants"; +import * as ss from "superstruct"; + +import { IndexerQueues } from "./service"; +import { findTokenByAddress, yesterday } from "../utils"; + +export const PriceMessage = ss.object({ + fillEventId: ss.number(), +}); + +export type PriceMessage = ss.Infer; + +export type PriceWorkerConfig = { + coingeckoApiKey?: string; +}; + +type CGHistoricPrice = { + id: string; + symbol: string; + name: string; + market_data?: { + current_price: { + usd: number; + }; + }; +}; + +/** + * This worker listens to the `PriceQuery` queue and processes each job by: + * - Verifying the existence of the relay hash info and deposit records. + * - Determining the block time from the relay hash info and calculating the price time as the previous day's timestamp. + * - Identifying the base currency using the output token and destination chain ID. + * - Checking if a historic price for the base currency and quote currency (USD) already exists in the database. + * - If not, fetching the historic price from Coingecko and inserting it into the database. + * - Logging errors and information at various stages of the process. + */ +export class PriceWorker { + private worker: Worker; + private coingeckoClient: across.coingecko.Coingecko; + private relayHashInfoRepository; + private historicPriceRepository; + + constructor( + private redis: Redis, + private postgres: DataSource, + private logger: winston.Logger, + private config: PriceWorkerConfig, + ) { + this.coingeckoClient = across.coingecko.Coingecko.get( + logger, + config.coingeckoApiKey, + ); + this.relayHashInfoRepository = this.postgres.getRepository( + entities.RelayHashInfo, + ); + this.historicPriceRepository = this.postgres.getRepository( + entities.HistoricPrice, + ); + this.setWorker(); + } + + private async getPrice( + address: string, + chainId: number, + time: Date, + quoteCurrency = "usd", + ): Promise { + const priceTime = yesterday(time); + const tokenInfo = findTokenByAddress(address, chainId); + if (!tokenInfo) { + return undefined; + } + const baseCurrency = tokenInfo.symbol; + + const cachedPrice = await this.historicPriceRepository.findOne({ + where: { + date: priceTime, + baseCurrency, + quoteCurrency, + }, + }); + // we have this price at this time in the db + if (cachedPrice) { + return Number(cachedPrice.price); + } + + const cgFormattedDate = + DateTime.fromJSDate(priceTime).toFormat("dd-LL-yyyy"); + const price = await this.coingeckoClient.getContractHistoricDayPrice( + address, + cgFormattedDate, + quoteCurrency, + chainId, + ); + assert( + price, + `Unable to fetch price for ${quoteCurrency} in ${baseCurrency}(${tokenInfo.coingeckoId}) at ${priceTime}`, + ); + // upsert to prevent conflicts with swap worker inserts + await this.historicPriceRepository.upsert( + { + date: priceTime, + baseCurrency, + quoteCurrency, + price: price.toString(), + }, + ["date", "baseCurrency", "quoteCurrency"], + ); + + return Number(price); + } + + public setWorker() { + this.worker = new Worker( + IndexerQueues.PriceQuery, + async (job: Job) => { + // validate data type + if (!ss.is(job.data, PriceMessage)) return; + try { + await this.run(job.data); + } catch (error) { + this.logger.error({ + at: "PriceWorker", + message: `Error getting price for fill on fill event id ${job.data.fillEventId}`, + error, + job, + }); + throw error; + } + }, + { connection: this.redis, concurrency: 10 }, + ); + } + // price is assumed to be a float, amount is assumed in wei and decimals is the conversion for that amount + // this outputs the difference between input and output normalized to the price which is typically usd + private static calculateBridgeFee( + inputToken: { amount: string; price: number; decimals: number }, + outputToken: { amount: string; price: number; decimals: number }, + ): string { + // Convert input token amount from string to BigInt for precise arithmetic operations + const inputAmountBigInt = BigInt(inputToken.amount); + // Convert output token amount from string to BigInt for precise arithmetic operations + const outputAmountBigInt = BigInt(outputToken.amount); + + // Convert input token price to BigInt by scaling it according to its decimals + // This involves rounding the price to the nearest integer after multiplying by 10^decimals + const inputPriceBigInt = BigInt( + Math.round(inputToken.price * Math.pow(10, 18)), + ); + // Convert output token price to BigInt by scaling it according to its decimals + // This involves rounding the price to the nearest integer after multiplying by 10^decimals + const outputPriceBigInt = BigInt( + Math.round(outputToken.price * Math.pow(10, 18)), + ); + + // Normalize the input amount by multiplying it with its price and dividing by 10^decimals + // This converts the amount to a common scale based on its price + const normalizedInputAmount = + (inputAmountBigInt * inputPriceBigInt) / + BigInt(Math.pow(10, inputToken.decimals)); + // Normalize the output amount by multiplying it with its price and dividing by 10^decimals + // This converts the amount to a common scale based on its price + const normalizedOutputAmount = + (outputAmountBigInt * outputPriceBigInt) / + BigInt(Math.pow(10, outputToken.decimals)); + + // Calculate the bridge fee by subtracting the normalized output amount from the normalized input amount + // This gives the difference in value between the input and output tokens + return ethers.utils.formatEther( + normalizedInputAmount - normalizedOutputAmount, + ); + } + private async run(params: PriceMessage) { + const { fillEventId } = params; + + const relayHashInfo = await this.relayHashInfoRepository.findOne({ + where: { fillEventId }, + relations: { + fillEvent: true, + }, + }); + + if (!relayHashInfo) { + const errorMessage = `Relay hash info not found by id ${fillEventId}`; + this.logger.error({ + at: "PriceWorker", + message: errorMessage, + ...params, + }); + // this should end the request if the entity cant be found by id. it will never be there + return; + } + + if (!relayHashInfo.fillEvent) { + const errorMessage = "Fill event not found for relay hash info."; + this.logger.error({ + at: "PriceWorker", + message: errorMessage, + ...params, + }); + return; + } + + if ( + relayHashInfo.bridgeFeeUsd && + relayHashInfo.inputPriceUsd && + relayHashInfo.outputPriceUsd + ) { + const errorMessage = "Skipping already processed relay hash"; + this.logger.warn({ + at: "PriceWorker", + message: errorMessage, + ...params, + }); + return; + } + + // we are getting our price timestamp off fill event time rather than deposit, this should be pretty close to deposit, and we only look up previous 24 hour price anywyay + // if blockTimestamp doesnt exist, maybe we keep retrying till it does + const blockTime = relayHashInfo.fillEvent.blockTimestamp; + if (!blockTime) { + const errorMessage = "Block time not found for relay hash info."; + this.logger.error({ + at: "PriceWorker", + message: errorMessage, + ...params, + }); + throw new Error(errorMessage); + } + const inputTokenAddress = relayHashInfo.fillEvent.inputToken; + const outputTokenAddress = relayHashInfo.fillEvent.outputToken; + const destinationChainId = relayHashInfo.destinationChainId; + const inputTokenInfo = findTokenByAddress( + inputTokenAddress, + relayHashInfo.originChainId, + ); + if (!inputTokenInfo) { + return; + } + const outputTokenInfo = findTokenByAddress( + outputTokenAddress, + destinationChainId, + ); + if (!outputTokenInfo) { + return; + } + const inputTokenPrice = await this.getPrice( + inputTokenAddress, + relayHashInfo.originChainId, + blockTime, + ); + if (!inputTokenPrice) { + return; + } + const outputTokenPrice = await this.getPrice( + outputTokenAddress, + destinationChainId, + blockTime, + ); + if (!outputTokenPrice) { + return; + } + const inputToken = { + amount: relayHashInfo.fillEvent.inputAmount, + price: inputTokenPrice, + decimals: inputTokenInfo.decimals, + }; + const outputToken = { + amount: relayHashInfo.fillEvent.outputAmount, + price: outputTokenPrice, + decimals: outputTokenInfo.decimals, + }; + const bridgeFee = PriceWorker.calculateBridgeFee(inputToken, outputToken); + + let gasTokenPriceUsd: string | undefined; + let gasFeeUsd: string | undefined; + + if (relayHashInfo.fillGasFee) { + const destinationChainNativeTokenSymbol = + constants.PUBLIC_NETWORKS[Number(relayHashInfo.destinationChainId)] + ?.nativeToken; + if (!destinationChainNativeTokenSymbol) { + throw new Error( + `Destination chain native token symbol not found for chain id ${relayHashInfo.destinationChainId}`, + ); + } + const nativeToken = + constants.TOKEN_SYMBOLS_MAP[ + destinationChainNativeTokenSymbol as keyof typeof constants.TOKEN_SYMBOLS_MAP + ]; + if (!nativeToken) { + throw new Error( + `Native token not found for symbol ${destinationChainNativeTokenSymbol}`, + ); + } + const nativeTokenPlatformId = nativeToken.coingeckoId; + if (!nativeTokenPlatformId) { + throw new Error( + `Native token platform id not found for symbol ${destinationChainNativeTokenSymbol}`, + ); + } + const nativeTokenPrice = await this.getPriceForSymbol( + nativeToken.symbol, + nativeTokenPlatformId, + blockTime, + ); + const gasFeeBigInt = BigInt(relayHashInfo.fillGasFee); + const nativeTokenPriceBigInt = BigInt( + Math.round(nativeTokenPrice * Math.pow(10, 18)), + ); + const normalizedGasFee = + (gasFeeBigInt * nativeTokenPriceBigInt) / + BigInt(Math.pow(10, nativeToken.decimals)); + gasFeeUsd = ethers.utils.formatEther(normalizedGasFee); + gasTokenPriceUsd = nativeTokenPrice.toString(); + } + + const updatedFields: Partial = { + fillGasTokenPriceUsd: gasTokenPriceUsd, + fillGasFeeUsd: gasFeeUsd, + }; + + if (relayHashInfo.bridgeFeeUsd !== bridgeFee.toString()) { + updatedFields.bridgeFeeUsd = bridgeFee.toString(); + } + if (Number(relayHashInfo.inputPriceUsd) !== inputTokenPrice) { + updatedFields.inputPriceUsd = inputTokenPrice.toString(); + } + if (Number(relayHashInfo.outputPriceUsd) !== outputTokenPrice) { + updatedFields.outputPriceUsd = outputTokenPrice.toString(); + } + + if (Object.keys(updatedFields).length > 0) { + await this.relayHashInfoRepository.update({ fillEventId }, updatedFields); + this.logger.debug({ + at: "PriceWorker#updateRelayHashInfo", + message: "Updated relay hash info with new fields", + params, + updatedFields, + }); + } + } + + private async getPriceForSymbol( + symbol: string, + platformId: string, + time: Date, + ) { + const priceTime = yesterday(time); + const cachedPrice = await this.historicPriceRepository.findOne({ + where: { + date: priceTime, + baseCurrency: symbol, + quoteCurrency: "usd", + }, + }); + if (cachedPrice) { + return Number(cachedPrice.price); + } + const cgFormattedDate = + DateTime.fromJSDate(priceTime).toFormat("dd-LL-yyyy"); + const response = await this.coingeckoClient.call( + `/coins/${platformId}/history?date=${cgFormattedDate}`, + ); + const usdPrice = response.market_data?.current_price?.usd; + if (!usdPrice) { + throw new Error( + `Coingecko call returned no price for platform id ${platformId} at ${cgFormattedDate}`, + ); + } + await this.historicPriceRepository.upsert( + { + date: priceTime, + baseCurrency: symbol, + quoteCurrency: "usd", + price: usdPrice.toString(), + }, + { + conflictPaths: ["date", "baseCurrency", "quoteCurrency"], + skipUpdateIfNoValuesChanged: true, + }, + ); + + return usdPrice; + } + + public async close() { + return this.worker.close(); + } +} diff --git a/packages/indexer/src/messaging/service.ts b/packages/indexer/src/messaging/service.ts index 9f23abfe..f37da868 100644 --- a/packages/indexer/src/messaging/service.ts +++ b/packages/indexer/src/messaging/service.ts @@ -3,6 +3,8 @@ import { Queue, JobsOptions, BulkJobOptions } from "bullmq"; export enum IndexerQueues { IntegratorId = "IntegratorId", + PriceQuery = "PriceQuery", + SwapMessage = "SwapMessage", } export class IndexerQueuesService { @@ -19,8 +21,9 @@ export class IndexerQueuesService { (this.queues[queueName] = new Queue(queueName, { connection: this.connection, defaultJobOptions: { - attempts: Number.MAX_SAFE_INTEGER, + attempts: 2, removeOnComplete: true, + backoff: { type: "fixed", delay: 10 * 1000 }, }, })), ); diff --git a/packages/indexer/src/messaging/swapWorker.ts b/packages/indexer/src/messaging/swapWorker.ts new file mode 100644 index 00000000..a9bb9ae1 --- /dev/null +++ b/packages/indexer/src/messaging/swapWorker.ts @@ -0,0 +1,237 @@ +import Redis from "ioredis"; +import winston from "winston"; +import { DateTime } from "luxon"; +import { Job, Worker } from "bullmq"; +import * as across from "@across-protocol/sdk"; +import * as s from "superstruct"; +import { ethers } from "ethers"; + +import { DataSource, entities } from "@repo/indexer-database"; +import { assert } from "@repo/error-handling"; + +import { IndexerQueues } from "./service"; +import { RetryProvidersFactory } from "../web3/RetryProvidersFactory"; +import { findTokenByAddress, Token, yesterday } from "../utils"; + +export const SwapMessage = s.object({ + swapEventId: s.number(), +}); + +export type SwapWorkerConfig = { + coingeckoApiKey?: string; +}; + +export type SwapMessage = s.Infer; + +export class SwapWorker { + private worker: Worker; + private historicPriceRepository; + private relayHashInfoRepository; + private depositRepository; + private swapBeforeBridgeRepository; + private coingeckoClient: across.coingecko.Coingecko; + + constructor( + private redis: Redis, + private postgres: DataSource, + private retryProvidersFactory: RetryProvidersFactory, + private logger: winston.Logger, + private config: SwapWorkerConfig, + ) { + this.historicPriceRepository = this.postgres.getRepository( + entities.HistoricPrice, + ); + this.relayHashInfoRepository = this.postgres.getRepository( + entities.RelayHashInfo, + ); + this.depositRepository = this.postgres.getRepository( + entities.V3FundsDeposited, + ); + this.swapBeforeBridgeRepository = this.postgres.getRepository( + entities.SwapBeforeBridge, + ); + this.coingeckoClient = across.coingecko.Coingecko.get( + logger, + config.coingeckoApiKey, + ); + this.setWorker(); + } + public setWorker() { + this.worker = new Worker( + IndexerQueues.SwapMessage, + async (job: Job) => { + const [error, data] = s.validate(job.data, SwapMessage); + if (error) { + this.logger.error({ + at: "SwapWorker", + message: "Invalid job data", + error, + }); + return; + } + try { + await this.run(data); + } catch (error) { + this.logger.error({ + at: "SwapWorker", + message: `Error getting swap infor for hash ${data.swapEventId}`, + error, + }); + throw error; + } + }, + { connection: this.redis, concurrency: 10 }, + ); + } + private async getPrice( + address: string, + chainId: number, + time: Date, + quoteCurrency = "usd", + ): Promise<{ price: number; tokenInfo: Token } | undefined> { + const priceTime = yesterday(time); + const tokenInfo = findTokenByAddress(address, chainId); + if (!tokenInfo) { + return undefined; + } + const baseCurrency = tokenInfo.symbol; + const cachedPrice = await this.historicPriceRepository.findOne({ + where: { + date: priceTime, + baseCurrency, + quoteCurrency, + }, + }); + // we have this price at this time in the db + if (cachedPrice) { + return { + price: Number(cachedPrice.price), + tokenInfo, + }; + } + + const cgFormattedDate = + DateTime.fromJSDate(priceTime).toFormat("dd-LL-yyyy"); + const price = await this.coingeckoClient.getContractHistoricDayPrice( + address, + cgFormattedDate, + quoteCurrency, + chainId, + ); + assert( + price, + `Unable to fetch price for ${quoteCurrency} in ${baseCurrency}(${tokenInfo.coingeckoId}) at ${priceTime}`, + ); + // upsert to prevent conflicts with price worker inserts + await this.historicPriceRepository.upsert( + { + date: priceTime, + baseCurrency, + quoteCurrency, + price: price.toString(), + }, + ["date", "baseCurrency", "quoteCurrency"], + ); + + return { + price: Number(price), + tokenInfo, + }; + } + + private async run(params: SwapMessage) { + const { swapEventId } = params; + const relayHashInfo = await this.relayHashInfoRepository.findOne({ + where: { swapBeforeBridgeEventId: swapEventId }, + }); + if (!relayHashInfo || !relayHashInfo.depositEventId) { + this.logger.warn({ + at: "SwapWorker", + message: `Relay hash info not found for id ${swapEventId}`, + }); + return; + } + // a relay hash info with a swap event id should always have a deposit event id + const depositEvent = await this.depositRepository.findOne({ + where: { id: relayHashInfo.depositEventId }, + }); + const swapEvent = await this.swapBeforeBridgeRepository.findOne({ + where: { id: swapEventId }, + }); + + if (!swapEvent) { + this.logger.warn({ + at: "SwapWorker", + message: `Swap event not found for id ${swapEventId}`, + }); + return; + } + // a swap event should always have a deposit event + if (!depositEvent) { + this.logger.warn({ + at: "SwapWorker", + message: `Deposit event not found for id ${relayHashInfo.depositEventId}`, + }); + return; + } + // a deposit event should always have a block timestamp + if (!depositEvent.blockTimestamp) { + this.logger.warn({ + at: "SwapWorker", + message: `Deposit event block timestamp not found for id ${relayHashInfo.depositEventId}`, + }); + return; + } + + const { acrossInputToken, acrossInputAmount, swapToken, swapTokenAmount } = + swapEvent; + const swapTokenPrice = await this.getPrice( + swapToken, + swapEvent.chainId, + depositEvent.blockTimestamp, + ); + const acrossInputTokenPrice = await this.getPrice( + acrossInputToken, + swapEvent.chainId, + depositEvent.blockTimestamp, + ); + if (!swapTokenPrice || !acrossInputTokenPrice) { + this.logger.warn({ + at: "SwapWorker", + message: `Unable to get price for swap token`, + swapEvent, + swapTokenPrice, + acrossInputTokenPrice, + }); + return; + } + // converting wei to normal float value before doing any more math + const swapTokenAmountUsd = + Number( + ethers.utils.formatUnits( + swapTokenAmount, + swapTokenPrice.tokenInfo.decimals, + ), + ) * swapTokenPrice.price; + const acrossInputAmountUsd = + Number( + ethers.utils.formatUnits( + acrossInputAmount, + acrossInputTokenPrice.tokenInfo.decimals, + ), + ) * acrossInputTokenPrice.price; + const swapFeeUsd = swapTokenAmountUsd - acrossInputAmountUsd; + await this.relayHashInfoRepository.update( + // this is swapBeforeBridge entity id, unique to database + { swapBeforeBridgeEventId: swapEventId }, + { + swapTokenPriceUsd: swapTokenPrice.price.toString(), + swapFeeUsd: swapFeeUsd.toString(), + }, + ); + } + + public async close() { + return this.worker.close(); + } +} diff --git a/packages/indexer/src/parseEnv.ts b/packages/indexer/src/parseEnv.ts index 2b2a750a..6d0aa2a7 100644 --- a/packages/indexer/src/parseEnv.ts +++ b/packages/indexer/src/parseEnv.ts @@ -1,39 +1,59 @@ import * as s from "superstruct"; -import { DatabaseConfig } from "@repo/indexer-database"; -import { getNoTtlBlockDistance } from "./web3/constants"; +import { utils } from "@across-protocol/sdk"; import { assert } from "@repo/error-handling"; +import { DatabaseConfig } from "@repo/indexer-database"; import { Config as WebhooksConfig, WebhookTypes, parseWebhookClientsFromString, } from "@repo/webhooks"; +import { getNoTtlBlockDistance } from "./web3/constants"; export type Config = { redisConfig: RedisConfig; postgresConfig: DatabaseConfig; hubChainId: number; - spokePoolChainsEnabled: number[]; + evmSpokePoolChainsEnabled: number[]; + svmSpokePoolChainsEnabled: number[]; enableHubPoolIndexer: boolean; - enableBundleEventsProcessor: boolean; enableBundleIncludedEventsService: boolean; enableBundleBuilder: boolean; webhookConfig: WebhooksConfig; + maxBlockRangeSize?: number; + coingeckoApiKey?: string; + enablePriceWorker: boolean; + bundleEventsServiceStartBlockNumber: number; }; + export type RedisConfig = { host: string; port: number; maxRetriesPerRequest: null; }; + export type ProviderConfig = [providerUrl: string, chainId: number]; +export type RetryProviderConfig = { + providerCacheNamespace: string; + maxConcurrency: number; + pctRpcCallsLogged: number; + standardTtlBlockDistance?: number; + noTtlBlockDistance: number; + providerCacheTtl?: number; + nodeQuorumThreshold: number; + retries: number; + retryDelay: number; +}; + export type Env = Record; export function parseRedisConfig(env: Env): RedisConfig { - assert(env.REDIS_HOST, "requires REDIS_HOST"); - assert(env.REDIS_PORT, "requires REDIS_PORT"); - const port = parseNumber(env.REDIS_PORT); + const { REDIS_HOST, REDIS_PORT } = env; + assert(REDIS_HOST, "requires REDIS_HOST"); + assert(REDIS_PORT, "requires REDIS_PORT"); + const port = parseNumber(REDIS_PORT); return { - host: env.REDIS_HOST, + host: REDIS_HOST, port, // @dev: this retry config is needed for bullmq workers maxRetriesPerRequest: null, @@ -56,7 +76,7 @@ function parseNumber(value: string): number { return s.create(value, stringToInt); } -function parsePostgresConfig( +export function parsePostgresConfig( env: Record, ): DatabaseConfig { assert(env.DATABASE_HOST, "requires DATABASE_HOST"); @@ -105,7 +125,7 @@ export function parseProvidersUrls() { return results; } -export function parseRetryProviderEnvs(chainId: number) { +export function parseRetryProviderEnvs(chainId: number): RetryProviderConfig { const providerCacheNamespace = process.env.PROVIDER_CACHE_NAMESPACE || "indexer_provider_cache"; const maxConcurrency = Number( @@ -165,13 +185,16 @@ export function envToConfig(env: Env): Config { allProviderConfigs.length > 0, `Requires at least one RPC_PROVIDER_URLS_CHAIN_ID`, ); + const evmSpokePoolChainsEnabled = spokePoolChainsEnabled.filter((chainId) => + utils.chainIsEvm(chainId), + ); + const svmSpokePoolChainsEnabled = spokePoolChainsEnabled.filter((chainId) => + utils.chainIsSvm(chainId), + ); const hubChainId = hubPoolChain; const enableHubPoolIndexer = env.ENABLE_HUBPOOL_INDEXER ? env.ENABLE_HUBPOOL_INDEXER === "true" : true; - const enableBundleEventsProcessor = env.ENABLE_BUNDLE_EVENTS_PROCESSOR - ? env.ENABLE_BUNDLE_EVENTS_PROCESSOR === "true" - : true; const enableBundleIncludedEventsService = env.ENABLE_BUNDLE_INCLUDED_EVENTS_SERVICE ? env.ENABLE_BUNDLE_INCLUDED_EVENTS_SERVICE === "true" @@ -179,6 +202,12 @@ export function envToConfig(env: Env): Config { const enableBundleBuilder = env.ENABLE_BUNDLE_BUILDER ? env.ENABLE_BUNDLE_BUILDER === "true" : true; + const enablePriceWorker = env.ENABLE_PRICE_WORKER + ? env.ENABLE_PRICE_WORKER === "true" + : true; + const maxBlockRangeSize = env.MAX_BLOCK_RANGE_SIZE + ? parseInt(env.MAX_BLOCK_RANGE_SIZE) + : undefined; spokePoolChainsEnabled.forEach((chainId) => { const providerConfigs = allProviderConfigs.filter( (provider) => provider[1] == chainId, @@ -193,15 +222,26 @@ export function envToConfig(env: Env): Config { enabledWebhookRequestWorkers: true, clients: parseWebhookClientsFromString(env.WEBHOOK_CLIENTS ?? "[]"), }; + const coingeckoApiKey = env.COINGECKO_API_KEY; + const bundleEventsServiceStartBlockNumber = + env.BUNDLE_EVENTS_SERVICE_START_BLOCK_NUMBER + ? parseInt(env.BUNDLE_EVENTS_SERVICE_START_BLOCK_NUMBER) + : // Across v3 mainnet deployment block + 19277710; + return { redisConfig, postgresConfig, hubChainId, - spokePoolChainsEnabled, + evmSpokePoolChainsEnabled, + svmSpokePoolChainsEnabled, enableHubPoolIndexer, - enableBundleEventsProcessor, enableBundleIncludedEventsService, enableBundleBuilder, webhookConfig, + maxBlockRangeSize, + coingeckoApiKey, + enablePriceWorker, + bundleEventsServiceStartBlockNumber, }; } diff --git a/packages/indexer/src/redis/redisCache.ts b/packages/indexer/src/redis/redisCache.ts index b07bcc50..d8d7548d 100644 --- a/packages/indexer/src/redis/redisCache.ts +++ b/packages/indexer/src/redis/redisCache.ts @@ -8,13 +8,15 @@ export class RedisCache implements across.interfaces.CachingMechanismInterface { if (result === null) return result; return JSON.parse(result); } - set( + set( key: string, value: ObjectType, ttl?: number, ): Promise { - if (ttl !== undefined) { + if (ttl !== undefined && ttl !== Number.POSITIVE_INFINITY) { return this.redis.set(key, JSON.stringify(value), "EX", ttl); + } else if (ttl !== undefined && ttl === Number.POSITIVE_INFINITY) { + return this.redis.set(key, JSON.stringify(value), "EX", 2147483647); } return this.redis.set(key, JSON.stringify(value)); } diff --git a/packages/indexer/src/services/BundleBuilderService.ts b/packages/indexer/src/services/BundleBuilderService.ts index aedf186f..166453ff 100644 --- a/packages/indexer/src/services/BundleBuilderService.ts +++ b/packages/indexer/src/services/BundleBuilderService.ts @@ -1,4 +1,10 @@ -import { caching, clients, typechain, utils } from "@across-protocol/sdk"; +import { + caching, + clients, + typechain, + utils, + providers, +} from "@across-protocol/sdk"; import { entities } from "@repo/indexer-database"; import { assert } from "@repo/error-handling"; import Redis from "ioredis"; @@ -117,9 +123,10 @@ export class BundleBuilderService extends BaseIndexer { private async isCloseEnoughToHead( lastExecutedBundle: entities.ProposedRootBundle, ) { - const currentMainnetBlock = await this.config.providerFactory - .getProviderForChainId(this.config.hubChainId) - .getBlockNumber(); + const provider = this.config.providerFactory.getProviderForChainId( + this.config.hubChainId, + ) as providers.RetryProvider; + const currentMainnetBlock = await provider.getBlockNumber(); const lastExecutedMainnetBlock = lastExecutedBundle.bundleEvaluationBlockNumbers[0]!; const distanceToHead = currentMainnetBlock - lastExecutedMainnetBlock; diff --git a/packages/indexer/src/services/BundleIncludedEventsService.ts b/packages/indexer/src/services/BundleIncludedEventsService.ts index 849254ec..bd12ca58 100644 --- a/packages/indexer/src/services/BundleIncludedEventsService.ts +++ b/packages/indexer/src/services/BundleIncludedEventsService.ts @@ -1,16 +1,21 @@ import * as across from "@across-protocol/sdk"; +import { getDeployedBlockNumber } from "@across-protocol/contracts"; import Redis from "ioredis"; import winston from "winston"; + import { DataSource, entities } from "@repo/indexer-database"; + import { BaseIndexer } from "../generics"; import { BundleRepository } from "../database/BundleRepository"; import * as utils from "../utils"; import { getBlockTime } from "../web3/constants"; +import { RetryProvidersFactory } from "../web3/RetryProvidersFactory"; import { buildPoolRebalanceRoot, getBlockRangeBetweenBundles, getBundleBlockRanges, } from "../utils/bundleBuilderUtils"; +import { Config } from "../parseEnv"; export type BundleConfig = { hubChainId: number; @@ -20,6 +25,8 @@ export type BundleConfig = { hubPoolClientFactory: utils.HubPoolClientFactory; spokePoolClientFactory: utils.SpokePoolClientFactory; bundleRepository: BundleRepository; + retryProvidersFactory: RetryProvidersFactory; + config: Config; }; export class BundleIncludedEventsService extends BaseIndexer { @@ -47,7 +54,8 @@ export class BundleIncludedEventsService extends BaseIndexer { at: "Indexer#BundleIncludedEventsService#indexerLogic", message: "Error in BundleIncludedEventsService", notificationPath: "across-indexer-error", - error: JSON.stringify(error), + errorJson: JSON.stringify(error), + error, }); } } @@ -62,7 +70,7 @@ export class BundleIncludedEventsService extends BaseIndexer { const { logger, bundleRepository } = this.config; const executedBundles = await bundleRepository.getExecutedBundlesWithoutEventsAssociated({ - fromBlock: utils.ACROSS_V3_MAINNET_DEPLOYMENT_BLOCK, + fromBlock: this.config.config.bundleEventsServiceStartBlockNumber, }); logger.debug({ at: "Indexer#BundleIncludedEventsService#assignSpokePoolEventsToExecutedBundles", @@ -112,9 +120,12 @@ export class BundleIncludedEventsService extends BaseIndexer { historicalBundle.proposal, bundle.proposal, ); + const latestBlocks = + await this.getLatestBlockForBundleChains(lookbackRange); const spokeClients = this.getSpokeClientsForLookbackBlockRange( lookbackRange, spokePoolClientFactory, + latestBlocks, ); logger.debug({ at: "Indexer#BundleIncludedEventsService#getEventsIncludedInBundle", @@ -181,6 +192,7 @@ export class BundleIncludedEventsService extends BaseIndexer { private getSpokeClientsForLookbackBlockRange( lookbackRange: utils.ProposalRangeResult[], spokePoolClientFactory: utils.SpokePoolClientFactory, + latestBlocks: Record, ) { return lookbackRange.reduce( (acc, { chainId, startBlock, endBlock }) => { @@ -191,19 +203,64 @@ export class BundleIncludedEventsService extends BaseIndexer { const blockTime = getBlockTime(chainId); const endBlockTimeBuffer = 60 * 15; const blockBuffer = Math.round(endBlockTimeBuffer / blockTime); + const endBlockWithBuffer = endBlock + blockBuffer; + const latestBlock = latestBlocks[chainId]!; + const cappedEndBlock = Math.min(endBlockWithBuffer, latestBlock); + const deployedBlockNumber = getDeployedBlockNumber( + "SpokePool", + chainId, + ); + this.logger.debug({ + at: "Indexer#BundleIncludedEventsService#getSpokeClientsForLookbackBlockRange", + message: `Instantiate SpokePool client for chain ${chainId}`, + deployedBlockNumber, + startBlock, + cappedEndBlock, + }); + // A chain can be included in the bundle even if the SpokePool is not deployed yet + // In this case, the SpokePool client will not be instantiated and updated + if (deployedBlockNumber > endBlock) { + this.logger.debug({ + at: "Indexer#BundleIncludedEventsService#getSpokeClientsForLookbackBlockRange", + message: `SpokePool client not instantiated as it is not deployed yet for chain ${chainId}`, + deployedBlockNumber, + startBlock, + cappedEndBlock, + }); + return acc; + } + return { ...acc, [chainId]: spokePoolClientFactory.get( chainId, startBlock, - endBlock + blockBuffer, + cappedEndBlock, { hubPoolClient: this.hubPoolClient, }, + false, ), }; }, {} as Record, ); } + + private async getLatestBlockForBundleChains( + lookbackRange: utils.ProposalRangeResult[], + ): Promise> { + const entries = await Promise.all( + lookbackRange.map(async ({ chainId }) => { + const provider = + this.config.retryProvidersFactory.getProviderForChainId( + chainId, + ) as across.providers.RetryProvider; + const latestBlock = await provider.getBlockNumber(); + return [chainId, latestBlock]; + }), + ); + + return Object.fromEntries(entries); + } } diff --git a/packages/indexer/src/services/BundleServicesManager.ts b/packages/indexer/src/services/BundleServicesManager.ts index baf1904c..70d2c709 100644 --- a/packages/indexer/src/services/BundleServicesManager.ts +++ b/packages/indexer/src/services/BundleServicesManager.ts @@ -1,7 +1,6 @@ import { Logger } from "winston"; import { Config } from "../parseEnv"; import { BundleBuilderService } from "./BundleBuilderService"; -import { BundleEventsProcessor } from "./bundles"; import { Redis } from "ioredis"; import { DataSource } from "@repo/indexer-database"; import { @@ -14,7 +13,6 @@ import { BundleRepository } from "../database/BundleRepository"; import { BundleIncludedEventsService } from "./BundleIncludedEventsService"; export class BundleServicesManager { - private bundleEventsProcessor?: BundleEventsProcessor; private bundleBuilderService?: BundleBuilderService; private bundleIncludedEventsService?: BundleIncludedEventsService; @@ -31,14 +29,12 @@ export class BundleServicesManager { ) {} public start() { return Promise.all([ - this.startBundleEventsProcessor(), this.startBundleBuilderService(), this.startBundleIncludedEventsService(), ]); } public stop() { - this.bundleEventsProcessor?.stop(); this.bundleBuilderService?.stop(); this.bundleIncludedEventsService?.stop(); } @@ -59,27 +55,12 @@ export class BundleServicesManager { hubPoolClientFactory: this.hubPoolClientFactory, spokePoolClientFactory: this.spokePoolClientFactory, bundleRepository: this.bundleRepository, + retryProvidersFactory: this.retryProvidersFactory, + config: this.config, }); return this.bundleIncludedEventsService.start(10); } - private startBundleEventsProcessor() { - if (!this.config.enableBundleEventsProcessor) { - this.logger.warn({ - at: "Indexer#BundleServicesManager#startBundleEventsProcessor", - message: "Bundle events processor is disabled", - }); - return; - } - this.bundleEventsProcessor = new BundleEventsProcessor({ - logger: this.logger, - redis: this.redis, - postgres: this.postgres, - bundleRepository: this.bundleRepository, - }); - return this.bundleEventsProcessor.start(10); - } - private startBundleBuilderService() { if (!this.config.enableBundleBuilder) { this.logger.warn({ diff --git a/packages/indexer/src/services/bundles.ts b/packages/indexer/src/services/bundles.ts index d14eabd1..72fc182e 100644 --- a/packages/indexer/src/services/bundles.ts +++ b/packages/indexer/src/services/bundles.ts @@ -1,7 +1,6 @@ import Redis from "ioredis"; import winston from "winston"; import { DataSource } from "@repo/indexer-database"; -import { BaseIndexer } from "../generics"; import { BlockRangeInsertType, BundleRepository, @@ -13,42 +12,27 @@ const BLOCKS_PER_BUNDLE = Math.floor( BUNDLE_LIVENESS_SECONDS / AVERAGE_SECONDS_PER_BLOCK, ); -export type BundleConfig = { - logger: winston.Logger; - redis: Redis | undefined; - postgres: DataSource; - bundleRepository: BundleRepository; -}; +export type BundleConfig = {}; -/** - * Error thrown when the processor configuration is malformed - */ -class ConfigurationMalformedError extends Error { - constructor() { - super("Processor configuration is malformed"); - this.name = "ProcessorConfigurationMalformedError"; - } -} - -export class BundleEventsProcessor extends BaseIndexer { - constructor(private readonly config: BundleConfig) { - super(config.logger, "bundle"); - } +export class BundleEventsProcessor { + constructor( + private readonly logger: winston.Logger, + private readonly bundleRepository: BundleRepository, + ) {} - protected async indexerLogic(): Promise { + public async process(): Promise { try { - this.config.logger.debug({ + this.logger.debug({ at: "Indexer#BundleEventsProcessor#indexerLogic", message: "Starting bundle events processor", }); - const { logger, bundleRepository } = this.config; - await assignBundleToProposedEvent(bundleRepository, logger); - await assignDisputeEventToBundle(bundleRepository, logger); - await assignCanceledEventToBundle(bundleRepository, logger); - await assignBundleRangesToProposal(bundleRepository, logger); - await assignExecutionsToBundle(bundleRepository, logger); - await assignBundleExecutedStatus(bundleRepository, logger); - this.config.logger.debug({ + await assignBundleToProposedEvent(this.bundleRepository, this.logger); + await assignDisputeEventToBundle(this.bundleRepository, this.logger); + await assignCanceledEventToBundle(this.bundleRepository, this.logger); + await assignBundleRangesToProposal(this.bundleRepository, this.logger); + await assignExecutionsToBundle(this.bundleRepository, this.logger); + await assignBundleExecutedStatus(this.bundleRepository, this.logger); + this.logger.debug({ at: "Indexer#BundleEventsProcessor#indexerLogic", message: "Finished bundle events processor", }); @@ -56,16 +40,6 @@ export class BundleEventsProcessor extends BaseIndexer { console.log(error); } } - - protected async initialize(): Promise { - if (!this.config.postgres) { - this.logger.error({ - at: "Indexer#BundleEventsProcessor#initialize", - message: "Postgres connection not provided", - }); - throw new ConfigurationMalformedError(); - } - } } /** diff --git a/packages/indexer/src/services/spokePoolProcessor.ts b/packages/indexer/src/services/spokePoolProcessor.ts index c788361d..f904ed3a 100644 --- a/packages/indexer/src/services/spokePoolProcessor.ts +++ b/packages/indexer/src/services/spokePoolProcessor.ts @@ -1,16 +1,22 @@ -import { utils } from "@across-protocol/sdk"; import winston from "winston"; +import { providers } from "ethers"; import { DataSource, entities, utils as dbUtils, + InsertResult, + UpdateResult, SaveQueryResultType, + Not, } from "@repo/indexer-database"; import { WebhookTypes, eventProcessorManager } from "@repo/webhooks"; import { RelayStatus } from "../../../indexer-database/dist/src/entities"; -import { StoreEventsResult } from "../data-indexing/service/SpokePoolIndexerDataHandler"; +import { + DepositSwapPair, + StoreEventsResult, +} from "../data-indexing/service/SpokePoolIndexerDataHandler"; enum SpokePoolEvents { V3FundsDeposited = "V3FundsDeposited", @@ -19,60 +25,86 @@ enum SpokePoolEvents { } export class SpokePoolProcessor { - private queryBatchSize = 100; - constructor( private readonly postgres: DataSource, - private readonly logger: winston.Logger, private readonly chainId: number, + private readonly logger: winston.Logger, private readonly webhookWriteFn?: eventProcessorManager.WebhookWriteFn, ) {} - public async process(events: StoreEventsResult) { + public async process( + events: StoreEventsResult, + deletedDeposits: entities.V3FundsDeposited[], + depositSwapPairs: DepositSwapPair[], + transactionReceipts: Record, + ) { + // Update relay hash info records related to deleted deposits + await this.processDeletedDeposits(deletedDeposits); + const newDeposits = dbUtils.filterSaveQueryResults( events.deposits, SaveQueryResultType.Inserted, ); - const updatedDeposits = dbUtils.filterSaveQueryResults( - events.deposits, + + const newFills = dbUtils.filterSaveQueryResults( + events.fills, + SaveQueryResultType.Inserted, + ); + const updatedFills = dbUtils.filterSaveQueryResults( + events.fills, SaveQueryResultType.Updated, ); - await this.assignSpokeEventsToRelayHashInfo( - SpokePoolEvents.V3FundsDeposited, - [...newDeposits, ...updatedDeposits], + + const newSlowFillRequests = dbUtils.filterSaveQueryResults( + events.slowFillRequests, + SaveQueryResultType.Inserted, ); + const updatedSlowFillRequests = dbUtils.filterSaveQueryResults( + events.slowFillRequests, + SaveQueryResultType.Updated, + ); + + // Assign events to relay hash info + const timeToAssignSpokeEventsToRelayHashInfoStart = performance.now(); + await this.assignSpokeEventsToRelayHashInfo({ + deposits: newDeposits, + fills: [...newFills, ...updatedFills], + slowFillRequests: [...newSlowFillRequests, ...updatedSlowFillRequests], + transactionReceipts, + }); + await this.assignSwapEventToRelayHashInfo(depositSwapPairs); + const timeToAssignSpokeEventsToRelayHashInfoEnd = performance.now(); + + // Update expired deposits + const timeToUpdateExpiredRelaysStart = performance.now(); + const expiredDeposits = await this.updateExpiredRelays(); + const timeToUpdateExpiredRelaysEnd = performance.now(); + + // Update refunded deposits + const timeToUpdateRefundedDepositsStart = performance.now(); + const refundedDeposits = await this.updateRefundedDepositsStatus(); + const timeToUpdateRefundedDepositsEnd = performance.now(); + // Send webhook notifications // Notify webhook of new deposits newDeposits.forEach((deposit) => { this.webhookWriteFn?.({ type: WebhookTypes.DepositStatus, event: { - depositId: deposit.id, + depositId: deposit.depositId, originChainId: deposit.originChainId, depositTxHash: deposit.transactionHash, status: RelayStatus.Unfilled, }, }); }); - const newSlowFillRequests = dbUtils.filterSaveQueryResults( - events.slowFillRequests, - SaveQueryResultType.Inserted, - ); - const updatedSlowFillRequests = dbUtils.filterSaveQueryResults( - events.slowFillRequests, - SaveQueryResultType.Updated, - ); - await this.assignSpokeEventsToRelayHashInfo( - SpokePoolEvents.RequestedV3SlowFill, - [...newSlowFillRequests, ...updatedSlowFillRequests], - ); // Notify webhook of new slow fill requests newSlowFillRequests.forEach((deposit) => { this.webhookWriteFn?.({ type: WebhookTypes.DepositStatus, event: { - depositId: deposit.id, + depositId: deposit.depositId, originChainId: deposit.originChainId, depositTxHash: deposit.transactionHash, status: RelayStatus.SlowFillRequested, @@ -80,19 +112,6 @@ export class SpokePoolProcessor { }); }); - const newFills = dbUtils.filterSaveQueryResults( - events.fills, - SaveQueryResultType.Inserted, - ); - const updatedFills = dbUtils.filterSaveQueryResults( - events.fills, - SaveQueryResultType.Updated, - ); - await this.assignSpokeEventsToRelayHashInfo(SpokePoolEvents.FilledV3Relay, [ - ...newFills, - ...updatedFills, - ]); - // Notify webhook of new fills newFills.forEach((fill) => { this.webhookWriteFn?.({ @@ -106,7 +125,6 @@ export class SpokePoolProcessor { }); }); - const expiredDeposits = await this.updateExpiredRelays(); // Notify webhook of expired deposits expiredDeposits.forEach((deposit) => { this.webhookWriteFn?.({ @@ -120,8 +138,6 @@ export class SpokePoolProcessor { }); }); - const refundedDeposits = await this.updateRefundedDepositsStatus(); - // Notify webhook of refunded deposits refundedDeposits.forEach((deposit) => { this.webhookWriteFn?.({ @@ -134,72 +150,431 @@ export class SpokePoolProcessor { }, }); }); + + this.logger.debug({ + at: "Indexer#SpokePoolProcessor#process", + message: "System Time Log for SpokePoolProcessor#process", + spokeChainId: this.chainId, + timeToAssignSpokeEventsToRelayHashInfo: + timeToAssignSpokeEventsToRelayHashInfoEnd - + timeToAssignSpokeEventsToRelayHashInfoStart, + timeToUpdateExpiredRelays: + timeToUpdateExpiredRelaysEnd - timeToUpdateExpiredRelaysStart, + timeToUpdateRefundedDeposits: + timeToUpdateRefundedDepositsEnd - timeToUpdateRefundedDepositsStart, + totalTime: + timeToUpdateRefundedDepositsEnd - + timeToAssignSpokeEventsToRelayHashInfoStart, + }); } /** * Updates relayHashInfo table to include recently stored events - * @param events An array of already stored deposits, fills or slow fill requests + * @param events An object with stored deposits, fills and slow fill requests * @returns A void promise */ - private async assignSpokeEventsToRelayHashInfo( - eventType: SpokePoolEvents, - events: - | entities.V3FundsDeposited[] - | entities.FilledV3Relay[] - | entities.RequestedV3SlowFill[], + public async assignSpokeEventsToRelayHashInfo(events: { + deposits: entities.V3FundsDeposited[]; + fills: entities.FilledV3Relay[]; + slowFillRequests: entities.RequestedV3SlowFill[]; + transactionReceipts?: Record; + }): Promise { + await Promise.all([ + this.assignDepositEventsToRelayHashInfo(events.deposits), + this.assignFillEventsToRelayHashInfo( + events.fills, + events.transactionReceipts, + ), + this.assignSlowFillRequestedEventsToRelayHashInfo( + events.slowFillRequests, + ), + ]); + } + + /** + * Updates relayHashInfo table to include recently stored deposits + * @param events An array of already stored deposits + * @returns A void promise + */ + private async assignDepositEventsToRelayHashInfo( + events: entities.V3FundsDeposited[], ): Promise { - const relayHashInfoRepository = this.postgres.getRepository( - entities.RelayHashInfo, - ); - const eventTypeToField = { - [SpokePoolEvents.V3FundsDeposited]: "depositEventId", - [SpokePoolEvents.FilledV3Relay]: "fillEventId", - [SpokePoolEvents.RequestedV3SlowFill]: "requestSlowFillEventId", - }; - const data = events.map((event) => { - const eventField = eventTypeToField[eventType]; - return { - relayHash: event.relayHash, - depositId: event.depositId, - originChainId: event.originChainId, - destinationChainId: event.destinationChainId, - fillDeadline: event.fillDeadline, - [eventField]: event.id, - ...(eventType === SpokePoolEvents.V3FundsDeposited && { + const insertResults: InsertResult[] = []; + const updateResults: UpdateResult[] = []; + await Promise.all( + events.map(async (event) => { + // Format from event to relayHashInfo row + const item = { + relayHash: event.relayHash, + internalHash: event.internalHash, + depositId: event.depositId, + originChainId: event.originChainId, + destinationChainId: event.destinationChainId, + fillDeadline: event.fillDeadline, + depositEventId: event.id, depositTxHash: event.transactionHash, - }), - ...(eventType === SpokePoolEvents.FilledV3Relay && { - status: RelayStatus.Filled, + }; + + // Start a transaction + await this.postgres.transaction(async (transactionalEntityManager) => { + const relayHashInfoRepository = + transactionalEntityManager.getRepository(entities.RelayHashInfo); + + // Convert relayHash into a 32-bit integer for database lock usage + const lockKey = this.relayHashToInt32(item.internalHash as string); + // Acquire a lock to prevent concurrent modifications on the same relayHash. + // The lock is automatically released when the transaction commits or rolls back. + await transactionalEntityManager.query( + `SELECT pg_advisory_xact_lock($2, $1)`, + [item.originChainId, lockKey], + ); + + // Retrieve an existing entry that either: + // - Matches the relayHash and has no associated depositEventId. + // - Matches both relayHash and depositEventId. + const existingRow = await relayHashInfoRepository + .createQueryBuilder() + .where('"internalHash" = :itemInternalHash', { + itemInternalHash: item.internalHash, + }) + .andWhere( + '"depositEventId" IS NULL OR "depositEventId" = :itemEventId', + { itemEventId: item.depositEventId }, + ) + .getOne(); + + // Insert a new record if no matching entry is found. + if (!existingRow) { + const insertedRow = await relayHashInfoRepository.insert(item); + insertResults.push(insertedRow); + } else { + // Update the existing row if a match is found. + const updatedRow = await relayHashInfoRepository.update( + { id: existingRow.id, internalHash: item.internalHash }, + item, + ); + updateResults.push(updatedRow); + } + }); + }), + ); + + this.logRelayHashInfoAssignmentResult( + SpokePoolEvents.V3FundsDeposited, + insertResults, + updateResults, + ); + } + + /** + * Updates relayHashInfo table to include recently stored fills + * @param events An array of already stored fills + * @returns A void promise + */ + private async assignFillEventsToRelayHashInfo( + events: entities.FilledV3Relay[], + transactionReceipts?: Record, + ): Promise { + const insertResults: InsertResult[] = []; + const updateResults: UpdateResult[] = []; + await Promise.all( + events.map(async (event) => { + // Format from event to relayHashInfo row + const txnReceipt = transactionReceipts?.[event.transactionHash]; + if (transactionReceipts && !txnReceipt) { + throw new Error( + `Transaction receipt not found for fill event ${event.id} and transaction hash ${event.transactionHash}`, + ); + } + const gasFee = + txnReceipt?.gasUsed && txnReceipt?.effectiveGasPrice + ? txnReceipt.gasUsed.mul(txnReceipt.effectiveGasPrice) + : undefined; + const item: Partial = { + internalHash: event.internalHash, + depositId: event.depositId, + originChainId: event.originChainId, + destinationChainId: event.destinationChainId, + fillDeadline: event.fillDeadline, + fillEventId: event.id, + status: RelayStatus.Filled, // Mark the status as filled. fillTxHash: event.transactionHash, - }), - ...(eventType === SpokePoolEvents.RequestedV3SlowFill && { - status: RelayStatus.SlowFillRequested, - }), - }; - }); + fillGasFee: gasFee?.toString(), + }; - const upsertResults = []; - for (const item of data) { - upsertResults.push( - await relayHashInfoRepository.upsert(item, ["relayHash"]), - ); + // Start a transaction + + await this.postgres.transaction(async (transactionalEntityManager) => { + const relayHashInfoRepository = + transactionalEntityManager.getRepository(entities.RelayHashInfo); + + // Convert relayHash into a 32-bit integer for database lock usage + const lockKey = this.relayHashToInt32(item.internalHash as string); + // Acquire a lock to prevent concurrent modifications on the same relayHash. + // The lock is automatically released when the transaction commits or rolls back. + await transactionalEntityManager.query( + `SELECT pg_advisory_xact_lock($2, $1)`, + [item.originChainId, lockKey], + ); + + // Retrieve an existing entry based on the relayHash. + // If multiple rows exist, prioritize updating the one from the first deposit event indexed. + const existingRow = await relayHashInfoRepository + .createQueryBuilder() + .where(`"internalHash" = :itemInternalHash`, { + itemInternalHash: item.internalHash, + }) + .orderBy('"depositEventId"', "ASC") + .getOne(); + + // Insert a new record if no matching entry is found. + if (!existingRow) { + const insertedRow = await relayHashInfoRepository.insert(item); + insertResults.push(insertedRow); + } else { + // Update the existing row if a match is found. + const updatedRow = await relayHashInfoRepository.update( + { id: existingRow.id, internalHash: item.internalHash }, + item, + ); + updateResults.push(updatedRow); + } + }); + }), + ); + + this.logRelayHashInfoAssignmentResult( + SpokePoolEvents.FilledV3Relay, + insertResults, + updateResults, + ); + } + + /** + * Updates relayHashInfo table to include recently requested slow fill events + * @param events An array of already stored requested slow fills + * @returns A void promise + */ + private async assignSlowFillRequestedEventsToRelayHashInfo( + events: entities.RequestedV3SlowFill[], + ): Promise { + const insertResults: InsertResult[] = []; + const updateResults: UpdateResult[] = []; + await Promise.all( + events.map(async (event) => { + // Format from event to relayHashInfo row + const item = { + internalHash: event.internalHash, + depositId: event.depositId, + originChainId: event.originChainId, + destinationChainId: event.destinationChainId, + fillDeadline: event.fillDeadline, + slowFillRequestEventId: event.id, + }; + + // Start a transaction + await this.postgres.transaction(async (transactionalEntityManager) => { + const relayHashInfoRepository = + transactionalEntityManager.getRepository(entities.RelayHashInfo); + + // Convert relayHash into a 32-bit integer for database lock usage + const lockKey = this.relayHashToInt32(item.internalHash as string); + // Acquire a lock to prevent concurrent modifications on the same relayHash. + // The lock is automatically released when the transaction commits or rolls back. + await transactionalEntityManager.query( + `SELECT pg_advisory_xact_lock($2, $1)`, + [item.originChainId, lockKey], + ); + + // Retrieve an existing entry based on the relayHash. + // If multiple rows exist, prioritize updating the one from the first deposit event indexed. + const existingRow = await relayHashInfoRepository + .createQueryBuilder() + .where(`"internalHash" = :itemInternalHash`, { + itemInternalHash: item.internalHash, + }) + .orderBy('"depositEventId"', "ASC") + .getOne(); + + // Insert a new record if no matching entry is found. + if (!existingRow) { + const insertedRow = await relayHashInfoRepository.insert({ + ...item, + status: RelayStatus.SlowFillRequested, + }); + insertResults.push(insertedRow); + } else { + // Update the existing row if a match is found. + const updatedRow = await relayHashInfoRepository.update( + { id: existingRow.id, internalHash: item.internalHash }, + { + ...item, + // Update status to SlowFillRequested only if it is not already marked as Filled. + ...(existingRow.status !== RelayStatus.Filled && { + status: RelayStatus.SlowFillRequested, + }), + }, + ); + updateResults.push(updatedRow); + } + }); + }), + ); + + this.logRelayHashInfoAssignmentResult( + SpokePoolEvents.RequestedV3SlowFill, + insertResults, + updateResults, + ); + } + + private logRelayHashInfoAssignmentResult( + eventType: SpokePoolEvents, + insertResults: InsertResult[], + updateResults: UpdateResult[], + ) { + const insertedRows = insertResults.reduce( + (acc, res) => acc + res.generatedMaps.length, + 0, + ); + const updatedRows = updateResults.reduce( + (acc, res) => acc + res.affected!, + 0, + ); + if (insertedRows > 0 || updatedRows > 0) { + this.logger.debug({ + at: "Indexer#SpokePoolProcessor#assignSpokeEventsToRelayHashInfo", + message: `${eventType} events associated with RelayHashInfo`, + insertedRows, + updatedRows, + }); } + } - this.logger.debug({ - at: "Indexer#SpokePoolProcessor#assignSpokeEventsToRelayHashInfo", - message: `${eventType} events associated with RelayHashInfo`, - updatedRelayHashInfoRows: upsertResults.reduce( - (acc, res) => acc + res.generatedMaps.length, - 0, - ), - }); + /** + * Updates or deletes relay rows related to deleted deposit events. + * + * This function iterates over a list of deleted deposit events and ensures that its + * corresponding rows in RelayHashInfo are properly updated or deleted. + * - If a relay row has no other associated events (`fillEventId`, `slowFillRequestEventId`, `depositRefundTxHash`), + * it is deleted. + * - If a relay row has other associated events and there are no other rows matching the `relayHash`, only the + * reference to the deleted deposit is removed. + * - If other relay rows match the relayHash, the deposit information is transferred to the row with other + * events, and deletes the extra row. + * Operations are wrapped in a transaction and use a lock to avoid race conditions with processes that might + * be updating rows for the same relayHash. + * @param deletedDeposits - List of deleted deposit events. + * @returns A void promise + */ + public async processDeletedDeposits( + deletedDeposits: entities.V3FundsDeposited[], + ) { + for (const deposit of deletedDeposits) { + await this.postgres.transaction(async (transactionalEntityManager) => { + const relayHashInfoRepository = + transactionalEntityManager.getRepository(entities.RelayHashInfo); + + this.logger.warn({ + at: "spokePoolProcessor#processDeletedDeposits", + message: `Processing deleted deposit event with id ${deposit.id}`, + deletedDepositDetails: { + originChainId: deposit.originChainId, + txHash: deposit.transactionHash, + blockNumber: deposit.blockNumber, + txIndex: deposit.transactionIndex, + logIndex: deposit.logIndex, + }, + }); + + // Convert relayHash into a 32-bit integer for database lock usage + const lockKey = this.relayHashToInt32(deposit.internalHash!); + // Acquire a lock to prevent concurrent modifications on the same relayHash. + // The lock is automatically released when the transaction commits or rolls back. + await transactionalEntityManager.query( + `SELECT pg_advisory_xact_lock($2, $1)`, + [deposit.originChainId, lockKey], + ); + + const relatedRelayRow = await relayHashInfoRepository.findOne({ + where: { depositEventId: deposit.id }, + }); + + if (relatedRelayRow) { + const { fillEventId, slowFillRequestEventId, depositRefundTxHash } = + relatedRelayRow; + + if (!fillEventId && !slowFillRequestEventId && !depositRefundTxHash) { + // There are no other related events then it's safe to delete the row + await relayHashInfoRepository.delete({ id: relatedRelayRow.id }); + this.logger.warn({ + at: "spokePoolProcessor#processDeletedDeposits", + message: `Deleted relay row with id ${relatedRelayRow.id}. No related events.`, + }); + } else { + // There are other related events with the relay row + // Check if there are other rows with matching internalHash + const relayHashRecords = await relayHashInfoRepository.find({ + where: { + id: Not(relatedRelayRow.id), + internalHash: deposit.internalHash, + }, + order: { depositEventId: "ASC" }, + }); + + if (relayHashRecords.length === 0) { + // There are no other rows for this relayHash + // Only delete the reference to the deleted event in the existing row + await relayHashInfoRepository.update( + { id: relatedRelayRow.id }, + { depositEventId: null, depositTxHash: null }, + ); + this.logger.warn({ + at: "spokePoolProcessor#processDeletedDeposits", + message: `Updated relay row with id ${relatedRelayRow.id} to remove reference to deleted deposit event ${deposit.id}.`, + }); + } else { + // There are other rows matching this relayHash + // Get the one with the lowest depositEventId + const nextMatchingRow = relayHashRecords[0]!; + + // We don't expect this row to have any associated events as those + // were already associated with the row we got from the first query + if ( + nextMatchingRow.fillEventId || + nextMatchingRow.slowFillRequestEventId || + nextMatchingRow.depositRefundTxHash + ) { + throw new Error( + `Unexpected event associations found in next matching row with id: ${nextMatchingRow.id}`, + ); + } + + // Delete the row with matching relayHash and transfer its data to the row we are updating. + await relayHashInfoRepository.delete({ id: nextMatchingRow.id }); + await relayHashInfoRepository.update( + { id: relatedRelayRow.id }, + { + depositEventId: nextMatchingRow.depositEventId, + depositTxHash: nextMatchingRow.depositTxHash, + }, + ); + this.logger.warn({ + at: "spokePoolProcessor#processDeletedDeposits", + message: `Merged data from relay row with id ${nextMatchingRow.id} into ${relatedRelayRow.id} and deleted the former.`, + }); + } + } + } + }); + } } /** * Updates the status of expired relays originated from this processor's chain id * @returns An array with the updated relays */ - private async updateExpiredRelays(): Promise { + public async updateExpiredRelays(): Promise { const relayHashInfoRepository = this.postgres.getRepository( entities.RelayHashInfo, ); @@ -233,12 +608,11 @@ export class SpokePoolProcessor { } /** - * Calls the database to find expired relays and looks for related - * refunds in the bundle events table. + * Calls the database to find relays with related refunds in the bundle events table. * When a matching refund is found, updates the relay status to refunded * @returns An array with the updated relays */ - private async updateRefundedDepositsStatus(): Promise< + public async updateRefundedDepositsStatus(): Promise< entities.RelayHashInfo[] > { this.logger.debug({ @@ -248,22 +622,26 @@ export class SpokePoolProcessor { const bundleEventsRepository = this.postgres.getRepository( entities.BundleEvent, ); - const refundEvents = await bundleEventsRepository + const refundEvents = (await bundleEventsRepository .createQueryBuilder("be") .innerJoinAndSelect("be.bundle", "bundle") - .innerJoin(entities.RelayHashInfo, "rhi", "be.relayHash = rhi.relayHash") + .innerJoinAndMapOne( + "be.deposit", + entities.V3FundsDeposited, + "dep", + "be.relayHash = dep.internalHash AND be.eventChainId = dep.originChainId AND be.eventBlockNumber = dep.blockNumber AND be.eventLogIndex = dep.logIndex", + ) .where("be.type = :expiredDeposit", { expiredDeposit: entities.BundleEventType.ExpiredDeposit, }) - .andWhere("rhi.status = :expired", { - expired: entities.RelayStatus.Expired, - }) - .andWhere("rhi.originChainId = :chainId", { chainId: this.chainId }) + .andWhere("dep.originChainId = :chainId", { chainId: this.chainId }) .orderBy("be.bundleId", "DESC") .limit(100) - .getMany(); + .getMany()) as (entities.BundleEvent & { + deposit: entities.V3FundsDeposited; + })[]; - let updatedRows = []; + const updatedRows: entities.RelayHashInfo[] = []; for (const refundEvent of refundEvents) { // Get the relayerRefundRoot that included this refund const relayerRefundRoot = refundEvent.bundle.relayerRefundRoot; @@ -297,24 +675,55 @@ export class SpokePoolProcessor { if (!executedRelayerRefundRootEvent) continue; // If we found the execution of the relayer refund root, we can update the relay status - const relayHashInfoRepo = this.postgres.getRepository( - entities.RelayHashInfo, - ); - await relayHashInfoRepo - .createQueryBuilder() - .update() - .set({ - status: entities.RelayStatus.Refunded, - depositRefundTxHash: executedRelayerRefundRootEvent.transactionHash, - }) - .where("relayHash = :relayHash", { - relayHash: refundEvent.relayHash, - }) - .execute(); - const updatedRow = await relayHashInfoRepo.findOne({ - where: { relayHash: refundEvent.relayHash }, + await this.postgres.transaction(async (transactionalEntityManager) => { + const relayHashInfoRepo = transactionalEntityManager.getRepository( + entities.RelayHashInfo, + ); + + // Convert relayHash into a 32-bit integer for database lock usage + const lockKey = this.relayHashToInt32( + refundEvent.deposit.internalHash!, + ); + // Acquire a lock to prevent concurrent modifications on the same relayHash. + // The lock is automatically released when the transaction commits or rolls back. + await transactionalEntityManager.query( + `SELECT pg_advisory_xact_lock($2, $1)`, + [refundEvent.deposit.originChainId, lockKey], + ); + + const rowToUpdate = await relayHashInfoRepo.findOne({ + where: { + internalHash: refundEvent.relayHash, + depositEvent: { + originChainId: refundEvent.deposit.originChainId, + blockNumber: refundEvent.deposit.blockNumber, + logIndex: refundEvent.deposit.logIndex, + }, + }, + }); + if (rowToUpdate) { + if (rowToUpdate.status === entities.RelayStatus.Filled) { + this.logger.warn({ + at: "SpokePoolProcessor#updateRefundedDepositsStatus", + message: `Found a filled relay with id ${rowToUpdate.id} that is being unexpectedly refunded.`, + }); + } + const updatedRow = await relayHashInfoRepo + .createQueryBuilder() + .update() + .set({ + status: entities.RelayStatus.Refunded, + depositRefundTxHash: + executedRelayerRefundRootEvent.transactionHash, + }) + .where("id = :rowToUpdateId", { + rowToUpdateId: rowToUpdate.id, + }) + .returning("*") + .execute(); + updatedRows.push(updatedRow.raw[0]); + } }); - updatedRow && updatedRows.push(updatedRow); } if (updatedRows.length > 0) { this.logger.debug({ @@ -324,4 +733,52 @@ export class SpokePoolProcessor { } return updatedRows; } + + /** + * Generates a 32bit integer based on an input string + */ + private relayHashToInt32(relayHash: string): number { + let hash = 0; + let chr; + + // If the input string is empty, return 0 + if (relayHash.length === 0) return hash; + + // Loop through each character in the string + for (let i = 0; i < relayHash.length; i++) { + // Get the Unicode value of the character + chr = relayHash.charCodeAt(i); + + // Perform bitwise operations to generate a hash + // This shifts the hash left by 5 bits, subtracts itself, and adds the character code + hash = (hash << 5) - hash + chr; + + // Convert the result into a 32-bit integer by forcing it into the signed integer range + hash |= 0; + } + + // Return the final computed 32-bit integer hash + return hash; + } + + /** + * Assigns the swap event to the relay hash info + */ + private async assignSwapEventToRelayHashInfo( + depositSwapPairs: DepositSwapPair[], + ) { + const relayHashInfoRepository = this.postgres.getRepository( + entities.RelayHashInfo, + ); + await Promise.all( + depositSwapPairs.map((depositSwapPair) => + relayHashInfoRepository.update( + { depositEventId: depositSwapPair.deposit.id }, + { + swapBeforeBridgeEventId: depositSwapPair.swapBeforeBridge.id, + }, + ), + ), + ); + } } diff --git a/packages/indexer/src/test/example.test.ts b/packages/indexer/src/test/example.test.ts deleted file mode 100644 index f26d3d2f..00000000 --- a/packages/indexer/src/test/example.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { expect } from "chai"; - -// this is in here because mocha crashes if no tests are found -describe("example", () => { - it("should return true", async () => { - expect(true).to.be.true; - }); -}); diff --git a/packages/indexer/src/tests/example.test.ts b/packages/indexer/src/tests/example.test.ts new file mode 100644 index 00000000..d5aa681f --- /dev/null +++ b/packages/indexer/src/tests/example.test.ts @@ -0,0 +1,35 @@ +import { expect } from "chai"; +import { parsePostgresConfig } from "../parseEnv"; +import { + createDataSource, + Repository, + entities, + fixtures, +} from "@repo/indexer-database"; + +describe("example", () => { + let repository: Repository; + let depositsFixture: fixtures.FundsDepositedFixture; + + before(async () => { + const databaseConfig = parsePostgresConfig(process.env); + const dataSource = await createDataSource(databaseConfig).initialize(); + repository = dataSource.getRepository(entities.V3FundsDeposited); + depositsFixture = new fixtures.FundsDepositedFixture(dataSource); + }); + + after(async () => { + await depositsFixture.deleteAllDeposits(); + }); + + it("should return true", async () => { + expect(true).to.be.true; + }); + + // Example test showing database interaction + it("should create an entry in the database", async () => { + await depositsFixture.insertDeposits([]); + const depositRows = await repository.find(); + expect(depositRows.length).to.be.equal(1); + }); +}); diff --git a/packages/indexer/src/tests/priceWorker.test.ts b/packages/indexer/src/tests/priceWorker.test.ts new file mode 100644 index 00000000..1bb8fe13 --- /dev/null +++ b/packages/indexer/src/tests/priceWorker.test.ts @@ -0,0 +1,68 @@ +import { expect } from "chai"; +import { PriceWorker } from "../messaging/priceWorker"; + +describe("PriceWorker", function () { + describe("calculateBridgeFee", function () { + it("should correctly calculate the bridge fee", function () { + const inputToken = { + amount: "1000000000000000000", // 1 token in wei + price: 1, // $1 per token + decimals: 18, + }; + + const outputToken = { + amount: "500000000000000000", // 0.5 token in wei + price: 1, // $1 per token + decimals: 18, + }; + + const bridgeFee = PriceWorker["calculateBridgeFee"]( + inputToken, + outputToken, + ); + expect(bridgeFee).to.equal("0.5"); // Expecting a bridge fee of $0.5 + }); + + it("should return zero bridge fee when input and output values are equal", function () { + const inputToken = { + amount: "1000000000000000000", // 1 token in wei + price: 2, // $2 per token + decimals: 18, + }; + + const outputToken = { + amount: "1000000000000000000", // 1 token in wei + price: 2, // $2 per token + decimals: 18, + }; + + const bridgeFee = PriceWorker["calculateBridgeFee"]( + inputToken, + outputToken, + ); + expect(bridgeFee).to.equal("0.0"); // Expecting a bridge fee of $0.0 + }); + + it("should correctly calculate the bridge fee with different decimals", function () { + const inputToken = { + amount: "10000000000000000000", // 10 token in wei + price: 2, // $2 per token + decimals: 18, + }; + + const outputToken = { + amount: "5000000000", // 5 tokens in smaller unit + price: 3, // $3 per token + decimals: 9, + }; + // 10 * 2 = 20 + // 5 * 3 = 15 + // 20 - 15 = 5 + const bridgeFee = PriceWorker["calculateBridgeFee"]( + inputToken, + outputToken, + ); + expect(bridgeFee).to.equal("5.0"); // Expecting a bridge fee of $5.0 + }); + }); +}); diff --git a/packages/indexer/src/tests/relayHashInfo.test.ts b/packages/indexer/src/tests/relayHashInfo.test.ts new file mode 100644 index 00000000..dbc5ec0f --- /dev/null +++ b/packages/indexer/src/tests/relayHashInfo.test.ts @@ -0,0 +1,669 @@ +import { expect } from "chai"; +import winston from "winston"; +import { + createDataSource, + DataSource, + Repository, + entities, + fixtures, +} from "@repo/indexer-database"; +import { parsePostgresConfig } from "../parseEnv"; +import { SpokePoolRepository } from "../database/SpokePoolRepository"; +import { SpokePoolProcessor } from "../services/spokePoolProcessor"; + +describe("RelayHashInfo Tests", () => { + // Set up + // Tests logger + const logger = winston.createLogger({ + transports: [new winston.transports.Console()], + }); + + // DataSource + let dataSource: DataSource; + + // Repositories + let relayHashInfoRepository: Repository; + let spokePoolRepository: SpokePoolRepository; + + // Fixtures + let depositsFixture: fixtures.FundsDepositedFixture; + let fillsFixture: fixtures.FilledRelayFixture; + let slowFillsFixture: fixtures.RequestedSlowFillFixture; + let relayHashInfoFixture: fixtures.RelayHashInfoFixture; + let bundleFixture: fixtures.BundleFixture; + + // Events + let deposit: entities.V3FundsDeposited; + let fill: entities.FilledV3Relay; + let slowFill: entities.RequestedV3SlowFill; + + // Processor + let spokePoolProcessor: SpokePoolProcessor; + + before(async () => { + // Connect to database + const databaseConfig = parsePostgresConfig(process.env); + dataSource = await createDataSource(databaseConfig).initialize(); + + // Instantiate repositories + relayHashInfoRepository = dataSource.getRepository(entities.RelayHashInfo); + spokePoolRepository = new SpokePoolRepository(dataSource, logger); + + // Instantiate fixtures + depositsFixture = new fixtures.FundsDepositedFixture(dataSource); + fillsFixture = new fixtures.FilledRelayFixture(dataSource); + slowFillsFixture = new fixtures.RequestedSlowFillFixture(dataSource); + relayHashInfoFixture = new fixtures.RelayHashInfoFixture(dataSource); + bundleFixture = new fixtures.BundleFixture(dataSource); + + // Store events to use across tests + [deposit] = await depositsFixture.insertDeposits([ + { internalHash: "0x123" }, + ]); + [fill] = await fillsFixture.insertFills([{ internalHash: "0x123" }]); + [slowFill] = await slowFillsFixture.insertRequestedSlowFills([ + { internalHash: "0x123" }, + ]); + + // Initialize SpokePoolProcessor + spokePoolProcessor = new SpokePoolProcessor( + dataSource, + 1, // ChainId - for simplicity we'll use the same processor for all tests + logger, + ); + }); + + afterEach(async () => { + // Start each test with an empty relayHashInfo table + await relayHashInfoFixture.deleteAllRelayHashInfoRows(); + // also delete bundle events + await bundleFixture.cleanUpBundleEvents(); + }); + + after(async () => { + // Clean up db after all tests + await depositsFixture.deleteAllDeposits(); + await fillsFixture.deleteAllFilledRelays(); + await slowFillsFixture.deleteAllRequestedSlowFills(); + }); + + it("should update relayHashInfo when deposit is filled", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.status).to.equal( + entities.RelayStatus.Unfilled, + ); + expect(initialRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(initialRelayHashInfo!.fillEventId).to.be.null; + + // Process fill to update relayHashInfo + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + expect(updatedRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(updatedRelayHashInfo!.fillEventId).to.equal(fill.id); + }); + + it("should keep status as filled when a deposit is stored after a fill", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + expect(initialRelayHashInfo!.depositEventId).to.be.null; + expect(initialRelayHashInfo!.fillEventId).to.equal(fill.id); + + // Process fill to update relayHashInfo + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + expect(updatedRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(updatedRelayHashInfo!.fillEventId).to.equal(fill.id); + }); + + it("should update RelayHashInfo to slowFillRequested then filled", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.status).to.equal( + entities.RelayStatus.Unfilled, + ); + expect(initialRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(initialRelayHashInfo!.fillEventId).to.be.null; + + // Process slowFillRequest to update relayHashInfo + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [], + slowFillRequests: [slowFill], + }); + + // Verify intermediate relayHashInfo state + const intermediateRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(intermediateRelayHashInfo).to.not.be.null; + expect(intermediateRelayHashInfo!.status).to.equal( + entities.RelayStatus.SlowFillRequested, + ); + expect(intermediateRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(intermediateRelayHashInfo!.slowFillRequestEventId).to.equal( + slowFill.id, + ); + expect(intermediateRelayHashInfo!.fillEventId).to.be.null; + + // Process fill to update relayHashInfo + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + expect(updatedRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(updatedRelayHashInfo!.fillEventId).to.equal(fill.id); + expect(updatedRelayHashInfo!.slowFillRequestEventId).to.equal(slowFill.id); + }); + + it("should update RelayHashInfo status to Expired when deposit expires", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.status).to.equal( + entities.RelayStatus.Unfilled, + ); + expect(initialRelayHashInfo!.depositEventId).to.equal(deposit.id); + + // As the deposit was created using now() as the fill deadline, it should be expired + await spokePoolProcessor.updateExpiredRelays(); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal(entities.RelayStatus.Expired); + }); + + it("should update relayHashInfo with fill reference and status filled even after deposit expiry", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.status).to.equal( + entities.RelayStatus.Unfilled, + ); + expect(initialRelayHashInfo!.depositEventId).to.equal(deposit.id); + + // Deposit expires + await spokePoolProcessor.updateExpiredRelays(); + + // Verify intermediate relayHashInfo state + const intermediateRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(intermediateRelayHashInfo).to.not.be.null; + expect(intermediateRelayHashInfo!.status).to.equal( + entities.RelayStatus.Expired, + ); + + // Process fill to update relayHashInfo + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + expect(updatedRelayHashInfo!.fillEventId).to.equal(fill.id); + }); + + it("should update relayHashInfo status to refunded and set depositRefundTxHash when a refund is found", async () => { + // set up bundle related events + const [proposal] = await bundleFixture.insertBundleProposals([]); + const bundle = await bundleFixture.insertBundle(proposal.id, {}); + const [relayedRootBundle] = await bundleFixture.insertRelayedRootBundle([ + { + relayerRefundRoot: proposal.relayerRefundRoot, + slowRelayRoot: proposal.slowRelayRoot, + }, + ]); + const [executedRelayerRefundRoot] = + await bundleFixture.insertExecutedRelayerRefundRoot([ + { + rootBundleId: relayedRootBundle!.rootBundleId, + }, + ]); + + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Issue a refund for deposit + await bundleFixture.insertBundleEvents(bundle.id, [ + { + bundleId: bundle.id, + type: entities.BundleEventType.ExpiredDeposit, + relayHash: deposit.internalHash, + eventChainId: deposit.originChainId, + eventBlockNumber: deposit.blockNumber, + eventLogIndex: deposit.logIndex, + }, + ]); + + // Process refunds + await spokePoolProcessor.updateRefundedDepositsStatus(); + + // Verify final relayHashInfo state + const updatedRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: deposit.internalHash }, + }); + expect(updatedRelayHashInfo).to.not.be.null; + expect(updatedRelayHashInfo!.status).to.equal( + entities.RelayStatus.Refunded, + ); + expect(updatedRelayHashInfo!.depositEventId).to.equal(deposit.id); + expect(updatedRelayHashInfo!.depositRefundTxHash).to.equal( + executedRelayerRefundRoot!.transactionHash, + ); + }); + + describe("Test duplicated deposits handling", () => { + it("should create a new RelayHashInfo row for a duplicated deposit with the same internalHash", async () => { + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [deposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x123" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.depositEventId).to.equal(deposit.id); + + // Create duplicate deposit in different block + const [duplicatedDeposit] = await depositsFixture.insertDeposits([ + { internalHash: "0x123", blockNumber: 2 }, + ]); + + // Process duplicate deposit + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [duplicatedDeposit], + fills: [], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const relayRows = await relayHashInfoRepository.find({ + where: { internalHash: "0x123" }, + order: { depositEventId: "ASC" }, + }); + expect(relayRows!).to.have.lengthOf(2); + expect(relayRows[0]!.depositEventId).to.equal(deposit.id); + expect(relayRows[1]!.depositEventId).to.equal(duplicatedDeposit.id); + }); + + it("should create a new RelayHashInfo row for a duplicated deposit even after the original is filled", async () => { + // Create original deposit + const [originalDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0x456", internalHash: "0x456" }, + ]); + + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [originalDeposit], + fills: [], + slowFillRequests: [], + }); + + // Create fill + const [fill] = await fillsFixture.insertFills([ + { internalHash: "0x456" }, + ]); + + // Process fill to create filled relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Create duplicate deposit in different block + const [duplicatedDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0x456", internalHash: "0x456", blockNumber: 2 }, + ]); + + // Process duplicated deposit + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [duplicatedDeposit!], + fills: [], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const relayRows = await relayHashInfoRepository.find({ + where: { internalHash: "0x456" }, + order: { depositEventId: "ASC" }, + }); + expect(relayRows!).to.have.lengthOf(2); + const originalRelay = relayRows[0]!; + const duplicatedRelay = relayRows[1]!; + expect(originalRelay.depositEventId).to.equal(originalDeposit.id); + expect(originalRelay.fillEventId).to.equal(fill.id); + expect(originalRelay.status).to.equal(entities.RelayStatus.Filled); + expect(duplicatedRelay.depositEventId).to.equal(duplicatedDeposit!.id); + expect(duplicatedRelay.fillEventId).to.be.null; + expect(duplicatedRelay.status).to.equal(entities.RelayStatus.Unfilled); + }); + + it("should create two unfilled RelayHashInfo rows for duplicated deposits and then fill the first one", async () => { + // Create original deposit + const [originalDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0xabc", internalHash: "0xabc" }, + ]); + + // Process original deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [originalDeposit], + fills: [], + slowFillRequests: [], + }); + + // Create duplicate deposit + const [duplicatedDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0xabc", internalHash: "0xabc", blockNumber: 2 }, + ]); + + // Process duplicated deposit + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [duplicatedDeposit], + fills: [], + slowFillRequests: [], + }); + + // Create fill + const [fill] = await fillsFixture.insertFills([ + { internalHash: "0xabc" }, + ]); + + // Process fill to update original relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Verify final relayHashInfo state + const relayRows = await relayHashInfoRepository.find({ + where: { internalHash: "0xabc" }, + order: { depositEventId: "ASC" }, + }); + expect(relayRows!).to.have.lengthOf(2); + const originalRelay = relayRows[0]!; + const duplicatedRelay = relayRows[1]!; + expect(originalRelay.depositEventId).to.equal(originalDeposit.id); + expect(originalRelay.fillEventId).to.equal(fill.id); + expect(originalRelay.status).to.equal(entities.RelayStatus.Filled); + expect(duplicatedRelay.depositEventId).to.equal(duplicatedDeposit.id); + expect(duplicatedRelay.fillEventId).to.be.null; + expect(duplicatedRelay.status).to.equal(entities.RelayStatus.Unfilled); + }); + }); + + describe("Test deleted deposits handling", () => { + it("should delete RelayHashInfo row when deposit is not finalized and no other events exist", async () => { + // Create deposit + const [unfinalizedDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0xdef", internalHash: "0xdef", finalised: false }, + ]); + + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [unfinalizedDeposit], + fills: [], + slowFillRequests: [], + }); + + // Verify initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0xdef" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + + // Soft delete unfinalized deposit + const deletedDeposits = + await spokePoolRepository.deleteUnfinalisedDepositEvents( + 1, // chainId + unfinalizedDeposit.blockNumber + 1, // lastFinalisedBlock older than deposit block number + ); + + // Process deleted deposit + await spokePoolProcessor.processDeletedDeposits(deletedDeposits); + + // Verify final relayHashInfo state. Existing row for internalHash should be deleted + const finalRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0xdef" }, + }); + expect(finalRelayHashInfo).to.be.null; + }); + + it("should remove deposit reference but keep relayHashInfo row when a deposit is not finalised but a fill exists", async () => { + // Create deposit + const [unfinalizedDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0x1ab", internalHash: "0x1ab", finalised: false }, + ]); + + // Process deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [unfinalizedDeposit], + fills: [], + slowFillRequests: [], + }); + + // Create fill + const [fill] = await fillsFixture.insertFills([ + { internalHash: "0x1ab" }, + ]); + + // Process fill to update relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Check initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x1ab" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + expect(initialRelayHashInfo!.depositEventId).to.equal( + unfinalizedDeposit.id, + ); + expect(initialRelayHashInfo!.fillEventId).to.equal(fill.id); + expect(initialRelayHashInfo!.status).to.equal( + entities.RelayStatus.Filled, + ); + + // Soft delete unfinalized deposit + const deletedDeposits = + await spokePoolRepository.deleteUnfinalisedDepositEvents( + 1, // chainId + unfinalizedDeposit.blockNumber + 1, // lastFinalisedBlock older than deposit block number + ); + + // Process deleted deposit + await spokePoolProcessor.processDeletedDeposits(deletedDeposits); + + // Verify final relayHashInfo state. Existing row for internalHash should have its depositEventId removed + const finalRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x1ab" }, + }); + expect(finalRelayHashInfo).to.not.be.null; + expect(finalRelayHashInfo!.depositEventId).to.be.null; + expect(finalRelayHashInfo!.fillEventId).to.equal(fill.id); + expect(finalRelayHashInfo!.status).to.equal(entities.RelayStatus.Filled); + }); + + it("should merge relay row data into an existing entry and delete the redundant row when replacing an unfinalized deposit with a new deposit", async () => { + // Create original deposit + const [originalDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0x2cd", internalHash: "0x2cd", finalised: false }, + ]); + + // Process original deposit to create initial relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [originalDeposit], + fills: [], + slowFillRequests: [], + }); + + // Check initial relayHashInfo state + const initialRelayHashInfo = await relayHashInfoRepository.findOne({ + where: { internalHash: "0x2cd" }, + }); + expect(initialRelayHashInfo).to.not.be.null; + + // Create fill + const [fill] = await fillsFixture.insertFills([ + { internalHash: "0x2cd" }, + ]); + + // Process fill to update relayHashInfo row + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [], + fills: [fill], + slowFillRequests: [], + }); + + // Create duplicate deposit + const [replacingDeposit] = await depositsFixture.insertDeposits([ + { relayHash: "0x2cd", internalHash: "0x2cd", blockNumber: 2 }, + ]); + + // Process duplicate deposit + await spokePoolProcessor.assignSpokeEventsToRelayHashInfo({ + deposits: [replacingDeposit], + fills: [], + slowFillRequests: [], + }); + + // Check RelayHashInfo state after duplicate deposit is processed and before deleting the unfinalized deposit + const relayRows = await relayHashInfoRepository.find({ + where: { internalHash: "0x2cd" }, + order: { depositEventId: "ASC" }, + }); + const unfinalizedDeposit = relayRows[0]; + const finalizedDeposit = relayRows[1]; + expect(relayRows).to.not.be.null; + expect(relayRows).to.have.lengthOf(2); + expect(unfinalizedDeposit!.depositEventId).to.equal(originalDeposit.id); + expect(unfinalizedDeposit!.fillEventId).to.equal(fill.id); + expect(unfinalizedDeposit!.status).to.equal(entities.RelayStatus.Filled); + expect(finalizedDeposit!.depositEventId).to.equal(replacingDeposit.id); + expect(finalizedDeposit!.fillEventId).to.be.null; + expect(finalizedDeposit!.status).to.equal(entities.RelayStatus.Unfilled); + + // Soft delete unfinalized deposit + const deletedDeposits = + await spokePoolRepository.deleteUnfinalisedDepositEvents( + 1, // chainId + originalDeposit.blockNumber + 1, // lastFinalisedBlock older than deposit block number + ); + + // Process deleted deposit + await spokePoolProcessor.processDeletedDeposits(deletedDeposits); + + // Check RelayHashInfo state after deleting unfinalized deposit + // Replacing deposit data should be merged into original row + const relayRowsAfterDeletion = await relayHashInfoRepository.find({ + where: { internalHash: "0x2cd" }, + order: { depositEventId: "ASC" }, + }); + expect(relayRowsAfterDeletion).to.not.be.null; + expect(relayRowsAfterDeletion).to.have.lengthOf(1); + const finalRow = relayRowsAfterDeletion[0]; + expect(finalRow!.depositEventId).to.equal(replacingDeposit.id); + expect(finalRow!.fillEventId).to.equal(fill.id); + expect(finalRow!.status).to.equal(entities.RelayStatus.Filled); + }); + }); +}); diff --git a/packages/indexer/src/utils/bundleBuilderUtils.ts b/packages/indexer/src/utils/bundleBuilderUtils.ts index 844268be..1cf5740f 100644 --- a/packages/indexer/src/utils/bundleBuilderUtils.ts +++ b/packages/indexer/src/utils/bundleBuilderUtils.ts @@ -1,8 +1,9 @@ -import { utils, clients, interfaces } from "@across-protocol/sdk"; +import { utils, clients, interfaces, providers } from "@across-protocol/sdk"; import winston from "winston"; import { entities } from "@repo/indexer-database"; import { BundleRepository } from "../database/BundleRepository"; import { RetryProvidersFactory } from "../web3/RetryProvidersFactory"; +import { getDeployedBlockNumber } from "@across-protocol/contracts"; export type ProposalRange = Pick< entities.ProposedRootBundle, @@ -87,8 +88,8 @@ export function getBundleBlockRanges(bundle: entities.Bundle) { * @returns The block ranges for each chain. For each chain, this is the previous * proposal's evaluation block number + 1 to the current proposal's evaluation block * number. In the case that the new proposal includes ranges for a chain that was not - * previously included, the range starts at block 0 for that chain per the ACX UMIP. We - * also ensure that disabled chains aren't ticked up. I.e. if a chain has the same end + * previously included, the range starts at the spoke pool deployment block for that chain per the ACX UMIP. + * We also ensure that disabled chains aren't ticked up. I.e. if a chain has the same end * block as the previous proposal range, we don't increment. * @dev The ordering of the ranges is the same as the chainIds in the current proposal. */ @@ -103,7 +104,7 @@ export function getBlockRangeBetweenBundles( startBlock: Math.min( previous.bundleEvaluationBlockNumbers[idx] ? previous.bundleEvaluationBlockNumbers[idx]! + 1 - : 0, // If this is a new chain, start from block 0 + : getDeployedBlockNumber("SpokePool", chainId), // If this is a new chain, start from spoke pool deployment block current.bundleEvaluationBlockNumbers[idx]!, ), endBlock: current.bundleEvaluationBlockNumbers[idx]!, @@ -134,7 +135,9 @@ export async function getBlockRangeFromBundleToHead( if (disabledChainIds.includes(chainId)) { return { chainId, startBlock: previousBlock, endBlock: previousBlock }; } else { - const provider = providers.getProviderForChainId(chainId); + const provider = providers.getProviderForChainId( + chainId, + ) as providers.RetryProvider; const currentBlock = await provider.getBlockNumber(); return { chainId, diff --git a/packages/indexer/src/utils/clients/SpokePoolClient.ts b/packages/indexer/src/utils/clients/SpokePoolClient.ts new file mode 100644 index 00000000..5230a426 --- /dev/null +++ b/packages/indexer/src/utils/clients/SpokePoolClient.ts @@ -0,0 +1,42 @@ +import * as across from "@across-protocol/sdk"; +import { Contract } from "ethers"; +import winston from "winston"; + +export class SpokePoolClient extends across.clients.SpokePoolClient { + constructor( + logger: winston.Logger, + spokePool: Contract, + hubPoolClient: across.clients.HubPoolClient | null, + chainId: number, + deploymentBlock: number, + eventSearchConfig?: across.utils.MakeOptional< + across.utils.EventSearchConfig, + "toBlock" + >, + private disableQuoteBlockLookup = false, + ) { + super( + logger, + spokePool, + hubPoolClient, + chainId, + deploymentBlock, + eventSearchConfig, + ); + } + + protected getBlockNumbers( + timestamps: number[], + ): Promise<{ [quoteTimestamp: number]: number }> { + return this.hubPoolClient && !this.disableQuoteBlockLookup + ? this.hubPoolClient.getBlockNumbers(timestamps) + : Promise.resolve( + Object.fromEntries( + timestamps.map((timestamp) => [ + timestamp, + across.utils.MAX_BIG_INT.toNumber(), + ]), + ), + ); + } +} diff --git a/packages/indexer/src/utils/clients/index.ts b/packages/indexer/src/utils/clients/index.ts new file mode 100644 index 00000000..8dc8e027 --- /dev/null +++ b/packages/indexer/src/utils/clients/index.ts @@ -0,0 +1 @@ +export { SpokePoolClient } from "./SpokePoolClient"; diff --git a/packages/indexer/src/utils/contractFactoryUtils.ts b/packages/indexer/src/utils/contractFactoryUtils.ts index 6788c722..fcc964ce 100644 --- a/packages/indexer/src/utils/contractFactoryUtils.ts +++ b/packages/indexer/src/utils/contractFactoryUtils.ts @@ -1,5 +1,5 @@ import { CHAIN_IDs } from "@across-protocol/constants"; -import { clients } from "@across-protocol/sdk"; +import { clients, providers } from "@across-protocol/sdk"; import { Logger } from "winston"; import { getMaxBlockLookBack } from "../web3/constants"; import { RetryProvidersFactory } from "../web3/RetryProvidersFactory"; @@ -51,7 +51,9 @@ export class ConfigStoreClientFactory extends ContractClientFactory= 0 && utcHour < 3 ? 2 : 1; + return DateTime.fromJSDate(now).minus({ days: daysToSubtract }).toJSDate(); +} + +export type TokenInfo = { + name: string; + symbol: string; + decimals: number; + addresses: Record; + coingeckoId: string; +}; +export type Token = { + name: string; + symbol: string; + decimals: number; + address: string; + chainId: number; + coingeckoId: string; +}; +// mapping the token constants to something easier to search +export const tokenSymbolsMap = [ + ...Object.values(constants.TOKEN_SYMBOLS_MAP), +] as TokenInfo[]; +// map to just a flat list +export const tokensList = tokenSymbolsMap.reduce((result, token) => { + Object.entries(token.addresses).forEach(([chainId, address]) => { + result.push({ + name: token.name, + symbol: token.symbol, + decimals: token.decimals, + chainId: Number(chainId), + address: address, + coingeckoId: token.coingeckoId, + }); + }); + return result; +}, [] as Token[]); + +// given an address and chain id, return the token data +export function findTokenByAddress(address: string, chainId: number) { + const result = tokensList.find( + (token) => + token.address.toLowerCase() === address.toLowerCase() && + token.chainId === chainId, + ); + + return result; +} diff --git a/packages/indexer/src/utils/index.ts b/packages/indexer/src/utils/index.ts index 1faf5dc2..6cb2d1a9 100644 --- a/packages/indexer/src/utils/index.ts +++ b/packages/indexer/src/utils/index.ts @@ -2,3 +2,4 @@ export * from "./contractUtils"; export * from "./contractFactoryUtils"; export * from "./bundleBuilderUtils"; export * from "./spokePoolUtils"; +export * from "./currencyUtils"; diff --git a/packages/indexer/src/utils/spokePoolUtils.ts b/packages/indexer/src/utils/spokePoolUtils.ts index c03f0157..198ec088 100644 --- a/packages/indexer/src/utils/spokePoolUtils.ts +++ b/packages/indexer/src/utils/spokePoolUtils.ts @@ -1,4 +1,6 @@ import { interfaces, providers } from "@across-protocol/sdk"; +import { utils as ethersUtils } from "ethers"; +import { SvmProvider } from "../web3/RetryProvidersFactory"; export type V3FundsDepositedWithIntegradorId = interfaces.DepositWithBlock & { integratorId?: string | undefined; @@ -37,3 +39,68 @@ export async function getIntegratorId( } return integratorId; } + +export async function getSvmIntegratorId( + provider: SvmProvider, + txnRef: any, // TODO: fix, should be Signature +) { + const INTEGRATOR_DELIMITER = "1dc0de"; + const INTEGRATOR_ID_LENGTH = 4; // Integrator ids are 4 characters long + const txn = await provider + .getTransaction(txnRef, { + maxSupportedTransactionVersion: 0, + }) + .send(); + const txnLogs = txn?.meta?.logMessages; + const integratorIdLog = txnLogs?.find((log) => + log.includes(INTEGRATOR_DELIMITER), + ); + const integratorId = integratorIdLog + ?.split(INTEGRATOR_DELIMITER) + .pop() + ?.substring(0, INTEGRATOR_ID_LENGTH); + return integratorId; +} + +export function getInternalHash( + relayData: Omit, + messageHash: string, + destinationChainId: number, +): string { + const _relayData = { + originChainId: relayData.originChainId, + depositId: relayData.depositId, + inputAmount: relayData.inputAmount, + outputAmount: relayData.outputAmount, + messageHash: messageHash, + fillDeadline: relayData.fillDeadline, + exclusivityDeadline: relayData.exclusivityDeadline, + depositor: ethersUtils.hexZeroPad(relayData.depositor, 32), + recipient: ethersUtils.hexZeroPad(relayData.recipient, 32), + inputToken: ethersUtils.hexZeroPad(relayData.inputToken, 32), + outputToken: ethersUtils.hexZeroPad(relayData.outputToken, 32), + exclusiveRelayer: ethersUtils.hexZeroPad(relayData.exclusiveRelayer, 32), + }; + return ethersUtils.keccak256( + ethersUtils.defaultAbiCoder.encode( + [ + "tuple(" + + "bytes32 depositor," + + "bytes32 recipient," + + "bytes32 exclusiveRelayer," + + "bytes32 inputToken," + + "bytes32 outputToken," + + "uint256 inputAmount," + + "uint256 outputAmount," + + "uint256 originChainId," + + "uint256 depositId," + + "uint32 fillDeadline," + + "uint32 exclusivityDeadline," + + "bytes messageHash" + + ")", + "uint256 destinationChainId", + ], + [_relayData, destinationChainId], + ), + ); +} diff --git a/packages/indexer/src/web3/EventDecoder.ts b/packages/indexer/src/web3/EventDecoder.ts new file mode 100644 index 00000000..7d94ec90 --- /dev/null +++ b/packages/indexer/src/web3/EventDecoder.ts @@ -0,0 +1,48 @@ +import { ethers } from "ethers"; +import { SwapBeforeBridgeEvent } from "./model/events"; +import { SwapAndBridgeBase__factory } from "@across-protocol/contracts"; + +export class EventDecoder { + static decodeSwapBeforeBridgeEvents( + receipt: ethers.providers.TransactionReceipt, + ) { + const swapBeforeBridgeEventTopic = + "0x646284e396b68ff4b4f34e0aa97bcdb9c100f5b44a20da5c475f627039853841"; + const events: SwapBeforeBridgeEvent[] = this.decodeTransactionReceiptLogs( + receipt, + swapBeforeBridgeEventTopic, + SwapAndBridgeBase__factory.abi, + ); + + return events; + } + + static decodeTransactionReceiptLogs( + receipt: ethers.providers.TransactionReceipt, + eventTopic: string, + abi: any, + ) { + const events: (ethers.providers.Log & { args: any })[] = []; + + for (const log of receipt.logs) { + const contractInterface = new ethers.utils.Interface(abi); + + if (log.topics.length === 0) continue; + + try { + const parsedLog = contractInterface.parseLog(log); + if (parsedLog && log.topics[0] === eventTopic) { + events.push({ ...log, args: parsedLog.args }); + } + } catch (e: any) { + if (e.reason === "no matching event" && e.code === "INVALID_ARGUMENT") { + continue; + } else { + throw e; + } + } + } + + return events; + } +} diff --git a/packages/indexer/src/web3/RetryProvidersFactory.ts b/packages/indexer/src/web3/RetryProvidersFactory.ts index 9c37a895..188c425f 100644 --- a/packages/indexer/src/web3/RetryProvidersFactory.ts +++ b/packages/indexer/src/web3/RetryProvidersFactory.ts @@ -1,12 +1,24 @@ import { Logger } from "winston"; -import { providers } from "@across-protocol/sdk"; +import { PUBLIC_NETWORKS } from "@across-protocol/constants"; +import { providers, utils } from "@across-protocol/sdk"; -import { parseRetryProviderEnvs, parseProvidersUrls } from "../parseEnv"; +import { + parseRetryProviderEnvs, + parseProvidersUrls, + RetryProviderConfig, +} from "../parseEnv"; import { RedisCache } from "../redis/redisCache"; import { getChainCacheFollowDistance } from "./constants"; +// SVM provider helper type. +// TODO: move to SDK. +export type SvmProvider = ReturnType< + typeof providers.CachedSolanaRpcFactory.prototype.createRpcClient +>; + export class RetryProvidersFactory { - private retryProviders: Map = new Map(); + private retryProviders: Map = + new Map(); constructor( private redisCache: RedisCache, @@ -22,27 +34,73 @@ export class RetryProvidersFactory { throw new Error(`Invalid provider urls found for chainId: ${chainId}`); } const standardTtlBlockDistance = getChainCacheFollowDistance(chainId); - const provider = new providers.RetryProvider( - providerUrls.map((url) => [url, chainId]), - chainId, - retryProviderEnvs.nodeQuorumThreshold, - retryProviderEnvs.retries, - retryProviderEnvs.retryDelay, - retryProviderEnvs.maxConcurrency, - retryProviderEnvs.providerCacheNamespace, - retryProviderEnvs.pctRpcCallsLogged, - this.redisCache, - standardTtlBlockDistance, - retryProviderEnvs.noTtlBlockDistance, - retryProviderEnvs.providerCacheTtl, - this.logger, - ); + let provider; + if (utils.chainIsSvm(chainId)) { + provider = this.instantiateSvmProvider( + chainId, + retryProviderEnvs, + providerUrls, + ); + } else if (utils.chainIsEvm(chainId)) { + provider = this.instantiateEvmProvider( + chainId, + { ...retryProviderEnvs, standardTtlBlockDistance }, + providerUrls, + ); + } else { + const chainFamily = PUBLIC_NETWORKS[chainId]?.family; + throw new Error( + `Invalid chainId ${chainId}. Chain family ${chainFamily} not supported.`, + ); + } + this.retryProviders.set(chainId, provider); } return this; } - public getProviderForChainId(chainId: number) { + private instantiateSvmProvider( + chainId: number, + providerEnvs: RetryProviderConfig, + providerUrls: string[], + ): SvmProvider { + const rpcFactory = new providers.CachedSolanaRpcFactory( + providerEnvs.providerCacheNamespace, + this.redisCache, + providerEnvs.maxConcurrency, + providerEnvs.pctRpcCallsLogged, + this.logger, + providerUrls[0]!, + chainId, + ); + return rpcFactory.createRpcClient(); + } + + private instantiateEvmProvider( + chainId: number, + providerEnvs: RetryProviderConfig, + providerUrls: string[], + ): providers.RetryProvider { + return new providers.RetryProvider( + providerUrls.map((url) => [url, chainId]), + chainId, + providerEnvs.nodeQuorumThreshold, + providerEnvs.retries, + providerEnvs.retryDelay, + providerEnvs.maxConcurrency, + providerEnvs.providerCacheNamespace, + providerEnvs.pctRpcCallsLogged, + this.redisCache, + providerEnvs.standardTtlBlockDistance, + providerEnvs.noTtlBlockDistance, + providerEnvs.providerCacheTtl, + this.logger, + ); + } + + public getProviderForChainId( + chainId: number, + ): SvmProvider | providers.RetryProvider { const retryProvider = this.retryProviders.get(chainId); if (!retryProvider) { @@ -51,4 +109,54 @@ export class RetryProvidersFactory { return retryProvider; } + + // TODO: This will need to be updated to support custom SVM providers too. + /** + * Get a custom EVM provider for a given chainId. This is useful for testing + * for situations where you need a provider with different settings than the + * default ones. + */ + public getCustomEvmProvider({ + chainId, + enableCaching = true, + }: { + chainId: number; + enableCaching: boolean; + }): providers.RetryProvider { + const providerUrls = parseProvidersUrls().get(chainId); + + if (!providerUrls || providerUrls.length === 0) { + throw new Error(`No provider urls found for chainId: ${chainId}`); + } + const retryProviderEnvs = parseRetryProviderEnvs(chainId); + + let redisCache; + let standardTtlBlockDistance; + let noTtlBlockDistance; + let providerCacheTtl; + + // Caching is enabled by overriding the undefined values + if (enableCaching) { + redisCache = this.redisCache; + standardTtlBlockDistance = getChainCacheFollowDistance(chainId); + noTtlBlockDistance = retryProviderEnvs.noTtlBlockDistance; + providerCacheTtl = retryProviderEnvs.providerCacheTtl; + } + + return new providers.RetryProvider( + providerUrls.map((url) => [url, chainId]), + chainId, + retryProviderEnvs.nodeQuorumThreshold, + retryProviderEnvs.retries, + retryProviderEnvs.retryDelay, + retryProviderEnvs.maxConcurrency, + retryProviderEnvs.providerCacheNamespace, + retryProviderEnvs.pctRpcCallsLogged, + redisCache, + standardTtlBlockDistance, + noTtlBlockDistance, + providerCacheTtl, + this.logger, + ); + } } diff --git a/packages/indexer/src/web3/constants.ts b/packages/indexer/src/web3/constants.ts index feb42838..4cbe20b5 100644 --- a/packages/indexer/src/web3/constants.ts +++ b/packages/indexer/src/web3/constants.ts @@ -10,6 +10,7 @@ const DEFAULT_NO_TTL_DISTANCE: { [chainId: number]: number } = { [CHAIN_IDs.BLAST]: 86400, [CHAIN_IDs.BOBA]: 86400, [CHAIN_IDs.INK]: 86400, + [CHAIN_IDs.LENS]: 172800, [CHAIN_IDs.LINEA]: 57600, [CHAIN_IDs.LISK]: 86400, [CHAIN_IDs.MAINNET]: 14400, @@ -17,19 +18,23 @@ const DEFAULT_NO_TTL_DISTANCE: { [chainId: number]: number } = { [CHAIN_IDs.OPTIMISM]: 86400, [CHAIN_IDs.POLYGON]: 86400, [CHAIN_IDs.REDSTONE]: 86400, + [CHAIN_IDs.SOLANA]: 432000, [CHAIN_IDs.SCROLL]: 57600, + [CHAIN_IDs.SONEIUM]: 86400, + [CHAIN_IDs.UNICHAIN]: 86400, + [CHAIN_IDs.WORLD_CHAIN]: 86400, [CHAIN_IDs.ZK_SYNC]: 172800, [CHAIN_IDs.ZORA]: 86400, - [CHAIN_IDs.WORLD_CHAIN]: 86400, + // Testnets: + [CHAIN_IDs.SOLANA_DEVNET]: 432000, }; export function getNoTtlBlockDistance(chainId: number) { - return 1_000_000_000_000; - // const noTtlBlockDistance = DEFAULT_NO_TTL_DISTANCE[chainId]; - // if (!noTtlBlockDistance) { - // throw new Error(`No noTtlBlockDistance found for chainId: ${chainId}`); - // } - // return noTtlBlockDistance; + const noTtlBlockDistance = DEFAULT_NO_TTL_DISTANCE[chainId]; + if (!noTtlBlockDistance) { + throw new Error(`No noTtlBlockDistance found for chainId: ${chainId}`); + } + return noTtlBlockDistance; } // This is the max anticipated distance on each chain before RPC data is likely to be consistent amongst providers. @@ -43,6 +48,7 @@ export const CHAIN_CACHE_FOLLOW_DISTANCE: { [chainId: number]: number } = { [CHAIN_IDs.BLAST]: 120, [CHAIN_IDs.BOBA]: 0, [CHAIN_IDs.INK]: 120, + [CHAIN_IDs.LENS]: 512, [CHAIN_IDs.LISK]: 120, [CHAIN_IDs.LINEA]: 100, // Linea has a soft-finality of 1 block. This value is padded - but at 3s/block the padding is 5 minutes [CHAIN_IDs.MAINNET]: 128, @@ -51,9 +57,12 @@ export const CHAIN_CACHE_FOLLOW_DISTANCE: { [chainId: number]: number } = { [CHAIN_IDs.POLYGON]: 256, [CHAIN_IDs.REDSTONE]: 120, [CHAIN_IDs.SCROLL]: 100, + [CHAIN_IDs.SOLANA]: 80, + [CHAIN_IDs.SONEIUM]: 120, + [CHAIN_IDs.UNICHAIN]: 120, + [CHAIN_IDs.WORLD_CHAIN]: 120, [CHAIN_IDs.ZK_SYNC]: 512, [CHAIN_IDs.ZORA]: 120, - [CHAIN_IDs.WORLD_CHAIN]: 120, // Testnets: [CHAIN_IDs.ARBITRUM_SEPOLIA]: 0, @@ -64,6 +73,7 @@ export const CHAIN_CACHE_FOLLOW_DISTANCE: { [chainId: number]: number } = { [CHAIN_IDs.OPTIMISM_SEPOLIA]: 0, [CHAIN_IDs.POLYGON_AMOY]: 0, [CHAIN_IDs.SEPOLIA]: 0, + [CHAIN_IDs.SOLANA_DEVNET]: 80, }; export const getChainCacheFollowDistance = (chainId: number) => { @@ -76,24 +86,13 @@ export const getChainCacheFollowDistance = (chainId: number) => { return chainCacheFollowDistance; }; +// Default is 10K, add only needed overrides const MAX_BLOCK_LOOK_BACK = { - [CHAIN_IDs.MAINNET]: 5000, - [CHAIN_IDs.OPTIMISM]: 10000, - [CHAIN_IDs.POLYGON]: 10000, [CHAIN_IDs.BOBA]: 4990, - [CHAIN_IDs.INK]: 10000, - [CHAIN_IDs.ZK_SYNC]: 10000, - [CHAIN_IDs.REDSTONE]: 500, // TODO: Update when Quicknode is enable as a provider - [CHAIN_IDs.LISK]: 10000, - [CHAIN_IDs.BASE]: 10000, - [CHAIN_IDs.MODE]: 10000, - [CHAIN_IDs.ALEPH_ZERO]: 10000, - [CHAIN_IDs.ARBITRUM]: 10000, [CHAIN_IDs.LINEA]: 5000, - [CHAIN_IDs.BLAST]: 10000, + [CHAIN_IDs.MAINNET]: 7000, + [CHAIN_IDs.REDSTONE]: 9000, [CHAIN_IDs.SCROLL]: 3000, - [CHAIN_IDs.ZORA]: 10000, - [CHAIN_IDs.WORLD_CHAIN]: 10000, }; /** @@ -113,12 +112,14 @@ export function getMaxBlockLookBack(chainId: number) { // Average block time in seconds by chain export const BLOCK_TIME_SECONDS: { [chainId: number]: number } = { + // Mainnets [CHAIN_IDs.ALEPH_ZERO]: 2, [CHAIN_IDs.ARBITRUM]: 0.25, [CHAIN_IDs.BASE]: 2, [CHAIN_IDs.BLAST]: 2, [CHAIN_IDs.BOBA]: 2, [CHAIN_IDs.INK]: 1, + [CHAIN_IDs.LENS]: 600, // TODO: Update to 1 when Lens go live [CHAIN_IDs.LINEA]: 3, [CHAIN_IDs.LISK]: 2, [CHAIN_IDs.MAINNET]: 12, @@ -127,9 +128,14 @@ export const BLOCK_TIME_SECONDS: { [chainId: number]: number } = { [CHAIN_IDs.POLYGON]: 2, [CHAIN_IDs.REDSTONE]: 2, [CHAIN_IDs.SCROLL]: 3, + [CHAIN_IDs.SOLANA]: 0.4, + [CHAIN_IDs.SONEIUM]: 2, + [CHAIN_IDs.UNICHAIN]: 2, [CHAIN_IDs.WORLD_CHAIN]: 2, [CHAIN_IDs.ZK_SYNC]: 1, [CHAIN_IDs.ZORA]: 2, + // Testnets: + [CHAIN_IDs.SOLANA_DEVNET]: 0.4, }; /** diff --git a/packages/indexer/src/web3/model/events.ts b/packages/indexer/src/web3/model/events.ts new file mode 100644 index 00000000..d6fe2e94 --- /dev/null +++ b/packages/indexer/src/web3/model/events.ts @@ -0,0 +1,13 @@ +import { BigNumber, providers } from "ethers"; + +export interface SwapBeforeBridgeEvent extends providers.Log { + args: { + swapToken: string; + acrossInputToken: string; + acrossOutputToken: string; + swapTokenAmount: BigNumber; + acrossInputAmount: BigNumber; + acrossOutputAmount: BigNumber; + exchange: string; + }; +} diff --git a/packages/webhooks/src/eventProcessors/depositStatus.ts b/packages/webhooks/src/eventProcessors/depositStatus.ts index a9459740..b75d28f0 100644 --- a/packages/webhooks/src/eventProcessors/depositStatus.ts +++ b/packages/webhooks/src/eventProcessors/depositStatus.ts @@ -13,7 +13,7 @@ import { WebhookClientRepository } from "../database/webhookClientRepository"; export const DepositStatusEvent = ss.object({ originChainId: ss.number(), depositTxHash: ss.string(), - depositId: ss.number(), + depositId: ss.string(), status: ss.string(), }); export type DepositStatusEvent = ss.Infer; @@ -61,7 +61,9 @@ export class DepositStatusProcessor implements IEventProcessor { ), ); const clientsMap = clients - .filter((client) => client !== undefined) + .filter( + (client): client is entities.WebhookClient => client !== undefined, + ) .reduce( (acc, client) => { acc[client.id] = client; @@ -76,7 +78,14 @@ export class DepositStatusProcessor implements IEventProcessor { if (client) { this.notify({ url: hook.url, - data: { ...event, webhookRequestId: hook.id }, + data: { + ...event, + depositId: + typeof event.depositId === "string" + ? parseInt(event.depositId) + : event.depositId, + webhookRequestId: hook.id, + }, apiKey: client.apiKey, }); } else { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a874890..80b7ce1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,32 +146,38 @@ importers: packages/indexer: dependencies: '@across-protocol/constants': - specifier: ^3.1.25 - version: 3.1.25 + specifier: ^3.1.44 + version: 3.1.44 '@across-protocol/contracts': - specifier: ^3.0.19 - version: 3.0.19(@babel/core@7.25.2)(@ethersproject/abi@5.7.0)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + specifier: ^4.0.4 + version: 4.0.4(@babel/core@7.25.2)(@ethersproject/abi@5.8.0)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@across-protocol/sdk': - specifier: ^3.3.23 - version: 3.3.23(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/abi@5.7.0)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + specifier: ^4.1.30 + version: 4.1.30(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/abi@5.8.0)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@repo/error-handling': specifier: workspace:* version: link:../error-handling '@repo/webhooks': specifier: workspace:* version: link:../webhooks + '@solana/kit': + specifier: ^2.1.0 + version: 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@types/express': specifier: ^4.17.21 version: 4.17.21 '@types/lodash': specifier: ^4.17.7 version: 4.17.7 + '@types/luxon': + specifier: ^3.4.2 + version: 3.4.2 bullmq: specifier: ^5.12.12 version: 5.12.14 ethers: - specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^5.8.0 + version: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) express: specifier: ^4.19.2 version: 4.21.1 @@ -184,6 +190,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.21 + luxon: + specifier: ^3.5.0 + version: 3.5.0 redis: specifier: ^4.7.0 version: 4.7.0 @@ -215,6 +224,9 @@ importers: chai: specifier: ^4.5.0 version: 4.5.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -263,6 +275,9 @@ importers: cors: specifier: ^2.8.5 version: 2.8.5 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 ejs: specifier: ^3.1.10 version: 3.1.10 @@ -331,8 +346,8 @@ importers: packages/indexer-database: dependencies: '@across-protocol/sdk': - specifier: ^3.3.23 - version: 3.3.23(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + specifier: ^4.1.30 + version: 4.1.30(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) pg: specifier: ^8.4.0 version: 8.12.0 @@ -594,21 +609,21 @@ packages: '@across-protocol/across-token@1.0.0': resolution: {integrity: sha512-QbbrIR5TGmEgkTF13dVy9oTDMV/7Ji1Fcx91nYHDuxUYvHacZ43Se3UlG4Xp8eKRAZtm8hYi0rm0WjrH7Nfl7g==} - '@across-protocol/constants@3.1.25': - resolution: {integrity: sha512-GpZoYn7hETYL2BPMM2GqXAer6+l/xuhder+pvpb00HJcb/sqCjF7vaaeKxjKJ3jKtyeulYmdu0NDkeNm5KbNWA==} + '@across-protocol/constants@3.1.44': + resolution: {integrity: sha512-0a1fW4Ca/gbfXMyvAmU+olOcc1GcilOojP7eEudWAIxw3Gp69a87g0VuV72NN4A1sl45npZ1DrOXLsLWEQkU6g==} '@across-protocol/contracts@0.1.4': resolution: {integrity: sha512-y9FVRSFdPgEdGWBcf8rUmmzdYhzGdy0752HwpaAFtMJ1pn+HFgNaI0EZc/UudMKIPOkk+/BxPIHYPy7tKad5/A==} - '@across-protocol/contracts@3.0.19': - resolution: {integrity: sha512-9GjKKF8SHGKP9FGhawHzLZ8sfBVFUICd+Bn1pn3SFuh0p+ndQIayG+QEYRKGFUXVPV6+XXLve750PQ1Hu7dIEg==} + '@across-protocol/contracts@4.0.4': + resolution: {integrity: sha512-1LJXlwZth9psv3/Kgxbq8lzZ1B2Pan2zjaiE+4ma7mH43Wr0/dbVIp4BQQFXHLxY3JujIhn0LsemQAau+2zLAQ==} engines: {node: '>=16.18.0'} peerDependencies: buffer-layout: ^1.2.2 - '@across-protocol/sdk@3.3.23': - resolution: {integrity: sha512-1AVVE8Z3rCjPDu/HAqAe2sErQXm+vbBz7VuVZPVmzdlLAHKAaAFOqtmWUNJg3iPYAkfAAjfoykBT48APDWRkfg==} - engines: {node: '>=16.18.0'} + '@across-protocol/sdk@4.1.30': + resolution: {integrity: sha512-k25lbmdstgcfVaEJ6ArFXfEhGliu7PRR8xOH5Wl/dAH96tjb9P+9IBJClHo7IrayzW9KIL64KnkmH1lXah6/7A==} + engines: {node: '>=20.18.0'} '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} @@ -629,10 +644,6 @@ packages: resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} - engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} @@ -648,18 +659,14 @@ packages: resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.26.10': + resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-define-polyfill-provider@0.6.3': resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: @@ -679,8 +686,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} '@babel/helper-simple-access@7.24.7': @@ -707,10 +714,6 @@ packages: resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} @@ -724,51 +727,47 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-runtime@7.25.9': - resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==} + '@babel/plugin-transform-runtime@7.26.10': + resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.20.13': - resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.25.7': - resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} '@babel/traverse@7.25.3': resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/traverse@7.26.10': + resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} engines: {node: '>=6.9.0'} '@babel/types@7.25.2': resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} '@colors/colors@1.6.0': @@ -885,8 +884,8 @@ packages: '@eth-optimism/core-utils@0.7.7': resolution: {integrity: sha512-JO3UvrlnOpeCKzDd/9mCd47n1FFjTOJtfG1JxUx24OfC/0yjZv6sKXDoMlZoDJArTQtCyyZ9QB7vulSFjOC6rA==} - '@eth-optimism/sdk@3.3.2': - resolution: {integrity: sha512-+zhxT0YkBIEzHsuIayQGjr8g9NawZo6/HYfzg1NSEFsE2Yt0NyCWqVDFTuuak0T6AvIa2kNcl3r0Z8drdb2QmQ==} + '@eth-optimism/sdk@3.3.3': + resolution: {integrity: sha512-I8xjchsZL6L66N/0Q14QvGZpsIiVfpuXBu+OX4HB3HXGvF7NQxXSRfOXzrQKj3ikhoJUpASsR4gL/yQsH+Vh3Q==} peerDependencies: ethers: ^5 @@ -914,96 +913,186 @@ packages: '@ethersproject/abi@5.7.0': resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + '@ethersproject/abstract-provider@5.7.0': resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + '@ethersproject/abstract-signer@5.7.0': resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + '@ethersproject/address@5.7.0': resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + '@ethersproject/base64@5.7.0': resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + '@ethersproject/basex@5.7.0': resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + '@ethersproject/bignumber@5.7.0': resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + '@ethersproject/bytes@5.7.0': resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + '@ethersproject/constants@5.7.0': resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + '@ethersproject/contracts@5.7.0': resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - '@ethersproject/hardware-wallets@5.7.0': - resolution: {integrity: sha512-DjMMXIisRc8xFvEoLoYz1w7JDOYmaz/a0X9sp7Zu668RR8U1zCAyj5ow25HLRW+TCzEC5XiFetTXqS5kXonFCQ==} + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + + '@ethersproject/hardware-wallets@5.8.0': + resolution: {integrity: sha512-bsGrIs3CnsphjB+0/8bcoBm3ttJInUTSC1f2bA5Gjf8KPyA1DlIAr3x/RKQdg0a0EWygtY9HNRJgosec5mvZ7Q==} '@ethersproject/hash@5.7.0': resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + '@ethersproject/hdnode@5.7.0': resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + '@ethersproject/json-wallets@5.7.0': resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + '@ethersproject/keccak256@5.7.0': resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + '@ethersproject/logger@5.7.0': resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + '@ethersproject/networks@5.7.1': resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + '@ethersproject/pbkdf2@5.7.0': resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + '@ethersproject/properties@5.7.0': resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + '@ethersproject/providers@5.7.2': resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + '@ethersproject/random@5.7.0': resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + '@ethersproject/rlp@5.7.0': resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + '@ethersproject/sha2@5.7.0': resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + '@ethersproject/signing-key@5.7.0': resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + '@ethersproject/solidity@5.7.0': resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + '@ethersproject/strings@5.7.0': resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + '@ethersproject/transactions@5.7.0': resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + '@ethersproject/units@5.7.0': resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + '@ethersproject/wallet@5.7.0': resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + '@ethersproject/web@5.7.1': resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -1063,9 +1152,9 @@ packages: resolution: {integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==} engines: {node: '>=12'} - '@google-cloud/promisify@4.0.0': - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} + '@google-cloud/promisify@4.1.0': + resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==} + engines: {node: '>=18'} '@google-cloud/storage@6.12.0': resolution: {integrity: sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==} @@ -1075,8 +1164,8 @@ packages: resolution: {integrity: sha512-TLZwbR9WYx/wNhJv6PcbKEuHZpArUG1WtaPLwjxRJeTVNDV2gOsDVDihbezCyyOcHxU3kXCewB5y2BA1pP0mIg==} engines: {node: '>=10'} - '@grpc/grpc-js@1.11.3': - resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + '@grpc/grpc-js@1.13.0': + resolution: {integrity: sha512-pMuxInZjUnUkgMT2QLZclRqwk2ykJbIU05aZgPgJYXEpN9+2I7z7aNwcjWZSycRPl232FfhPszyBFJyOxTHNog==} engines: {node: '>=12.10.0'} '@grpc/grpc-js@1.6.12': @@ -1117,6 +1206,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1155,8 +1248,8 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@jsdoc/salty@0.2.8': - resolution: {integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==} + '@jsdoc/salty@0.2.9': + resolution: {integrity: sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==} engines: {node: '>=v12.0.0'} '@ledgerhq/cryptoassets@5.53.0': @@ -1233,17 +1326,14 @@ packages: cpu: [x64] os: [win32] - '@multiformats/base-x@4.0.1': - resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - '@noble/curves@1.6.0': - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.2.0': @@ -1253,8 +1343,8 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} '@noble/secp256k1@1.7.1': @@ -1272,36 +1362,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.6.2': - resolution: {integrity: sha512-o4A9SaPlxJ1MS6u8Ozqq7Y0ri2XO0jASw+qkytQyBYowNFNReoGqVSs7SCwenYCDiN+1il8+M0VAUq7wOovnCQ==} + '@nomicfoundation/edr-darwin-arm64@0.8.0': + resolution: {integrity: sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.6.2': - resolution: {integrity: sha512-WG8BeG2eR3rFC+2/9V1hoPGW7tmNRUcuztdHUijO1h2flRsf2YWv+kEHO+EEnhGkEbgBUiwOrwlwlSMxhe2cGA==} + '@nomicfoundation/edr-darwin-x64@0.8.0': + resolution: {integrity: sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.6.2': - resolution: {integrity: sha512-wvHaTmOwuPjRIOqBB+paI3RBdNlG8f3e1F2zWj75EdeWwefimPzzFUs05JxOYuPO0JhDQIn2tbYUgdZbBQ+mqg==} + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': + resolution: {integrity: sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.6.2': - resolution: {integrity: sha512-UrOAxnsywUcEngQM2ZxIuucci0VX29hYxX7jcpwZU50HICCjxNsxnuXYPxv+IM+6gbhBY1FYvYJGW4PJcP1Nyw==} + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': + resolution: {integrity: sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.6.2': - resolution: {integrity: sha512-gYxlPLi7fkNcmDmCwZWQa5eOfNcTDundE+TWjpyafxLAjodQuKBD4I0p4XbnuocHjoBEeNzLWdE5RShbZEXEJA==} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': + resolution: {integrity: sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.6.2': - resolution: {integrity: sha512-ev5hy9wmiHZi1GKQ1l6PJ2+UpsUh+DvK9AwiCZVEdaicuhmTfO6fdL4szgE4An8RU+Ou9DeiI1tZcq6iw++Wuw==} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': + resolution: {integrity: sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.6.2': - resolution: {integrity: sha512-2ZXVVcmdmEeX0Hb3IAurHUjgU3H1GIk9h7Okosdjgl3tl+BaNHxi84Us+DblynO1LRj8nL/ATeVtSfBuW3Z1vw==} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': + resolution: {integrity: sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.6.2': - resolution: {integrity: sha512-yPUegN3sTWiAkRatCmGRkuvMgD9HSSpivl2ebAqq0aU2xgC7qmIO+YQPxQ3Z46MUoi7MrTf4e6GpbT4S/8x0ew==} + '@nomicfoundation/edr@0.8.0': + resolution: {integrity: sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==} engines: {node: '>= 18'} '@nomicfoundation/ethereumjs-common@4.0.4': @@ -1373,12 +1463,20 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 - '@nomiclabs/hardhat-web3@2.0.0': - resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} + '@nomiclabs/hardhat-web3@2.0.1': + resolution: {integrity: sha512-PfIiMUL5xWpkkt1Gvfb8qJ4DUtqU++rTh/B/80aONwTniSoT12YlXQukdZoHGlpD1IBEG9y4+0OULRnWz5ywLQ==} peerDependencies: hardhat: ^2.0.0 web3: ^1.0.0-beta.36 + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@opencensus/core@0.1.0': resolution: {integrity: sha512-Bdbi5vi44a1fwyHNyKh6bwzuFZJeZJPhzdwogk/Kw5juoEeRGPworK1sgtB3loeR8cqLyi5us0mz9h0xqINiSQ==} engines: {node: '>=8'} @@ -1404,6 +1502,7 @@ packages: '@pinata/sdk@2.1.0': resolution: {integrity: sha512-hkS0tcKtsjf9xhsEBs2Nbey5s+Db7x5rlOH9TaWHBXkJ7IwwOs2xnEDigNaxAHKjYAwcw+m2hzpO5QgOfeF7Zw==} + deprecated: Please install the new IPFS SDK at pinata-web3. More information at https://docs.pinata.cloud/web3/sdk '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -1493,8 +1592,8 @@ packages: '@scure/base@1.1.7': resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} - '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + '@scure/base@1.2.4': + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -1502,8 +1601,8 @@ packages: '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - '@scure/bip32@1.5.0': - resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -1511,8 +1610,8 @@ packages: '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - '@scure/bip39@1.4.0': - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -1550,8 +1649,31 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@solana-developers/helpers@2.5.6': - resolution: {integrity: sha512-NPWZblVMl4LuVVSJOZG0ZF0VYnrMUjCyMNTiGwNUXPK2WWYJCqpuDyzs/PMqwvM4gMTjk4pEToBX8N2UxDvZkQ==} + '@solana-developers/helpers@2.8.0': + resolution: {integrity: sha512-K3SjX3f0NbCGBcbN40vIMfTicYFNj8bkImcF32JxiR1YmsXu2scb3449bG1CRk/5JBSA0pP4p+lhGU1nc2mEVg==} + + '@solana-program/token@0.5.1': + resolution: {integrity: sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana/accounts@2.1.0': + resolution: {integrity: sha512-1JOBiLFeIeHmGx7k1b23UWF9vM1HAh9GBMCzr5rBPrGSBs+QUgxBJ3+yrRg+UPEOSELubqo7qoOVFUKYsb1nXw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/addresses@2.1.0': + resolution: {integrity: sha512-IgiRuju2yLz14GnrysOPSNZbZQ8F+7jhx7FYZLrbKogf6NX4wy4ijLHxRsLFqP8o8aY69BZULkM9MwrSjsZi7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/assertions@2.1.0': + resolution: {integrity: sha512-KCYmxFRsg897Ec7yGdpc0rniOlqGD3NpicmIjWIV87uiXX5uFco4t+01sKyFlhsv4T4OgHxngMsxkfQ3AUkFVg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' '@solana/buffer-layout-utils@0.2.0': resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} @@ -1566,38 +1688,203 @@ packages: peerDependencies: typescript: '>=5' + '@solana/codecs-core@2.1.0': + resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/codecs-data-structures@2.0.0-rc.1': resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} peerDependencies: typescript: '>=5' + '@solana/codecs-data-structures@2.1.0': + resolution: {integrity: sha512-oDF5ek54kirqJ09q8k/qEpobBiWOhd3CkkGOTyfjsmTF/IGIigNbdYIakxV3+vudBeaNBw08y0XdBYI4JL/nqA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/codecs-numbers@2.0.0-rc.1': resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} peerDependencies: typescript: '>=5' + '@solana/codecs-numbers@2.1.0': + resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/codecs-strings@2.0.0-rc.1': resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5' + '@solana/codecs-strings@2.1.0': + resolution: {integrity: sha512-O/eJFLzFrHomcCR1Y5QbIqoPo7iaJaWNnIeskB4mVhVjLyjlJS4WtBP2NBRzM9uJXaXyOxxKroqqO9zFsHOpvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + '@solana/codecs@2.0.0-rc.1': resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} peerDependencies: typescript: '>=5' + '@solana/codecs@2.1.0': + resolution: {integrity: sha512-C0TnfrpbTg7zoIFYfM65ofeL2AWEz80OsD6mjVdcTKpb1Uj7XuBuNLss3dMnatPQaL7RagD9VLA5/WfYayyteQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/errors@2.0.0-rc.1': resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} hasBin: true peerDependencies: typescript: '>=5' + '@solana/errors@2.1.0': + resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5' + + '@solana/fast-stable-stringify@2.1.0': + resolution: {integrity: sha512-a8vR92qbe/VsvQ1BpN3PIEwnoHD2fTHEwCJh9GG58z3R15RIjk73gc0khjcdg4U1tZwTJqWkvk8SbDIgGdOgMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/functional@2.1.0': + resolution: {integrity: sha512-RVij8Av4F2uUOFcEC8n9lgD72e9gQMritmGHhMh+G91Xops4I6Few+oQ++XgSTiL2t3g3Cs0QZ13onZ0FL45FQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/instructions@2.1.0': + resolution: {integrity: sha512-wfn6e7Rgm0Sw/Th1v/pXsKTvloZvAAQI7j1yc9WcIk9ngqH5p6LhqMMkrwYPB2oTk8+MMr7SZ4E+2eK2gL6ODA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/keys@2.1.0': + resolution: {integrity: sha512-esY1+dlZjB18hZML5p+YPec29wi3HH0SzKx7RiqF//dI2cJ6vHfq3F+7ArbNnF6R2YCLFtl7DzS/tkqR2Xkxeg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/kit@2.1.0': + resolution: {integrity: sha512-vqaHROLKp89xdIbaKVG6BQ44uMN9E6/rSTeltkvquD2qdTObssafGDbAKVFjwZhlNO+sdzHDCLekGabn5VAL6A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/options@2.0.0-rc.1': resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} peerDependencies: typescript: '>=5' + '@solana/options@2.1.0': + resolution: {integrity: sha512-T/vJCr8qnwK6HxriOPXCrx31IpA9ZYecxuOzQ3G74kIayED4spmpXp6PLtRYR/fo2LZ6UcgHN0qSgONnvwEweg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/programs@2.1.0': + resolution: {integrity: sha512-9Y30/yUbTR99+QRN2ukNXQQTGY68oKmVrXnh/et6StM1JF5WHvAJqBigsHG5bt6KxTISoRuncBnH/IRnDqPxKg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/promises@2.1.0': + resolution: {integrity: sha512-eQJaQXA2kD4dVyifzhslV3wOvq27fwOJ4az89BQ4Cz83zPbR94xOeDShwcXrKBYqaUf6XqH5MzdEo14t4tKAFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-api@2.1.0': + resolution: {integrity: sha512-4yCnHYHFlz9VffivoY5q/HVeBjT59byB2gmg7UyC3ktxD28AlF9jjsE5tJKiapAKr2J3KWm0D/rH/QwW14cGeA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-parsed-types@2.1.0': + resolution: {integrity: sha512-mRzHemxlWDS9p1fPQNKwL+1vEOUMG8peSUJb0X/NbM12yjowDNdzM++fkOgIyCKDPddfkcoNmNrQmr2jwjdN1Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-spec-types@2.1.0': + resolution: {integrity: sha512-NxcZ8piXMyCdbNUL6d36QJfL2UAQEN33StlGku0ltTVe1nrokZ5WRNjSPohU1fODlNaZzTvUFzvUkM1yGCkyzw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-spec@2.1.0': + resolution: {integrity: sha512-NPAIM5EY7Jke0mHnmoMpgCEb/nZKIo+bgVFK/u+z74gY0JnCNt0DfocStUUQtlhqSmTyoHamt3lfxp4GT2zXbA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-subscriptions-api@2.1.0': + resolution: {integrity: sha512-de1dBRSE2CUwoZHMXQ/0v7iC+/pG0+iYY8jLHGGNxtKrYbTnV08mXQbaAMrmv2Rk8ZFmfJWbqbYZ9dRWdO3P5g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-subscriptions-channel-websocket@2.1.0': + resolution: {integrity: sha512-goJe9dv0cs967HJ382vSX8yapXgQzRHCmH323LsXrrpj/s3Eb3yUwJq7AcHgoh4gKIqyAfGybq/bE5Aa8Pcm9g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + ws: ^8.18.0 + + '@solana/rpc-subscriptions-spec@2.1.0': + resolution: {integrity: sha512-Uqasfd3Tlr22lC/Vy5dToF0e68dMKPdnt4ks7FwXuPdEbNRM/TDGb0GqG+bt/d3IIrNOCA5Y8vsE0nQHGrWG/w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-subscriptions@2.1.0': + resolution: {integrity: sha512-dTyI03VlueE3s7mA/OBlA5l6yKUUKHMJd31tpzxV3AFnqE/QPS5NVrF/WY6pPBobLJiCP0UFOe7eR/MKP9SUCA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-transformers@2.1.0': + resolution: {integrity: sha512-E2xPlaCu6tNO00v4HIJxJCYkoNwgVJYad5sxbIUZOQBWwXnWIcll2jUT4bWKpBGq5vFDYfkzRBr8Rco3DhfXqg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-transport-http@2.1.0': + resolution: {integrity: sha512-E3UovTBid4/S8QDd9FkADVKfyG+v7CW5IqI4c27ZDKfazCsnDLLkqh98C6BvNCqi278HKBui4lI2GoFpCq89Pw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc-types@2.1.0': + resolution: {integrity: sha512-1ODnhmpR1X/GjB7hs4gVR3mcCagfPQV0dzq/2DNuCiMjx2snn64KP5WoAHfBEyoC9/Rb36+JpNj/hLAOikipKA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/rpc@2.1.0': + resolution: {integrity: sha512-myg9qAo6b2WKyHSMXURQykb+ZRnNEXBPLEcwRwkos8STzPPyRFg6ady2s0FCQQTtL/pVjanIU2bObZIzbMGugA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/signers@2.1.0': + resolution: {integrity: sha512-Yq0JdJnCecRsSBshNWy+OIRmAGeVfjwIh9Z+H1jv8u8p+dJCOreKakTWuxMt5tnj3q5K1mPcak9O2PqVPZ0teA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + '@solana/spl-token-group@0.0.7': resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} engines: {node: '>=16'} @@ -1610,14 +1897,44 @@ packages: peerDependencies: '@solana/web3.js': ^1.95.3 - '@solana/spl-token@0.4.9': - resolution: {integrity: sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==} + '@solana/spl-token@0.4.13': + resolution: {integrity: sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w==} engines: {node: '>=16'} peerDependencies: - '@solana/web3.js': ^1.95.3 + '@solana/web3.js': ^1.95.5 + + '@solana/subscribable@2.1.0': + resolution: {integrity: sha512-xi12Cm889+uT5sRKnIzr7nLnHAp3hiR3dqIzrT1P7z7iEGp8OnqUQIQCHlgozFHM2cPW+6685NQXk1l1ImuJIw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/sysvars@2.1.0': + resolution: {integrity: sha512-GXu9yS0zIebmM1Unqw/XFpYuvug03m42w98ioOPV/yiHzECggGRGpHGD9RLVYnkyz0eL4NRbnJ5dAEu/fvGe0A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/transaction-confirmation@2.1.0': + resolution: {integrity: sha512-VxOvtvs2e9h5u73PHyE2TptLAMO5x6dOXlOgvq1Nk6l3rKM2HAsd+KDpN7gjOo8/EgItMMmyEilXygWWRgpSIA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/transaction-messages@2.1.0': + resolution: {integrity: sha512-+GPzZHLYNFbqHKoiL8mYALp7eAXtAbI6zLViZpIM3zUbVNU3q5+FCKGv6jCBnxs+3QCbeapu+W1OyfDa6BUtTQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' + + '@solana/transactions@2.1.0': + resolution: {integrity: sha512-QeM4sCItReeIy5LU7LhGkz7RPfMPTg/Qo8h0LSfhiJiPTOHOhElmh42vkLJmwPl83+MsKtisyPQNK6penM2nAw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5' - '@solana/web3.js@1.95.4': - resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} + '@solana/web3.js@1.98.0': + resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} @@ -1730,10 +2047,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/bignumber.js@5.0.0': - resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} - deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! - '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -1813,15 +2126,15 @@ packages: '@types/lodash@4.17.7': resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} - '@types/lodash@4.17.9': - resolution: {integrity: sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==} - '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -1834,9 +2147,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimatch@3.0.5': - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -2073,20 +2383,14 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@uma/common@2.37.1': - resolution: {integrity: sha512-gUZfpoBJRU4pMHnlNlcxMMRPnBlH/K4cZ8b4R6UewxvUbxbBNktV6KC4A2bkZ0AS9IQRzNGHToZJg//0cbqULw==} - '@uma/common@2.37.3': resolution: {integrity: sha512-DLcM2xtiFWDbty21r2gsL6AJbOc8G/CMqg0iMxssvkKbz8varsWS44zJF85XGxMlY8fE40w0ZS8MR92xpbsu4g==} - '@uma/contracts-frontend@0.4.23': - resolution: {integrity: sha512-x0kS05uIZbpz/DP1TjvYNLR5h/PWNbb5pNa4FisVTmDL5F/FQuLZX7Mf+rh3zBApm37U4NkvrAcIyIQ1eqSGdA==} + '@uma/contracts-frontend@0.4.25': + resolution: {integrity: sha512-LfkMw0lO+H+hUPevoAFogVu5iJTXp+Q2ChddqiynvvrwZ/lrNHrOjj0uEX1winjJXTLFs78jBK1AsIkkYK2VTQ==} - '@uma/contracts-node@0.4.23': - resolution: {integrity: sha512-W0mBb0pp5mXfLgsqXAIQUU3nqUMAsRKbrM6FfWAjmswe7PrMBlUq3fgpd+Fw1S6T0egKhe+zABYoU8H3ROJAUw==} - - '@uma/core@2.59.1': - resolution: {integrity: sha512-TYwfMoDxGYcnXsazTtY76hQjopyPvm6TICyIh4Jh5gi6sHz1bcK52G4PBNPFV9/lvMuhzuJ7nKckDn3FQ4F7gQ==} + '@uma/contracts-node@0.4.25': + resolution: {integrity: sha512-WaFojX4qyMmXpy5MBS7g0M0KnWESGusdSfTmlkZpCh65TksGaJwAyOM1YBRLL3xm3xSgxPoG+n6tTilSomUmOw==} '@uma/core@2.61.0': resolution: {integrity: sha512-bnk+CWW+uWpRilrgUny/gDXHKomG+h1Ug84OXdx+AAvj1/BtlMDOCNNt1OX8LSAz+a0hkiN9s24/zgHclTC/sg==} @@ -2094,20 +2398,13 @@ packages: '@uma/logger@1.3.0': resolution: {integrity: sha512-8lCSA7kvH34kbp652toM9ZtANEW1bxT8NLyFSTZlegcHgQ1opR+GepTKerrOLU7SKdOJY1P0ZWCQN5vUKxrdHA==} - '@uma/merkle-distributor@1.3.40': - resolution: {integrity: sha512-Hu0Qlj9pkCnwKMYGDoSOf6biabq64go7JiF9jJd/dbju12zh/gX6PInJTbosHfbYv6LIm43zb5RBc7XtZwW+nQ==} - hasBin: true - - '@uma/sdk@0.34.8': - resolution: {integrity: sha512-/aYmJBS46r1LPtBXMYnzvgAaF9opy0PeKontPRUV50mU/wCAd3yHdVVNpPiq73IYfYVweJ2K8XpblVBC97rzZA==} + '@uma/sdk@0.34.10': + resolution: {integrity: sha512-Jo64XpbCxquuPIIktQCWFMNN/vCTyA1SbVXMrlmXgO7NAtPPMyPBlsKJr+N0/QrqymBQcO5wzdmo+EqJaeKIHw==} engines: {node: '>=14'} peerDependencies: '@eth-optimism/contracts': ^0.5.40 ethers: ^5.7.2 - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2161,9 +2458,6 @@ packages: resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@zxing/text-encoding@0.9.0': - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -2171,12 +2465,16 @@ packages: abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + abbrev@3.0.0: + resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==} + engines: {node: ^18.17.0 || >=20.5.0} + abi-decoder@https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb: resolution: {tarball: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb} version: 2.2.2 - abitype@1.0.6: - resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -2242,12 +2540,12 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} aggregate-error@3.1.0: @@ -2267,10 +2565,6 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -2313,9 +2607,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - any-signal@2.1.2: - resolution: {integrity: sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2408,8 +2699,8 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} - arweave@1.15.1: - resolution: {integrity: sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ==} + arweave@1.15.5: + resolution: {integrity: sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==} engines: {node: '>=18'} asap@2.0.6: @@ -2492,8 +2783,8 @@ packages: axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.8.2: + resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} @@ -2503,8 +2794,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.6: - resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -2523,8 +2814,8 @@ packages: base-x@3.0.10: resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - base-x@5.0.0: - resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2545,8 +2836,8 @@ packages: big-number@2.0.0: resolution: {integrity: sha512-C67Su0g+XsmXADX/UM9L/+xSbqqwq0D/qGJs2ky6Noy2FDuCZnC38ZSXODiaBvqWma2VYRZEXgm4H74PS6tCDg==} - big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} @@ -2577,9 +2868,6 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - blob-to-it@1.0.4: - resolution: {integrity: sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -2606,10 +2894,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - borc@2.1.2: - resolution: {integrity: sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==} - engines: {node: '>=4'} - borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} @@ -2633,9 +2917,6 @@ packages: browser-or-node@2.1.1: resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} - browser-readablestream-to-it@1.0.3: - resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} - browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -2648,8 +2929,9 @@ packages: browserify-des@1.0.2: resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} browserify-sign@4.2.3: resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} @@ -2660,8 +2942,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2708,9 +2990,9 @@ packages: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} - bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} + bufio@1.2.3: + resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==} + engines: {node: '>=8.0.0'} builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -2723,6 +3005,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -2743,10 +3029,22 @@ packages: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2773,8 +3071,8 @@ packages: caniuse-lite@1.0.30001646: resolution: {integrity: sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==} - caniuse-lite@1.0.30001686: - resolution: {integrity: sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==} + caniuse-lite@1.0.30001703: + resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2829,25 +3127,25 @@ packages: cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - - chokidar@3.5.1: - resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} - engines: {node: '>= 8.10.0'} + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -2865,11 +3163,6 @@ packages: engines: {node: '>=4.0.0', npm: '>=3.0.0'} deprecated: This module has been superseded by the multiformats module - cids@1.1.9: - resolution: {integrity: sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==} - engines: {node: '>=4.0.0', npm: '>=3.0.0'} - deprecated: This module has been superseded by the multiformats module - cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} @@ -2966,13 +3259,13 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -3057,15 +3350,12 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js-compat@3.41.0: + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -3175,15 +3465,6 @@ packages: supports-color: optional: true - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.6: resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} @@ -3210,8 +3491,8 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -3282,9 +3563,6 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - delimit-stream@0.1.0: - resolution: {integrity: sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -3333,10 +3611,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -3361,9 +3635,6 @@ packages: resolution: {integrity: sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==} engines: {node: '>=18'} - dns-over-http-resolver@1.2.3: - resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -3385,8 +3656,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} @@ -3414,6 +3685,10 @@ packages: resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} engines: {node: '>=0.10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -3440,16 +3715,12 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-fetch@1.9.1: - resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} - engines: {node: '>=6'} + electron-to-chromium@1.5.114: + resolution: {integrity: sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==} electron-to-chromium@1.5.4: resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} - electron-to-chromium@1.5.68: - resolution: {integrity: sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==} - elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -3485,6 +3756,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -3514,9 +3788,6 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - err-code@3.0.1: - resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} - errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -3532,6 +3803,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -3547,10 +3822,18 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -3810,8 +4093,8 @@ packages: eth-block-tracker@4.4.3: resolution: {integrity: sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==} - eth-crypto@2.6.0: - resolution: {integrity: sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==} + eth-crypto@2.7.0: + resolution: {integrity: sha512-MWbDl7OAoBAjkF2a7tklffAJv68uDI/MGPJKontt460nldJ8/2xT4cQacS8sGa6XJlon4ux1nAVzRoa4GxspOQ==} eth-ens-namehash@2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} @@ -3920,6 +4203,9 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -3959,6 +4245,9 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + express-bearer-token@3.0.0: resolution: {integrity: sha512-bW51OGRAQHZYPHoxTFaIqWNDPSRri0OSFktB4dcHNAxvuSjqQP1CE6WUxpdJscKlkQe7cemRR+z7fg4GYfmJ2g==} engines: {node: '>= 6.0.0'} @@ -3995,9 +4284,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -4017,11 +4303,11 @@ packages: fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true fastestsmallesttextencoderdecoder@1.0.22: @@ -4030,6 +4316,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -4070,10 +4364,6 @@ packages: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4129,26 +4419,14 @@ packages: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} - - form-data@2.5.2: - resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} + form-data@2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} engines: {node: '>= 0.12'} - form-data@3.0.2: - resolution: {integrity: sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==} - engines: {node: '>= 6'} - form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - formidable@3.5.1: resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} @@ -4190,6 +4468,10 @@ packages: fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} @@ -4241,8 +4523,8 @@ packages: resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} engines: {node: '>=12'} - gcp-metadata@6.1.0: - resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} generic-pool@3.9.0: @@ -4267,8 +4549,9 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-iterator@1.0.2: - resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -4278,6 +4561,10 @@ packages: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} @@ -4330,14 +4617,6 @@ packages: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} deprecated: Glob versions prior to v9 are no longer supported - glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -4390,8 +4669,8 @@ packages: resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} engines: {node: '>=12'} - google-auth-library@9.14.1: - resolution: {integrity: sha512-Rj+PMjoNFGFTmtItH7gHfbHpGVSb3vmnGK3nwNBqxQF9NoBpttSZI/rc0WiM63ma2uGDQtYEkMHkK9U6937NiA==} + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} engines: {node: '>=14'} google-gax@2.30.5: @@ -4408,6 +4687,10 @@ packages: resolution: {integrity: sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg==} engines: {node: '>=14'} + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + google-p12-pem@3.1.4: resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==} engines: {node: '>=10'} @@ -4423,7 +4706,11 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - got@11.8.6: + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} @@ -4441,10 +4728,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - gtoken@5.3.2: resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} engines: {node: '>=10'} @@ -4489,8 +4772,8 @@ packages: ts-generator: ^0.1.1 typechain: ^4.0.1 - hardhat@2.22.12: - resolution: {integrity: sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w==} + hardhat@2.22.19: + resolution: {integrity: sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==} hasBin: true peerDependencies: ts-node: '*' @@ -4527,6 +4810,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -4534,9 +4821,9 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hash-base@3.0.4: - resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} - engines: {node: '>=4'} + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} @@ -4588,8 +4875,8 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} http-basic@8.1.3: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} @@ -4609,6 +4896,10 @@ packages: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-response-object@3.0.2: resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} @@ -4631,8 +4922,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} humanize-ms@1.2.1: @@ -4722,6 +5013,10 @@ packages: resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -4730,40 +5025,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipfs-core-types@0.3.1: - resolution: {integrity: sha512-xPBsowS951RsuskMo86AWz9y4ReaBot1YsjOhZvKl8ORd8taxIBTT72LnEPwIZ2G24U854Zjxvd/qUMqO14ivg==} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - - ipfs-core-utils@0.7.2: - resolution: {integrity: sha512-d7T72GxvhNN+tEHsJjxI5Y4LQVdMMbSwNbWB6nVsIHUEdwm3w85L2u1E/ctNd9aaNGvoBwEcnIZhSmqhMf7stw==} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - - ipfs-http-client@49.0.4: - resolution: {integrity: sha512-qgWbkcB4glQrUkE2tZR+GVXyrO6aJyspWBjyct/6TzrhCHx7evjz+kUTK+wNm4S9zccUePEml5VNZUmUhoQtbA==} - engines: {node: '>=10.3.0', npm: '>=3.0.0'} - deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details - - ipfs-utils@6.0.8: - resolution: {integrity: sha512-mDDQaDisI/uWk+X08wyw+jBcq76IXwMjgyaoyEgJDb/Izb+QbBCSJjo9q+EvbMxh6/l6q0NiAfbbsxEyQYPW9w==} - - ipld-block@0.11.1: - resolution: {integrity: sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw==} - engines: {node: '>=6.0.0', npm: '>=3.0.0'} - - ipld-dag-cbor@0.17.1: - resolution: {integrity: sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw==} - engines: {node: '>=6.0.0', npm: '>=3.0.0'} - deprecated: This module has been superseded by @ipld/dag-cbor and multiformats - - ipld-dag-pb@0.20.0: - resolution: {integrity: sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg==} - engines: {node: '>=6.0.0', npm: '>=3.0.0'} - deprecated: This module has been superseded by @ipld/dag-pb and multiformats - - ipld-raw@6.0.0: - resolution: {integrity: sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg==} - deprecated: This module has been superseded by the multiformats module - is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -4801,9 +5062,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-circular@1.0.2: - resolution: {integrity: sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==} - is-core-module@2.15.0: resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} @@ -4816,9 +5074,6 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} - is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4977,21 +5232,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iso-constants@0.1.2: - resolution: {integrity: sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ==} - engines: {node: '>=10'} - - iso-random-stream@2.0.2: - resolution: {integrity: sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==} - engines: {node: '>=10'} - - iso-url@0.4.7: - resolution: {integrity: sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==} - engines: {node: '>=10'} - - iso-url@1.2.1: - resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} - engines: {node: '>=12'} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} @@ -5034,36 +5277,6 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - it-all@1.0.6: - resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} - - it-concat@1.0.3: - resolution: {integrity: sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA==} - - it-glob@0.0.14: - resolution: {integrity: sha512-TKKzs9CglbsihSpcwJPXN5DBUssu4akRzPlp8QJRCoLrKoaOpyY2V1qDlxx+UMivn0i114YyTd4AawWl7eqIdw==} - - it-last@1.0.6: - resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} - - it-map@1.0.6: - resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} - - it-peekable@1.0.3: - resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} - - it-reader@2.1.0: - resolution: {integrity: sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw==} - - it-tar@1.2.2: - resolution: {integrity: sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA==} - - it-to-stream@0.1.2: - resolution: {integrity: sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ==} - - it-to-stream@1.0.0: - resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} - iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -5075,8 +5288,8 @@ packages: engines: {node: '>=10'} hasBin: true - jayson@4.1.2: - resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} + jayson@4.1.3: + resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} engines: {node: '>=8'} hasBin: true @@ -5099,10 +5312,6 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.0.0: - resolution: {integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -5113,8 +5322,11 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdoc@4.0.3: - resolution: {integrity: sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsdoc@4.0.4: + resolution: {integrity: sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==} engines: {node: '>=12.0.0'} hasBin: true @@ -5162,20 +5374,17 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.1.1: - resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} + json-stable-stringify@1.2.1: + resolution: {integrity: sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==} engines: {node: '>= 0.4'} - json-stream-stringify@3.1.4: - resolution: {integrity: sha512-oGoz05ft577LolnXFQHD2CjnXDxXVA5b8lHwfEZgRXQUZeCMo6sObQQRq+NXuHQ3oTeMZHHmmPY2rjVwyqR62A==} + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} engines: {node: '>=7.10.1'} json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json-text-sequence@0.1.1: - resolution: {integrity: sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==} - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -5201,8 +5410,8 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + jsonschema@1.5.0: + resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} @@ -5222,9 +5431,6 @@ packages: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} - keypair@1.0.4: - resolution: {integrity: sha512-zwhgOhhniaL7oxMgUMKKw5219PWWABMO+dgMnzJOQ2/5L3XJtTJGhW2PEXlxXj9zaccdReZJZ83+4NPhVfNVDg==} - keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -5281,10 +5487,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libp2p-crypto@0.19.7: - resolution: {integrity: sha512-Qb5o/3WFKF2j6mYSt4UBPyi2kbKl3jYV0podBJoJCw70DlpM5Xc+oh3fFY9ToSunu8aSQQ5GY8nutjXgX/uGRA==} - engines: {node: '>=12.0.0'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5295,10 +5497,6 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5333,12 +5531,14 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.isequalwith@4.4.0: resolution: {integrity: sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==} @@ -5365,10 +5565,6 @@ packages: resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} engines: {node: '>=0.8.6'} - log-symbols@4.0.0: - resolution: {integrity: sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==} - engines: {node: '>=10'} - log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -5448,6 +5644,10 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + markdown-it-anchor@8.6.7: resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: @@ -5466,8 +5666,12 @@ packages: engines: {node: '>= 12'} hasBin: true - match-all@1.2.6: - resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} + match-all@1.2.7: + resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -5493,10 +5697,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -5571,13 +5771,6 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - - minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5596,9 +5789,33 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + minipass@2.9.0: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -5606,6 +5823,10 @@ packages: minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -5641,11 +5862,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - mocha@8.4.0: - resolution: {integrity: sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==} - engines: {node: '>= 10.12.0'} - hasBin: true - mock-fs@4.14.0: resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} @@ -5671,18 +5887,10 @@ packages: msgpackr@1.11.0: resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==} - multiaddr-to-uri@6.0.0: - resolution: {integrity: sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A==} - deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri - multiaddr@7.5.0: resolution: {integrity: sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw==} deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr - multiaddr@8.1.2: - resolution: {integrity: sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ==} - deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr - multibase@0.6.1: resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} deprecated: This module has been superseded by the multiformats module @@ -5696,16 +5904,6 @@ packages: engines: {node: '>=10.0.0', npm: '>=6.0.0'} deprecated: This module has been superseded by the multiformats module - multibase@3.1.2: - resolution: {integrity: sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==} - engines: {node: '>=10.0.0', npm: '>=6.0.0'} - deprecated: This module has been superseded by the multiformats module - - multibase@4.0.6: - resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} - deprecated: This module has been superseded by the multiformats module - multicodec@0.5.7: resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} deprecated: This module has been superseded by the multiformats module @@ -5714,17 +5912,6 @@ packages: resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} deprecated: This module has been superseded by the multiformats module - multicodec@2.1.3: - resolution: {integrity: sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==} - deprecated: This module has been superseded by the multiformats module - - multicodec@3.2.1: - resolution: {integrity: sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==} - deprecated: This module has been superseded by the multiformats module - - multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - multihashes@0.4.21: resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} @@ -5732,32 +5919,17 @@ packages: resolution: {integrity: sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw==} engines: {node: '>=10.0.0', npm: '>=6.0.0'} - multihashes@4.0.3: - resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} - - multihashing-async@2.1.4: - resolution: {integrity: sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} - murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} - murmurhash3js-revisited@3.0.0: - resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} - engines: {node: '>=8.0.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nan@2.14.0: resolution: {integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==} - nan@2.21.0: - resolution: {integrity: sha512-MCpOGmdWvAOMi4RWnpxS5G24l7dVMtdSHtV87I3ltjaLdFOTO74HVJ+DfYiAXjxGKsYR/UCmm1rBwhMN7KqS1A==} - - nan@2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + nan@2.22.2: + resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} nano-base32@1.0.1: resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} @@ -5765,29 +5937,9 @@ packages: nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} - nanoid@3.1.20: - resolution: {integrity: sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - native-abort-controller@1.0.4: - resolution: {integrity: sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ==} - peerDependencies: - abort-controller: '*' - - native-fetch@3.0.0: - resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} - peerDependencies: - node-fetch: '*' - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5795,6 +5947,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -5844,10 +6000,6 @@ packages: encoding: optional: true - node-forge@0.10.0: - resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} - engines: {node: '>= 6.0.0'} - node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -5864,8 +6016,9 @@ packages: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + node-gyp@11.1.0: + resolution: {integrity: sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==} + engines: {node: ^18.17.0 || >=20.5.0} hasBin: true node-hid@1.3.0: @@ -5892,6 +6045,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nofilter@1.0.4: resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} engines: {node: '>=8'} @@ -5907,6 +6063,11 @@ packages: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -6064,8 +6225,8 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} oboe@2.1.5: resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} @@ -6099,8 +6260,8 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - ox@0.1.2: - resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -6119,17 +6280,6 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - p-defer@3.0.0: - resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} - engines: {node: '>=8'} - - p-fifo@1.0.0: - resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6138,10 +6288,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6158,9 +6304,9 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} @@ -6190,9 +6336,6 @@ packages: parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - parse-duration@0.4.4: - resolution: {integrity: sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==} - parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} @@ -6207,8 +6350,11 @@ packages: parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} parse5@5.1.1: resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} @@ -6216,8 +6362,8 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -6233,10 +6379,6 @@ packages: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} engines: {node: '>=0.10.0'} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6280,16 +6422,6 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - peer-id@0.14.8: - resolution: {integrity: sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig==} - engines: {node: '>=14.0.0'} - hasBin: true - - pem-jwk@2.0.0: - resolution: {integrity: sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA==} - engines: {node: '>=5.10.0'} - hasBin: true - performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -6345,6 +6477,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -6459,6 +6595,10 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -6470,6 +6610,10 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise-to-callback@1.0.0: resolution: {integrity: sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==} engines: {node: '>=0.10.0'} @@ -6514,16 +6658,6 @@ packages: resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} engines: {node: '>=12.0.0'} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} - engines: {node: '>=12.0.0'} - - protocol-buffers-schema@3.6.0: - resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} - - protons@2.0.3: - resolution: {integrity: sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -6641,20 +6775,13 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readdirp@3.5.0: - resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} - engines: {node: '>=8.10.0'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.0.1: - resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} - engines: {node: '>= 14.16.0'} - - receptacle@1.3.2: - resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -6685,9 +6812,6 @@ packages: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -6766,10 +6890,6 @@ packages: requizzle@0.2.4: resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} - reset@0.1.0: - resolution: {integrity: sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q==} - engines: {node: '>= 0.8.0'} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -6811,9 +6931,6 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - retimer@2.0.0: - resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} - retry-request@4.2.2: resolution: {integrity: sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==} engines: {node: '>=8.10.0'} @@ -6826,6 +6943,10 @@ packages: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -6844,6 +6965,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + ripemd160-min@0.0.6: resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} engines: {node: '>=8'} @@ -6855,17 +6980,12 @@ packages: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true - rpc-websockets@9.0.4: - resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} + rpc-websockets@9.1.1: + resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - run@1.5.0: - resolution: {integrity: sha512-CBPzeX6JQZUdhZpSFyNt2vUk44ivKMWZYCNBYoZYEE46mL9nf6WyMP3320WnzIrJuo89+njiUvlo83jUEXjXLg==} - engines: {node: '>=v0.9.0'} - hasBin: true - rustbn.js@0.2.0: resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} @@ -6873,8 +6993,8 @@ packages: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} @@ -6919,9 +7039,9 @@ packages: resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} engines: {node: '>=10.0.0'} - secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} semaphore@1.1.0: resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} @@ -6955,9 +7075,6 @@ packages: sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} - serialize-javascript@5.0.1: - resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -7034,9 +7151,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - signed-varint@2.0.1: - resolution: {integrity: sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw==} - simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -7061,12 +7175,24 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + snake-case@2.1.0: resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solc@0.4.26: resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true @@ -7128,20 +7254,23 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} hasBin: true - stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} standard-as-callback@2.1.0: @@ -7165,9 +7294,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - stream-to-it@0.2.4: - resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} - strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} @@ -7270,8 +7396,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} @@ -7336,16 +7462,16 @@ packages: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -7355,6 +7481,10 @@ packages: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + teeny-request@7.2.0: resolution: {integrity: sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==} engines: {node: '>=10'} @@ -7406,8 +7536,9 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} - timeout-abort-controller@1.1.1: - resolution: {integrity: sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} @@ -7704,25 +7835,11 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - uglify-js@3.19.1: - resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uglify-js@3.19.2: - resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - uint8arrays@1.1.0: - resolution: {integrity: sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==} - - uint8arrays@2.1.10: - resolution: {integrity: sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==} - - uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} - ultron@1.1.1: resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} @@ -7735,14 +7852,25 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + undici-types@7.5.0: + resolution: {integrity: sha512-CxNFga24pkqrtk9aO4jV78tWXLZhVVU9J2/EAhBGwqJ1+tsLydMI2Vaq7wj3ba/SZL7BL8aq5rflf75DhbgkhA==} + + undici@5.28.5: + resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} engines: {node: '>=14.0'} undici@6.19.8: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -7761,8 +7889,8 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -7783,10 +7911,6 @@ packages: url-set-query@1.0.0: resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} - ursa-optional@0.10.2: - resolution: {integrity: sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A==} - engines: {node: '>=4'} - usb@1.9.2: resolution: {integrity: sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==} engines: {node: '>=10.16.0'} @@ -7846,9 +7970,6 @@ packages: varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} - varint@6.0.0: - resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -7857,17 +7978,14 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - viem@2.21.53: - resolution: {integrity: sha512-0pY8clBacAwzc59iV1vY4a6U4xvRlA5tAuhClJCKvqA6rXJzmNMMvxQ0EG79lkHr7WtBEruXz8nAmONXwnq4EQ==} + viem@2.23.10: + resolution: {integrity: sha512-va6Wde+v96PdfzdPEspCML1MjAqe+88O8BD+R9Kun/4s5KMUNcqfHbXdZP0ZZ2Zms80styvH2pDRAqCho6TqkA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - web3-bzz@1.10.0: resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} engines: {node: '>=8.0.0'} @@ -8204,9 +8322,6 @@ packages: resolution: {integrity: sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==} engines: {node: '>=8.0.0'} - webauthn-p256@0.0.10: - resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -8214,9 +8329,17 @@ packages: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + whatwg-fetch@2.0.4: resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -8254,8 +8377,10 @@ packages: engines: {node: '>= 8'} hasBin: true - wide-align@1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -8284,9 +8409,6 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - workerpool@6.1.0: - resolution: {integrity: sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==} - workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} @@ -8370,6 +8492,18 @@ packages: utf-8-validate: optional: true + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} @@ -8410,6 +8544,7 @@ packages: yaeti@0.0.6: resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} engines: {node: '>=0.10.32'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -8417,6 +8552,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -8424,10 +8563,6 @@ packages: yargs-parser@2.4.1: resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -8471,11 +8606,11 @@ packages: snapshots: - '@across-protocol/across-token@1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/across-token@1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8492,11 +8627,11 @@ snapshots: - typescript - utf-8-validate - '@across-protocol/across-token@1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/across-token@1.0.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@uma/common': 2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8513,32 +8648,13 @@ snapshots: - typescript - utf-8-validate - '@across-protocol/constants@3.1.25': {} - - '@across-protocol/contracts@0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@openzeppelin/contracts': 4.1.0 - '@uma/core': 2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - ethers - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate + '@across-protocol/constants@3.1.44': {} - '@across-protocol/contracts@0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@across-protocol/contracts@0.1.4(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@openzeppelin/contracts': 4.1.0 - '@uma/core': 2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/core': 2.61.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8553,11 +8669,11 @@ snapshots: - typechain - utf-8-validate - '@across-protocol/contracts@0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@across-protocol/contracts@0.1.4(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@openzeppelin/contracts': 4.1.0 - '@uma/core': 2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/core': 2.61.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8572,31 +8688,33 @@ snapshots: - typechain - utf-8-validate - '@across-protocol/contracts@3.0.19(@babel/core@7.25.2)(@ethersproject/abi@5.7.0)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/contracts@4.0.4(@babel/core@7.25.2)(@ethersproject/abi@5.8.0)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@across-protocol/constants': 3.1.25 + '@across-protocol/constants': 3.1.44 '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@defi-wonderland/smock': 2.4.0(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@defi-wonderland/smock': 2.4.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@openzeppelin/contracts': 4.9.6 '@openzeppelin/contracts-upgradeable': 4.9.6 '@scroll-tech/contracts': 0.1.0 - '@solana-developers/helpers': 2.5.6(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/spl-token': 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana-developers/helpers': 2.8.0(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana-program/token': 0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))) + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/spl-token': 0.4.13(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/yargs': 17.0.33 - '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/contracts-node': 0.4.23 - '@uma/core': 2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - axios: 1.7.7 + '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/contracts-node': 0.4.25 + '@uma/core': 2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + axios: 1.8.2 bs58: 6.0.0 buffer-layout: 1.2.2 prettier-plugin-rust: 0.1.9 yargs: 17.7.2 - zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + zksync-web3: 0.14.4(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8615,32 +8733,35 @@ snapshots: - typechain - typescript - utf-8-validate + - ws - '@across-protocol/contracts@3.0.19(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/contracts@4.0.4(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@across-protocol/constants': 3.1.25 + '@across-protocol/constants': 3.1.44 '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@defi-wonderland/smock': 2.4.0(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@defi-wonderland/smock': 2.4.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@openzeppelin/contracts': 4.9.6 '@openzeppelin/contracts-upgradeable': 4.9.6 '@scroll-tech/contracts': 0.1.0 - '@solana-developers/helpers': 2.5.6(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/spl-token': 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana-developers/helpers': 2.8.0(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana-program/token': 0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))) + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/spl-token': 0.4.13(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/yargs': 17.0.33 - '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/contracts-node': 0.4.23 - '@uma/core': 2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - axios: 1.7.7 + '@uma/common': 2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@uma/contracts-node': 0.4.25 + '@uma/core': 2.61.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + axios: 1.8.2 bs58: 6.0.0 buffer-layout: 1.2.2 prettier-plugin-rust: 0.1.9 yargs: 17.7.2 - zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + zksync-web3: 0.14.4(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8659,28 +8780,34 @@ snapshots: - typechain - typescript - utf-8-validate + - ws - '@across-protocol/sdk@3.3.23(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/abi@5.7.0)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/sdk@4.1.30(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/abi@5.8.0)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@across-protocol/across-token': 1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@across-protocol/constants': 3.1.25 - '@across-protocol/contracts': 3.0.19(@babel/core@7.25.2)(@ethersproject/abi@5.7.0)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@eth-optimism/sdk': 3.3.2(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@ethersproject/bignumber': 5.7.0 + '@across-protocol/across-token': 1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@across-protocol/constants': 3.1.44 + '@across-protocol/contracts': 4.0.4(@babel/core@7.25.2)(@ethersproject/abi@5.8.0)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@eth-optimism/sdk': 3.3.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ethersproject/bignumber': 5.8.0 '@pinata/sdk': 2.1.0 + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/mocha': 10.0.7 - '@uma/sdk': 0.34.8(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - arweave: 1.15.1 + '@uma/sdk': 0.34.10(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + arweave: 1.15.5 async: 3.2.6 axios: 0.27.2 big-number: 2.0.0 - decimal.js: 10.4.3 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bs58: 6.0.0 + decimal.js: 10.5.0 + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: 4.17.21 lodash.get: 4.4.2 + node-gyp: 11.1.0 superstruct: 0.15.5 - tslib: 2.7.0 - viem: 2.21.53(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10) + tslib: 2.8.1 + viem: 2.23.10(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8701,29 +8828,35 @@ snapshots: - typechain - typescript - utf-8-validate + - ws - zod - '@across-protocol/sdk@3.3.23(@babel/core@7.25.2)(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@across-protocol/sdk@4.1.30(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@across-protocol/across-token': 1.0.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@across-protocol/constants': 3.1.25 - '@across-protocol/contracts': 3.0.19(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@eth-optimism/sdk': 3.3.2(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@ethersproject/bignumber': 5.7.0 + '@across-protocol/across-token': 1.0.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + '@across-protocol/constants': 3.1.44 + '@across-protocol/contracts': 4.0.4(buffer-layout@1.2.2)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typescript@5.5.4)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@eth-optimism/sdk': 3.3.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ethersproject/bignumber': 5.8.0 '@pinata/sdk': 2.1.0 + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/mocha': 10.0.7 - '@uma/sdk': 0.34.8(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - arweave: 1.15.1 + '@uma/sdk': 0.34.10(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + arweave: 1.15.5 async: 3.2.6 axios: 0.27.2 big-number: 2.0.0 - decimal.js: 10.4.3 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bs58: 6.0.0 + decimal.js: 10.5.0 + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: 4.17.21 lodash.get: 4.4.2 + node-gyp: 11.1.0 superstruct: 0.15.5 - tslib: 2.7.0 - viem: 2.21.53(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10) + tslib: 2.8.1 + viem: 2.23.10(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@codechecks/client' @@ -8744,6 +8877,7 @@ snapshots: - typechain - typescript - utf-8-validate + - ws - zod '@adraffy/ens-normalize@1.11.0': {} @@ -8766,8 +8900,6 @@ snapshots: '@babel/compat-data@7.25.2': {} - '@babel/compat-data@7.26.2': {} - '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 @@ -8803,10 +8935,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/generator@7.26.2': + '@babel/generator@7.26.10': dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 @@ -8819,19 +8951,11 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.25.9': - dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.26.5 debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -8847,8 +8971,8 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 transitivePeerDependencies: - supports-color @@ -8862,7 +8986,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.26.5': {} '@babel/helper-simple-access@7.24.7': dependencies: @@ -8881,8 +9005,6 @@ snapshots: '@babel/helper-validator-option@7.24.8': {} - '@babel/helper-validator-option@7.25.9': {} - '@babel/helpers@7.25.0': dependencies: '@babel/template': 7.25.0 @@ -8899,31 +9021,27 @@ snapshots: dependencies: '@babel/types': 7.25.2 - '@babel/parser@7.26.2': + '@babel/parser@7.26.10': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.10 - '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.25.2)': + '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.25.2) babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/runtime@7.20.13': - dependencies: - regenerator-runtime: 0.13.11 - - '@babel/runtime@7.25.7': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 @@ -8933,11 +9051,11 @@ snapshots: '@babel/parser': 7.25.3 '@babel/types': 7.25.2 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 '@babel/traverse@7.25.3': dependencies: @@ -8951,13 +9069,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.25.9': + '@babel/traverse@7.26.10': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: @@ -8969,7 +9087,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.26.0': + '@babel/types@7.26.10': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -8981,9 +9099,9 @@ snapshots: '@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor-errors': 0.30.1 - '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@noble/hashes': 1.5.0 - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.7.1 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 @@ -9000,9 +9118,9 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 @@ -9016,19 +9134,19 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@defi-wonderland/smock@2.4.0(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@defi-wonderland/smock@2.4.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) diff: 5.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 - rxjs: 7.8.1 + rxjs: 7.8.2 semver: 7.6.3 transitivePeerDependencies: - c-kzg @@ -9100,13 +9218,13 @@ snapshots: '@ensdomains/ensjs@2.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.10 '@ensdomains/address-encoder': 0.1.9 '@ensdomains/ens': 0.4.5 '@ensdomains/resolver': 0.2.4 content-hash: 2.5.2 eth-ens-namehash: 2.0.8 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) js-sha3: 0.8.0 transitivePeerDependencies: - bufferutil @@ -9137,43 +9255,43 @@ snapshots: '@eslint/js@8.57.0': {} - '@eth-optimism/contracts@0.5.40(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@eth-optimism/contracts@0.5.40(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@eth-optimism/core-utils': 0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@eth-optimism/core-utils': 0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate '@eth-optimism/core-utils@0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/rlp': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bufio: 1.2.1 + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/rlp': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bufio: 1.2.3 chai: 4.5.0 transitivePeerDependencies: - bufferutil @@ -9181,19 +9299,19 @@ snapshots: '@eth-optimism/core-utils@0.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/web': 5.7.1 + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/web': 5.8.0 chai: 4.5.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - bufferutil @@ -9202,22 +9320,22 @@ snapshots: '@eth-optimism/core-utils@0.7.7(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/web': 5.7.1 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/web': 5.8.0 chai: 4.5.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: 4.17.21 transitivePeerDependencies: - bufferutil - utf-8-validate - '@eth-optimism/sdk@3.3.2(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@eth-optimism/sdk@3.3.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@eth-optimism/core-utils': 0.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: 4.17.21 merkletreejs: 0.3.11 rlp: 2.2.7 @@ -9257,84 +9375,158 @@ snapshots: '@ethersproject/abi@5.7.0': dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 '@ethersproject/abstract-provider@5.7.0': dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 '@ethersproject/abstract-signer@5.7.0': dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 '@ethersproject/address@5.7.0': dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 '@ethersproject/base64@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 '@ethersproject/basex@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/basex@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 '@ethersproject/bignumber@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 bn.js: 5.2.1 '@ethersproject/bytes@5.7.0': dependencies: - '@ethersproject/logger': 5.7.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 '@ethersproject/constants@5.7.0': dependencies: - '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bignumber': 5.8.0 - '@ethersproject/contracts@5.7.0': + '@ethersproject/constants@5.8.0': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 + '@ethersproject/bignumber': 5.8.0 - '@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + + '@ethersproject/contracts@5.8.0': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + + '@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ledgerhq/hw-app-eth': 5.27.2 '@ledgerhq/hw-transport': 5.26.0 '@ledgerhq/hw-transport-u2f': 5.26.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: '@ledgerhq/hw-transport-node-hid': 5.26.0 transitivePeerDependencies: @@ -9343,200 +9535,381 @@ snapshots: '@ethersproject/hash@5.7.0': dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 '@ethersproject/hdnode@5.7.0': dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/hdnode@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 '@ethersproject/json-wallets@5.7.0': dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/json-wallets@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 aes-js: 3.0.0 scrypt-js: 3.0.1 '@ethersproject/keccak256@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 js-sha3: 0.8.0 '@ethersproject/logger@5.7.0': {} + '@ethersproject/logger@5.8.0': {} + '@ethersproject/networks@5.7.1': dependencies: - '@ethersproject/logger': 5.7.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 '@ethersproject/pbkdf2@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + + '@ethersproject/pbkdf2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 '@ethersproject/properties@5.7.0': dependencies: - '@ethersproject/logger': 5.7.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 bech32: 1.1.4 ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate + '@ethersproject/providers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@ethersproject/random@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/random@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 '@ethersproject/rlp@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 '@ethersproject/sha2@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + + '@ethersproject/sha2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 hash.js: 1.1.7 '@ethersproject/signing-key@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + '@ethersproject/solidity@5.7.0': dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/solidity@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 '@ethersproject/strings@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 '@ethersproject/transactions@5.7.0': dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 '@ethersproject/units@5.7.0': dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/units@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 '@ethersproject/wallet@5.7.0': dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/wallet@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 '@ethersproject/web@5.7.1': dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 '@ethersproject/wordlists@5.7.0': dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/wordlists@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 '@fastify/busboy@2.1.1': {} '@gnosis.pm/mock-contract@4.0.0': {} - '@gnosis.pm/safe-contracts@1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@gnosis.pm/safe-contracts@1.3.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@gnosis.pm/zodiac@3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@gnosis.pm/zodiac@3.2.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@gnosis.pm/mock-contract': 4.0.0 - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': 4.9.6 '@openzeppelin/contracts-upgradeable': 4.9.6 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@google-cloud/common@3.10.0(encoding@0.1.13)': dependencies: @@ -9555,7 +9928,7 @@ snapshots: '@google-cloud/datastore@8.7.0(encoding@0.1.13)': dependencies: - '@google-cloud/promisify': 4.0.0 + '@google-cloud/promisify': 4.1.0 arrify: 2.0.1 async-mutex: 0.5.0 concat-stream: 2.0.0 @@ -9620,7 +9993,7 @@ snapshots: '@google-cloud/promisify@3.0.1': {} - '@google-cloud/promisify@4.0.0': {} + '@google-cloud/promisify@4.1.0': {} '@google-cloud/storage@6.12.0(encoding@0.1.13)': dependencies: @@ -9633,7 +10006,7 @@ snapshots: duplexify: 4.1.3 ent: 2.2.1 extend: 3.0.2 - fast-xml-parser: 4.4.1 + fast-xml-parser: 4.5.3 gaxios: 5.1.3(encoding@0.1.13) google-auth-library: 8.9.0(encoding@0.1.13) mime: 3.0.0 @@ -9668,7 +10041,7 @@ snapshots: - encoding - supports-color - '@grpc/grpc-js@1.11.3': + '@grpc/grpc-js@1.13.0': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 @@ -9721,6 +10094,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -9760,7 +10137,7 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@jsdoc/salty@0.2.8': + '@jsdoc/salty@0.2.9': dependencies: lodash: 4.17.21 @@ -9866,8 +10243,6 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@multiformats/base-x@4.0.1': {} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -9876,15 +10251,15 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 - '@noble/curves@1.6.0': + '@noble/curves@1.8.1': dependencies: - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.7.1 '@noble/hashes@1.2.0': {} '@noble/hashes@1.4.0': {} - '@noble/hashes@1.5.0': {} + '@noble/hashes@1.7.1': {} '@noble/secp256k1@1.7.1': {} @@ -9900,29 +10275,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nomicfoundation/edr-darwin-arm64@0.6.2': {} + '@nomicfoundation/edr-darwin-arm64@0.8.0': {} - '@nomicfoundation/edr-darwin-x64@0.6.2': {} + '@nomicfoundation/edr-darwin-x64@0.8.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.6.2': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.8.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.6.2': {} + '@nomicfoundation/edr-linux-arm64-musl@0.8.0': {} - '@nomicfoundation/edr-linux-x64-gnu@0.6.2': {} + '@nomicfoundation/edr-linux-x64-gnu@0.8.0': {} - '@nomicfoundation/edr-linux-x64-musl@0.6.2': {} + '@nomicfoundation/edr-linux-x64-musl@0.8.0': {} - '@nomicfoundation/edr-win32-x64-msvc@0.6.2': {} + '@nomicfoundation/edr-win32-x64-msvc@0.8.0': {} - '@nomicfoundation/edr@0.6.2': + '@nomicfoundation/edr@0.8.0': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.6.2 - '@nomicfoundation/edr-darwin-x64': 0.6.2 - '@nomicfoundation/edr-linux-arm64-gnu': 0.6.2 - '@nomicfoundation/edr-linux-arm64-musl': 0.6.2 - '@nomicfoundation/edr-linux-x64-gnu': 0.6.2 - '@nomicfoundation/edr-linux-x64-musl': 0.6.2 - '@nomicfoundation/edr-win32-x64-msvc': 0.6.2 + '@nomicfoundation/edr-darwin-arm64': 0.8.0 + '@nomicfoundation/edr-darwin-x64': 0.8.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.8.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.8.0 + '@nomicfoundation/edr-linux-x64-musl': 0.8.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.8.0 '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: @@ -9944,33 +10319,33 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.7 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 + table: 6.9.0 + undici: 5.28.5 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.7 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 + table: 6.9.0 + undici: 5.28.5 transitivePeerDependencies: - supports-color @@ -10005,28 +10380,40 @@ 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.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-web3@2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-web3@2.0.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: - '@types/bignumber.js': 5.0.0 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-web3@2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-web3@2.0.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: - '@types/bignumber.js': 5.0.0 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.6.3 + '@opencensus/core@0.1.0': dependencies: continuation-local-storage: 3.2.1 @@ -10059,7 +10446,7 @@ snapshots: '@pinata/sdk@2.1.0': dependencies: axios: 0.21.4(debug@4.3.7) - form-data: 2.5.1 + form-data: 2.5.3 is-ipfs: 0.6.3 path: 0.12.7 transitivePeerDependencies: @@ -10134,13 +10521,13 @@ snapshots: '@scure/base@1.1.7': {} - '@scure/base@1.1.9': {} + '@scure/base@1.2.4': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.9 + '@scure/base': 1.1.7 '@scure/bip32@1.4.0': dependencies: @@ -10148,26 +10535,26 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 - '@scure/bip32@1.5.0': + '@scure/bip32@1.6.2': dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.9 + '@scure/base': 1.1.7 '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 - '@scure/bip39@1.4.0': + '@scure/bip39@1.5.4': dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 '@sentry/core@5.30.0': dependencies: @@ -10222,11 +10609,13 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@solana-developers/helpers@2.5.6(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@solana-developers/helpers@2.8.0(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: - '@solana/spl-token': 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.13(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + bn.js: 5.2.1 bs58: 6.0.0 dotenv: 16.4.5 transitivePeerDependencies: @@ -10236,10 +10625,41 @@ snapshots: - typescript - utf-8-validate + '@solana-program/token@0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + + '@solana/accounts@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/assertions': 2.1.0(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) bigint-buffer: 1.1.5 bignumber.js: 9.1.2 transitivePeerDependencies: @@ -10256,6 +10676,11 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@5.5.4) typescript: 5.5.4 + '@solana/codecs-core@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.5.4)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) @@ -10263,12 +10688,25 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@5.5.4) typescript: 5.5.4 + '@solana/codecs-data-structures@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.5.4)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) '@solana/errors': 2.0.0-rc.1(typescript@5.5.4) typescript: 5.5.4 + '@solana/codecs-numbers@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) @@ -10277,6 +10715,14 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 5.5.4 + '@solana/codecs-strings@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.5.4 + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) @@ -10288,46 +10734,271 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/codecs@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-data-structures': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/options': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/errors@2.0.0-rc.1(typescript@5.5.4)': dependencies: chalk: 5.3.0 commander: 12.1.0 typescript: 5.5.4 - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + '@solana/errors@2.1.0(typescript@5.5.4)': + dependencies: + chalk: 5.3.0 + commander: 13.1.0 + typescript: 5.5.4 + + '@solana/fast-stable-stringify@2.1.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@solana/functional@2.1.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@solana/instructions@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + + '@solana/keys@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/assertions': 2.1.0(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/accounts': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/instructions': 2.1.0(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/programs': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-parsed-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-subscriptions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/signers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/sysvars': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-confirmation': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.5.4) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.5.4) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.0.0-rc.1(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-data-structures': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@2.1.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@solana/rpc-api@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-parsed-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-transformers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@2.1.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@solana/rpc-spec-types@2.1.0(typescript@5.5.4)': + dependencies: + typescript: 5.5.4 + + '@solana/rpc-spec@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + + '@solana/rpc-subscriptions-api@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-subscriptions-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-transformers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@2.1.0(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/rpc-subscriptions-spec': 2.1.0(typescript@5.5.4) + '@solana/subscribable': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@solana/rpc-subscriptions-spec@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/promises': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + '@solana/subscribable': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + + '@solana/rpc-subscriptions@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/fast-stable-stringify': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/promises': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-subscriptions-api': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-subscriptions-channel-websocket': 2.1.0(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-transformers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/subscribable': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/rpc-transformers@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@2.1.0(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + undici-types: 7.5.0 + + '@solana/rpc-types@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/fast-stable-stringify': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/rpc-api': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-spec': 2.1.0(typescript@5.5.4) + '@solana/rpc-spec-types': 2.1.0(typescript@5.5.4) + '@solana/rpc-transformers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-transport-http': 2.1.0(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.5.4) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.5.4) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.5.4) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/errors': 2.0.0-rc.1(typescript@5.5.4) + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/instructions': 2.1.0(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/spl-token-group@0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': dependencies: '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': dependencies: '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.4.13(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -10336,22 +11007,85 @@ snapshots: - typescript - utf-8-validate - '@solana/web3.js@1.95.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + '@solana/subscribable@2.1.0(typescript@5.5.4)': dependencies: - '@babel/runtime': 7.26.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 + '@solana/errors': 2.1.0(typescript@5.5.4) + typescript: 5.5.4 + + '@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/accounts': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/promises': 2.1.0(typescript@5.5.4) + '@solana/rpc': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-subscriptions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/transaction-messages@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-data-structures': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/instructions': 2.1.0(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4)': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/codecs-core': 2.1.0(typescript@5.5.4) + '@solana/codecs-data-structures': 2.1.0(typescript@5.5.4) + '@solana/codecs-numbers': 2.1.0(typescript@5.5.4) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/errors': 2.1.0(typescript@5.5.4) + '@solana/functional': 2.1.0(typescript@5.5.4) + '@solana/instructions': 2.1.0(typescript@5.5.4) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/web3.js@1.98.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.10 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 bn.js: 5.2.1 borsh: 0.7.0 bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + jayson: 4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) node-fetch: 2.7.0(encoding@0.1.13) - rpc-websockets: 9.0.4 + rpc-websockets: 9.1.1 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil @@ -10394,7 +11128,7 @@ snapshots: dependencies: '@truffle/abi-utils': 1.0.3 '@truffle/compile-common': 0.9.8 - big.js: 6.2.1 + big.js: 6.2.2 bn.js: 5.2.1 cbor: 5.2.0 debug: 4.3.7 @@ -10498,7 +11232,7 @@ snapshots: dependencies: camelcase: 4.1.0 chalk: 2.4.2 - cheerio: 1.0.0-rc.12 + cheerio: 1.0.0 detect-indent: 5.0.0 highlight.js: 10.7.3 lodash.merge: 4.6.2 @@ -10536,7 +11270,7 @@ snapshots: ethereumjs-vm: 2.6.0 fetch-ponyfill: 4.1.0 json-rpc-engine: 5.4.0 - json-stable-stringify: 1.1.1 + json-stable-stringify: 1.2.1 pify: 3.0.0 safe-event-emitter: 1.0.1 @@ -10561,7 +11295,7 @@ snapshots: ethereumjs-block: 1.7.1 ethereumjs-util: 5.2.1 ethereumjs-vm: 2.6.0 - json-stable-stringify: 1.1.1 + json-stable-stringify: 1.2.1 promise-to-callback: 1.0.0 readable-stream: 2.3.8 request: 2.88.2 @@ -10584,10 +11318,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@types/bignumber.js@5.0.0': - dependencies: - bignumber.js: 8.1.1 - '@types/bn.js@4.11.6': dependencies: '@types/node': 16.18.104 @@ -10684,16 +11414,16 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.9 + '@types/lodash': 4.17.7 '@types/lodash@4.17.7': {} - '@types/lodash@4.17.9': {} - '@types/long@4.0.2': {} '@types/lru-cache@5.1.1': {} + '@types/luxon@3.4.2': {} + '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 @@ -10705,8 +11435,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimatch@3.0.5': {} - '@types/minimatch@5.1.2': {} '@types/mkdirp@0.5.2': @@ -10750,7 +11478,7 @@ snapshots: '@types/caseless': 0.12.5 '@types/node': 16.18.104 '@types/tough-cookie': 4.0.5 - form-data: 2.5.2 + form-data: 2.5.3 '@types/resolve@0.0.8': dependencies: @@ -11022,135 +11750,33 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@uma/common@2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@across-protocol/contracts': 0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@google-cloud/kms': 3.8.0(encoding@0.1.13) - '@google-cloud/storage': 6.12.0(encoding@0.1.13) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@truffle/contract': 4.6.17(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@truffle/hdwallet-provider': 1.5.1-alpha.1(@babel/core@7.25.2)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@types/ethereum-protocol': 1.0.5 - '@uniswap/v3-core': 1.0.1 - abi-decoder: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb - async-retry: 1.3.3 - axios: 1.7.7 - bignumber.js: 8.1.1 - chalk-pipe: 3.0.0 - decimal.js: 10.4.3 - dotenv: 9.0.2 - eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-typechain: 0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) - lodash.uniqby: 4.7.0 - minimist: 1.2.8 - moment: 2.30.1 - node-fetch: 2.7.0(encoding@0.1.13) - node-metamask: https://codeload.github.com/UMAprotocol/node-metamask/tar.gz/36b33cb82558bafcd3ab0dcfbd35b26c2c0a2584(bufferutil@4.0.8)(utf-8-validate@5.0.10) - require-context: 1.1.0 - solidity-coverage: 0.7.22(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - truffle-deploy-registry: 0.5.1 - web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - winston: 3.13.1 - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - ethers - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate - - '@uma/common@2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@across-protocol/contracts': 0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@google-cloud/kms': 3.8.0(encoding@0.1.13) - '@google-cloud/storage': 6.12.0(encoding@0.1.13) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@truffle/contract': 4.6.17(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@truffle/hdwallet-provider': 1.5.1-alpha.1(@babel/core@7.25.2)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@types/ethereum-protocol': 1.0.5 - '@uniswap/v3-core': 1.0.1 - abi-decoder: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb - async-retry: 1.3.3 - axios: 1.7.7 - bignumber.js: 8.1.1 - chalk-pipe: 3.0.0 - decimal.js: 10.4.3 - dotenv: 9.0.2 - eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-typechain: 0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) - lodash.uniqby: 4.7.0 - minimist: 1.2.8 - moment: 2.30.1 - node-fetch: 2.7.0(encoding@0.1.13) - node-metamask: https://codeload.github.com/UMAprotocol/node-metamask/tar.gz/36b33cb82558bafcd3ab0dcfbd35b26c2c0a2584(bufferutil@4.0.8)(utf-8-validate@5.0.10) - require-context: 1.1.0 - solidity-coverage: 0.7.22(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - truffle-deploy-registry: 0.5.1 - web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - winston: 3.13.1 - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - ethers - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate - - '@uma/common@2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/common@2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': dependencies: - '@across-protocol/contracts': 0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 + '@across-protocol/contracts': 0.1.4(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 '@google-cloud/kms': 3.8.0(encoding@0.1.13) '@google-cloud/storage': 6.12.0(encoding@0.1.13) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-web3': 2.0.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@truffle/contract': 4.6.17(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@truffle/hdwallet-provider': 1.5.1-alpha.1(@babel/core@7.25.2)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/ethereum-protocol': 1.0.5 '@uniswap/v3-core': 1.0.1 abi-decoder: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb async-retry: 1.3.3 - axios: 1.7.7 + axios: 1.8.2 bignumber.js: 8.1.1 chalk-pipe: 3.0.0 - decimal.js: 10.4.3 + decimal.js: 10.5.0 dotenv: 9.0.2 - eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-typechain: 0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) + eth-crypto: 2.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-typechain: 0.3.5(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) lodash.uniqby: 4.7.0 minimist: 1.2.8 moment: 2.30.1 @@ -11175,33 +11801,33 @@ snapshots: - typechain - utf-8-validate - '@uma/common@2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/common@2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@across-protocol/contracts': 0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 + '@across-protocol/contracts': 0.1.4(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 '@google-cloud/kms': 3.8.0(encoding@0.1.13) '@google-cloud/storage': 6.12.0(encoding@0.1.13) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-web3': 2.0.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@truffle/contract': 4.6.17(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@truffle/hdwallet-provider': 1.5.1-alpha.1(@babel/core@7.25.2)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/ethereum-protocol': 1.0.5 '@uniswap/v3-core': 1.0.1 abi-decoder: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb async-retry: 1.3.3 - axios: 1.7.7 + axios: 1.8.2 bignumber.js: 8.1.1 chalk-pipe: 3.0.0 - decimal.js: 10.4.3 + decimal.js: 10.5.0 dotenv: 9.0.2 - eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-typechain: 0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) + eth-crypto: 2.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat-deploy: 0.9.1(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-typechain: 0.3.5(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) lodash.uniqby: 4.7.0 minimist: 1.2.8 moment: 2.30.1 @@ -11226,33 +11852,33 @@ snapshots: - typechain - utf-8-validate - '@uma/common@2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/common@2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@across-protocol/contracts': 0.1.4(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 + '@across-protocol/contracts': 0.1.4(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 '@google-cloud/kms': 3.8.0(encoding@0.1.13) '@google-cloud/storage': 6.12.0(encoding@0.1.13) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-web3': 2.0.1(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@truffle/contract': 4.6.17(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@truffle/hdwallet-provider': 1.5.1-alpha.1(@babel/core@7.25.2)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@types/ethereum-protocol': 1.0.5 '@uniswap/v3-core': 1.0.1 abi-decoder: https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb async-retry: 1.3.3 - axios: 1.7.7 + axios: 1.8.2 bignumber.js: 8.1.1 chalk-pipe: 3.0.0 - decimal.js: 10.4.3 + decimal.js: 10.5.0 dotenv: 9.0.2 - eth-crypto: 2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - hardhat-typechain: 0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) + eth-crypto: 2.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat-deploy: 0.9.1(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + hardhat-typechain: 0.3.5(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)) lodash.uniqby: 4.7.0 minimist: 1.2.8 moment: 2.30.1 @@ -11277,72 +11903,17 @@ snapshots: - typechain - utf-8-validate - '@uma/contracts-frontend@0.4.23': {} - - '@uma/contracts-node@0.4.23': {} - - '@uma/core@2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@gnosis.pm/zodiac': 3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@maticnetwork/fx-portal': 1.0.5 - '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/merkle-distributor': 1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uniswap/lib': 4.0.1-alpha - '@uniswap/v2-core': 1.0.0 - '@uniswap/v2-periphery': 1.1.0-beta.0 - '@uniswap/v3-core': 1.0.1 - '@uniswap/v3-periphery': 1.4.4 - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - ethers - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate + '@uma/contracts-frontend@0.4.25': {} - '@uma/core@2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@gnosis.pm/zodiac': 3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@maticnetwork/fx-portal': 1.0.5 - '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/merkle-distributor': 1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uniswap/lib': 4.0.1-alpha - '@uniswap/v2-core': 1.0.0 - '@uniswap/v2-periphery': 1.1.0-beta.0 - '@uniswap/v3-core': 1.0.1 - '@uniswap/v3-periphery': 1.4.4 - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - ethers - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate + '@uma/contracts-node@0.4.25': {} - '@uma/core@2.59.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/core@2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': dependencies: - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@gnosis.pm/zodiac': 3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/zodiac': 3.2.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@maticnetwork/fx-portal': 1.0.5 '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/merkle-distributor': 1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) '@uniswap/lib': 4.0.1-alpha '@uniswap/v2-core': 1.0.0 '@uniswap/v2-periphery': 1.1.0-beta.0 @@ -11362,13 +11933,13 @@ snapshots: - typechain - utf-8-validate - '@uma/core@2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/core@2.61.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@gnosis.pm/zodiac': 3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/zodiac': 3.2.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@maticnetwork/fx-portal': 1.0.5 '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/common': 2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@uniswap/lib': 4.0.1-alpha '@uniswap/v2-core': 1.0.0 '@uniswap/v2-periphery': 1.1.0-beta.0 @@ -11388,13 +11959,13 @@ snapshots: - typechain - utf-8-validate - '@uma/core@2.61.0(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': + '@uma/core@2.61.0(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@gnosis.pm/zodiac': 3.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@gnosis.pm/zodiac': 3.2.0(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@maticnetwork/fx-portal': 1.0.5 '@openzeppelin/contracts': 4.9.6 - '@uma/common': 2.37.3(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) + '@uma/common': 2.37.3(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@uniswap/lib': 4.0.1-alpha '@uniswap/v2-core': 1.0.0 '@uniswap/v2-periphery': 1.1.0-beta.0 @@ -11435,90 +12006,21 @@ snapshots: - supports-color - utf-8-validate - '@uma/merkle-distributor@1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/contracts-node': 0.4.23 - chai: 4.5.0 - commander: 7.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ipfs-http-client: 49.0.4(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)) - mocha: 8.4.0 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate - - '@uma/merkle-distributor@1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/contracts-node': 0.4.23 - chai: 4.5.0 - commander: 7.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ipfs-http-client: 49.0.4(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)) - mocha: 8.4.0 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate - - '@uma/merkle-distributor@1.3.40(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10)': - dependencies: - '@uma/common': 2.37.1(@babel/core@7.25.2)(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4))(utf-8-validate@5.0.10) - '@uma/contracts-node': 0.4.23 - chai: 4.5.0 - commander: 7.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ipfs-http-client: 49.0.4(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)) - mocha: 8.4.0 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - '@babel/core' - - '@codechecks/client' - - '@ethersproject/hardware-wallets' - - bufferutil - - debug - - encoding - - hardhat - - supports-color - - ts-generator - - typechain - - utf-8-validate - - '@uma/sdk@0.34.8(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@uma/sdk@0.34.10(@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.8)(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@eth-optimism/core-utils': 0.7.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@google-cloud/datastore': 8.7.0(encoding@0.1.13) '@types/lodash-es': 4.17.12 - '@uma/contracts-frontend': 0.4.23 - '@uma/contracts-node': 0.4.23 - axios: 1.7.7 + '@uma/contracts-frontend': 0.4.25 + '@uma/contracts-node': 0.4.25 + axios: 1.8.2 bluebird: 3.7.2 - bn.js: 4.12.0 - decimal.js: 10.4.3 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 4.12.1 + decimal.js: 10.5.0 + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) highland: 2.13.5 immer: 9.0.21 lodash-es: 4.17.21 @@ -11529,8 +12031,6 @@ snapshots: - supports-color - utf-8-validate - '@ungap/promise-all-settled@1.1.2': {} - '@ungap/structured-clone@1.2.0': {} '@uniswap/lib@1.1.1': {} @@ -11589,9 +12089,6 @@ snapshots: '@vladfrangu/async_event_emitter@2.4.6': {} - '@zxing/text-encoding@0.9.0': - optional: true - JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -11599,12 +12096,14 @@ snapshots: abbrev@1.0.9: {} + abbrev@3.0.0: {} + abi-decoder@https://codeload.github.com/UMAprotocol/abi-decoder/tar.gz/1f18b7037985bf9b8960a6dc39dc52579ef274bb: dependencies: web3-eth-abi: 1.10.4 web3-utils: 1.10.4 - abitype@1.0.6(typescript@5.5.4): + abitype@1.0.8(typescript@5.5.4): optionalDependencies: typescript: 5.5.4 @@ -11653,13 +12152,9 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} - agentkeepalive@4.5.0: + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -11678,7 +12173,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -11689,8 +12184,6 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-colors@4.1.1: {} - ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -11719,11 +12212,6 @@ snapshots: any-promise@1.3.0: {} - any-signal@2.1.2: - dependencies: - abort-controller: 3.0.0 - native-abort-controller: 1.0.4(abort-controller@3.0.0) - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -11742,7 +12230,7 @@ snapshots: arconnect@0.4.2: dependencies: - arweave: 1.15.1 + arweave: 1.15.5 are-we-there-yet@1.1.7: dependencies: @@ -11843,7 +12331,7 @@ snapshots: arrify@2.0.1: {} - arweave@1.15.1: + arweave@1.15.5: dependencies: arconnect: 0.4.2 asn1.js: 5.4.1 @@ -11860,7 +12348,7 @@ snapshots: asn1.js@5.4.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -11890,7 +12378,7 @@ snapshots: async-mutex@0.5.0: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 async-retry@1.3.3: dependencies: @@ -11933,10 +12421,10 @@ snapshots: transitivePeerDependencies: - debug - axios@1.7.7: + axios@1.8.2: dependencies: follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.1 + form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -11947,18 +12435,18 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.25.2): dependencies: - '@babel/compat-data': 7.26.2 + '@babel/compat-data': 7.25.2 '@babel/core': 7.25.2 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.2) - core-js-compat: 3.39.0 + core-js-compat: 3.41.0 transitivePeerDependencies: - supports-color @@ -11979,7 +12467,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - base-x@5.0.0: {} + base-x@5.0.1: {} base64-js@1.5.1: {} @@ -11995,7 +12483,7 @@ snapshots: big-number@2.0.0: {} - big.js@6.2.1: {} + big.js@6.2.2: {} bigint-buffer@1.1.5: dependencies: @@ -12023,13 +12511,10 @@ snapshots: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true blakejs@1.2.1: {} - blob-to-it@1.0.4: - dependencies: - browser-readablestream-to-it: 1.0.3 - bluebird@3.7.2: {} bn.js@4.11.6: {} @@ -12076,16 +12561,6 @@ snapshots: boolbase@1.0.0: {} - borc@2.1.2: - dependencies: - bignumber.js: 9.1.2 - buffer: 5.7.1 - commander: 2.20.3 - ieee754: 1.2.1 - iso-url: 0.4.7 - json-text-sequence: 0.1.1 - readable-stream: 3.6.2 - borsh@0.7.0: dependencies: bn.js: 5.2.1 @@ -12120,8 +12595,6 @@ snapshots: browser-or-node@2.1.1: {} - browser-readablestream-to-it@1.0.3: {} - browser-stdout@1.3.1: {} browserify-aes@1.2.0: @@ -12146,19 +12619,20 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserify-rsa@4.1.0: + browserify-rsa@4.1.1: dependencies: bn.js: 5.2.1 randombytes: 2.1.0 + safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: bn.js: 5.2.1 - browserify-rsa: 4.1.0 + browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.7 - hash-base: 3.0.4 + elliptic: 6.6.1 + hash-base: 3.0.5 inherits: 2.0.4 parse-asn1: 5.1.7 readable-stream: 2.3.8 @@ -12171,12 +12645,12 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) - browserslist@4.24.2: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001686 - electron-to-chromium: 1.5.68 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + caniuse-lite: 1.0.30001703 + electron-to-chromium: 1.5.114 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) bs58@4.0.1: dependencies: @@ -12184,7 +12658,7 @@ snapshots: bs58@6.0.0: dependencies: - base-x: 5.0.0 + base-x: 5.0.1 bs58check@2.1.2: dependencies: @@ -12220,7 +12694,7 @@ snapshots: dependencies: node-gyp-build: 4.8.2 - bufio@1.2.1: {} + bufio@1.2.3: {} builtin-modules@3.3.0: {} @@ -12238,6 +12712,21 @@ snapshots: bytes@3.1.2: {} + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.4.3 + unique-filename: 4.0.0 + cacheable-lookup@5.0.4: {} cacheable-lookup@6.1.0: {} @@ -12269,6 +12758,11 @@ snapshots: package-hash: 4.0.0 write-file-atomic: 3.0.3 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -12277,6 +12771,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camel-case@3.0.0: @@ -12294,7 +12800,7 @@ snapshots: caniuse-lite@1.0.30001646: {} - caniuse-lite@1.0.30001686: {} + caniuse-lite@1.0.30001703: {} caseless@0.12.0: {} @@ -12382,29 +12888,21 @@ snapshots: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 - cheerio@1.0.0-rc.12: + cheerio@1.0.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - - chokidar@3.5.1: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.5.0 - optionalDependencies: - fsevents: 2.3.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.19.8 + whatwg-mimetype: 4.0.0 chokidar@3.6.0: dependencies: @@ -12418,12 +12916,14 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.1: + chokidar@4.0.3: dependencies: - readdirp: 4.0.1 + readdirp: 4.1.2 chownr@1.1.4: {} + chownr@3.0.0: {} + ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -12444,13 +12944,6 @@ snapshots: multicodec: 1.0.4 multihashes: 1.0.1 - cids@1.1.9: - dependencies: - multibase: 4.0.6 - multicodec: 3.2.1 - multihashes: 4.0.3 - uint8arrays: 3.1.1 - cipher-base@1.0.4: dependencies: inherits: 2.0.4 @@ -12559,9 +13052,9 @@ snapshots: commander@12.1.0: {} - commander@2.20.3: {} + commander@13.1.0: {} - commander@7.2.0: {} + commander@2.20.3: {} commander@8.3.0: {} @@ -12639,14 +13132,12 @@ snapshots: cookiejar@2.1.4: {} - core-js-compat@3.39.0: + core-js-compat@3.41.0: dependencies: - browserslist: 4.24.2 + browserslist: 4.24.4 core-util-is@1.0.2: {} - core-util-is@1.0.3: {} - cors@2.8.5: dependencies: object-assign: 4.1.1 @@ -12657,7 +13148,7 @@ snapshots: create-ecdh@4.0.4: dependencies: bn.js: 4.12.1 - elliptic: 6.5.7 + elliptic: 6.6.1 create-hash@1.2.0: dependencies: @@ -12744,7 +13235,7 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-what@6.1.0: {} @@ -12790,12 +13281,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.1(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - debug@4.3.6(supports-color@8.1.1): dependencies: ms: 2.1.2 @@ -12810,7 +13295,7 @@ snapshots: decamelize@4.0.0: {} - decimal.js@10.4.3: {} + decimal.js@10.5.0: {} decode-uri-component@0.2.2: {} @@ -12890,8 +13375,6 @@ snapshots: delegates@1.0.0: optional: true - delimit-stream@0.1.0: {} - denque@2.1.0: {} depd@2.0.0: {} @@ -12929,8 +13412,6 @@ snapshots: diff@4.0.2: {} - diff@5.0.0: {} - diff@5.2.0: {} diffie-hellman@5.0.3: @@ -12967,15 +13448,6 @@ snapshots: - bufferutil - utf-8-validate - dns-over-http-resolver@1.2.3(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - debug: 4.3.7 - native-fetch: 3.0.0(node-fetch@2.7.0(encoding@0.1.13)) - receptacle: 1.3.2 - transitivePeerDependencies: - - node-fetch - - supports-color - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -12998,7 +13470,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -13030,6 +13502,12 @@ snapshots: create-hmac: 1.1.7 optional: true + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer3@0.1.5: {} duplexify@4.1.3: @@ -13065,17 +13543,13 @@ snapshots: dependencies: jake: 10.9.2 - electron-fetch@1.9.1: - dependencies: - encoding: 0.1.13 + electron-to-chromium@1.5.114: {} electron-to-chromium@1.5.4: {} - electron-to-chromium@1.5.68: {} - elliptic@6.5.4: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -13085,7 +13559,7 @@ snapshots: elliptic@6.5.6: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -13095,7 +13569,7 @@ snapshots: elliptic@6.5.7: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -13129,6 +13603,11 @@ snapshots: encodeurl@2.0.0: {} + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -13157,8 +13636,6 @@ snapshots: err-code@2.0.3: {} - err-code@3.0.1: {} - errno@0.1.8: dependencies: prr: 1.0.1 @@ -13220,6 +13697,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-get-iterator@1.1.3: @@ -13255,12 +13734,23 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -13614,8 +14104,8 @@ snapshots: eth-block-tracker@4.4.3(@babel/core@7.25.2): dependencies: - '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.25.2) - '@babel/runtime': 7.26.0 + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.25.2) + '@babel/runtime': 7.26.10 eth-query: 2.1.2 json-rpc-random-id: 1.0.1 pify: 3.0.0 @@ -13624,15 +14114,15 @@ snapshots: - '@babel/core' - supports-color - eth-crypto@2.6.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + eth-crypto@2.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@babel/runtime': 7.20.13 + '@babel/runtime': 7.26.0 '@ethereumjs/tx': 3.5.2 - '@types/bn.js': 5.1.1 + '@types/bn.js': 5.1.6 eccrypto: 1.1.6 ethereumjs-util: 7.1.5 ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - secp256k1: 5.0.0 + secp256k1: 5.0.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13645,11 +14135,11 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.7 + axios: 1.8.2 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-readdir-recursive: 1.1.0 lodash: 4.17.21 markdown-table: 1.1.3 @@ -13672,8 +14162,8 @@ snapshots: eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - bn.js: 4.12.0 - elliptic: 6.5.7 + bn.js: 4.12.1 + elliptic: 6.6.1 nano-json-stream-parser: 0.1.2 servify: 0.1.12 ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -13749,7 +14239,7 @@ snapshots: ethereumjs-abi@0.6.8: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 ethereumjs-util: 6.2.1 ethereumjs-account@2.0.5: @@ -13799,9 +14289,9 @@ snapshots: ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 - bn.js: 4.12.0 + bn.js: 4.12.1 create-hash: 1.2.0 - elliptic: 6.5.7 + elliptic: 6.6.1 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -13887,6 +14377,42 @@ snapshots: - bufferutil - utf-8-validate + ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 @@ -13924,6 +14450,8 @@ snapshots: expand-template@2.0.3: optional: true + exponential-backoff@3.1.2: {} + express-bearer-token@3.0.0: dependencies: cookie: 1.0.1 @@ -14021,8 +14549,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14041,11 +14567,11 @@ snapshots: fast-text-encoding@1.0.6: {} - fast-uri@3.0.1: {} + fast-uri@3.0.6: {} - fast-xml-parser@4.4.1: + fast-xml-parser@4.5.3: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 fastestsmallesttextencoderdecoder@1.0.22: {} @@ -14053,6 +14579,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fecha@4.2.3: {} fetch-ponyfill@4.1.0: @@ -14113,10 +14643,6 @@ snapshots: path-exists: 2.1.0 pinkie-promise: 2.0.1 - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -14171,37 +14697,20 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@2.5.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@2.5.2: + form-data@2.5.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 safe-buffer: 5.2.1 - form-data@3.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - formidable@3.5.1: dependencies: dezalgo: 1.0.4 @@ -14255,6 +14764,10 @@ snapshots: dependencies: minipass: 2.9.0 + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + fs-readdir-recursive@1.1.0: {} fs.realpath@1.0.0: {} @@ -14313,7 +14826,7 @@ snapshots: gaxios@6.7.1(encoding@0.1.13): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-stream: 2.0.1 node-fetch: 2.7.0(encoding@0.1.13) uuid: 9.0.1 @@ -14337,9 +14850,10 @@ snapshots: - encoding - supports-color - gcp-metadata@6.1.0(encoding@0.1.13): + gcp-metadata@6.1.1(encoding@0.1.13): dependencies: gaxios: 6.7.1(encoding@0.1.13) + google-logging-utils: 0.0.2 json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -14363,12 +14877,28 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-iterator@1.0.2: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 get-package-type@0.1.0: {} get-port@3.2.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stdin@9.0.0: {} get-stream@4.1.0: @@ -14430,24 +14960,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@7.1.6: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -14549,12 +15061,12 @@ snapshots: - encoding - supports-color - google-auth-library@9.14.1(encoding@0.1.13): + google-auth-library@9.15.1(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 gaxios: 6.7.1(encoding@0.1.13) - gcp-metadata: 6.1.0(encoding@0.1.13) + gcp-metadata: 6.1.1(encoding@0.1.13) gtoken: 7.1.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: @@ -14603,22 +15115,24 @@ snapshots: google-gax@4.4.1(encoding@0.1.13): dependencies: - '@grpc/grpc-js': 1.11.3 + '@grpc/grpc-js': 1.13.0 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) node-fetch: 2.7.0(encoding@0.1.13) object-hash: 3.0.0 proto3-json-serializer: 2.0.2 - protobufjs: 7.4.0 + protobufjs: 7.3.2 retry-request: 7.0.2(encoding@0.1.13) uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color + google-logging-utils@0.0.2: {} + google-p12-pem@3.1.4: dependencies: node-forge: 1.3.1 @@ -14631,6 +15145,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 @@ -14681,8 +15197,6 @@ snapshots: graphemer@1.4.0: {} - growl@1.10.5: {} - gtoken@5.3.2(encoding@0.1.13): dependencies: gaxios: 4.3.3(encoding@0.1.13) @@ -14716,7 +15230,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.19.2 + uglify-js: 3.19.3 har-schema@2.0.0: {} @@ -14725,29 +15239,29 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - hardhat-deploy@0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hardware-wallets': 5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/solidity': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wallet': 5.7.0 + hardhat-deploy@0.9.1(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hardware-wallets': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/solidity': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wallet': 5.8.0 '@types/qs': 6.9.15 axios: 0.21.4(debug@4.3.7) chalk: 4.1.2 chokidar: 3.6.0 debug: 4.3.7 enquirer: 2.4.1 - form-data: 4.0.1 + form-data: 4.0.0 fs-extra: 10.1.0 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - match-all: 1.2.6 + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.13.0 transitivePeerDependencies: @@ -14755,29 +15269,28 @@ snapshots: - supports-color - utf-8-validate - hardhat-deploy@0.9.1(@ethersproject/hardware-wallets@5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hardware-wallets': 5.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/solidity': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wallet': 5.7.0 + hardhat-deploy@0.9.1(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/solidity': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wallet': 5.8.0 '@types/qs': 6.9.15 axios: 0.21.4(debug@4.3.7) chalk: 4.1.2 chokidar: 3.6.0 debug: 4.3.7 enquirer: 2.4.1 - form-data: 4.0.1 + form-data: 4.0.0 fs-extra: 10.1.0 - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - match-all: 1.2.6 + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.13.0 transitivePeerDependencies: @@ -14785,11 +15298,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14797,11 +15310,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -14809,23 +15322,21 @@ snapshots: - debug - utf-8-validate - hardhat-typechain@0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)): + hardhat-typechain@0.3.5(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - ts-generator: 0.1.1 - typechain: 4.0.3(typescript@5.5.4) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-typechain@0.3.5(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)): + hardhat-typechain@0.3.5(hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(ts-generator@0.1.1)(typechain@4.0.3(typescript@5.5.4)): dependencies: - hardhat: 2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ts-generator: 0.1.1 typechain: 4.0.3(typescript@5.5.4) - hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@16.18.104)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.6.2 + '@nomicfoundation/edr': 0.8.0 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -14837,34 +15348,34 @@ snapshots: aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 4.0.1 + chokidar: 4.0.3 ci-info: 2.0.0 debug: 4.3.7 enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 ethereumjs-abi: 0.6.8 - find-up: 2.1.0 + find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 - glob: 7.2.0 immutable: 4.3.7 io-ts: 1.10.4 - json-stream-stringify: 3.1.4 + json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 mocha: 10.7.0 p-map: 4.0.0 + picocolors: 1.1.1 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 solc: 0.8.26(debug@4.3.7) source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.12 tsort: 0.0.1 - undici: 5.28.4 + undici: 5.28.5 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: @@ -14876,11 +15387,11 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.19(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.6.2 + '@nomicfoundation/edr': 0.8.0 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -14892,34 +15403,34 @@ snapshots: aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 4.0.1 + chokidar: 4.0.3 ci-info: 2.0.0 debug: 4.3.7 enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 ethereumjs-abi: 0.6.8 - find-up: 2.1.0 + find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 - glob: 7.2.0 immutable: 4.3.7 io-ts: 1.10.4 - json-stream-stringify: 3.1.4 + json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 mocha: 10.7.0 p-map: 4.0.0 + picocolors: 1.1.1 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 solc: 0.8.26(debug@4.3.7) source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.12 tsort: 0.0.1 - undici: 5.28.4 + undici: 5.28.5 uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: @@ -14947,6 +15458,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -14954,7 +15467,7 @@ snapshots: has-unicode@2.0.1: optional: true - hash-base@3.0.4: + hash-base@3.0.5: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 @@ -15013,11 +15526,11 @@ snapshots: html-escaper@2.0.2: {} - htmlparser2@8.0.2: + htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 entities: 4.5.0 http-basic@8.1.3: @@ -15047,6 +15560,13 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + http-response-object@3.0.2: dependencies: '@types/node': 10.17.60 @@ -15076,9 +15596,9 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.3 debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -15165,125 +15685,14 @@ snapshots: transitivePeerDependencies: - supports-color - ip-regex@4.3.0: {} - - ipaddr.js@1.9.1: {} - - ipfs-core-types@0.3.1(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - cids: 1.1.9 - multiaddr: 8.1.2(node-fetch@2.7.0(encoding@0.1.13)) - peer-id: 0.14.8 - transitivePeerDependencies: - - node-fetch - - supports-color - - ipfs-core-utils@0.7.2(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - any-signal: 2.1.2 - blob-to-it: 1.0.4 - browser-readablestream-to-it: 1.0.3 - cids: 1.1.9 - err-code: 2.0.3 - ipfs-core-types: 0.3.1(node-fetch@2.7.0(encoding@0.1.13)) - ipfs-utils: 6.0.8(encoding@0.1.13) - it-all: 1.0.6 - it-map: 1.0.6 - it-peekable: 1.0.3 - multiaddr: 8.1.2(node-fetch@2.7.0(encoding@0.1.13)) - multiaddr-to-uri: 6.0.0(node-fetch@2.7.0(encoding@0.1.13)) - parse-duration: 0.4.4 - timeout-abort-controller: 1.1.1 - uint8arrays: 2.1.10 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - - ipfs-http-client@49.0.4(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - abort-controller: 3.0.0 - any-signal: 2.1.2 - bignumber.js: 9.1.2 - cids: 1.1.9 - debug: 4.3.7 - form-data: 3.0.2 - ipfs-core-types: 0.3.1(node-fetch@2.7.0(encoding@0.1.13)) - ipfs-core-utils: 0.7.2(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13)) - ipfs-utils: 6.0.8(encoding@0.1.13) - ipld-block: 0.11.1 - ipld-dag-cbor: 0.17.1 - ipld-dag-pb: 0.20.0 - ipld-raw: 6.0.0 - it-last: 1.0.6 - it-map: 1.0.6 - it-tar: 1.2.2 - it-to-stream: 0.1.2 - merge-options: 3.0.4 - multiaddr: 8.1.2(node-fetch@2.7.0(encoding@0.1.13)) - multibase: 4.0.6 - multicodec: 3.2.1 - multihashes: 4.0.3 - nanoid: 3.3.7 - native-abort-controller: 1.0.4(abort-controller@3.0.0) - parse-duration: 0.4.4 - stream-to-it: 0.2.4 - uint8arrays: 2.1.10 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - - ipfs-utils@6.0.8(encoding@0.1.13): - dependencies: - abort-controller: 3.0.0 - any-signal: 2.1.2 - buffer: 6.0.3 - electron-fetch: 1.9.1 - err-code: 3.0.1 - is-electron: 2.2.2 - iso-url: 1.2.1 - it-glob: 0.0.14 - it-to-stream: 1.0.0 - merge-options: 3.0.4 - nanoid: 3.3.7 - native-abort-controller: 1.0.4(abort-controller@3.0.0) - native-fetch: 3.0.0(node-fetch@2.7.0(encoding@0.1.13)) - node-fetch: 2.7.0(encoding@0.1.13) - stream-to-it: 0.2.4 - transitivePeerDependencies: - - encoding - - ipld-block@0.11.1: - dependencies: - cids: 1.1.9 - - ipld-dag-cbor@0.17.1: + ip-address@9.0.5: dependencies: - borc: 2.1.2 - cids: 1.1.9 - is-circular: 1.0.2 - multicodec: 3.2.1 - multihashing-async: 2.1.4 - uint8arrays: 2.1.10 + jsbn: 1.1.0 + sprintf-js: 1.1.3 - ipld-dag-pb@0.20.0: - dependencies: - cids: 1.1.9 - class-is: 1.1.0 - multicodec: 2.1.3 - multihashing-async: 2.1.4 - protons: 2.0.3 - reset: 0.1.0 - run: 1.5.0 - stable: 0.1.8 - uint8arrays: 1.1.0 + ip-regex@4.3.0: {} - ipld-raw@6.0.0: - dependencies: - cids: 1.1.9 - multicodec: 2.1.3 - multihashing-async: 2.1.4 + ipaddr.js@1.9.1: {} is-arguments@1.1.1: dependencies: @@ -15322,8 +15731,6 @@ snapshots: is-callable@1.2.7: {} - is-circular@1.0.2: {} - is-core-module@2.15.0: dependencies: hasown: 2.0.2 @@ -15336,13 +15743,11 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-electron@2.2.2: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-fn@1.0.0: {} @@ -15463,24 +15868,15 @@ snapshots: isexe@2.0.0: {} - iso-constants@0.1.2: {} - - iso-random-stream@2.0.2: - dependencies: - events: 3.3.0 - readable-stream: 3.6.2 - - iso-url@0.4.7: {} - - iso-url@1.2.1: {} + isexe@3.1.1: {} isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - isows@1.0.6(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + isows@1.0.6(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -15528,54 +15924,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - it-all@1.0.6: {} - - it-concat@1.0.3: - dependencies: - bl: 4.1.0 - - it-glob@0.0.14: - dependencies: - '@types/minimatch': 3.0.5 - minimatch: 3.1.2 - - it-last@1.0.6: {} - - it-map@1.0.6: {} - - it-peekable@1.0.3: {} - - it-reader@2.1.0: - dependencies: - bl: 4.1.0 - - it-tar@1.2.2: - dependencies: - bl: 4.1.0 - buffer: 5.7.1 - iso-constants: 0.1.2 - it-concat: 1.0.3 - it-reader: 2.1.0 - p-defer: 3.0.0 - - it-to-stream@0.1.2: - dependencies: - buffer: 5.7.1 - fast-fifo: 1.3.2 - get-iterator: 1.0.2 - p-defer: 3.0.0 - p-fifo: 1.0.0 - readable-stream: 3.6.2 - - it-to-stream@1.0.0: - dependencies: - buffer: 6.0.3 - fast-fifo: 1.3.2 - get-iterator: 1.0.2 - p-defer: 3.0.0 - p-fifo: 1.0.0 - readable-stream: 3.6.2 - iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 @@ -15597,7 +15945,7 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + jayson@4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 @@ -15630,10 +15978,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.0.0: - dependencies: - argparse: 2.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -15644,10 +15988,12 @@ snapshots: jsbn@0.1.1: {} - jsdoc@4.0.3: + jsbn@1.1.0: {} + + jsdoc@4.0.4: dependencies: - '@babel/parser': 7.25.3 - '@jsdoc/salty': 0.2.8 + '@babel/parser': 7.26.10 + '@jsdoc/salty': 0.2.9 '@types/markdown-it': 14.1.2 bluebird: 3.7.2 catharsis: 0.9.0 @@ -15693,21 +16039,18 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.1.1: + json-stable-stringify@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 isarray: 2.0.5 jsonify: 0.0.1 object-keys: 1.1.1 - json-stream-stringify@3.1.4: {} + json-stream-stringify@3.1.6: {} json-stringify-safe@5.0.1: {} - json-text-sequence@0.1.1: - dependencies: - delimit-stream: 0.1.0 - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -15732,7 +16075,7 @@ snapshots: jsonparse@1.3.1: {} - jsonschema@1.4.1: {} + jsonschema@1.5.0: {} jsprim@1.4.2: dependencies: @@ -15765,8 +16108,6 @@ snapshots: node-gyp-build: 4.8.2 readable-stream: 3.6.2 - keypair@1.0.4: {} - keyv@3.1.0: dependencies: json-buffer: 3.0.0 @@ -15835,20 +16176,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libp2p-crypto@0.19.7: - dependencies: - err-code: 3.0.1 - is-typedarray: 1.0.0 - iso-random-stream: 2.0.2 - keypair: 1.0.4 - multiformats: 9.9.0 - node-forge: 0.10.0 - pem-jwk: 2.0.0 - protobufjs: 6.11.4 - secp256k1: 4.0.3 - uint8arrays: 3.1.1 - ursa-optional: 0.10.2 - lines-and-columns@1.2.4: {} linkify-it@5.0.0: @@ -15863,11 +16190,6 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -15914,10 +16236,6 @@ snapshots: log-driver@1.2.7: {} - log-symbols@4.0.0: - dependencies: - chalk: 4.1.2 - log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -15992,6 +16310,22 @@ snapshots: make-error@1.3.6: {} + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): dependencies: '@types/markdown-it': 14.1.2 @@ -16010,7 +16344,9 @@ snapshots: marked@4.3.0: {} - match-all@1.2.6: {} + match-all@1.2.7: {} + + math-intrinsics@1.1.0: {} md5.js@1.3.5: dependencies: @@ -16037,10 +16373,6 @@ snapshots: merge-descriptors@1.0.3: {} - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 - merge2@1.4.1: {} merkle-patricia-tree@2.3.2: @@ -16105,14 +16437,6 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@3.0.4: - dependencies: - brace-expansion: 1.1.11 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -16131,17 +16455,50 @@ snapshots: minimist@1.2.8: {} + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.0.1 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + minipass@2.9.0: dependencies: safe-buffer: 5.2.1 yallist: 3.1.1 + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@7.1.2: {} minizlib@1.3.3: dependencies: minipass: 2.9.0 + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + mkdirp-classic@0.5.3: optional: true @@ -16161,7 +16518,7 @@ snapshots: mnemonist@0.38.5: dependencies: - obliterator: 2.0.4 + obliterator: 2.0.5 mocha@10.7.0: dependencies: @@ -16186,34 +16543,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - mocha@8.4.0: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.1 - debug: 4.3.1(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.1.6 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.0.0 - log-symbols: 4.0.0 - minimatch: 3.0.4 - ms: 2.1.3 - nanoid: 3.1.20 - serialize-javascript: 5.0.1 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - wide-align: 1.1.3 - workerpool: 6.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - mock-fs@4.14.0: {} module-details-from-path@1.0.3: {} @@ -16242,13 +16571,6 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 - multiaddr-to-uri@6.0.0(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - multiaddr: 8.1.2(node-fetch@2.7.0(encoding@0.1.13)) - transitivePeerDependencies: - - node-fetch - - supports-color - multiaddr@7.5.0: dependencies: buffer: 5.7.1 @@ -16258,20 +16580,6 @@ snapshots: multibase: 0.7.0 varint: 5.0.2 - multiaddr@8.1.2(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - cids: 1.1.9 - class-is: 1.1.0 - dns-over-http-resolver: 1.2.3(node-fetch@2.7.0(encoding@0.1.13)) - err-code: 2.0.3 - is-ip: 3.1.0 - multibase: 3.1.2 - uint8arrays: 1.1.0 - varint: 5.0.2 - transitivePeerDependencies: - - node-fetch - - supports-color - multibase@0.6.1: dependencies: base-x: 3.0.10 @@ -16287,15 +16595,6 @@ snapshots: base-x: 3.0.10 buffer: 5.7.1 - multibase@3.1.2: - dependencies: - '@multiformats/base-x': 4.0.1 - web-encoding: 1.1.5 - - multibase@4.0.6: - dependencies: - '@multiformats/base-x': 4.0.1 - multicodec@0.5.7: dependencies: varint: 5.0.2 @@ -16305,18 +16604,6 @@ snapshots: buffer: 5.7.1 varint: 5.0.2 - multicodec@2.1.3: - dependencies: - uint8arrays: 1.1.0 - varint: 6.0.0 - - multicodec@3.2.1: - dependencies: - uint8arrays: 3.1.1 - varint: 6.0.0 - - multiformats@9.9.0: {} - multihashes@0.4.21: dependencies: buffer: 5.7.1 @@ -16329,29 +16616,12 @@ snapshots: multibase: 1.0.1 varint: 5.0.2 - multihashes@4.0.3: - dependencies: - multibase: 4.0.6 - uint8arrays: 3.1.1 - varint: 5.0.2 - - multihashing-async@2.1.4: - dependencies: - blakejs: 1.2.1 - err-code: 3.0.1 - js-sha3: 0.8.0 - multihashes: 4.0.3 - murmurhash3js-revisited: 3.0.0 - uint8arrays: 3.1.1 - murmur-128@0.2.1: dependencies: encode-utf8: 1.0.3 fmix: 0.1.0 imul: 1.0.1 - murmurhash3js-revisited@3.0.0: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -16360,34 +16630,22 @@ snapshots: nan@2.14.0: {} - nan@2.21.0: {} - - nan@2.22.0: + nan@2.22.2: optional: true nano-base32@1.0.1: {} nano-json-stream-parser@0.1.2: {} - nanoid@3.1.20: {} - - nanoid@3.3.7: {} - napi-build-utils@1.0.2: optional: true - native-abort-controller@1.0.4(abort-controller@3.0.0): - dependencies: - abort-controller: 3.0.0 - - native-fetch@3.0.0(node-fetch@2.7.0(encoding@0.1.13)): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - natural-compare@1.4.0: {} negotiator@0.6.3: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} next-tick@1.1.0: {} @@ -16437,8 +16695,6 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-forge@0.10.0: {} - node-forge@1.3.1: {} node-gyp-build-optional-packages@5.2.2: @@ -16450,13 +16706,25 @@ snapshots: node-gyp-build@4.8.2: {} - node-gyp-build@4.8.4: - optional: true + node-gyp@11.1.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.6.3 + tar: 7.4.3 + which: 5.0.0 + transitivePeerDependencies: + - supports-color node-hid@1.3.0: dependencies: bindings: 1.5.0 - nan: 2.22.0 + nan: 2.22.2 node-abi: 2.30.1 prebuild-install: 5.3.6 optional: true @@ -16492,6 +16760,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + nofilter@1.0.4: {} nofilter@3.1.0: {} @@ -16503,6 +16773,10 @@ snapshots: dependencies: abbrev: 1.0.9 + nopt@8.1.0: + dependencies: + abbrev: 3.0.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -16618,7 +16892,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - obliterator@2.0.4: {} + obliterator@2.0.5: {} oboe@2.1.5: dependencies: @@ -16662,14 +16936,14 @@ snapshots: os-tmpdir@1.0.2: {} - ox@0.1.2(typescript@5.5.4): + ox@0.6.9(typescript@5.5.4): dependencies: '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(typescript@5.5.4) + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.5.4) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.5.4 @@ -16682,17 +16956,6 @@ snapshots: p-cancelable@3.0.0: {} - p-defer@3.0.0: {} - - p-fifo@1.0.0: - dependencies: - fast-fifo: 1.3.2 - p-defer: 3.0.0 - - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -16701,10 +16964,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -16721,7 +16980,7 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-try@1.0.0: {} + p-map@7.0.3: {} p-try@2.2.0: {} @@ -16749,14 +17008,12 @@ snapshots: asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 - hash-base: 3.0.4 + hash-base: 3.0.5 pbkdf2: 3.1.2 safe-buffer: 5.2.1 parse-cache-control@1.0.1: {} - parse-duration@0.4.4: {} - parse-headers@2.0.5: {} parse-json@2.2.0: @@ -16774,16 +17031,20 @@ snapshots: dependencies: parse5: 6.0.1 - parse5-htmlparser2-tree-adapter@7.0.0: + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 - parse5: 7.1.2 + parse5: 7.2.1 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.2.1 parse5@5.1.1: {} parse5@6.0.1: {} - parse5@7.1.2: + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -16802,8 +17063,6 @@ snapshots: dependencies: pinkie-promise: 2.0.1 - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -16844,20 +17103,6 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - peer-id@0.14.8: - dependencies: - cids: 1.1.9 - class-is: 1.1.0 - libp2p-crypto: 0.19.7 - minimist: 1.2.8 - multihashes: 4.0.3 - protobufjs: 6.11.4 - uint8arrays: 2.1.10 - - pem-jwk@2.0.0: - dependencies: - asn1.js: 5.4.1 - performance-now@2.1.0: {} pg-cloudflare@1.1.1: @@ -16913,6 +17158,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -16969,7 +17216,7 @@ snapshots: pump: 3.0.2 rc: 1.2.8 simple-get: 3.1.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 which-pm-runs: 1.1.0 optional: true @@ -16987,7 +17234,7 @@ snapshots: pump: 3.0.2 rc: 1.2.8 simple-get: 3.1.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 optional: true @@ -17015,6 +17262,8 @@ snapshots: prettier@3.3.3: {} + proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} process-on-spawn@1.0.0: @@ -17023,6 +17272,11 @@ snapshots: process@0.11.10: {} + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + promise-to-callback@1.0.0: dependencies: is-fn: 1.0.0 @@ -17044,11 +17298,11 @@ snapshots: proto3-json-serializer@1.1.1: dependencies: - protobufjs: 7.2.4 + protobufjs: 7.3.2 proto3-json-serializer@2.0.2: dependencies: - protobufjs: 7.4.0 + protobufjs: 7.3.2 protobufjs-cli@1.1.1(protobufjs@7.2.4): dependencies: @@ -17057,12 +17311,12 @@ snapshots: espree: 9.6.1 estraverse: 5.3.0 glob: 8.1.0 - jsdoc: 4.0.3 + jsdoc: 4.0.4 minimist: 1.2.8 protobufjs: 7.2.4 semver: 7.6.3 tmp: 0.2.3 - uglify-js: 3.19.1 + uglify-js: 3.19.3 protobufjs@6.11.3: dependencies: @@ -17126,30 +17380,6 @@ snapshots: '@types/node': 16.18.104 long: 5.2.3 - protobufjs@7.4.0: - 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': 16.18.104 - long: 5.2.3 - - protocol-buffers-schema@3.6.0: {} - - protons@2.0.3: - dependencies: - protocol-buffers-schema: 3.6.0 - signed-varint: 2.0.1 - uint8arrays: 3.1.1 - varint: 5.0.2 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -17164,7 +17394,7 @@ snapshots: public-encrypt@4.0.3: dependencies: bn.js: 4.12.1 - browserify-rsa: 4.1.0 + browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 randombytes: 2.1.0 @@ -17271,21 +17501,21 @@ snapshots: readable-stream@1.0.34: dependencies: - core-util-is: 1.0.3 + core-util-is: 1.0.2 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 readable-stream@1.1.14: dependencies: - core-util-is: 1.0.3 + core-util-is: 1.0.2 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 readable-stream@2.3.8: dependencies: - core-util-is: 1.0.3 + core-util-is: 1.0.2 inherits: 2.0.4 isarray: 1.0.0 process-nextick-args: 2.0.1 @@ -17299,19 +17529,11 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@3.5.0: - dependencies: - picomatch: 2.3.1 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 - readdirp@4.0.1: {} - - receptacle@1.3.2: - dependencies: - ms: 2.1.3 + readdirp@4.1.2: {} rechoir@0.6.2: dependencies: @@ -17350,8 +17572,6 @@ snapshots: globalthis: 1.0.4 which-builtin-type: 1.1.4 - regenerator-runtime@0.13.11: {} - regenerator-runtime@0.14.1: {} regexp-tree@0.1.27: {} @@ -17463,8 +17683,6 @@ snapshots: dependencies: lodash: 4.17.21 - reset@0.1.0: {} - resolve-alpn@1.2.1: {} resolve-from@3.0.0: {} @@ -17506,8 +17724,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - retimer@2.0.0: {} - retry-request@4.2.2: dependencies: debug: 4.3.7 @@ -17531,6 +17747,8 @@ snapshots: - encoding - supports-color + retry@0.12.0: {} + retry@0.13.1: {} reusify@1.0.4: {} @@ -17543,6 +17761,10 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + ripemd160-min@0.0.6: {} ripemd160@2.0.2: @@ -17554,7 +17776,7 @@ snapshots: dependencies: bn.js: 5.2.1 - rpc-websockets@9.0.4: + rpc-websockets@9.1.1: dependencies: '@swc/helpers': 0.5.15 '@types/uuid': 8.3.4 @@ -17562,7 +17784,7 @@ snapshots: buffer: 6.0.3 eventemitter3: 5.0.1 uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 @@ -17571,17 +17793,13 @@ snapshots: dependencies: queue-microtask: 1.2.3 - run@1.5.0: - dependencies: - minimatch: 10.0.1 - rustbn.js@0.2.0: {} rxjs@6.6.7: dependencies: tslib: 1.14.1 - rxjs@7.8.1: + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -17638,8 +17856,8 @@ snapshots: bn.js: 4.12.1 create-hash: 1.2.0 drbg.js: 1.0.1 - elliptic: 6.5.7 - nan: 2.14.0 + elliptic: 6.6.1 + nan: 2.22.2 safe-buffer: 5.2.1 optional: true @@ -17649,11 +17867,11 @@ snapshots: node-addon-api: 2.0.2 node-gyp-build: 4.8.1 - secp256k1@5.0.0: + secp256k1@5.0.1: dependencies: - elliptic: 6.5.6 + elliptic: 6.6.1 node-addon-api: 5.1.0 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 semaphore@1.1.0: {} @@ -17706,10 +17924,6 @@ snapshots: no-case: 2.3.2 upper-case-first: 1.1.2 - serialize-javascript@5.0.1: - dependencies: - randombytes: 2.1.0 - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -17807,10 +18021,6 @@ snapshots: signal-exit@4.1.0: {} - signed-varint@2.0.1: - dependencies: - varint: 5.0.2 - simple-concat@1.0.1: {} simple-get@2.8.2: @@ -17840,6 +18050,8 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smart-buffer@4.2.0: {} + snake-case@2.1.0: dependencies: no-case: 2.3.2 @@ -17849,6 +18061,19 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.3.7 + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + solc@0.4.26: dependencies: fs-extra: 0.30.0 @@ -17880,7 +18105,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - jsonschema: 1.4.1 + jsonschema: 1.5.0 lodash: 4.17.21 node-emoji: 1.11.0 pify: 4.0.1 @@ -17953,6 +18178,8 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -17965,11 +18192,13 @@ snapshots: safer-buffer: 2.1.2 tweetnacl: 0.14.5 - stable@0.1.8: {} + ssri@12.0.0: + dependencies: + minipass: 7.1.2 stack-trace@0.0.10: {} - stacktrace-parser@0.1.10: + stacktrace-parser@0.1.11: dependencies: type-fest: 0.7.1 @@ -17989,10 +18218,6 @@ snapshots: stream-shift@1.0.3: {} - stream-to-it@0.2.4: - dependencies: - get-iterator: 1.0.2 - strict-uri-encode@1.1.0: {} strict-uri-encode@2.0.0: {} @@ -18113,7 +18338,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} stubs@3.0.0: {} @@ -18202,7 +18427,7 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.3 - table@6.8.2: + table@6.9.0: dependencies: ajv: 8.17.1 lodash.truncate: 4.4.2 @@ -18212,7 +18437,7 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -18239,6 +18464,15 @@ snapshots: safe-buffer: 5.2.1 yallist: 3.1.1 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + teeny-request@7.2.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0 @@ -18299,7 +18533,7 @@ snapshots: '@types/qs': 6.9.15 caseless: 0.12.0 concat-stream: 1.6.2 - form-data: 2.5.2 + form-data: 2.5.3 http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 @@ -18317,10 +18551,10 @@ snapshots: timed-out@4.0.1: {} - timeout-abort-controller@1.1.1: + tinyglobby@0.2.12: dependencies: - abort-controller: 3.0.0 - retimer: 2.0.0 + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 title-case@2.1.1: dependencies: @@ -18598,23 +18832,7 @@ snapshots: uc.micro@2.1.0: {} - uglify-js@3.19.1: {} - - uglify-js@3.19.2: - optional: true - - uint8arrays@1.1.0: - dependencies: - multibase: 3.1.2 - web-encoding: 1.1.5 - - uint8arrays@2.1.10: - dependencies: - multiformats: 9.9.0 - - uint8arrays@3.1.1: - dependencies: - multiformats: 9.9.0 + uglify-js@3.19.3: {} ultron@1.1.1: {} @@ -18629,12 +18847,22 @@ snapshots: undici-types@6.19.8: {} - undici@5.28.4: + undici-types@7.5.0: {} + + undici@5.28.5: dependencies: '@fastify/busboy': 2.1.1 undici@6.19.8: {} + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -18647,9 +18875,9 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 - update-browserslist-db@1.1.1(browserslist@4.24.2): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: - browserslist: 4.24.2 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -18669,15 +18897,10 @@ snapshots: url-set-query@1.0.0: {} - ursa-optional@0.10.2: - dependencies: - bindings: 1.5.0 - nan: 2.21.0 - usb@1.9.2: dependencies: node-addon-api: 4.3.0 - node-gyp-build: 4.8.4 + node-gyp-build: 4.8.2 optional: true utf-8-validate@5.0.10: @@ -18723,8 +18946,6 @@ snapshots: varint@5.0.2: {} - varint@6.0.0: {} - vary@1.1.2: {} verror@1.10.0: @@ -18733,17 +18954,16 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - viem@2.21.53(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10): + viem@2.23.10(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(typescript@5.5.4) - isows: 1.0.6(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - ox: 0.1.2(typescript@5.5.4) - webauthn-p256: 0.0.10 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.5.4) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ox: 0.6.9(typescript@5.5.4) + ws: 8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -18751,12 +18971,6 @@ snapshots: - utf-8-validate - zod - web-encoding@1.1.5: - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - web3-bzz@1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 @@ -18819,7 +19033,7 @@ snapshots: web3-core-method@1.10.0: dependencies: - '@ethersproject/transactions': 5.7.0 + '@ethersproject/transactions': 5.8.0 web3-core-helpers: 1.10.0 web3-core-promievent: 1.10.0 web3-core-subscriptions: 1.10.0 @@ -18827,7 +19041,7 @@ snapshots: web3-core-method@1.10.4: dependencies: - '@ethersproject/transactions': 5.7.0 + '@ethersproject/transactions': 5.8.0 web3-core-helpers: 1.10.4 web3-core-promievent: 1.10.4 web3-core-subscriptions: 1.10.4 @@ -18835,7 +19049,7 @@ snapshots: web3-core-method@1.7.4: dependencies: - '@ethersproject/transactions': 5.7.0 + '@ethersproject/transactions': 5.8.0 web3-core-helpers: 1.7.4 web3-core-promievent: 1.7.4 web3-core-subscriptions: 1.7.4 @@ -18843,7 +19057,7 @@ snapshots: web3-core-method@1.8.2: dependencies: - '@ethersproject/transactions': 5.7.0 + '@ethersproject/transactions': 5.8.0 web3-core-helpers: 1.8.2 web3-core-promievent: 1.8.2 web3-core-subscriptions: 1.8.2 @@ -18981,22 +19195,22 @@ snapshots: web3-eth-abi@1.10.0: dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 web3-utils: 1.10.0 web3-eth-abi@1.10.4: dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 web3-utils: 1.10.4 web3-eth-abi@1.7.4: dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 web3-utils: 1.7.4 web3-eth-abi@1.8.2: dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 web3-utils: 1.8.2 web3-eth-accounts@1.10.0(encoding@0.1.13): @@ -19569,11 +19783,6 @@ snapshots: - supports-color - utf-8-validate - webauthn-p256@0.0.10: - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - webidl-conversions@3.0.1: {} websocket@1.0.35: @@ -19587,8 +19796,14 @@ snapshots: transitivePeerDependencies: - supports-color + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-fetch@2.0.4: {} + whatwg-mimetype@4.0.0: {} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -19647,9 +19862,9 @@ snapshots: dependencies: isexe: 2.0.0 - wide-align@1.1.3: + which@5.0.0: dependencies: - string-width: 2.1.1 + isexe: 3.1.1 wide-align@1.1.5: dependencies: @@ -19686,8 +19901,6 @@ snapshots: wordwrap@1.0.0: {} - workerpool@6.1.0: {} - workerpool@6.5.1: {} wrap-ansi@2.1.0: @@ -19753,6 +19966,11 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@8.18.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + xhr-request-promise@0.1.3: dependencies: xhr-request: 1.1.0 @@ -19800,6 +20018,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -19810,8 +20030,6 @@ snapshots: camelcase: 3.0.0 lodash.assign: 4.2.0 - yargs-parser@20.2.4: {} - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -19878,6 +20096,6 @@ snapshots: yocto-queue@0.1.0: {} - zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + zksync-web3@0.14.4(ethers@5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)