From e32135c6d60e096ee2ff3276f413780b2debf00e Mon Sep 17 00:00:00 2001 From: Jorge Sanmiguel <8038323+jsanmigimeno@users.noreply.github.com> Date: Fri, 31 May 2024 09:41:06 +0000 Subject: [PATCH 1/4] feat: Overhaul the 'privateKey' loading mechanism --- config.example.yaml | 11 +++- src/config/config.schema.ts | 30 ++++++++--- src/config/config.service.ts | 18 ++++++- src/config/config.types.ts | 6 ++- src/config/privateKeyLoaders/env.ts | 35 +++++++++++++ .../privateKeyLoaders/privateKeyLoader.ts | 51 +++++++++++++++++++ src/main.ts | 3 ++ src/submitter/submitter.service.ts | 8 +-- src/wallet/wallet.service.ts | 17 +++---- 9 files changed, 155 insertions(+), 24 deletions(-) create mode 100644 src/config/privateKeyLoaders/env.ts create mode 100644 src/config/privateKeyLoaders/privateKeyLoader.ts diff --git a/config.example.yaml b/config.example.yaml index c502f7c..c0a7084 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -1,6 +1,15 @@ # Global Relayer configuration global: - privateKey: '' # The privateKey of the account that will be submitting the packet relays + # ! The 'privateKey' of the account that will be submitting the packet relays is by default + # ! loaded from the environment variable 'RELAYER_PRIVATE_KEY'. Alternatively, the privateKey + # ! may be specified here (not recommended). + # privateKey: '' + # ! Optionally, custom privateKey loaders may be implemented and specified (NOTE: the 'env' + # ! loader is used if no privateKey configuration is specified): + # privateKey: + # loader: 'env' # The privateKey loader name (must match the implementation on src/config/privateKeyLoaders/.ts). + # customLoaderConfig: '' # Custom loader configs may be specified. + logLevel: 'info' monitor: diff --git a/src/config/config.schema.ts b/src/config/config.schema.ts index 2c4d80e..4bb165b 100644 --- a/src/config/config.schema.ts +++ b/src/config/config.schema.ts @@ -4,8 +4,8 @@ import { AnyValidateFunction } from "ajv/dist/core" const MIN_PROCESSING_INTERVAL = 1; const MAX_PROCESSING_INTERVAL = 500; -const EVM_ADDRESS_EXPR = '^0x[0-9a-fA-F]{40}$'; // '0x' + 20 bytes (40 chars) -const BYTES_32_HEX_EXPR = '^0x[0-9a-fA-F]{64}$'; // '0x' + 32 bytes (64 chars) +export const EVM_ADDRESS_EXPR = '^0x[0-9a-fA-F]{40}$'; // '0x' + 20 bytes (40 chars) +export const BYTES_32_HEX_EXPR = '^0x[0-9a-fA-F]{64}$'; // '0x' + 32 bytes (64 chars) const POSITIVE_NUMBER_SCHEMA = { $id: "positive-number-schema", @@ -73,10 +73,7 @@ const GLOBAL_SCHEMA = { $id: "global-schema", type: "object", properties: { - privateKey: { - type: "string", - pattern: BYTES_32_HEX_EXPR, - }, + privateKey: { $ref: "private-key-schema" }, logLevel: { $ref: "non-empty-string-schema" }, monitor: { $ref: "monitor-schema" }, @@ -85,10 +82,28 @@ const GLOBAL_SCHEMA = { persister: { $ref: "persister-schema" }, wallet: { $ref: "wallet-schema" }, }, - required: ["privateKey"], + required: [], additionalProperties: false } +const PRIVATE_KEY_SCHEMA = { + $id: "private-key-schema", + "anyOf": [ + { + type: "string", + pattern: BYTES_32_HEX_EXPR, + }, + { + type: "object", + properties: { + loader: { $ref: "non-empty-string-schema" }, + }, + required: ["loader"], + additionalProperties: true, + } + ] +} + const MONITOR_SCHEMA = { $id: "monitor-schema", type: "object", @@ -235,6 +250,7 @@ const CHAINS_SCHEMA = { export function getConfigValidator(): AnyValidateFunction { const ajv = new Ajv({ strict: true }); ajv.addSchema(POSITIVE_NUMBER_SCHEMA); + ajv.addSchema(PRIVATE_KEY_SCHEMA); ajv.addSchema(INTEGER_SCHEMA); ajv.addSchema(POSITIVE_NON_ZERO_INTEGER_SCHEMA); ajv.addSchema(NON_EMPTY_STRING_SCHEMA); diff --git a/src/config/config.service.ts b/src/config/config.service.ts index ef2d8fe..dfa4f0a 100644 --- a/src/config/config.service.ts +++ b/src/config/config.service.ts @@ -4,6 +4,7 @@ import * as yaml from 'js-yaml'; import dotenv from 'dotenv'; import { getConfigValidator } from './config.schema'; import { GlobalConfig, ChainConfig, AMBConfig, GetterGlobalConfig, SubmitterGlobalConfig, PersisterConfig, WalletGlobalConfig, GetterConfig, SubmitterConfig, WalletConfig, MonitorConfig, MonitorGlobalConfig } from './config.types'; +import { loadPrivateKeyLoader } from './privateKeyLoaders/privateKeyLoader'; @Injectable() export class ConfigService { @@ -72,6 +73,21 @@ export class ConfigService { } } + private async loadPrivateKey(rawPrivateKeyConfig: any): Promise { + if (typeof rawPrivateKeyConfig === "string") { + //NOTE: Using 'console.warn' as the logger is not available at this point. //TODO use logger + console.warn('WARNING: the privateKey has been loaded from the configuration file. Consider storing the privateKey using an alternative safer method.') + return rawPrivateKeyConfig; + } + + const privateKeyLoader = loadPrivateKeyLoader( + rawPrivateKeyConfig?.['loader'] ?? null, + rawPrivateKeyConfig ?? {}, + ); + + return privateKeyLoader.load(); + } + private loadGlobalConfig(): GlobalConfig { const rawGlobalConfig = this.rawConfig['global']; @@ -83,7 +99,7 @@ export class ConfigService { return { port: parseInt(process.env['RELAYER_PORT']), - privateKey: rawGlobalConfig.privateKey, + privateKey: this.loadPrivateKey(rawGlobalConfig.privateKey), logLevel: rawGlobalConfig.logLevel, monitor: this.formatMonitorGlobalConfig(rawGlobalConfig.monitor), getter: this.formatGetterGlobalConfig(rawGlobalConfig.getter), diff --git a/src/config/config.types.ts b/src/config/config.types.ts index ffea932..04d3231 100644 --- a/src/config/config.types.ts +++ b/src/config/config.types.ts @@ -1,6 +1,6 @@ export interface GlobalConfig { port: number; - privateKey: string; + privateKey: Promise; logLevel?: string; monitor: MonitorGlobalConfig; getter: GetterGlobalConfig; @@ -9,6 +9,10 @@ export interface GlobalConfig { wallet: WalletGlobalConfig; } +export type PrivateKeyConfig = string | { + loader: string; +} + export interface MonitorGlobalConfig { interval?: number; blockDelay?: number; diff --git a/src/config/privateKeyLoaders/env.ts b/src/config/privateKeyLoaders/env.ts new file mode 100644 index 0000000..fdb1fa6 --- /dev/null +++ b/src/config/privateKeyLoaders/env.ts @@ -0,0 +1,35 @@ +import { PrivateKeyLoader, PrivateKeyLoaderConfig } from "./privateKeyLoader"; + +export const PRIVATE_KEY_LOADER_TYPE_ENVIRONMENT_VARIABLE = 'env'; +const DEFAULT_ENV_VARIABLE_NAME = 'RELAYER_PRIVATE_KEY'; + +export interface EnvPrivateKeyLoaderConfig extends PrivateKeyLoaderConfig { + envVariableName?: string, +} + +export class EnvPrivateKeyLoader extends PrivateKeyLoader { + override loaderType: string = PRIVATE_KEY_LOADER_TYPE_ENVIRONMENT_VARIABLE; + private readonly envVariableName: string; + + constructor( + protected override readonly config: EnvPrivateKeyLoaderConfig, + ) { + super(config); + + this.envVariableName = config.envVariableName ?? DEFAULT_ENV_VARIABLE_NAME; + } + + override async loadPrivateKey(): Promise { + const privateKey = process.env[this.envVariableName]; + + if (privateKey == undefined) { + throw new Error( + `Failed to load privateKey from enviornment variable '${this.envVariableName}'.`, + ); + } + + return privateKey; + } +} + +export default EnvPrivateKeyLoader; diff --git a/src/config/privateKeyLoaders/privateKeyLoader.ts b/src/config/privateKeyLoaders/privateKeyLoader.ts new file mode 100644 index 0000000..1377295 --- /dev/null +++ b/src/config/privateKeyLoaders/privateKeyLoader.ts @@ -0,0 +1,51 @@ +import { BYTES_32_HEX_EXPR } from "../config.schema"; + +export const PRIVATE_KEY_LOADER_TYPE_BASE = 'base'; + +const DEFAULT_PRIVATE_KEY_LOADER = 'env'; + +export interface PrivateKeyLoaderConfig { +} + +export function loadPrivateKeyLoader( + loader: string | null, + config: PrivateKeyLoaderConfig +): BasePrivateKeyLoader { + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const module = require(`./${loader ?? DEFAULT_PRIVATE_KEY_LOADER}`); + const loaderClass: typeof BasePrivateKeyLoader = module.default; + + return new loaderClass( + config, + ) +} + +export abstract class PrivateKeyLoader { + abstract readonly loaderType: string; + + constructor( + protected readonly config: PrivateKeyLoaderConfig, + ) {} + + abstract loadPrivateKey(): Promise; + + async load(): Promise { + const privateKey = await this.loadPrivateKey(); + + if (!new RegExp(BYTES_32_HEX_EXPR).test(privateKey)) { + throw new Error('Invalid loaded privateKey format.') + } + + return privateKey; + } +} + + +// ! 'BasePrivateKeyLoader' should only be used as a type. +export class BasePrivateKeyLoader extends PrivateKeyLoader { + override loaderType: string = PRIVATE_KEY_LOADER_TYPE_BASE; + override loadPrivateKey(): Promise { + throw new Error("Method not implemented."); + } +} diff --git a/src/main.ts b/src/main.ts index 40c75fb..37253e4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,6 +27,9 @@ async function bootstrap() { const configService = app.get(ConfigService); const loggerService = app.get(LoggerService); + // Wait for the privateKey to be ready + await configService.globalConfig.privateKey; + logLoadedOptions(configService, loggerService); await app.listen(configService.globalConfig.port); diff --git a/src/submitter/submitter.service.ts b/src/submitter/submitter.service.ts index ab8df54..6c3b6d4 100644 --- a/src/submitter/submitter.service.ts +++ b/src/submitter/submitter.service.ts @@ -55,7 +55,7 @@ export class SubmitterService { async onModuleInit(): Promise { this.loggerService.info(`Starting the submitter on all chains...`); - const globalSubmitterConfig = this.loadGlobalSubmitterConfig(); + const globalSubmitterConfig = await this.loadGlobalSubmitterConfig(); // check if the submitter has been disabled. if (!globalSubmitterConfig.enabled) { @@ -98,7 +98,7 @@ export class SubmitterService { await new Promise((r) => setTimeout(r, 5000)); } - private loadGlobalSubmitterConfig(): GlobalSubmitterConfig { + private async loadGlobalSubmitterConfig(): Promise { const submitterConfig = this.configService.globalConfig.submitter; const enabled = submitterConfig['enabled'] ?? true; @@ -118,7 +118,7 @@ export class SubmitterService { gasLimitBuffer['default'] = 0; } - const walletPublicKey = (new Wallet(this.configService.globalConfig.privateKey)).address; + const walletPublicKey = (new Wallet(await this.configService.globalConfig.privateKey)).address; return { enabled, @@ -138,7 +138,7 @@ export class SubmitterService { ): Promise { const chainId = chainConfig.chainId; const rpc = chainConfig.rpc; - const relayerPrivateKey = this.configService.globalConfig.privateKey; + const relayerPrivateKey = await this.configService.globalConfig.privateKey; const incentivesAddresses = new Map(); this.configService.ambsConfig.forEach((amb) => { diff --git a/src/wallet/wallet.service.ts b/src/wallet/wallet.service.ts index 566a5d9..ae0e088 100644 --- a/src/wallet/wallet.service.ts +++ b/src/wallet/wallet.service.ts @@ -74,14 +74,11 @@ export class WalletService implements OnModuleInit { private readonly queuedRequests: Record = {}; - readonly publicKey: string; - constructor( private readonly configService: ConfigService, private readonly loggerService: LoggerService, ) { this.defaultWorkerConfig = this.loadDefaultWorkerConfig(); - this.publicKey = (new Wallet(this.configService.globalConfig.privateKey)).address; } async onModuleInit() { @@ -95,7 +92,7 @@ export class WalletService implements OnModuleInit { private async initializeWorkers(): Promise { for (const [chainId,] of this.configService.chainsConfig) { - this.spawnWorker(chainId); + await this.spawnWorker(chainId); } // Add a small delay to wait for the workers to be initialized @@ -141,9 +138,9 @@ export class WalletService implements OnModuleInit { } } - private loadWorkerConfig( + private async loadWorkerConfig( chainId: string, - ): WalletWorkerData { + ): Promise { const defaultConfig = this.defaultWorkerConfig; @@ -177,7 +174,7 @@ export class WalletService implements OnModuleInit { chainWalletConfig.gasBalanceUpdateInterval ?? defaultConfig.balanceUpdateInterval, - privateKey: this.configService.globalConfig.privateKey, + privateKey: await this.configService.globalConfig.privateKey, maxFeePerGas: chainWalletConfig.maxFeePerGas ?? @@ -207,10 +204,10 @@ export class WalletService implements OnModuleInit { }; } - private spawnWorker( + private async spawnWorker( chainId: string - ): void { - const workerData = this.loadWorkerConfig(chainId); + ): Promise { + const workerData = await this.loadWorkerConfig(chainId); this.loggerService.info( { chainId, From 8ce516058f02532d3221b3730583250531a0c072 Mon Sep 17 00:00:00 2001 From: Jorge Sanmiguel <8038323+jsanmigimeno@users.noreply.github.com> Date: Fri, 31 May 2024 10:14:09 +0000 Subject: [PATCH 2/4] chore: Minor code refactor --- src/config/config.schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/config.schema.ts b/src/config/config.schema.ts index 4bb165b..e180aa1 100644 --- a/src/config/config.schema.ts +++ b/src/config/config.schema.ts @@ -250,7 +250,6 @@ const CHAINS_SCHEMA = { export function getConfigValidator(): AnyValidateFunction { const ajv = new Ajv({ strict: true }); ajv.addSchema(POSITIVE_NUMBER_SCHEMA); - ajv.addSchema(PRIVATE_KEY_SCHEMA); ajv.addSchema(INTEGER_SCHEMA); ajv.addSchema(POSITIVE_NON_ZERO_INTEGER_SCHEMA); ajv.addSchema(NON_EMPTY_STRING_SCHEMA); @@ -260,6 +259,7 @@ export function getConfigValidator(): AnyValidateFunction { ajv.addSchema(PROCESSING_INTERVAL_SCHEMA); ajv.addSchema(CONFIG_SCHEMA); ajv.addSchema(GLOBAL_SCHEMA); + ajv.addSchema(PRIVATE_KEY_SCHEMA); ajv.addSchema(MONITOR_SCHEMA); ajv.addSchema(GETTER_SCHEMA); ajv.addSchema(SUBMITTER_SCHEMA); From 80e31e6741583a016037824150d049c166569ea5 Mon Sep 17 00:00:00 2001 From: Jorge Sanmiguel <8038323+jsanmigimeno@users.noreply.github.com> Date: Fri, 31 May 2024 10:21:23 +0000 Subject: [PATCH 3/4] chore: Undo the removal of the wallet service 'publicKey' property --- src/wallet/wallet.service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/wallet/wallet.service.ts b/src/wallet/wallet.service.ts index ae0e088..bd35aec 100644 --- a/src/wallet/wallet.service.ts +++ b/src/wallet/wallet.service.ts @@ -74,11 +74,14 @@ export class WalletService implements OnModuleInit { private readonly queuedRequests: Record = {}; + readonly publicKey: Promise; + constructor( private readonly configService: ConfigService, private readonly loggerService: LoggerService, ) { this.defaultWorkerConfig = this.loadDefaultWorkerConfig(); + this.publicKey = this.loadPublicKey(); } async onModuleInit() { @@ -89,6 +92,10 @@ export class WalletService implements OnModuleInit { this.initiateIntervalStatusLog(); } + private async loadPublicKey(): Promise { + return (new Wallet(await this.configService.globalConfig.privateKey)).address; + } + private async initializeWorkers(): Promise { for (const [chainId,] of this.configService.chainsConfig) { From 67748639a7e9687fe723cc4c10ad4fbdebba908d Mon Sep 17 00:00:00 2001 From: Jorge Sanmiguel <8038323+jsanmigimeno@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:45:11 +0000 Subject: [PATCH 4/4] Merge branch 'testnet' into jsanmi/overhaul-private-key-management --- .env.example | 2 + abis/LayerZeroEnpointV2.json | 1392 ++ abis/ReceiveULN302.json | 526 + config.example.yaml | 80 +- docker-compose.yaml | 12 +- package.json | 6 +- pnpm-lock.yaml | 12454 +++++++++------- src/app.module.ts | 4 +- src/collector/layer-zero/layer-zero.ts | 240 + src/collector/layer-zero/layer-zero.utils.ts | 56 + src/collector/layer-zero/layer-zero.worker.ts | 837 ++ src/collector/mock/mock.worker.ts | 134 +- src/collector/polymer/polymer.worker.ts | 116 +- .../wormhole/winston-pino-logger-transport.ts | 37 + .../wormhole/wormhole-engine.worker.ts | 64 +- .../wormhole-message-sniffer.worker.ts | 161 +- .../wormhole/wormhole-recovery.worker.ts | 205 +- src/common/utils.ts | 98 +- src/config/config.schema.ts | 51 +- src/config/config.service.ts | 94 +- src/config/config.types.ts | 34 +- src/evaluator/evaluator.controller.ts | 113 + src/evaluator/evaluator.interface.ts | 74 + src/evaluator/evaluator.module.ts | 8 +- src/evaluator/evaluator.service.ts | 185 +- src/evaluator/evaluator.types.ts | 222 + src/evaluator/evaluator.worker.ts | 549 + src/getter/getter.service.ts | 2 +- src/getter/getter.worker.ts | 178 +- src/main.ts | 2 + src/monitor/monitor.gateway.ts | 2 +- src/monitor/monitor.service.ts | 6 + src/monitor/monitor.worker.ts | 22 +- src/pricing/pricing.controller.ts | 48 + src/pricing/pricing.interface.ts | 41 + src/pricing/pricing.module.ts | 11 + src/pricing/pricing.provider.ts | 176 + src/pricing/pricing.service.ts | 178 + src/pricing/pricing.types.ts | 48 + src/pricing/pricing.worker.ts | 97 + src/pricing/providers/coin-gecko.ts | 55 + src/pricing/providers/fixed.ts | 25 + src/resolvers/arbitrum.ts | 57 +- src/resolvers/base-sepolia.ts | 24 + src/resolvers/base.ts | 24 + src/resolvers/op-stack.ts | 54 + src/resolvers/optimism-sepolia.ts | 24 + src/resolvers/optimism.ts | 24 + src/resolvers/resolver.ts | 32 +- src/store/persister/persister.worker.ts | 95 +- src/store/postgres/postgres.transformer.ts | 29 +- src/store/store.controller.ts | 16 +- src/store/store.gateway.ts | 13 +- src/store/store.lib.ts | 948 +- src/store/store.types.ts | 149 + src/store/types/bounty.enum.ts | 5 - src/store/types/store.types.ts | 70 - src/submitter/queues/eval-queue.ts | 318 +- src/submitter/queues/submit-queue.ts | 62 +- src/submitter/submitter.module.ts | 3 +- src/submitter/submitter.service.ts | 84 +- src/submitter/submitter.types.ts | 27 +- src/submitter/submitter.worker.ts | 227 +- src/wallet/queues/confirm-queue.ts | 7 +- src/wallet/queues/submit-queue.ts | 8 +- src/wallet/transaction-helper.ts | 104 +- src/wallet/wallet.interface.ts | 79 +- src/wallet/wallet.service.ts | 101 +- src/wallet/wallet.types.ts | 52 +- src/wallet/wallet.worker.ts | 82 +- 70 files changed, 14601 insertions(+), 6762 deletions(-) create mode 100644 abis/LayerZeroEnpointV2.json create mode 100644 abis/ReceiveULN302.json create mode 100644 src/collector/layer-zero/layer-zero.ts create mode 100644 src/collector/layer-zero/layer-zero.utils.ts create mode 100644 src/collector/layer-zero/layer-zero.worker.ts create mode 100644 src/collector/wormhole/winston-pino-logger-transport.ts create mode 100644 src/evaluator/evaluator.controller.ts create mode 100644 src/evaluator/evaluator.interface.ts create mode 100644 src/evaluator/evaluator.types.ts create mode 100644 src/evaluator/evaluator.worker.ts create mode 100644 src/pricing/pricing.controller.ts create mode 100644 src/pricing/pricing.interface.ts create mode 100644 src/pricing/pricing.module.ts create mode 100644 src/pricing/pricing.provider.ts create mode 100644 src/pricing/pricing.service.ts create mode 100644 src/pricing/pricing.types.ts create mode 100644 src/pricing/pricing.worker.ts create mode 100644 src/pricing/providers/coin-gecko.ts create mode 100644 src/pricing/providers/fixed.ts create mode 100644 src/resolvers/base-sepolia.ts create mode 100644 src/resolvers/base.ts create mode 100644 src/resolvers/op-stack.ts create mode 100644 src/resolvers/optimism-sepolia.ts create mode 100644 src/resolvers/optimism.ts create mode 100644 src/store/store.types.ts delete mode 100644 src/store/types/bounty.enum.ts delete mode 100644 src/store/types/store.types.ts diff --git a/.env.example b/.env.example index 53c7e68..02901ac 100644 --- a/.env.example +++ b/.env.example @@ -3,6 +3,8 @@ RELAYER_PORT=3000 # Docker COMPOSE_PROFILES="wormhole" # Set the docker compose profiles as a comma separated list +MAX_LOG_SIZE="500m" +MAX_LOG_FILES="5" # Wormhole SPY_PORT=7073 diff --git a/abis/LayerZeroEnpointV2.json b/abis/LayerZeroEnpointV2.json new file mode 100644 index 0000000..e38c1d8 --- /dev/null +++ b/abis/LayerZeroEnpointV2.json @@ -0,0 +1,1392 @@ +[ + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_owner", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "LZ_AlreadyRegistered", "type": "error" }, + { "inputs": [], "name": "LZ_ComposeExists", "type": "error" }, + { + "inputs": [ + { "internalType": "bytes32", "name": "expected", "type": "bytes32" }, + { "internalType": "bytes32", "name": "actual", "type": "bytes32" } + ], + "name": "LZ_ComposeNotFound", + "type": "error" + }, + { "inputs": [], "name": "LZ_DefaultReceiveLibUnavailable", "type": "error" }, + { "inputs": [], "name": "LZ_DefaultSendLibUnavailable", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requiredNative", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "suppliedNative", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requiredLzToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "suppliedLzToken", + "type": "uint256" + } + ], + "name": "LZ_InsufficientFee", + "type": "error" + }, + { "inputs": [], "name": "LZ_InvalidExpiry", "type": "error" }, + { + "inputs": [{ "internalType": "uint64", "name": "nonce", "type": "uint64" }], + "name": "LZ_InvalidNonce", + "type": "error" + }, + { "inputs": [], "name": "LZ_InvalidPayloadHash", "type": "error" }, + { "inputs": [], "name": "LZ_InvalidReceiveLibrary", "type": "error" }, + { "inputs": [], "name": "LZ_LzTokenUnavailable", "type": "error" }, + { "inputs": [], "name": "LZ_OnlyNonDefaultLib", "type": "error" }, + { "inputs": [], "name": "LZ_OnlyReceiveLib", "type": "error" }, + { "inputs": [], "name": "LZ_OnlyRegisteredLib", "type": "error" }, + { "inputs": [], "name": "LZ_OnlyRegisteredOrDefaultLib", "type": "error" }, + { "inputs": [], "name": "LZ_OnlySendLib", "type": "error" }, + { "inputs": [], "name": "LZ_PathNotInitializable", "type": "error" }, + { "inputs": [], "name": "LZ_PathNotVerifiable", "type": "error" }, + { + "inputs": [ + { "internalType": "bytes32", "name": "expected", "type": "bytes32" }, + { "internalType": "bytes32", "name": "actual", "type": "bytes32" } + ], + "name": "LZ_PayloadHashNotFound", + "type": "error" + }, + { "inputs": [], "name": "LZ_SameValue", "type": "error" }, + { "inputs": [], "name": "LZ_SendReentrancy", "type": "error" }, + { "inputs": [], "name": "LZ_Unauthorized", "type": "error" }, + { "inputs": [], "name": "LZ_UnsupportedEid", "type": "error" }, + { "inputs": [], "name": "LZ_UnsupportedInterface", "type": "error" }, + { "inputs": [], "name": "LZ_ZeroLzTokenFee", "type": "error" }, + { + "inputs": [ + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" } + ], + "name": "Transfer_NativeFailed", + "type": "error" + }, + { "inputs": [], "name": "Transfer_ToAddressIsZero", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "guid", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "index", + "type": "uint16" + } + ], + "name": "ComposeDelivered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "guid", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "index", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "message", + "type": "bytes" + } + ], + "name": "ComposeSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "newLib", + "type": "address" + } + ], + "name": "DefaultReceiveLibrarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "oldLib", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + } + ], + "name": "DefaultReceiveLibraryTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "newLib", + "type": "address" + } + ], + "name": "DefaultSendLibrarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "delegate", + "type": "address" + } + ], + "name": "DelegateSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "srcEid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "sender", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "nonce", + "type": "uint64" + } + ], + "name": "InboundNonceSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newLib", + "type": "address" + } + ], + "name": "LibraryRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "guid", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "index", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gas", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "reason", + "type": "bytes" + } + ], + "name": "LzComposeAlert", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "indexed": false, + "internalType": "struct Origin", + "name": "origin", + "type": "tuple" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "guid", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gas", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "reason", + "type": "bytes" + } + ], + "name": "LzReceiveAlert", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "LzTokenSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "srcEid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "sender", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "nonce", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "payloadHash", + "type": "bytes32" + } + ], + "name": "PacketBurnt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "indexed": false, + "internalType": "struct Origin", + "name": "origin", + "type": "tuple" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "PacketDelivered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "srcEid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "sender", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "nonce", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "payloadHash", + "type": "bytes32" + } + ], + "name": "PacketNilified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "encodedPayload", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "options", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "sendLibrary", + "type": "address" + } + ], + "name": "PacketSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "indexed": false, + "internalType": "struct Origin", + "name": "origin", + "type": "tuple" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "payloadHash", + "type": "bytes32" + } + ], + "name": "PacketVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "newLib", + "type": "address" + } + ], + "name": "ReceiveLibrarySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "oldLib", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "name": "ReceiveLibraryTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "newLib", + "type": "address" + } + ], + "name": "SendLibrarySet", + "type": "event" + }, + { + "inputs": [], + "name": "EMPTY_PAYLOAD_HASH", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NIL_PAYLOAD_HASH", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blockedLibrary", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "_nonce", "type": "uint64" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" } + ], + "name": "clear", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, + { "internalType": "uint16", "name": "index", "type": "uint16" } + ], + "name": "composeQueue", + "outputs": [ + { "internalType": "bytes32", "name": "messageHash", "type": "bytes32" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" } + ], + "name": "defaultReceiveLibrary", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" } + ], + "name": "defaultReceiveLibraryTimeout", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" }, + { "internalType": "uint256", "name": "expiry", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "dstEid", "type": "uint32" } + ], + "name": "defaultSendLibrary", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "oapp", "type": "address" } + ], + "name": "delegates", + "outputs": [ + { "internalType": "address", "name": "delegate", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eid", + "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "address", "name": "_lib", "type": "address" }, + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "uint32", "name": "_configType", "type": "uint32" } + ], + "name": "getConfig", + "outputs": [{ "internalType": "bytes", "name": "config", "type": "bytes" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" } + ], + "name": "getReceiveLibrary", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" }, + { "internalType": "bool", "name": "isDefault", "type": "bool" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRegisteredLibraries", + "outputs": [ + { "internalType": "address[]", "name": "", "type": "address[]" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSendContext", + "outputs": [ + { "internalType": "uint32", "name": "", "type": "uint32" }, + { "internalType": "address", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_sender", "type": "address" }, + { "internalType": "uint32", "name": "_dstEid", "type": "uint32" } + ], + "name": "getSendLibrary", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_sender", "type": "bytes32" } + ], + "name": "inboundNonce", + "outputs": [{ "internalType": "uint64", "name": "", "type": "uint64" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "receiver", "type": "address" }, + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "inboundNonce", "type": "uint64" } + ], + "name": "inboundPayloadHash", + "outputs": [ + { "internalType": "bytes32", "name": "payloadHash", "type": "bytes32" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "address", "name": "_receiver", "type": "address" } + ], + "name": "initializable", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_sender", "type": "address" }, + { "internalType": "uint32", "name": "_dstEid", "type": "uint32" } + ], + "name": "isDefaultSendLibrary", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "lib", "type": "address" }], + "name": "isRegisteredLibrary", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isSendingMessage", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint32", "name": "_eid", "type": "uint32" }], + "name": "isSupportedEid", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { + "internalType": "address", + "name": "_actualReceiveLib", + "type": "address" + } + ], + "name": "isValidReceiveLibrary", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "receiver", "type": "address" }, + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" } + ], + "name": "lazyInboundNonce", + "outputs": [ + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "uint16", "name": "_index", "type": "uint16" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" } + ], + "name": "lzCompose", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_from", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "uint16", "name": "_index", "type": "uint16" }, + { "internalType": "uint256", "name": "_gas", "type": "uint256" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" }, + { "internalType": "bytes", "name": "_reason", "type": "bytes" } + ], + "name": "lzComposeAlert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" } + ], + "name": "lzReceive", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "uint256", "name": "_gas", "type": "uint256" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" }, + { "internalType": "bytes", "name": "_reason", "type": "bytes" } + ], + "name": "lzReceiveAlert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lzToken", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeToken", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_sender", "type": "address" }, + { "internalType": "uint32", "name": "_dstEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_receiver", "type": "bytes32" } + ], + "name": "nextGuid", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "_nonce", "type": "uint64" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" } + ], + "name": "nilify", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "uint32", "name": "dstEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "receiver", "type": "bytes32" } + ], + "name": "outboundNonce", + "outputs": [ + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "dstEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "receiver", "type": "bytes32" }, + { "internalType": "bytes", "name": "message", "type": "bytes" }, + { "internalType": "bytes", "name": "options", "type": "bytes" }, + { "internalType": "bool", "name": "payInLzToken", "type": "bool" } + ], + "internalType": "struct MessagingParams", + "name": "_params", + "type": "tuple" + }, + { "internalType": "address", "name": "_sender", "type": "address" } + ], + "name": "quote", + "outputs": [ + { + "components": [ + { "internalType": "uint256", "name": "nativeFee", "type": "uint256" }, + { "internalType": "uint256", "name": "lzTokenFee", "type": "uint256" } + ], + "internalType": "struct MessagingFee", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "receiver", "type": "address" }, + { "internalType": "uint32", "name": "srcEid", "type": "uint32" } + ], + "name": "receiveLibraryTimeout", + "outputs": [ + { "internalType": "address", "name": "lib", "type": "address" }, + { "internalType": "uint256", "name": "expiry", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_token", "type": "address" }, + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_amount", "type": "uint256" } + ], + "name": "recoverToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_lib", "type": "address" } + ], + "name": "registerLibrary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "dstEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "receiver", "type": "bytes32" }, + { "internalType": "bytes", "name": "message", "type": "bytes" }, + { "internalType": "bytes", "name": "options", "type": "bytes" }, + { "internalType": "bool", "name": "payInLzToken", "type": "bool" } + ], + "internalType": "struct MessagingParams", + "name": "_params", + "type": "tuple" + }, + { "internalType": "address", "name": "_refundAddress", "type": "address" } + ], + "name": "send", + "outputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" }, + { + "components": [ + { + "internalType": "uint256", + "name": "nativeFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lzTokenFee", + "type": "uint256" + } + ], + "internalType": "struct MessagingFee", + "name": "fee", + "type": "tuple" + } + ], + "internalType": "struct MessagingReceipt", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "uint16", "name": "_index", "type": "uint16" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" } + ], + "name": "sendCompose", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "address", "name": "_lib", "type": "address" }, + { + "components": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { "internalType": "uint32", "name": "configType", "type": "uint32" }, + { "internalType": "bytes", "name": "config", "type": "bytes" } + ], + "internalType": "struct SetConfigParam[]", + "name": "_params", + "type": "tuple[]" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_newLib", "type": "address" }, + { "internalType": "uint256", "name": "_gracePeriod", "type": "uint256" } + ], + "name": "setDefaultReceiveLibrary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_lib", "type": "address" }, + { "internalType": "uint256", "name": "_expiry", "type": "uint256" } + ], + "name": "setDefaultReceiveLibraryTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_newLib", "type": "address" } + ], + "name": "setDefaultSendLibrary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_delegate", "type": "address" } + ], + "name": "setDelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_lzToken", "type": "address" } + ], + "name": "setLzToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_newLib", "type": "address" }, + { "internalType": "uint256", "name": "_gracePeriod", "type": "uint256" } + ], + "name": "setReceiveLibrary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_lib", "type": "address" }, + { "internalType": "uint256", "name": "_expiry", "type": "uint256" } + ], + "name": "setReceiveLibraryTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_newLib", "type": "address" } + ], + "name": "setSendLibrary", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "_nonce", "type": "uint64" } + ], + "name": "skip", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "address", "name": "_receiver", "type": "address" } + ], + "name": "verifiable", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ], + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple" + }, + { "internalType": "address", "name": "_receiver", "type": "address" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" } + ], + "name": "verify", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/abis/ReceiveULN302.json b/abis/ReceiveULN302.json new file mode 100644 index 0000000..853dbaa --- /dev/null +++ b/abis/ReceiveULN302.json @@ -0,0 +1,526 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_endpoint", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "LZ_MessageLib_OnlyEndpoint", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_AtLeastOneDVN", "type": "error" }, + { + "inputs": [ + { "internalType": "uint32", "name": "configType", "type": "uint32" } + ], + "name": "LZ_ULN_InvalidConfigType", + "type": "error" + }, + { "inputs": [], "name": "LZ_ULN_InvalidConfirmations", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_InvalidEid", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_InvalidOptionalDVNCount", "type": "error" }, + { + "inputs": [], + "name": "LZ_ULN_InvalidOptionalDVNThreshold", + "type": "error" + }, + { "inputs": [], "name": "LZ_ULN_InvalidPacketHeader", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_InvalidPacketVersion", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_InvalidRequiredDVNCount", "type": "error" }, + { "inputs": [], "name": "LZ_ULN_Unsorted", "type": "error" }, + { + "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], + "name": "LZ_ULN_UnsupportedEid", + "type": "error" + }, + { "inputs": [], "name": "LZ_ULN_Verifying", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "internalType": "struct UlnConfig", + "name": "config", + "type": "tuple" + } + ], + "indexed": false, + "internalType": "struct SetDefaultUlnConfigParam[]", + "name": "params", + "type": "tuple[]" + } + ], + "name": "DefaultUlnConfigsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "dvn", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "header", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "confirmations", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "proofHash", + "type": "bytes32" + } + ], + "name": "PayloadVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oapp", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "eid", + "type": "uint32" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "indexed": false, + "internalType": "struct UlnConfig", + "name": "config", + "type": "tuple" + } + ], + "name": "UlnConfigSet", + "type": "event" + }, + { + "inputs": [ + { "internalType": "bytes", "name": "_packetHeader", "type": "bytes" }, + { "internalType": "uint32", "name": "_localEid", "type": "uint32" } + ], + "name": "assertHeader", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes", "name": "_packetHeader", "type": "bytes" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" } + ], + "name": "commitVerification", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_remoteEid", "type": "uint32" } + ], + "name": "getAppUlnConfig", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "internalType": "struct UlnConfig", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_configType", "type": "uint32" } + ], + "name": "getConfig", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { "internalType": "uint32", "name": "_remoteEid", "type": "uint32" } + ], + "name": "getUlnConfig", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "internalType": "struct UlnConfig", + "name": "rtnConfig", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "headerHash", "type": "bytes32" }, + { "internalType": "bytes32", "name": "payloadHash", "type": "bytes32" }, + { "internalType": "address", "name": "dvn", "type": "address" } + ], + "name": "hashLookup", + "outputs": [ + { "internalType": "bool", "name": "submitted", "type": "bool" }, + { "internalType": "uint64", "name": "confirmations", "type": "uint64" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint32", "name": "_eid", "type": "uint32" }], + "name": "isSupportedEid", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messageLibType", + "outputs": [ + { "internalType": "enum MessageLibType", "name": "", "type": "uint8" } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_oapp", "type": "address" }, + { + "components": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { "internalType": "uint32", "name": "configType", "type": "uint32" }, + { "internalType": "bytes", "name": "config", "type": "bytes" } + ], + "internalType": "struct SetConfigParam[]", + "name": "_params", + "type": "tuple[]" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "internalType": "struct UlnConfig", + "name": "config", + "type": "tuple" + } + ], + "internalType": "struct SetDefaultUlnConfigParam[]", + "name": "_params", + "type": "tuple[]" + } + ], + "name": "setDefaultUlnConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes4", "name": "_interfaceId", "type": "bytes4" } + ], + "name": "supportsInterface", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "confirmations", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "requiredDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNCount", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "optionalDVNThreshold", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "requiredDVNs", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "optionalDVNs", + "type": "address[]" + } + ], + "internalType": "struct UlnConfig", + "name": "_config", + "type": "tuple" + }, + { "internalType": "bytes32", "name": "_headerHash", "type": "bytes32" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" } + ], + "name": "verifiable", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes", "name": "_packetHeader", "type": "bytes" }, + { "internalType": "bytes32", "name": "_payloadHash", "type": "bytes32" }, + { "internalType": "uint64", "name": "_confirmations", "type": "uint64" } + ], + "name": "verify", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { "internalType": "uint64", "name": "major", "type": "uint64" }, + { "internalType": "uint8", "name": "minor", "type": "uint8" }, + { "internalType": "uint8", "name": "endpointVersion", "type": "uint8" } + ], + "stateMutability": "pure", + "type": "function" + } + ] \ No newline at end of file diff --git a/config.example.yaml b/config.example.yaml index c0a7084..68a6f75 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -26,11 +26,26 @@ global: retryInterval: 30000 # Time to wait before retrying a failed transaction maxTries: 3 # Maximum tries for a transaction maxPendingTransactions: 50 # Maximum number of transactions within the 'submit' pipeline. + evaluationRetryInterval: 3600000 # Interval at which to reevaluate whether to relay a message. + maxEvaluationDuration: 86400000 # Time after which to drop an undelivered message. + + evaluator: + verificationDeliveryGas: '55000' # Gas amount used for packet verification upon delivery. + unrewardedDeliveryGas: '25000' # Gas amount that will be unrewarded on delivery submission. + minDeliveryReward: 0.001 # In the 'pricingDenomination' specified below + relativeMinDeliveryReward: 0.001 + verificationAckGas: '55000' # Gas amount used for packet verification upon ack. + unrewardedAckGas: '25000' # Gas amount that will be unrewarded on ack submission. + minAckReward: 0.001 # In the 'pricingDenomination' specified below + relativeMinAckReward: 0.001 + profitabilityFactor: 1.0 # Profitiability evaluation adjustment factor. A larger + # factor implies a larger profitability guarantee. + + pricing: + provider: 'coin-gecko' + coinDecimals: 18 + pricingDenomination: 'usd' - # Gas properties - gasLimitBuffer: # Extra gasLimit buffer. Customizable per AMB. - default: 10000 - mock: 50000 wallet: retryInterval: 30000 # Time to wait before retrying a failed transaction @@ -80,6 +95,9 @@ ambs: - name: wormhole isTestnet: true + - name: layer-zero + packetCost: '6000000000000' + # Chain configuration chains: - chainId: 11155111 @@ -94,6 +112,9 @@ chains: blockDelay: 2 interval: 5000 + pricing: + gasCoinId: 'ethereum' # coin-gecko pricing provider specific configuration + # AMB configuration wormhole: wormholeChainId: 10002 @@ -103,14 +124,25 @@ chains: - chainId: 11155420 name: 'OP Sepolia' rpc: 'https://sepolia.optimism.io' + resolver: 'op-sepolia' + pricing: + gasCoinId: 'ethereum' # coin-gecko pricing provider specific configuration wormhole: wormholeChainId: 10005 incentivesAddress: '0x198cDD55d90277726f3222D5A8111AdB8b0af9ee' bridgeAddress: '0x31377888146f3253211EFEf5c676D41ECe7D58Fe' + layer-zero: + layerZeroChainId: 40232 + incentivesAddress: '0xd41ace766aed57fefdca3a7d27d20b837284b872' + bridgeAddress: '0x6edce65403992e310a62460808c4b910d972f10f' + receiverAddress: '0x9284fd59B95b9143AF0b9795CAC16eb3C723C9Ca' - chainId: 84532 name: 'Base Sepolia' rpc: 'https://sepolia.base.org' + resolver: 'base-sepolia' + pricing: + gasCoinId: 'ethereum' # coin-gecko pricing provider specific configuration wormhole: wormholeChainId: 10004 incentivesAddress: '0x63B4E24DC9814fAcDe241fB4dEFcA04d5fc6d763' @@ -119,7 +151,45 @@ chains: - chainId: 168587773 name: 'Blast Testnet' rpc: 'https://sepolia.blast.io' + pricing: + gasCoinId: 'ethereum' # coin-gecko pricing provider specific configuration wormhole: wormholeChainId: 36 incentivesAddress: '0x9524ACA1fF46fAd177160F0a803189Cb552A3780' - bridgeAddress: '0x473e002D7add6fB67a4964F13bFd61280Ca46886' \ No newline at end of file + bridgeAddress: '0x473e002D7add6fB67a4964F13bFd61280Ca46886' + + - chainId: 421614 + name: "Arbitrum Sepolia" + rpc: "https://arbitrum-sepolia-rpc.publicnode.com" + resolver: 'arbitrum' + pricing: + coinId: 'ethereum' # coin-gecko pricing provider specific configuration + monitor: + blockDelay: 5 + interval: 2000 + getter: + maxBlocks: 5000 + wormhole: + wormholeChainId: 10003 + incentivesAddress: "0x59aa9e2339dd0c019f188f1ed9b27b9a10ae664d" + bridgeAddress: "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35" + layer-zero: + layerZeroChainId: 40231 + incentivesAddress: '0xd41ace766aed57fefdca3a7d27d20b837284b872' + bridgeAddress: '0x6EDCE65403992e310A62460808c4b910D972f10f' + receiverAddress: '0x75Db67CDab2824970131D5aa9CECfC9F69c69636' + + - chainId: 713715 + name: 'Sei Devnet' + rpc: 'https://evm-rpc-arctic-1.sei-apis.com' + pricing: + coinId: 'sei-network' # coin-gecko pricing provider specific configuration + monitor: + interval: 2000 + blockDelay: 10 + layer-zero: + layerZeroChainId: 40258 + incentivesAddress: '0xd41ace766aed57fefdca3a7d27d20b837284b872' + bridgeAddress: '0x6EDCE65403992e310A62460808c4b910D972f10f' + receiverAddress: '0xcF1B0F4106B0324F96fEfcC31bA9498caa80701C' + packetCost: '100000000000000000' diff --git a/docker-compose.yaml b/docker-compose.yaml index 7ca1694..f7ddd52 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,8 +6,10 @@ services: - ${REDIS_PORT}:${REDIS_PORT} attach: false logging: + driver: 'local' options: - max-size: 5m + max-size: 50m + max-file: 5 spy: image: ghcr.io/wormhole-foundation/guardiand:latest @@ -27,11 +29,13 @@ services: attach: false profiles: ['wormhole'] logging: + driver: 'local' options: max-size: 50m + max-file: 5 relayer: - image: ghcr.io/catalystdao/generalised-relayer:latest + image: ghcr.io/catalystdao/generalised-relayer:testnet build: context: . dockerfile: dockerfile.relayer @@ -49,5 +53,7 @@ services: depends_on: - redis logging: + driver: 'local' options: - max-size: 5g + max-size: ${MAX_LOG_SIZE:-500m} + max-file: ${MAX_LOG_FILES:-5} diff --git a/package.json b/package.json index 822f111..9cdf1f9 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@typechain/ethers-v6": "^0.5.1", "@wormhole-foundation/relayer-engine": "^0.3.2", "ajv": "^8.12.0", + "axios": "^1.6.8", "dotenv": "^16.3.1", "drizzle-kit": "^0.20.6", "drizzle-orm": "^0.29.1", @@ -41,7 +42,10 @@ "pg": "^8.11.3", "pino": "^8.15.1", "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "viem": "^2.15.1", + "winston": "^3.13.0", + "winston-transport": "^4.7.0" }, "devDependencies": { "@nestjs/cli": "^10.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 691fe23..6ff1464 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -7,159 +7,170 @@ settings: overrides: '@wormhole-foundation/relayer-engine>@certusone/wormhole-sdk': 0.10.15 -dependencies: - '@nestjs/common': - specifier: ^10.0.0 - version: 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': - specifier: ^10.0.0 - version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/platform-express': - specifier: ^10.0.0 - version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) - '@nestjs/platform-ws': - specifier: ^10.3.7 - version: 10.3.7(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1) - '@nestjs/schematics': - specifier: ^10.0.0 - version: 10.1.1(typescript@5.4.2) - '@nestjs/websockets': - specifier: ^10.3.7 - version: 10.3.7(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@typechain/ethers-v6': - specifier: ^0.5.1 - version: 0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2) - '@wormhole-foundation/relayer-engine': - specifier: ^0.3.2 - version: 0.3.2(@bull-board/ui@5.14.2)(@improbable-eng/grpc-web@0.15.0)(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2)(typescript@5.4.2) - ajv: - specifier: ^8.12.0 - version: 8.12.0 - dotenv: - specifier: ^16.3.1 - version: 16.4.5 - drizzle-kit: - specifier: ^0.20.6 - version: 0.20.14 - drizzle-orm: - specifier: ^0.29.1 - version: 0.29.5(@types/pg@8.11.2)(pg@8.11.3) - ethers: - specifier: ^5.7.0 - version: 5.7.2 - ethers6: - specifier: npm:ethers@^6.11.1 - version: /ethers@6.11.1 - ioredis: - specifier: ^5.3.2 - version: 5.3.2 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - pg: - specifier: ^8.11.3 - version: 8.11.3 - pino: - specifier: ^8.15.1 - version: 8.19.0 - reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - -devDependencies: - '@nestjs/cli': - specifier: ^10.0.0 - version: 10.3.2(esbuild@0.19.12) - '@nestjs/testing': - specifier: ^10.0.0 - version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-express@10.3.3) - '@types/express': - specifier: ^4.17.17 - version: 4.17.21 - '@types/jest': - specifier: ^29.5.2 - version: 29.5.12 - '@types/js-yaml': - specifier: ^4.0.9 - version: 4.0.9 - '@types/node': - specifier: ^20.3.1 - version: 20.11.25 - '@types/pg': - specifier: ^8.10.9 - version: 8.11.2 - '@types/supertest': - specifier: ^2.0.12 - version: 2.0.16 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.2) - eslint: - specifier: ^8.42.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.0.0 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - jest: - specifier: ^29.5.0 - version: 29.7.0(@types/node@20.11.25)(ts-node@10.9.2) - prettier: - specifier: ^3.0.0 - version: 3.2.5 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - supertest: - specifier: ^6.3.3 - version: 6.3.4 - ts-jest: - specifier: ^29.1.0 - version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.2) - ts-loader: - specifier: ^9.4.3 - version: 9.5.1(typescript@5.4.2)(webpack@5.90.3) - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@20.11.25)(typescript@5.4.2) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typechain: - specifier: ^8.3.2 - version: 8.3.2(typescript@5.4.2) - typescript: - specifier: ^5.1.3 - version: 5.4.2 +importers: + + .: + dependencies: + '@nestjs/common': + specifier: ^10.0.0 + version: 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^10.0.0 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^10.0.0 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) + '@nestjs/platform-ws': + specifier: ^10.3.7 + version: 10.3.7(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1) + '@nestjs/schematics': + specifier: ^10.0.0 + version: 10.1.1(typescript@5.4.2) + '@nestjs/websockets': + specifier: ^10.3.7 + version: 10.3.7(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@typechain/ethers-v6': + specifier: ^0.5.1 + version: 0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2) + '@wormhole-foundation/relayer-engine': + specifier: ^0.3.2 + version: 0.3.2(@bull-board/ui@5.14.2)(@improbable-eng/grpc-web@0.15.0)(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2)(typescript@5.4.2) + ajv: + specifier: ^8.12.0 + version: 8.12.0 + axios: + specifier: ^1.6.8 + version: 1.7.2 + dotenv: + specifier: ^16.3.1 + version: 16.4.5 + drizzle-kit: + specifier: ^0.20.6 + version: 0.20.14 + drizzle-orm: + specifier: ^0.29.1 + version: 0.29.5(@types/pg@8.11.2)(pg@8.11.3) + ethers: + specifier: ^5.7.0 + version: 5.7.2 + ethers6: + specifier: npm:ethers@^6.11.1 + version: ethers@6.11.1 + ioredis: + specifier: ^5.3.2 + version: 5.3.2 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + pg: + specifier: ^8.11.3 + version: 8.11.3 + pino: + specifier: ^8.15.1 + version: 8.19.0 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.14 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + viem: + specifier: ^2.15.1 + version: 2.15.1(typescript@5.4.2) + winston: + specifier: ^3.13.0 + version: 3.13.0 + winston-transport: + specifier: ^4.7.0 + version: 4.7.0 + devDependencies: + '@nestjs/cli': + specifier: ^10.0.0 + version: 10.3.2(esbuild@0.19.12) + '@nestjs/testing': + specifier: ^10.0.0 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-express@10.3.3) + '@types/express': + specifier: ^4.17.17 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.2 + version: 29.5.12 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + '@types/node': + specifier: ^20.3.1 + version: 20.11.25 + '@types/pg': + specifier: ^8.10.9 + version: 8.11.2 + '@types/supertest': + specifier: ^2.0.12 + version: 2.0.16 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.2) + eslint: + specifier: ^8.42.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + jest: + specifier: ^29.5.0 + version: 29.7.0(@types/node@20.11.25)(ts-node@10.9.2) + prettier: + specifier: ^3.0.0 + version: 3.2.5 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: ^6.3.3 + version: 6.3.4 + ts-jest: + specifier: ^29.1.0 + version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.2) + ts-loader: + specifier: ^9.4.3 + version: 9.5.1(typescript@5.4.2)(webpack@5.90.3) + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@20.11.25)(typescript@5.4.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typechain: + specifier: ^8.3.2 + version: 8.3.2(typescript@5.4.2) + typescript: + specifier: ^5.1.3 + version: 5.4.2 packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true - /@adraffy/ens-normalize@1.10.1: + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - dev: false - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@angular-devkit/core@17.1.2(chokidar@3.6.0): + '@angular-devkit/core@17.1.2': resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: @@ -167,45 +178,18 @@ packages: peerDependenciesMeta: chokidar: optional: true - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.6.0 - jsonc-parser: 3.2.0 - picomatch: 3.0.1 - rxjs: 7.8.1 - source-map: 0.7.4 - /@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0): + '@angular-devkit/schematics-cli@17.1.2': resolution: {integrity: sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) - ansi-colors: 4.1.3 - inquirer: 9.2.12 - symbol-observable: 4.0.0 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - chokidar - dev: true - /@angular-devkit/schematics@17.1.2(chokidar@3.6.0): + '@angular-devkit/schematics@17.1.2': resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 17.1.2(chokidar@3.6.0) - jsonc-parser: 3.2.0 - magic-string: 0.30.5 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - /@apollo/client@3.9.6(graphql@16.8.1): + '@apollo/client@3.9.6': resolution: {integrity: sha512-+zpddcnZ4G2VZ0xIEnvIHFsLqeopNOnWuE2ZVbRuetLLpj/biLPNN719B/iofdd1/iHRclKfv0XaAmX6PBhYKA==} - requiresBuild: true peerDependencies: graphql: ^15.0.0 || ^16.0.0 graphql-ws: ^5.5.5 @@ -221,474 +205,5708 @@ packages: optional: true subscriptions-transport-ws: optional: true - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@wry/caches': 1.0.1 - '@wry/equality': 0.5.7 - '@wry/trie': 0.5.0 - graphql: 16.8.1 - graphql-tag: 2.12.6(graphql@16.8.1) - hoist-non-react-statics: 3.3.2 - optimism: 0.18.0 - prop-types: 15.8.1 - rehackt: 0.0.6 - response-iterator: 0.2.6 - symbol-observable: 4.0.0 - ts-invariant: 0.10.3 - tslib: 2.6.2 - zen-observable-ts: 1.2.5 - transitivePeerDependencies: - - '@types/react' - dev: false - optional: true - /@babel/code-frame@7.23.5: + '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - /@babel/compat-data@7.23.5: + '@babel/compat-data@7.23.5': resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.24.0: + '@babel/core@7.24.0': resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.23.6: + '@babel/generator@7.23.6': resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/helper-compilation-targets@7.23.6: + '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-environment-visitor@7.22.20: + '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.23.0: + '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - /@babel/helper-hoist-variables@7.22.5: + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-imports@7.22.15: + '@babel/helper-module-imports@7.22.15': resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + '@babel/helper-module-transforms@7.23.3': resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-plugin-utils@7.24.0: + '@babel/helper-plugin-utils@7.24.0': resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-simple-access@7.22.5: + '@babel/helper-simple-access@7.22.5': resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-split-export-declaration@7.22.6: + '@babel/helper-split-export-declaration@7.22.6': resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-string-parser@7.23.4: + '@babel/helper-string-parser@7.23.4': resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.23.5: + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helpers@7.24.0: + '@babel/helpers@7.24.0': resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.23.4: + '@babel/highlight@7.23.4': resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/parser@7.24.0: + '@babel/parser@7.24.0': resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-bigint@7.8.3': resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): + '@babel/plugin-syntax-jsx@7.23.3': resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): + '@babel/plugin-syntax-typescript@7.23.3': resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/runtime@7.20.13: + '@babel/runtime@7.20.13': resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} - requiresBuild: true - dependencies: - regenerator-runtime: 0.13.11 - dev: false - optional: true - /@babel/runtime@7.24.0: + '@babel/runtime@7.24.0': resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - /@babel/template@7.24.0: + '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - dev: true - /@babel/traverse@7.24.0: + '@babel/traverse@7.24.0': resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.24.0: + '@babel/types@7.24.0': resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@bcoe/v8-coverage@0.2.3: + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@bull-board/api@5.14.2(@bull-board/ui@5.14.2): + '@bull-board/api@5.14.2': resolution: {integrity: sha512-0wppAGPU7ZMwWMpzkmtrlmm7ySI5immymyaRS1cVNJ54rUiGOZP5tnm+Sj7MwPdf63rxqIM843un8+PvQyARGg==} peerDependencies: '@bull-board/ui': 5.14.2 - dependencies: - '@bull-board/ui': 5.14.2 - redis-info: 3.1.0 - dev: false - /@bull-board/koa@5.14.2: + '@bull-board/koa@5.14.2': resolution: {integrity: sha512-SlCwZhFLS3c8MS6wCeq6rPF9cgxJ2a8lhR+EyujdgJMjQGVUOMQzJOOkBjQF2fbS2ixC923/6NOYMNwq87dhfA==} - dependencies: - '@bull-board/api': 5.14.2(@bull-board/ui@5.14.2) - '@bull-board/ui': 5.14.2 - ejs: 3.1.9 - koa: 2.15.0 - koa-mount: 4.0.0 - koa-router: 10.1.1 - koa-static: 5.0.0 - koa-views: 7.0.2(ejs@3.1.9) - transitivePeerDependencies: - - '@types/koa' - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - supports-color - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - dev: false - /@bull-board/ui@5.14.2: + '@bull-board/ui@5.14.2': resolution: {integrity: sha512-NiyKWLjKjy29I6ySCnSYbzGX4ZJyPE4xlS5/Z5dVsF2bJLoAV+yD1obflxteJMt60FiEgLV7tfs6tMSVa+Htew==} + + '@certusone/wormhole-sdk-proto-web@0.0.7': + resolution: {integrity: sha512-GCe1/bcqMS0Mt+hsWp4SE4NLL59pWmK0lhQXO0oqAKl0G9AuuTdudySMDF/sLc7z5H2w34bSuSrIEKvPuuSC+w==} + + '@certusone/wormhole-sdk-wasm@0.0.1': + resolution: {integrity: sha512-LdIwLhOyr4pPs2jqYubqC7d4UkqYBX0EG/ppspQlW3qlVE0LZRMrH6oVzzLMyHtV0Rw7O9sIKzORW/T3mrJv2w==} + + '@certusone/wormhole-sdk@0.10.15': + resolution: {integrity: sha512-XECfrvdYjsGPZWyR1bqWCPOiRw7+6upszpSvAXjKIqEnTNXOCYRkt5ae8TVh5oZxPjpts2X3t4Oi9WGcEssHpQ==} + + '@certusone/wormhole-spydk@0.0.1': + resolution: {integrity: sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==} + + '@classic-terra/terra.proto@1.1.0': + resolution: {integrity: sha512-bYhQG5LUaGF0KPRY9hYT/HEcd1QExZPQd6zLV/rQkCe/eDxfwFRLzZHpaaAdfWoAAZjsRWqJbUCqCg7gXBbJpw==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@confio/ics23@0.6.8': + resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + + '@coral-xyz/borsh@0.2.6': + resolution: {integrity: sha512-y6nmHw1bFcJib7sMHsQPpC8r47xhqDZVvhUdna7NUPzpSbOZG6f46N21+aXsQ2w/tG8Ggls488J/ZmwbgVmyjg==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.2.0 + + '@cosmjs/amino@0.28.13': + resolution: {integrity: sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ==} + + '@cosmjs/amino@0.29.5': + resolution: {integrity: sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw==} + + '@cosmjs/amino@0.30.1': + resolution: {integrity: sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==} + + '@cosmjs/cosmwasm-stargate@0.29.5': + resolution: {integrity: sha512-TNdSvm2tEE3XMCuxHxquzls56t40hC8qnLeYJWHsY2ECZmRK3KrnpRReEr7N7bLtODToK7X/riYrV0JaYxjrYA==} + + '@cosmjs/crypto@0.28.13': + resolution: {integrity: sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ==} + + '@cosmjs/crypto@0.29.5': + resolution: {integrity: sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ==} + + '@cosmjs/crypto@0.30.1': + resolution: {integrity: sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==} + + '@cosmjs/encoding@0.28.13': + resolution: {integrity: sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA==} + + '@cosmjs/encoding@0.29.5': + resolution: {integrity: sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ==} + + '@cosmjs/encoding@0.30.1': + resolution: {integrity: sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==} + + '@cosmjs/json-rpc@0.28.13': + resolution: {integrity: sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A==} + + '@cosmjs/json-rpc@0.29.5': + resolution: {integrity: sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w==} + + '@cosmjs/json-rpc@0.30.1': + resolution: {integrity: sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==} + + '@cosmjs/math@0.28.13': + resolution: {integrity: sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g==} + + '@cosmjs/math@0.29.5': + resolution: {integrity: sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q==} + + '@cosmjs/math@0.30.1': + resolution: {integrity: sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q==} + + '@cosmjs/proto-signing@0.28.13': + resolution: {integrity: sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ==} + + '@cosmjs/proto-signing@0.29.5': + resolution: {integrity: sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA==} + + '@cosmjs/proto-signing@0.30.1': + resolution: {integrity: sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ==} + + '@cosmjs/socket@0.28.13': + resolution: {integrity: sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug==} + + '@cosmjs/socket@0.29.5': + resolution: {integrity: sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ==} + + '@cosmjs/socket@0.30.1': + resolution: {integrity: sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow==} + + '@cosmjs/stargate@0.28.13': + resolution: {integrity: sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg==} + + '@cosmjs/stargate@0.29.5': + resolution: {integrity: sha512-hjEv8UUlJruLrYGJcUZXM/CziaINOKwfVm2BoSdUnNTMxGvY/jC1ABHKeZUYt9oXHxEJ1n9+pDqzbKc8pT0nBw==} + + '@cosmjs/stargate@0.30.1': + resolution: {integrity: sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==} + + '@cosmjs/stream@0.28.13': + resolution: {integrity: sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg==} + + '@cosmjs/stream@0.29.5': + resolution: {integrity: sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA==} + + '@cosmjs/stream@0.30.1': + resolution: {integrity: sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==} + + '@cosmjs/tendermint-rpc@0.28.13': + resolution: {integrity: sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w==} + + '@cosmjs/tendermint-rpc@0.29.5': + resolution: {integrity: sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w==} + + '@cosmjs/tendermint-rpc@0.30.1': + resolution: {integrity: sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ==} + + '@cosmjs/utils@0.28.13': + resolution: {integrity: sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg==} + + '@cosmjs/utils@0.29.5': + resolution: {integrity: sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ==} + + '@cosmjs/utils@0.30.1': + resolution: {integrity: sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@datastructures-js/queue@4.2.3': + resolution: {integrity: sha512-GWVMorC/xi2V2ta+Z/CPgPGHL2ZJozcj48g7y2nIX5GIGZGRrbShSHgvMViJwHJurUzJYOdIdRZnWDRrROFwJA==} + + '@drizzle-team/studio@0.0.39': + resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@grpc/grpc-js@1.10.1': + resolution: {integrity: sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==} + engines: {node: ^8.13.0 || >=10.10.0} + + '@grpc/proto-loader@0.7.10': + resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} + engines: {node: '>=6'} + hasBin: true + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@improbable-eng/grpc-web-node-http-transport@0.15.0': + resolution: {integrity: sha512-HLgJfVolGGpjc9DWPhmMmXJx8YGzkek7jcCFO1YYkSOoO81MWRZentPOd/JiKiZuU08wtc4BG+WNuGzsQB5jZA==} + peerDependencies: + '@improbable-eng/grpc-web': '>=0.13.0' + + '@improbable-eng/grpc-web@0.14.1': + resolution: {integrity: sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==} + peerDependencies: + google-protobuf: ^3.14.0 + + '@improbable-eng/grpc-web@0.15.0': + resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==} + peerDependencies: + google-protobuf: ^3.14.0 + + '@injectivelabs/core-proto-ts@0.0.14': + resolution: {integrity: sha512-NZWlgBzgVrXow9IknFQHvcYKX4QkUD25taRigoNYQK8PDn4+VXd9xM5WFUDRhzm2smTCguyl/+MghpEp4oTPWw==} + + '@injectivelabs/exceptions@1.14.6': + resolution: {integrity: sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==} + + '@injectivelabs/grpc-web-node-http-transport@0.0.2': + resolution: {integrity: sha512-rpyhXLiGY/UMs6v6YmgWHJHiO9l0AgDyVNv+jcutNVt4tQrmNvnpvz2wCAGOFtq5LuX/E9ChtTVpk3gWGqXcGA==} + peerDependencies: + '@injectivelabs/grpc-web': '>=0.0.1' + + '@injectivelabs/grpc-web-react-native-transport@0.0.2': + resolution: {integrity: sha512-mk+aukQXnYNgPsPnu3KBi+FD0ZHQpazIlaBZ2jNZG7QAVmxTWtv3R66Zoq99Wx2dnE946NsZBYAoa0K5oSjnow==} + peerDependencies: + '@injectivelabs/grpc-web': '>=0.0.1' + + '@injectivelabs/grpc-web@0.0.1': + resolution: {integrity: sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw==} + peerDependencies: + google-protobuf: ^3.14.0 + + '@injectivelabs/indexer-proto-ts@1.10.8-rc.4': + resolution: {integrity: sha512-IwbepTfsHHAv3Z36As6yH/+HIplOEpUu6SFHBCVgdSIaQ8GuvTib4HETiVnV4mjYqoyVgWs+zLSAfih46rdMJQ==} + + '@injectivelabs/mito-proto-ts@1.0.9': + resolution: {integrity: sha512-+TZMvJ4SHwcn6SFPdqaiQFZdNhjH7hyRFozY15nOTC2utdGij9jEsjz1NsyOejfYDA0s1z5Wm1SgrMYKaVpAmQ==} + + '@injectivelabs/networks@1.10.12': + resolution: {integrity: sha512-tTHyLls1Nik5QTs/S03qqG2y/ITvNwI8CJOQbMmmsr1CL2CdjJBtzRYn9Dyx2p8XgzRFf9hmlybpe20tq9O3SA==} + + '@injectivelabs/networks@1.14.6': + resolution: {integrity: sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==} + + '@injectivelabs/sdk-ts@1.10.72': + resolution: {integrity: sha512-A5mHNNBgO4fI1c/7CZ0bGfVXliy8laP+VaYZ++aWh1YyudoZw4CTCEmLetZRy7AUU3XcfbHa8sAImRi7db+v6Q==} + + '@injectivelabs/test-utils@1.14.4': + resolution: {integrity: sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==} + + '@injectivelabs/token-metadata@1.14.7': + resolution: {integrity: sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==} + + '@injectivelabs/ts-types@1.14.6': + resolution: {integrity: sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==} + + '@injectivelabs/utils@1.10.12': + resolution: {integrity: sha512-c8al79nxIJgV1cBAdW2TPDGldj/8gm5k0h5TIN/AJs8/AeIjpTwwVGfLY3QvPOpRsxuQ9CjBkTXrAcSL1wwkcw==} + + '@injectivelabs/utils@1.14.6': + resolution: {integrity: sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==} + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@keplr-wallet/types@0.11.64': + resolution: {integrity: sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==} + + '@ljharb/through@2.3.12': + resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} + engines: {node: '>= 0.4'} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2': + resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2': + resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2': + resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2': + resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2': + resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2': + resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} + cpu: [x64] + os: [win32] + + '@mysten/bcs@0.7.1': + resolution: {integrity: sha512-wFPb8bkhwrbiStfZMV5rFM7J+umpke59/dNjDp+UYJKykNlW23LCk2ePyEUvGdb62HGJM1jyOJ8g4egE3OmdKA==} + + '@mysten/sui.js@0.32.2': + resolution: {integrity: sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==} + engines: {node: '>=16'} + + '@nestjs/cli@10.3.2': + resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} + engines: {node: '>= 16.14'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 || ^0.3.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@10.3.3': + resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} + peerDependencies: + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/core@10.3.3': + resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/platform-express@10.3.3': + resolution: {integrity: sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + + '@nestjs/platform-ws@10.3.7': + resolution: {integrity: sha512-lOvZ8u5UdL0FgAOdWosDXefVgDikPd4j5el81emkx+H0pFsysfHXSSoSvMLQijdhENqHSl3buRhO5n3M3uia1w==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + rxjs: ^7.1.0 + + '@nestjs/schematics@10.1.1': + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/testing@10.3.3': + resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nestjs/websockets@10.3.7': + resolution: {integrity: sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/platform-socket.io': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/hashes@1.1.3': + resolution: {integrity: sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@osmonauts/helpers@0.6.0': + resolution: {integrity: sha512-l62tWR/0W4R+5wRvMeRK0zlaJ8WZhULKsQAZ7kNzggL0pbndIAV+0BJ/jEBbNletoeGtuV8rpi6Wo+w+RmtZGw==} + + '@osmonauts/lcd@0.8.0': + resolution: {integrity: sha512-k7m2gAVnXc0H4m/eTq4z/8A6hFrr3MPS9wnLV4Xu9/K/WYltCnp2PpiObZm+feZUPK/svES6hxIQeO1bODLx8g==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@project-serum/anchor@0.25.0': + resolution: {integrity: sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A==} + engines: {node: '>=11'} + + '@project-serum/borsh@0.2.5': + resolution: {integrity: sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.2.0 + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@scure/base@1.1.5': + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + + '@scure/bip39@1.1.0': + resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@scure/bip39@1.2.2': + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + + '@sei-js/core@1.5.0': + resolution: {integrity: sha512-5Ojk6YvCfe5Fj2hwZ6nShHfNemwf9CFUylpLJmsxkQg0UYXhe6w5TFtZ+mnE+sOFO086vD0MYMUEYXXMqn0E9g==} + + '@sei-js/proto@1.3.0': + resolution: {integrity: sha512-p/nn07Kc7h6nvTk4PJ+OqQFHmfZ4YWZ0i2Q2pnKKqq/o1sKCpoS3atP63mB6vC5r5tJfNbBjFWiCyQI2foGiiQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@solana/buffer-layout-utils@0.2.0': + resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} + engines: {node: '>= 10'} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.0.0-experimental.8618508': + resolution: {integrity: sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==} + + '@solana/codecs-data-structures@2.0.0-experimental.8618508': + resolution: {integrity: sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==} + + '@solana/codecs-numbers@2.0.0-experimental.8618508': + resolution: {integrity: sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==} + + '@solana/codecs-strings@2.0.0-experimental.8618508': + resolution: {integrity: sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + + '@solana/options@2.0.0-experimental.8618508': + resolution: {integrity: sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==} + + '@solana/spl-token-metadata@0.1.2': + resolution: {integrity: sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.87.6 + + '@solana/spl-token@0.3.11': + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.88.0 + + '@solana/spl-type-length-value@0.1.0': + resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} + engines: {node: '>=16'} + + '@solana/web3.js@1.90.1': + resolution: {integrity: sha512-BaopDf3TN54N9/T1iILu+Fz2gthIZzi+6X2A7bb0FWvGlwI/78iKRb2WjSnCfrHmMbWVLJR5n/pmXteezMXgVw==} + + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + + '@terra-money/terra.js@3.1.9': + resolution: {integrity: sha512-JulSvOHLM56fL7s+cIjIbZeWPBluq883X1soWxA4TG5rKkDythT/DHeLXr3jP5Ld/26VENPSg6lNvK7cEYKpiw==} + engines: {node: '>=14'} + + '@terra-money/terra.proto@0.1.7': + resolution: {integrity: sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==} + + '@terra-money/terra.proto@2.1.0': + resolution: {integrity: sha512-rhaMslv3Rkr+QsTQEZs64FKA4QlfO0DfQHaR6yct/EovenMkibDEQ63dEL6yJA6LCaEQGYhyVB9JO9pTUA8ybw==} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: '>=4.7.0' + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.1': + resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} + + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.5': + resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash.values@4.3.9': + resolution: {integrity: sha512-IJ20OEfqNwm3k8ENwoM3q0yOs4UMpgtD4GqxB4lwBHToGthHWqhyh5DdSgQjioocz0QK2SSBkJfCq95ZTV8BTw==} + + '@types/lodash@4.14.202': + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + + '@types/node@10.12.18': + resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + '@types/node@18.19.22': + resolution: {integrity: sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==} + + '@types/node@20.11.25': + resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/pg@8.11.2': + resolution: {integrity: sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/qs@6.9.12': + resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.4': + resolution: {integrity: sha512-uzSBYwrpal8y2X2Pul5ZSWpzRiDha2FLcquaN95qUPnOjYgm/zQ5LIdqeJpQJTRWNTN+Rhm0aC8H06Ds2rqCYw==} + + '@types/supertest@2.0.16': + resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webassemblyjs/ast@1.11.6': + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.11.6': + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.11.6': + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.11.6': + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + + '@webassemblyjs/wasm-gen@1.11.6': + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + + '@webassemblyjs/wasm-opt@1.11.6': + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + + '@webassemblyjs/wasm-parser@1.11.6': + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + + '@webassemblyjs/wast-printer@1.11.6': + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + + '@wormhole-foundation/relayer-engine@0.3.2': + resolution: {integrity: sha512-6CAGZdxDpPZph+Gx1Tob5wEarEzvD27G7khoGhB9sc8KiOhRz8zDiBspFfLetzfBEHMiTyvAOibETV5G0ULilA==} + + '@wry/caches@1.0.1': + resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} + engines: {node: '>=8'} + + '@wry/context@0.7.4': + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + + '@wry/equality@0.5.7': + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + + '@wry/trie@0.4.3': + resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} + engines: {node: '>=8'} + + '@wry/trie@0.5.0': + resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} + engines: {node: '>=8'} + + '@xlabs-xyz/wallet-monitor@0.2.16': + resolution: {integrity: sha512-Fup24DcONFy3o5lrJP3i5gc5XXj7675gWhco3JkweWTFj86c17UrXYQOhZF1Z09b7WYt4rnXZx+wQ4W19HzOoQ==} + + '@xpla/xpla.js@0.2.3': + resolution: {integrity: sha512-Tfk7hCGWXtwr08reY3Pi6dmzIqFbzri9jcyzJdfNmdo4cN0PMwpRJuZZcPmtxiIUnNef3AN1E/6nJUD5MKniuA==} + engines: {node: '>=14'} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abitype@1.0.0: + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller-x@0.4.3: + resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@7.1.1: + resolution: {integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + algo-msgpack-with-bigint@2.1.1: + resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} + engines: {node: '>= 10'} + + algosdk@2.7.0: + resolution: {integrity: sha512-sBE9lpV7bup3rZ+q2j3JQaFAE9JwZvjWKX00vPlG8e9txctXbgLL56jZhSWZndqhDI9oI+0P4NldkuQIWdrUyg==} + engines: {node: '>=18.0.0'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + aptos@1.5.0: + resolution: {integrity: sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==} + engines: {node: '>=11.0.0'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-flatten@1.1.1: + resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@0.24.0: + resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} + + axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + + axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + big-integer@1.6.36: + resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} + engines: {node: '>=0.6'} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + binary-parser@2.2.1: + resolution: {integrity: sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA==} + engines: {node: '>=12'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + + bip32@2.0.6: + resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} + engines: {node: '>=6.0.0'} + + bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + + bip66@1.1.5: + resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-headers@0.4.1: + resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + + buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + bullmq@3.15.8: + resolution: {integrity: sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-lite@1.0.30001596: + resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} + + capability@0.2.5: + resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} + + case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + consolidate@0.16.0: + resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} + engines: {node: '>= 0.10.0'} + deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog + peerDependencies: + arc-templates: ^0.5.3 + atpl: '>=0.7.6' + babel-core: ^6.26.3 + bracket-template: ^1.1.5 + coffee-script: ^1.12.7 + dot: ^1.1.3 + dust: ^0.3.0 + dustjs-helpers: ^1.7.4 + dustjs-linkedin: ^2.7.5 + eco: ^1.1.0-rc-3 + ect: ^0.5.9 + ejs: ^3.1.5 + haml-coffee: ^1.14.1 + hamlet: ^0.3.3 + hamljs: ^0.6.2 + handlebars: ^4.7.6 + hogan.js: ^3.0.2 + htmling: ^0.0.8 + jade: ^1.11.0 + jazz: ^0.0.18 + jqtpl: ~1.1.0 + just: ^0.1.8 + liquid-node: ^3.0.1 + liquor: ^0.0.5 + lodash: ^4.17.20 + marko: ^3.14.4 + mote: ^0.2.0 + mustache: ^4.0.1 + nunjucks: ^3.2.2 + plates: ~0.4.11 + pug: ^3.0.0 + qejs: ^3.0.5 + ractive: ^1.3.12 + razor-tmpl: ^1.3.1 + react: ^16.13.1 + react-dom: ^16.13.1 + slm: ^2.0.0 + squirrelly: ^5.1.0 + swig: ^1.4.2 + swig-templates: ^2.0.3 + teacup: ^2.0.0 + templayed: '>=0.2.3' + then-jade: '*' + then-pug: '*' + tinyliquid: ^0.2.34 + toffee: ^0.3.6 + twig: ^1.15.2 + twing: ^5.0.2 + underscore: ^1.11.0 + vash: ^0.13.0 + velocityjs: ^2.0.1 + walrus: ^0.10.1 + whiskers: ^0.4.0 + peerDependenciesMeta: + arc-templates: + optional: true + atpl: + optional: true + babel-core: + optional: true + bracket-template: + optional: true + coffee-script: + optional: true + dot: + optional: true + dust: + optional: true + dustjs-helpers: + optional: true + dustjs-linkedin: + optional: true + eco: + optional: true + ect: + optional: true + ejs: + optional: true + haml-coffee: + optional: true + hamlet: + optional: true + hamljs: + optional: true + handlebars: + optional: true + hogan.js: + optional: true + htmling: + optional: true + jade: + optional: true + jazz: + optional: true + jqtpl: + optional: true + just: + optional: true + liquid-node: + optional: true + liquor: + optional: true + lodash: + optional: true + marko: + optional: true + mote: + optional: true + mustache: + optional: true + nunjucks: + optional: true + plates: + optional: true + pug: + optional: true + qejs: + optional: true + ractive: + optional: true + razor-tmpl: + optional: true + react: + optional: true + react-dom: + optional: true + slm: + optional: true + squirrelly: + optional: true + swig: + optional: true + swig-templates: + optional: true + teacup: + optional: true + templayed: + optional: true + then-jade: + optional: true + then-pug: + optional: true + tinyliquid: + optional: true + toffee: + optional: true + twig: + optional: true + twing: + optional: true + underscore: + optional: true + vash: + optional: true + velocityjs: + optional: true + walrus: + optional: true + whiskers: + optional: true + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + + 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'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cosmjs-types@0.4.1: + resolution: {integrity: sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog==} + + cosmjs-types@0.5.1: + resolution: {integrity: sha512-NcC58xUIVLlKdIimWWQAmSlmCjiMrJnuHf4i3LiD8PCextfHR0fT3V5/WlXZZreyMgdmh6ML1zPUfGTbbo3Z5g==} + + cosmjs-types@0.5.2: + resolution: {integrity: sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg==} + + cosmjs-types@0.7.2: + resolution: {integrity: sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-addr-codec@0.1.8: + resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} + + crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dprint-node@1.0.8: + resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} + + drbg.js@1.0.1: + resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} + engines: {node: '>=0.10'} + + dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + + drizzle-kit@0.20.14: + resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} + hasBin: true + + drizzle-orm@0.29.5: + resolution: {integrity: sha512-jS3+uyzTz4P0Y2CICx8FmRQ1eplURPaIMWDn/yq6k4ShRFj9V7vlJk67lSf2kyYPzQ60GkkNGXcJcwrxZ6QCRw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + eccrypto@1.1.6: + resolution: {integrity: sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.695: + resolution: {integrity: sha512-eMijZmeqPtm774pCZIOrfUHMs/7ls++W1sLhxwqgu8KQ8E2WmMtzwyqOMt0XXUJ3HTIPfuwlfwF+I5cwnfItBA==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.15.1: + resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} + engines: {node: '>=10.13.0'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-polyfill@0.1.3: + resolution: {integrity: sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild-register@3.5.0: + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-crypto@2.6.0: + resolution: {integrity: sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethers@6.11.1: + resolution: {integrity: sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==} + engines: {node: '>=14.0.0'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fork-ts-checker-webpack-plugin@9.0.2: + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-paths@0.0.7: + resolution: {integrity: sha512-0wdJt7C1XKQxuCgouqd+ZvLJ56FQixKoki9MrFaO4EriqzXOiH9gbukaDE1ou08S8Ns3/yDzoBAISNPqj6e6tA==} + engines: {node: '>=6.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + + hi-base32@0.5.1: + resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isows@1.0.4: + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + + jayson@4.1.0: + resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} + engines: {node: '>=8'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-sha512@0.8.0: + resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jscrypto@1.0.3: + resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-diff@0.9.0: + resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-mount@4.0.0: + resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} + engines: {node: '>= 7.6.0'} + + koa-router@10.1.1: + resolution: {integrity: sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==} + engines: {node: '>= 8.0.0'} + deprecated: '**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173' + + koa-router@12.0.1: + resolution: {integrity: sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==} + engines: {node: '>= 12'} + + koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + + koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + + koa-views@7.0.2: + resolution: {integrity: sha512-dvx3mdVeSVuIPEaKAoGbxLcenudvhl821xxyuRbcoA+bOJ2dvN8wlGjkLu0ZFMlkCscXZV6lzxy28rafeazI/w==} + deprecated: This package is deprecated, please use the new fork @ladjs/koa-views. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/koa-views for updates and release changelog + peerDependencies: + '@types/koa': ^2.13.1 + peerDependenciesMeta: + '@types/koa': + optional: true + + koa@2.15.0: + resolution: {integrity: sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libsodium-wrappers@0.7.13: + resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==} + + libsodium@0.7.13: + resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + link-module-alias@1.2.0: + resolution: {integrity: sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw==} + engines: {node: '> 8.0.0'} + hasBin: true + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.values@4.3.0: + resolution: {integrity: sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@9.1.2: + resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} + engines: {node: 14 || >=16.14} + + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + + luxon@3.4.4: + resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + engines: {node: '>=12'} + + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + media-typer@0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + + merge-descriptors@1.0.1: + resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + hasBin: true + + msgpackr@1.10.1: + resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} + + multer@1.4.4-lts.1: + resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} + engines: {node: '>= 6.0.0'} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.14.0: + resolution: {integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==} + + nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + near-api-js@1.1.0: + resolution: {integrity: sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + nice-grpc-common@2.0.2: + resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + + nice-grpc@2.1.7: + resolution: {integrity: sha512-pSaZk5Y3PHGAPObOSXTrANgimA6T//szxlcKOnnyttpYwO0gyOpX2WsaFK4fbGJizPVxXjwqrXpPOSHMwM2vlg==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} + hasBin: true + + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + + nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + o3@1.0.3: + resolution: {integrity: sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + optimism@0.18.0: + resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.1: + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.0: + resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.19.0: + resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prom-client@14.2.0: + resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} + engines: {node: '>=10'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + + protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readonly-date@1.0.0: + resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-info@3.1.0: + resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + rehackt@0.0.6: + resolution: {integrity: sha512-l3WEzkt4ntlEc/IB3/mF6SRgNHA6zfQR7BlGOgBTOmx7IJJXojDASav+NsgXHFjHn+6RmwqsGPFgZpabWpeOdw==} + peerDependencies: + '@types/react': '*' + react: '*' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + response-iterator@0.2.6: + resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==} + engines: {node: '>=0.8'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + ripemd160-min@0.0.6: + resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} + engines: {node: '>=8'} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + rpc-websockets@7.9.0: + resolution: {integrity: sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@3.7.1: + resolution: {integrity: sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==} + engines: {node: '>=4.0.0'} + + secp256k1@4.0.3: + 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'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sha3@2.1.4: + resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + snakecase-keys@5.5.0: + resolution: {integrity: sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==} + engines: {node: '>=12'} + + sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + store2@2.14.3: + resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + + superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + + superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + + supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} + engines: {node: '>=6.4.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@2.0.3: + resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} + engines: {node: '>=0.10'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.29.1: + resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + + tiny-secp256k1@1.1.6: + resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} + engines: {node: '>=6.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@1.2.1: + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-error@1.0.6: + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + + ts-jest@29.1.2: + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@9.5.1: + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-poet@6.7.0: + resolution: {integrity: sha512-A0wvFtpkTCWPw7ftTIwbEH+L+7ul4CU0x3jXKQ+kCnmEQIAOwhpUaBmcAYKxZCxHae9/MUl4LbyTqw25BpzW5Q==} + + ts-proto-descriptors@1.15.0: + resolution: {integrity: sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==} + + ts-proto@1.167.9: + resolution: {integrity: sha512-zqZ15CzqvupSpoTl/fzOs5gG7SFvj1ENmWeKMgD4Yl2BSx8I5F+qgYkr9EZYMu7Ho7u+QtwzfudROo+/jwM2pg==} + hasBin: true + + tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + u3@0.1.1: + resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==} + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + viem@2.15.1: + resolution: {integrity: sha512-Vrveen3vDOJyPf8Q8TDyWePG2pTdK6IpSi4P6qlvAP+rXkAeqRvwYBy9AmGm+BeYpCETAyTT0SrCP6458XSt+w==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vlq@2.0.4: + resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpack@5.90.3: + resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + + winston-transport@4.7.0: + resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + engines: {node: '>= 12.0.0'} + + winston@3.13.0: + resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} + engines: {node: '>= 12.0.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + 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 + + xstream@11.14.0: + resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + + zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adraffy/ens-normalize@1.10.0': {} + + '@adraffy/ens-normalize@1.10.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular-devkit/core@17.1.2(chokidar@3.6.0)': + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + chokidar: 3.6.0 + jsonc-parser: 3.2.0 + picomatch: 3.0.1 + rxjs: 7.8.1 + source-map: 0.7.4 + + '@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + ansi-colors: 4.1.3 + inquirer: 9.2.12 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/schematics@17.1.2(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + jsonc-parser: 3.2.0 + magic-string: 0.30.5 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@apollo/client@3.9.6(graphql@16.8.1)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@wry/caches': 1.0.1 + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.0 + prop-types: 15.8.1 + rehackt: 0.0.6 + response-iterator: 0.2.6 + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.6.2 + zen-observable-ts: 1.2.5 + transitivePeerDependencies: + - '@types/react' + optional: true + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + '@babel/compat-data@7.23.5': {} + + '@babel/core@7.24.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helpers': 7.24.0 + '@babel/parser': 7.24.0 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.6': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-plugin-utils@7.24.0': {} + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.24.0': + dependencies: + '@babel/types': 7.24.0 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/runtime@7.20.13': + dependencies: + regenerator-runtime: 0.13.11 + optional: true + + '@babel/runtime@7.24.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.0': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@bull-board/api@5.14.2(@bull-board/ui@5.14.2)': + dependencies: + '@bull-board/ui': 5.14.2 + redis-info: 3.1.0 + + '@bull-board/koa@5.14.2': + dependencies: + '@bull-board/api': 5.14.2(@bull-board/ui@5.14.2) + '@bull-board/ui': 5.14.2 + ejs: 3.1.9 + koa: 2.15.0 + koa-mount: 4.0.0 + koa-router: 10.1.1 + koa-static: 5.0.0 + koa-views: 7.0.2(ejs@3.1.9) + transitivePeerDependencies: + - '@types/koa' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffee-script + - dot + - dust + - dustjs-helpers + - dustjs-linkedin + - eco + - ect + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jade + - jazz + - jqtpl + - just + - liquid-node + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - supports-color + - swig + - swig-templates + - teacup + - templayed + - then-jade + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + + '@bull-board/ui@5.14.2': dependencies: '@bull-board/api': 5.14.2(@bull-board/ui@5.14.2) - dev: false - /@certusone/wormhole-sdk-proto-web@0.0.7(google-protobuf@3.21.2): - resolution: {integrity: sha512-GCe1/bcqMS0Mt+hsWp4SE4NLL59pWmK0lhQXO0oqAKl0G9AuuTdudySMDF/sLc7z5H2w34bSuSrIEKvPuuSC+w==} + '@certusone/wormhole-sdk-proto-web@0.0.7(google-protobuf@3.21.2)': dependencies: '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.2) protobufjs: 7.2.6 rxjs: 7.8.1 transitivePeerDependencies: - google-protobuf - dev: false - /@certusone/wormhole-sdk-wasm@0.0.1: - resolution: {integrity: sha512-LdIwLhOyr4pPs2jqYubqC7d4UkqYBX0EG/ppspQlW3qlVE0LZRMrH6oVzzLMyHtV0Rw7O9sIKzORW/T3mrJv2w==} + '@certusone/wormhole-sdk-wasm@0.0.1': dependencies: '@types/long': 4.0.2 '@types/node': 18.19.22 - dev: false - /@certusone/wormhole-sdk@0.10.15(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2): - resolution: {integrity: sha512-XECfrvdYjsGPZWyR1bqWCPOiRw7+6upszpSvAXjKIqEnTNXOCYRkt5ae8TVh5oZxPjpts2X3t4Oi9WGcEssHpQ==} + '@certusone/wormhole-sdk@0.10.15(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2)': dependencies: '@certusone/wormhole-sdk-proto-web': 0.0.7(google-protobuf@3.21.2) '@certusone/wormhole-sdk-wasm': 0.0.1 @@ -724,85 +5942,58 @@ packages: - react-dom - subscriptions-transport-ws - utf-8-validate - dev: false - /@certusone/wormhole-spydk@0.0.1: - resolution: {integrity: sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==} + '@certusone/wormhole-spydk@0.0.1': dependencies: '@grpc/grpc-js': 1.10.1 protobufjs: 6.11.4 - dev: false - /@classic-terra/terra.proto@1.1.0: - resolution: {integrity: sha512-bYhQG5LUaGF0KPRY9hYT/HEcd1QExZPQd6zLV/rQkCe/eDxfwFRLzZHpaaAdfWoAAZjsRWqJbUCqCg7gXBbJpw==} + '@classic-terra/terra.proto@1.1.0': dependencies: '@improbable-eng/grpc-web': 0.14.1(google-protobuf@3.21.2) google-protobuf: 3.21.2 long: 4.0.0 protobufjs: 6.11.4 - dev: false - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true + '@colors/colors@1.5.0': optional: true - /@colors/colors@1.6.0: - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - dev: false + '@colors/colors@1.6.0': {} - /@confio/ics23@0.6.8: - resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + '@confio/ics23@0.6.8': dependencies: '@noble/hashes': 1.3.3 protobufjs: 6.11.4 - dev: false - /@coral-xyz/borsh@0.2.6(@solana/web3.js@1.90.1): - resolution: {integrity: sha512-y6nmHw1bFcJib7sMHsQPpC8r47xhqDZVvhUdna7NUPzpSbOZG6f46N21+aXsQ2w/tG8Ggls488J/ZmwbgVmyjg==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.2.0 + '@coral-xyz/borsh@0.2.6(@solana/web3.js@1.90.1)': dependencies: '@solana/web3.js': 1.90.1 bn.js: 5.2.1 buffer-layout: 1.2.2 - dev: false - /@cosmjs/amino@0.28.13: - resolution: {integrity: sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ==} + '@cosmjs/amino@0.28.13': dependencies: '@cosmjs/crypto': 0.28.13 '@cosmjs/encoding': 0.28.13 '@cosmjs/math': 0.28.13 '@cosmjs/utils': 0.28.13 - dev: false - /@cosmjs/amino@0.29.5: - resolution: {integrity: sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw==} + '@cosmjs/amino@0.29.5': dependencies: '@cosmjs/crypto': 0.29.5 '@cosmjs/encoding': 0.29.5 '@cosmjs/math': 0.29.5 '@cosmjs/utils': 0.29.5 - dev: false - /@cosmjs/amino@0.30.1: - resolution: {integrity: sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==} - requiresBuild: true + '@cosmjs/amino@0.30.1': dependencies: '@cosmjs/crypto': 0.30.1 '@cosmjs/encoding': 0.30.1 '@cosmjs/math': 0.30.1 '@cosmjs/utils': 0.30.1 - dev: false optional: true - /@cosmjs/cosmwasm-stargate@0.29.5: - resolution: {integrity: sha512-TNdSvm2tEE3XMCuxHxquzls56t40hC8qnLeYJWHsY2ECZmRK3KrnpRReEr7N7bLtODToK7X/riYrV0JaYxjrYA==} + '@cosmjs/cosmwasm-stargate@0.29.5': dependencies: '@cosmjs/amino': 0.29.5 '@cosmjs/crypto': 0.29.5 @@ -819,10 +6010,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@cosmjs/crypto@0.28.13: - resolution: {integrity: sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ==} + '@cosmjs/crypto@0.28.13': dependencies: '@cosmjs/encoding': 0.28.13 '@cosmjs/math': 0.28.13 @@ -831,10 +6020,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.5 libsodium-wrappers: 0.7.13 - dev: false - /@cosmjs/crypto@0.29.5: - resolution: {integrity: sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ==} + '@cosmjs/crypto@0.29.5': dependencies: '@cosmjs/encoding': 0.29.5 '@cosmjs/math': 0.29.5 @@ -843,11 +6030,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.5 libsodium-wrappers: 0.7.13 - dev: false - /@cosmjs/crypto@0.30.1: - resolution: {integrity: sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==} - requiresBuild: true + '@cosmjs/crypto@0.30.1': dependencies: '@cosmjs/encoding': 0.30.1 '@cosmjs/math': 0.30.1 @@ -856,80 +6040,57 @@ packages: bn.js: 5.2.1 elliptic: 6.5.5 libsodium-wrappers: 0.7.13 - dev: false optional: true - /@cosmjs/encoding@0.28.13: - resolution: {integrity: sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA==} + '@cosmjs/encoding@0.28.13': dependencies: base64-js: 1.5.1 bech32: 1.1.4 readonly-date: 1.0.0 - dev: false - /@cosmjs/encoding@0.29.5: - resolution: {integrity: sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ==} + '@cosmjs/encoding@0.29.5': dependencies: base64-js: 1.5.1 bech32: 1.1.4 readonly-date: 1.0.0 - dev: false - /@cosmjs/encoding@0.30.1: - resolution: {integrity: sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==} - requiresBuild: true + '@cosmjs/encoding@0.30.1': dependencies: base64-js: 1.5.1 bech32: 1.1.4 readonly-date: 1.0.0 - dev: false optional: true - /@cosmjs/json-rpc@0.28.13: - resolution: {integrity: sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A==} + '@cosmjs/json-rpc@0.28.13': dependencies: '@cosmjs/stream': 0.28.13 xstream: 11.14.0 - dev: false - /@cosmjs/json-rpc@0.29.5: - resolution: {integrity: sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w==} + '@cosmjs/json-rpc@0.29.5': dependencies: '@cosmjs/stream': 0.29.5 xstream: 11.14.0 - dev: false - /@cosmjs/json-rpc@0.30.1: - resolution: {integrity: sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==} - requiresBuild: true + '@cosmjs/json-rpc@0.30.1': dependencies: '@cosmjs/stream': 0.30.1 xstream: 11.14.0 - dev: false optional: true - /@cosmjs/math@0.28.13: - resolution: {integrity: sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g==} + '@cosmjs/math@0.28.13': dependencies: bn.js: 5.2.1 - dev: false - /@cosmjs/math@0.29.5: - resolution: {integrity: sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q==} + '@cosmjs/math@0.29.5': dependencies: bn.js: 5.2.1 - dev: false - /@cosmjs/math@0.30.1: - resolution: {integrity: sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q==} - requiresBuild: true + '@cosmjs/math@0.30.1': dependencies: bn.js: 5.2.1 - dev: false optional: true - /@cosmjs/proto-signing@0.28.13: - resolution: {integrity: sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ==} + '@cosmjs/proto-signing@0.28.13': dependencies: '@cosmjs/amino': 0.28.13 '@cosmjs/crypto': 0.28.13 @@ -938,10 +6099,8 @@ packages: '@cosmjs/utils': 0.28.13 cosmjs-types: 0.4.1 long: 4.0.0 - dev: false - /@cosmjs/proto-signing@0.29.5: - resolution: {integrity: sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA==} + '@cosmjs/proto-signing@0.29.5': dependencies: '@cosmjs/amino': 0.29.5 '@cosmjs/crypto': 0.29.5 @@ -950,11 +6109,8 @@ packages: '@cosmjs/utils': 0.29.5 cosmjs-types: 0.5.2 long: 4.0.0 - dev: false - /@cosmjs/proto-signing@0.30.1: - resolution: {integrity: sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ==} - requiresBuild: true + '@cosmjs/proto-signing@0.30.1': dependencies: '@cosmjs/amino': 0.30.1 '@cosmjs/crypto': 0.30.1 @@ -963,11 +6119,9 @@ packages: '@cosmjs/utils': 0.30.1 cosmjs-types: 0.7.2 long: 4.0.0 - dev: false optional: true - /@cosmjs/socket@0.28.13: - resolution: {integrity: sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug==} + '@cosmjs/socket@0.28.13': dependencies: '@cosmjs/stream': 0.28.13 isomorphic-ws: 4.0.1(ws@7.5.9) @@ -976,10 +6130,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@cosmjs/socket@0.29.5: - resolution: {integrity: sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ==} + '@cosmjs/socket@0.29.5': dependencies: '@cosmjs/stream': 0.29.5 isomorphic-ws: 4.0.1(ws@7.5.9) @@ -988,11 +6140,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@cosmjs/socket@0.30.1: - resolution: {integrity: sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow==} - requiresBuild: true + '@cosmjs/socket@0.30.1': dependencies: '@cosmjs/stream': 0.30.1 isomorphic-ws: 4.0.1(ws@7.5.9) @@ -1001,11 +6150,9 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /@cosmjs/stargate@0.28.13: - resolution: {integrity: sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg==} + '@cosmjs/stargate@0.28.13': dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.28.13 @@ -1023,10 +6170,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@cosmjs/stargate@0.29.5: - resolution: {integrity: sha512-hjEv8UUlJruLrYGJcUZXM/CziaINOKwfVm2BoSdUnNTMxGvY/jC1ABHKeZUYt9oXHxEJ1n9+pDqzbKc8pT0nBw==} + '@cosmjs/stargate@0.29.5': dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.29.5 @@ -1044,11 +6189,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@cosmjs/stargate@0.30.1: - resolution: {integrity: sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==} - requiresBuild: true + '@cosmjs/stargate@0.30.1': dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.30.1 @@ -1066,31 +6208,22 @@ packages: - bufferutil - debug - utf-8-validate - dev: false optional: true - /@cosmjs/stream@0.28.13: - resolution: {integrity: sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg==} + '@cosmjs/stream@0.28.13': dependencies: xstream: 11.14.0 - dev: false - /@cosmjs/stream@0.29.5: - resolution: {integrity: sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA==} + '@cosmjs/stream@0.29.5': dependencies: xstream: 11.14.0 - dev: false - /@cosmjs/stream@0.30.1: - resolution: {integrity: sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==} - requiresBuild: true + '@cosmjs/stream@0.30.1': dependencies: xstream: 11.14.0 - dev: false optional: true - /@cosmjs/tendermint-rpc@0.28.13: - resolution: {integrity: sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w==} + '@cosmjs/tendermint-rpc@0.28.13': dependencies: '@cosmjs/crypto': 0.28.13 '@cosmjs/encoding': 0.28.13 @@ -1106,10 +6239,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@cosmjs/tendermint-rpc@0.29.5: - resolution: {integrity: sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w==} + '@cosmjs/tendermint-rpc@0.29.5': dependencies: '@cosmjs/crypto': 0.29.5 '@cosmjs/encoding': 0.29.5 @@ -1125,11 +6256,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@cosmjs/tendermint-rpc@0.30.1: - resolution: {integrity: sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ==} - requiresBuild: true + '@cosmjs/tendermint-rpc@0.30.1': dependencies: '@cosmjs/crypto': 0.30.1 '@cosmjs/encoding': 0.30.1 @@ -1145,461 +6273,184 @@ packages: - bufferutil - debug - utf-8-validate - dev: false optional: true - /@cosmjs/utils@0.28.13: - resolution: {integrity: sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg==} - dev: false + '@cosmjs/utils@0.28.13': {} - /@cosmjs/utils@0.29.5: - resolution: {integrity: sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ==} - dev: false + '@cosmjs/utils@0.29.5': {} - /@cosmjs/utils@0.30.1: - resolution: {integrity: sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==} - requiresBuild: true - dev: false + '@cosmjs/utils@0.30.1': optional: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@dabh/diagnostics@2.0.3: - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 - dev: false - /@datastructures-js/queue@4.2.3: - resolution: {integrity: sha512-GWVMorC/xi2V2ta+Z/CPgPGHL2ZJozcj48g7y2nIX5GIGZGRrbShSHgvMViJwHJurUzJYOdIdRZnWDRrROFwJA==} - dev: false + '@datastructures-js/queue@4.2.3': {} - /@drizzle-team/studio@0.0.39: - resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} + '@drizzle-team/studio@0.0.39': dependencies: superjson: 2.2.1 - dev: false - /@esbuild-kit/core-utils@3.3.2: - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 - dev: false - /@esbuild-kit/esm-loader@2.6.5: - resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.7.3 - dev: false - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true + '@esbuild/aix-ppc64@0.19.12': optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm64@0.18.20': optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true + '@esbuild/android-arm64@0.19.12': optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm@0.18.20': optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true + '@esbuild/android-arm@0.19.12': optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-x64@0.18.20': optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true + '@esbuild/android-x64@0.19.12': optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-arm64@0.18.20': optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-arm64@0.19.12': optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-x64@0.18.20': optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-x64@0.19.12': optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-arm64@0.18.20': optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true + + '@esbuild/freebsd-arm64@0.19.12': optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-x64@0.18.20': optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true + '@esbuild/freebsd-x64@0.19.12': optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm64@0.18.20': optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm64@0.19.12': optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm@0.18.20': optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm@0.19.12': optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ia32@0.18.20': optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true + '@esbuild/linux-ia32@0.19.12': optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-loong64@0.18.20': optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true + '@esbuild/linux-loong64@0.19.12': optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-mips64el@0.18.20': optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true + '@esbuild/linux-mips64el@0.19.12': optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ppc64@0.18.20': optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true + '@esbuild/linux-ppc64@0.19.12': optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-riscv64@0.18.20': optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true + '@esbuild/linux-riscv64@0.19.12': optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-s390x@0.18.20': optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true + '@esbuild/linux-s390x@0.19.12': optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-x64@0.18.20': optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@esbuild/linux-x64@0.19.12': optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false + '@esbuild/netbsd-x64@0.18.20': optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true + '@esbuild/netbsd-x64@0.19.12': optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false + '@esbuild/openbsd-x64@0.18.20': optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true + '@esbuild/openbsd-x64@0.19.12': optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false + '@esbuild/sunos-x64@0.18.20': optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + '@esbuild/sunos-x64@0.19.12': optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-arm64@0.18.20': optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@esbuild/win32-arm64@0.19.12': optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-ia32@0.18.20': optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@esbuild/win32-ia32@0.19.12': optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-x64@0.18.20': optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@esbuild/win32-x64@0.19.12': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -1612,33 +6463,22 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.57.0': {} - /@ethereumjs/common@2.6.5: - resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} - requiresBuild: true + '@ethereumjs/common@2.6.5': dependencies: crc-32: 1.2.2 ethereumjs-util: 7.1.5 - dev: false optional: true - /@ethereumjs/tx@3.5.2: - resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} - requiresBuild: true + '@ethereumjs/tx@3.5.2': dependencies: '@ethereumjs/common': 2.6.5 ethereumjs-util: 7.1.5 - dev: false optional: true - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + '@ethersproject/abi@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -1649,10 +6489,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + '@ethersproject/abstract-provider@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -1661,63 +6499,47 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - dev: false - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@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 - dev: false - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + '@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 - dev: false - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/base64@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 - dev: false - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + '@ethersproject/basex@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: false - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + '@ethersproject/bignumber@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - dev: false - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + '@ethersproject/bytes@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/constants@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 - dev: false - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + '@ethersproject/contracts@5.7.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -1729,10 +6551,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - dev: false - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hash@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -1743,10 +6563,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + '@ethersproject/hdnode@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -1760,10 +6578,8 @@ packages: '@ethersproject/strings': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: false - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/json-wallets@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -1778,40 +6594,28 @@ packages: '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 - dev: false - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + '@ethersproject/keccak256@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - dev: false - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: false + '@ethersproject/logger@5.7.0': {} - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.7.1': dependencies: '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/pbkdf2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - dev: false - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/properties@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + '@ethersproject/providers@5.7.2': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -1836,32 +6640,24 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + '@ethersproject/random@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/rlp@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + '@ethersproject/sha2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - dev: false - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/signing-key@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -1869,10 +6665,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 - dev: false - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/solidity@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -1880,18 +6674,14 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/transactions@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -1902,18 +6692,14 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - dev: false - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + '@ethersproject/units@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/wallet@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -1930,117 +6716,75 @@ packages: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: false - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@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 - dev: false - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@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 - dev: false - /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): - resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} - requiresBuild: true - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': dependencies: graphql: 16.8.1 - dev: false optional: true - /@grpc/grpc-js@1.10.1: - resolution: {integrity: sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==} - engines: {node: ^8.13.0 || >=10.10.0} + '@grpc/grpc-js@1.10.1': dependencies: '@grpc/proto-loader': 0.7.10 '@types/node': 20.11.25 - dev: false - /@grpc/proto-loader@0.7.10: - resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} - engines: {node: '>=6'} - hasBin: true + '@grpc/proto-loader@0.7.10': dependencies: lodash.camelcase: 4.3.0 long: 5.2.3 protobufjs: 7.2.6 yargs: 17.7.2 - dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.2': {} - /@improbable-eng/grpc-web-node-http-transport@0.15.0(@improbable-eng/grpc-web@0.15.0): - resolution: {integrity: sha512-HLgJfVolGGpjc9DWPhmMmXJx8YGzkek7jcCFO1YYkSOoO81MWRZentPOd/JiKiZuU08wtc4BG+WNuGzsQB5jZA==} - peerDependencies: - '@improbable-eng/grpc-web': '>=0.13.0' + '@improbable-eng/grpc-web-node-http-transport@0.15.0(@improbable-eng/grpc-web@0.15.0)': dependencies: '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.2) - dev: false - /@improbable-eng/grpc-web@0.14.1(google-protobuf@3.21.2): - resolution: {integrity: sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==} - peerDependencies: - google-protobuf: ^3.14.0 + '@improbable-eng/grpc-web@0.14.1(google-protobuf@3.21.2)': dependencies: browser-headers: 0.4.1 google-protobuf: 3.21.2 - dev: false - /@improbable-eng/grpc-web@0.15.0(google-protobuf@3.21.2): - resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==} - peerDependencies: - google-protobuf: ^3.14.0 + '@improbable-eng/grpc-web@0.15.0(google-protobuf@3.21.2)': dependencies: browser-headers: 0.4.1 google-protobuf: 3.21.2 - dev: false - /@injectivelabs/core-proto-ts@0.0.14: - resolution: {integrity: sha512-NZWlgBzgVrXow9IknFQHvcYKX4QkUD25taRigoNYQK8PDn4+VXd9xM5WFUDRhzm2smTCguyl/+MghpEp4oTPWw==} - requiresBuild: true + '@injectivelabs/core-proto-ts@0.0.14': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) google-protobuf: 3.21.2 protobufjs: 7.2.6 rxjs: 7.8.1 - dev: false optional: true - /@injectivelabs/exceptions@1.14.6(google-protobuf@3.21.2): - resolution: {integrity: sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==} - requiresBuild: true + '@injectivelabs/exceptions@1.14.6(google-protobuf@3.21.2)': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) '@injectivelabs/ts-types': 1.14.6 @@ -2049,65 +6793,41 @@ packages: shx: 0.3.4 transitivePeerDependencies: - google-protobuf - dev: false optional: true - /@injectivelabs/grpc-web-node-http-transport@0.0.2(@injectivelabs/grpc-web@0.0.1): - resolution: {integrity: sha512-rpyhXLiGY/UMs6v6YmgWHJHiO9l0AgDyVNv+jcutNVt4tQrmNvnpvz2wCAGOFtq5LuX/E9ChtTVpk3gWGqXcGA==} - requiresBuild: true - peerDependencies: - '@injectivelabs/grpc-web': '>=0.0.1' + '@injectivelabs/grpc-web-node-http-transport@0.0.2(@injectivelabs/grpc-web@0.0.1)': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) - dev: false optional: true - /@injectivelabs/grpc-web-react-native-transport@0.0.2(@injectivelabs/grpc-web@0.0.1): - resolution: {integrity: sha512-mk+aukQXnYNgPsPnu3KBi+FD0ZHQpazIlaBZ2jNZG7QAVmxTWtv3R66Zoq99Wx2dnE946NsZBYAoa0K5oSjnow==} - requiresBuild: true - peerDependencies: - '@injectivelabs/grpc-web': '>=0.0.1' + '@injectivelabs/grpc-web-react-native-transport@0.0.2(@injectivelabs/grpc-web@0.0.1)': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) - dev: false optional: true - /@injectivelabs/grpc-web@0.0.1(google-protobuf@3.21.2): - resolution: {integrity: sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw==} - requiresBuild: true - peerDependencies: - google-protobuf: ^3.14.0 + '@injectivelabs/grpc-web@0.0.1(google-protobuf@3.21.2)': dependencies: browser-headers: 0.4.1 google-protobuf: 3.21.2 - dev: false optional: true - /@injectivelabs/indexer-proto-ts@1.10.8-rc.4: - resolution: {integrity: sha512-IwbepTfsHHAv3Z36As6yH/+HIplOEpUu6SFHBCVgdSIaQ8GuvTib4HETiVnV4mjYqoyVgWs+zLSAfih46rdMJQ==} - requiresBuild: true + '@injectivelabs/indexer-proto-ts@1.10.8-rc.4': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) google-protobuf: 3.21.2 protobufjs: 7.2.6 rxjs: 7.8.1 - dev: false optional: true - /@injectivelabs/mito-proto-ts@1.0.9: - resolution: {integrity: sha512-+TZMvJ4SHwcn6SFPdqaiQFZdNhjH7hyRFozY15nOTC2utdGij9jEsjz1NsyOejfYDA0s1z5Wm1SgrMYKaVpAmQ==} - requiresBuild: true + '@injectivelabs/mito-proto-ts@1.0.9': dependencies: '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) google-protobuf: 3.21.2 protobufjs: 7.2.6 rxjs: 7.8.1 - dev: false optional: true - /@injectivelabs/networks@1.10.12(google-protobuf@3.21.2): - resolution: {integrity: sha512-tTHyLls1Nik5QTs/S03qqG2y/ITvNwI8CJOQbMmmsr1CL2CdjJBtzRYn9Dyx2p8XgzRFf9hmlybpe20tq9O3SA==} - requiresBuild: true + '@injectivelabs/networks@1.10.12(google-protobuf@3.21.2)': dependencies: '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.2) '@injectivelabs/ts-types': 1.14.6 @@ -2117,12 +6837,9 @@ packages: transitivePeerDependencies: - debug - google-protobuf - dev: false optional: true - /@injectivelabs/networks@1.14.6(google-protobuf@3.21.2): - resolution: {integrity: sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==} - requiresBuild: true + '@injectivelabs/networks@1.14.6(google-protobuf@3.21.2)': dependencies: '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.2) '@injectivelabs/ts-types': 1.14.6 @@ -2132,12 +6849,9 @@ packages: transitivePeerDependencies: - debug - google-protobuf - dev: false optional: true - /@injectivelabs/sdk-ts@1.10.72: - resolution: {integrity: sha512-A5mHNNBgO4fI1c/7CZ0bGfVXliy8laP+VaYZ++aWh1YyudoZw4CTCEmLetZRy7AUU3XcfbHa8sAImRi7db+v6Q==} - requiresBuild: true + '@injectivelabs/sdk-ts@1.10.72': dependencies: '@apollo/client': 3.9.6(graphql@16.8.1) '@cosmjs/amino': 0.30.1 @@ -2184,12 +6898,9 @@ packages: - react-dom - subscriptions-transport-ws - utf-8-validate - dev: false optional: true - /@injectivelabs/test-utils@1.14.4: - resolution: {integrity: sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==} - requiresBuild: true + '@injectivelabs/test-utils@1.14.4': dependencies: axios: 0.21.4 bignumber.js: 9.1.2 @@ -2199,12 +6910,9 @@ packages: store2: 2.14.3 transitivePeerDependencies: - debug - dev: false optional: true - /@injectivelabs/token-metadata@1.14.7(google-protobuf@3.21.2): - resolution: {integrity: sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==} - requiresBuild: true + '@injectivelabs/token-metadata@1.14.7(google-protobuf@3.21.2)': dependencies: '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.2) '@injectivelabs/networks': 1.14.6(google-protobuf@3.21.2) @@ -2220,21 +6928,15 @@ packages: transitivePeerDependencies: - debug - google-protobuf - dev: false optional: true - /@injectivelabs/ts-types@1.14.6: - resolution: {integrity: sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==} - requiresBuild: true + '@injectivelabs/ts-types@1.14.6': dependencies: link-module-alias: 1.2.0 shx: 0.3.4 - dev: false optional: true - /@injectivelabs/utils@1.10.12(google-protobuf@3.21.2): - resolution: {integrity: sha512-c8al79nxIJgV1cBAdW2TPDGldj/8gm5k0h5TIN/AJs8/AeIjpTwwVGfLY3QvPOpRsxuQ9CjBkTXrAcSL1wwkcw==} - requiresBuild: true + '@injectivelabs/utils@1.10.12(google-protobuf@3.21.2)': dependencies: '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.2) '@injectivelabs/ts-types': 1.14.6 @@ -2248,12 +6950,9 @@ packages: transitivePeerDependencies: - debug - google-protobuf - dev: false optional: true - /@injectivelabs/utils@1.14.6(google-protobuf@3.21.2): - resolution: {integrity: sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==} - requiresBuild: true + '@injectivelabs/utils@1.14.6(google-protobuf@3.21.2)': dependencies: '@injectivelabs/exceptions': 1.14.6(google-protobuf@3.21.2) '@injectivelabs/ts-types': 1.14.6 @@ -2267,43 +6966,30 @@ packages: transitivePeerDependencies: - debug - google-protobuf - dev: false optional: true - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false + '@ioredis/commands@1.2.0': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@istanbuljs/schema@0.1.3': {} - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.25 @@ -2311,16 +6997,8 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - dev: true - /@jest/core@29.7.0(ts-node@10.9.2): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@29.7.0(ts-node@10.9.2)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -2354,38 +7032,26 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.11.25 jest-mock: 29.7.0 - dev: true - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - dev: true - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -2393,11 +7059,8 @@ packages: jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 - dev: true - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -2405,16 +7068,8 @@ packages: jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -2442,47 +7097,32 @@ packages: v8-to-istanbul: 9.2.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - dev: true - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.24.0 '@jest/types': 29.6.3 @@ -2501,11 +7141,8 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -2513,139 +7150,79 @@ packages: '@types/node': 20.11.25 '@types/yargs': 17.0.32 chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - /@keplr-wallet/types@0.11.64: - resolution: {integrity: sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==} + '@keplr-wallet/types@0.11.64': dependencies: axios: 0.27.2 long: 4.0.0 transitivePeerDependencies: - debug - dev: false - /@ljharb/through@2.3.12: - resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} - engines: {node: '>= 0.4'} + '@ljharb/through@2.3.12': dependencies: call-bind: 1.0.7 - dev: true - /@lukeed/csprng@1.1.0: - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} + '@lukeed/csprng@1.1.0': {} - /@metamask/eth-sig-util@4.0.1: - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true + '@metamask/eth-sig-util@4.0.1': dependencies: ethereumjs-abi: 0.6.8 ethereumjs-util: 6.2.1 ethjs-util: 0.1.6 tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - dev: false optional: true - /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: - resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2': optional: true - /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: - resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2': optional: true - /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: - resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2': optional: true - /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: - resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2': optional: true - /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: - resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2': optional: true - /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: - resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2': optional: true - /@mysten/bcs@0.7.1: - resolution: {integrity: sha512-wFPb8bkhwrbiStfZMV5rFM7J+umpke59/dNjDp+UYJKykNlW23LCk2ePyEUvGdb62HGJM1jyOJ8g4egE3OmdKA==} + '@mysten/bcs@0.7.1': dependencies: bs58: 5.0.0 - dev: false - /@mysten/sui.js@0.32.2: - resolution: {integrity: sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==} - engines: {node: '>=16'} + '@mysten/sui.js@0.32.2': dependencies: '@mysten/bcs': 0.7.1 '@noble/curves': 1.3.0 @@ -2660,20 +7237,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@nestjs/cli@10.3.2(esbuild@0.19.12): - resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} - engines: {node: '>= 16.14'} - hasBin: true - peerDependencies: - '@swc/cli': ^0.1.62 || ^0.3.0 - '@swc/core': ^1.3.62 - peerDependenciesMeta: - '@swc/cli': - optional: true - '@swc/core': - optional: true + '@nestjs/cli@10.3.2(esbuild@0.19.12)': dependencies: '@angular-devkit/core': 17.1.2(chokidar@3.6.0) '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) @@ -2701,20 +7266,8 @@ packages: - esbuild - uglify-js - webpack-cli - dev: true - /@nestjs/common@10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/common@10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1)': dependencies: iterare: 1.2.1 reflect-metadata: 0.1.14 @@ -2722,23 +7275,7 @@ packages: tslib: 2.6.2 uid: 2.0.2 - /@nestjs/core@10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true + '@nestjs/core@10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) @@ -2754,11 +7291,7 @@ packages: transitivePeerDependencies: - encoding - /@nestjs/platform-express@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): - resolution: {integrity: sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 + '@nestjs/platform-express@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)': dependencies: '@nestjs/common': 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -2770,12 +7303,7 @@ packages: transitivePeerDependencies: - supports-color - /@nestjs/platform-ws@10.3.7(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1): - resolution: {integrity: sha512-lOvZ8u5UdL0FgAOdWosDXefVgDikPd4j5el81emkx+H0pFsysfHXSSoSvMLQijdhENqHSl3buRhO5n3M3uia1w==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - rxjs: ^7.1.0 + '@nestjs/platform-ws@10.3.7(@nestjs/common@10.3.3)(@nestjs/websockets@10.3.7)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/websockets': 10.3.7(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -2785,12 +7313,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3): - resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} - peerDependencies: - typescript: '>=4.8.2' + '@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3)': dependencies: '@angular-devkit/core': 17.1.2(chokidar@3.6.0) '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) @@ -2800,12 +7324,8 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - chokidar - dev: true - /@nestjs/schematics@10.1.1(typescript@5.4.2): - resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} - peerDependencies: - typescript: '>=4.8.2' + '@nestjs/schematics@10.1.1(typescript@5.4.2)': dependencies: '@angular-devkit/core': 17.1.2(chokidar@3.6.0) '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) @@ -2815,38 +7335,15 @@ packages: typescript: 5.4.2 transitivePeerDependencies: - chokidar - dev: false - /@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-express@10.3.3): - resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/platform-express@10.3.3)': dependencies: '@nestjs/common': 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) tslib: 2.6.2 - dev: true - /@nestjs/websockets@10.3.7(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/platform-socket.io': ^10.0.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/platform-socket.io': - optional: true + '@nestjs/websockets@10.3.7(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(reflect-metadata@0.1.14)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.3(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/platform-express@10.3.3)(@nestjs/websockets@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -2856,57 +7353,33 @@ packages: rxjs: 7.8.1 tslib: 2.6.2 - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - dev: false - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.3.0': dependencies: '@noble/hashes': 1.3.3 - dev: false - /@noble/hashes@1.1.3: - resolution: {integrity: sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==} - dev: false + '@noble/hashes@1.1.3': {} - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.2': {} - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.3': {} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@nuxtjs/opencollective@0.3.2: - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + '@nuxtjs/opencollective@0.3.2': dependencies: chalk: 4.1.2 consola: 2.15.3 @@ -2914,12 +7387,9 @@ packages: transitivePeerDependencies: - encoding - /@one-ini/wasm@0.1.1: - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: false + '@one-ini/wasm@0.1.1': {} - /@osmonauts/helpers@0.6.0: - resolution: {integrity: sha512-l62tWR/0W4R+5wRvMeRK0zlaJ8WZhULKsQAZ7kNzggL0pbndIAV+0BJ/jEBbNletoeGtuV8rpi6Wo+w+RmtZGw==} + '@osmonauts/helpers@0.6.0': dependencies: '@babel/runtime': 7.24.0 '@cosmjs/amino': 0.28.13 @@ -2933,31 +7403,20 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@osmonauts/lcd@0.8.0: - resolution: {integrity: sha512-k7m2gAVnXc0H4m/eTq4z/8A6hFrr3MPS9wnLV4Xu9/K/WYltCnp2PpiObZm+feZUPK/svES6hxIQeO1bODLx8g==} + '@osmonauts/lcd@0.8.0': dependencies: '@babel/runtime': 7.24.0 axios: 0.27.2 transitivePeerDependencies: - debug - dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@project-serum/anchor@0.25.0: - resolution: {integrity: sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A==} - engines: {node: '>=11'} + '@project-serum/anchor@0.25.0': dependencies: '@project-serum/borsh': 0.2.5(@solana/web3.js@1.90.1) '@solana/web3.js': 1.90.1 @@ -2978,90 +7437,66 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@project-serum/borsh@0.2.5(@solana/web3.js@1.90.1): - resolution: {integrity: sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.2.0 + '@project-serum/borsh@0.2.5(@solana/web3.js@1.90.1)': dependencies: '@solana/web3.js': 1.90.1 bn.js: 5.2.1 buffer-layout: 1.2.2 - dev: false - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false + '@protobufjs/aspromise@1.1.2': {} - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false + '@protobufjs/base64@1.1.2': {} - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false + '@protobufjs/codegen@2.0.4': {} - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false + '@protobufjs/eventemitter@1.1.0': {} - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@protobufjs/fetch@1.1.0': dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 - dev: false - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false + '@protobufjs/float@1.0.2': {} - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false + '@protobufjs/inquire@1.1.0': {} - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false + '@protobufjs/path@1.1.2': {} - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false + '@protobufjs/pool@1.1.0': {} - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false + '@protobufjs/utf8@1.1.0': {} - /@scure/base@1.1.5: - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - dev: false + '@scure/base@1.1.5': {} - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.3.2': + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 + + '@scure/bip32@1.3.3': dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - dev: false - /@scure/bip39@1.1.0: - resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + '@scure/bip39@1.1.0': dependencies: '@noble/hashes': 1.1.3 '@scure/base': 1.1.5 - dev: false - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.2.1': dependencies: '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - dev: false - /@sei-js/core@1.5.0: - resolution: {integrity: sha512-5Ojk6YvCfe5Fj2hwZ6nShHfNemwf9CFUylpLJmsxkQg0UYXhe6w5TFtZ+mnE+sOFO086vD0MYMUEYXXMqn0E9g==} + '@scure/bip39@1.2.2': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 + + '@sei-js/core@1.5.0': dependencies: '@cosmjs/amino': 0.29.5 '@cosmjs/cosmwasm-stargate': 0.29.5 @@ -3084,10 +7519,8 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@sei-js/proto@1.3.0: - resolution: {integrity: sha512-p/nn07Kc7h6nvTk4PJ+OqQFHmfZ4YWZ0i2Q2pnKKqq/o1sKCpoS3atP63mB6vC5r5tJfNbBjFWiCyQI2foGiiQ==} + '@sei-js/proto@1.3.0': dependencies: '@babel/runtime': 7.24.0 '@cosmjs/amino': 0.29.5 @@ -3102,27 +7535,18 @@ packages: - bufferutil - debug - utf-8-validate - dev: false - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - dev: true - /@solana/buffer-layout-utils@0.2.0: - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} + '@solana/buffer-layout-utils@0.2.0': dependencies: '@solana/buffer-layout': 4.0.1 '@solana/web3.js': 1.90.1 @@ -3132,54 +7556,34 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@solana/buffer-layout@4.0.1: - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 - dev: false - /@solana/codecs-core@2.0.0-experimental.8618508: - resolution: {integrity: sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==} - dev: false + '@solana/codecs-core@2.0.0-experimental.8618508': {} - /@solana/codecs-data-structures@2.0.0-experimental.8618508: - resolution: {integrity: sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==} + '@solana/codecs-data-structures@2.0.0-experimental.8618508': dependencies: '@solana/codecs-core': 2.0.0-experimental.8618508 '@solana/codecs-numbers': 2.0.0-experimental.8618508 - dev: false - /@solana/codecs-numbers@2.0.0-experimental.8618508: - resolution: {integrity: sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==} + '@solana/codecs-numbers@2.0.0-experimental.8618508': dependencies: '@solana/codecs-core': 2.0.0-experimental.8618508 - dev: false - /@solana/codecs-strings@2.0.0-experimental.8618508(fastestsmallesttextencoderdecoder@1.0.22): - resolution: {integrity: sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 + '@solana/codecs-strings@2.0.0-experimental.8618508(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: '@solana/codecs-core': 2.0.0-experimental.8618508 '@solana/codecs-numbers': 2.0.0-experimental.8618508 fastestsmallesttextencoderdecoder: 1.0.22 - dev: false - /@solana/options@2.0.0-experimental.8618508: - resolution: {integrity: sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==} + '@solana/options@2.0.0-experimental.8618508': dependencies: '@solana/codecs-core': 2.0.0-experimental.8618508 '@solana/codecs-numbers': 2.0.0-experimental.8618508 - dev: false - /@solana/spl-token-metadata@0.1.2(@solana/web3.js@1.90.1)(fastestsmallesttextencoderdecoder@1.0.22): - resolution: {integrity: sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.87.6 + '@solana/spl-token-metadata@0.1.2(@solana/web3.js@1.90.1)(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: '@solana/codecs-core': 2.0.0-experimental.8618508 '@solana/codecs-data-structures': 2.0.0-experimental.8618508 @@ -3190,13 +7594,8 @@ packages: '@solana/web3.js': 1.90.1 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - dev: false - /@solana/spl-token@0.3.11(@solana/web3.js@1.90.1)(fastestsmallesttextencoderdecoder@1.0.22): - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 + '@solana/spl-token@0.3.11(@solana/web3.js@1.90.1)(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: '@solana/buffer-layout': 4.0.1 '@solana/buffer-layout-utils': 0.2.0 @@ -3208,17 +7607,12 @@ packages: - encoding - fastestsmallesttextencoderdecoder - utf-8-validate - dev: false - /@solana/spl-type-length-value@0.1.0: - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} + '@solana/spl-type-length-value@0.1.0': dependencies: buffer: 6.0.3 - dev: false - /@solana/web3.js@1.90.1: - resolution: {integrity: sha512-BaopDf3TN54N9/T1iILu+Fz2gthIZzi+6X2A7bb0FWvGlwI/78iKRb2WjSnCfrHmMbWVLJR5n/pmXteezMXgVw==} + '@solana/web3.js@1.90.1': dependencies: '@babel/runtime': 7.24.0 '@noble/curves': 1.3.0 @@ -3239,15 +7633,10 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@suchipi/femver@1.0.0: - resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} - dev: false + '@suchipi/femver@1.0.0': {} - /@terra-money/terra.js@3.1.9: - resolution: {integrity: sha512-JulSvOHLM56fL7s+cIjIbZeWPBluq883X1soWxA4TG5rKkDythT/DHeLXr3jP5Ld/26VENPSg6lNvK7cEYKpiw==} - engines: {node: '>=14'} + '@terra-money/terra.js@3.1.9': dependencies: '@classic-terra/terra.proto': 1.1.0 '@terra-money/terra.proto': 2.1.0 @@ -3265,348 +7654,221 @@ packages: ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - debug - dev: false - /@terra-money/terra.proto@0.1.7: - resolution: {integrity: sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==} + '@terra-money/terra.proto@0.1.7': dependencies: google-protobuf: 3.21.2 long: 4.0.0 protobufjs: 6.11.4 - dev: false - /@terra-money/terra.proto@2.1.0: - resolution: {integrity: sha512-rhaMslv3Rkr+QsTQEZs64FKA4QlfO0DfQHaR6yct/EovenMkibDEQ63dEL6yJA6LCaEQGYhyVB9JO9pTUA8ybw==} + '@terra-money/terra.proto@2.1.0': dependencies: '@improbable-eng/grpc-web': 0.14.1(google-protobuf@3.21.2) google-protobuf: 3.21.2 long: 4.0.0 protobufjs: 6.11.4 - dev: false - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.9': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node16@1.0.4': {} - /@typechain/ethers-v6@0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2): - resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} - peerDependencies: - ethers: 6.x - typechain: ^8.3.2 - typescript: '>=4.7.0' + '@typechain/ethers-v6@0.5.1(ethers@5.7.2)(typechain@8.3.2)(typescript@5.4.2)': dependencies: ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.4.2) typechain: 8.3.2(typescript@5.4.2) typescript: 5.4.2 - dev: false - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.0 '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.24.0 '@babel/types': 7.24.0 - dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/bn.js@4.11.6: - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - requiresBuild: true + '@types/bn.js@4.11.6': dependencies: '@types/node': 20.11.25 - dev: false optional: true - /@types/bn.js@5.1.1: - resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} - requiresBuild: true + '@types/bn.js@5.1.1': dependencies: '@types/node': 20.11.25 - dev: false optional: true - /@types/bn.js@5.1.5: - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - requiresBuild: true + '@types/bn.js@5.1.5': dependencies: '@types/node': 20.11.25 - dev: false - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 20.11.25 - dev: true - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 20.11.25 - /@types/cookiejar@2.1.5: - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - dev: true + '@types/cookiejar@2.1.5': {} - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.5 '@types/estree': 1.0.5 - dev: true - /@types/eslint@8.56.5: - resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} + '@types/eslint@8.56.5': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.11.25 '@types/qs': 6.9.12 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 '@types/qs': 6.9.12 '@types/serve-static': 1.15.5 - dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.11.25 - dev: true - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - dev: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.12': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - /@types/js-yaml@4.0.9: - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - dev: true + '@types/js-yaml@4.0.9': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/lodash.values@4.3.9: - resolution: {integrity: sha512-IJ20OEfqNwm3k8ENwoM3q0yOs4UMpgtD4GqxB4lwBHToGthHWqhyh5DdSgQjioocz0QK2SSBkJfCq95ZTV8BTw==} - requiresBuild: true + '@types/lodash.values@4.3.9': dependencies: '@types/lodash': 4.14.202 - dev: false optional: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - requiresBuild: true - dev: false + '@types/lodash@4.14.202': optional: true - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false + '@types/long@4.0.2': {} - /@types/methods@1.1.4: - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - dev: true + '@types/methods@1.1.4': {} - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true + '@types/mime@3.0.4': {} - /@types/node@10.12.18: - resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} - dev: false + '@types/node@10.12.18': {} - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false + '@types/node@12.20.55': {} - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - dev: false + '@types/node@18.15.13': {} - /@types/node@18.19.22: - resolution: {integrity: sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==} + '@types/node@18.19.22': dependencies: undici-types: 5.26.5 - dev: false - /@types/node@20.11.25: - resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + '@types/node@20.11.25': dependencies: undici-types: 5.26.5 - /@types/pbkdf2@3.1.2: - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - requiresBuild: true + '@types/pbkdf2@3.1.2': dependencies: '@types/node': 20.11.25 - dev: false - /@types/pg@8.11.2: - resolution: {integrity: sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==} + '@types/pg@8.11.2': dependencies: '@types/node': 20.11.25 pg-protocol: 1.6.0 pg-types: 4.0.2 - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/prettier@2.7.3': {} - /@types/qs@6.9.12: - resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} - dev: true + '@types/qs@6.9.12': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/secp256k1@4.0.6: - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - requiresBuild: true + '@types/secp256k1@4.0.6': dependencies: '@types/node': 20.11.25 - dev: false - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 20.11.25 - dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 '@types/node': 20.11.25 - dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true + '@types/stack-utils@2.0.3': {} - /@types/superagent@8.1.4: - resolution: {integrity: sha512-uzSBYwrpal8y2X2Pul5ZSWpzRiDha2FLcquaN95qUPnOjYgm/zQ5LIdqeJpQJTRWNTN+Rhm0aC8H06Ds2rqCYw==} + '@types/superagent@8.1.4': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.11.25 - dev: true - /@types/supertest@2.0.16: - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + '@types/supertest@2.0.16': dependencies: '@types/superagent': 8.1.4 - dev: true - /@types/triple-beam@1.3.5: - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - dev: false + '@types/triple-beam@1.3.5': {} - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@7.4.7': dependencies: '@types/node': 20.11.25 - dev: false - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) @@ -3624,17 +7886,8 @@ packages: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 @@ -3645,25 +7898,13 @@ packages: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) @@ -3673,21 +7914,10 @@ packages: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.2): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.2)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -3700,13 +7930,8 @@ packages: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -3719,78 +7944,51 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true + '@webassemblyjs/helper-buffer@1.11.6': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 @@ -3800,29 +7998,23 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 @@ -3830,17 +8022,13 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@wormhole-foundation/relayer-engine@0.3.2(@bull-board/ui@5.14.2)(@improbable-eng/grpc-web@0.15.0)(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2)(typescript@5.4.2): - resolution: {integrity: sha512-6CAGZdxDpPZph+Gx1Tob5wEarEzvD27G7khoGhB9sc8KiOhRz8zDiBspFfLetzfBEHMiTyvAOibETV5G0ULilA==} + '@wormhole-foundation/relayer-engine@0.3.2(@bull-board/ui@5.14.2)(@improbable-eng/grpc-web@0.15.0)(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(google-protobuf@3.21.2)(typescript@5.4.2)': dependencies: '@bull-board/api': 5.14.2(@bull-board/ui@5.14.2) '@bull-board/koa': 5.14.2 @@ -3859,7 +8047,7 @@ packages: koa: 2.15.0 lru-cache: 9.1.2 prom-client: 14.2.0 - winston: 3.12.0 + winston: 3.13.0 transitivePeerDependencies: - '@bull-board/ui' - '@improbable-eng/grpc-web' @@ -3930,55 +8118,33 @@ packages: - velocityjs - walrus - whiskers - dev: false - /@wry/caches@1.0.1: - resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} - engines: {node: '>=8'} - requiresBuild: true + '@wry/caches@1.0.1': dependencies: tslib: 2.6.2 - dev: false optional: true - /@wry/context@0.7.4: - resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} - engines: {node: '>=8'} - requiresBuild: true + '@wry/context@0.7.4': dependencies: tslib: 2.6.2 - dev: false optional: true - /@wry/equality@0.5.7: - resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} - engines: {node: '>=8'} - requiresBuild: true + '@wry/equality@0.5.7': dependencies: tslib: 2.6.2 - dev: false optional: true - /@wry/trie@0.4.3: - resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} - engines: {node: '>=8'} - requiresBuild: true + '@wry/trie@0.4.3': dependencies: tslib: 2.6.2 - dev: false optional: true - /@wry/trie@0.5.0: - resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} - engines: {node: '>=8'} - requiresBuild: true + '@wry/trie@0.5.0': dependencies: tslib: 2.6.2 - dev: false optional: true - /@xlabs-xyz/wallet-monitor@0.2.16(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.4.2): - resolution: {integrity: sha512-Fup24DcONFy3o5lrJP3i5gc5XXj7675gWhco3JkweWTFj86c17UrXYQOhZF1Z09b7WYt4rnXZx+wQ4W19HzOoQ==} + '@xlabs-xyz/wallet-monitor@0.2.16(@types/node@20.11.25)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.4.2)': dependencies: '@ethersproject/bignumber': 5.7.0 '@mysten/sui.js': 0.32.2 @@ -3994,7 +8160,7 @@ packages: prom-client: 14.2.0 ts-node: 10.9.2(@types/node@20.11.25)(typescript@5.4.2) ts-proto: 1.167.9 - winston: 3.12.0 + winston: 3.13.0 zod: 3.22.4 transitivePeerDependencies: - '@swc/core' @@ -4006,16 +8172,13 @@ packages: - supports-color - typescript - utf-8-validate - dev: false - /@xpla/xpla.js@0.2.3: - resolution: {integrity: sha512-Tfk7hCGWXtwr08reY3Pi6dmzIqFbzri9jcyzJdfNmdo4cN0PMwpRJuZZcPmtxiIUnNef3AN1E/6nJUD5MKniuA==} - engines: {node: '>=14'} + '@xpla/xpla.js@0.2.3': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/signing-key': 5.7.0 - '@terra-money/legacy.proto': /@terra-money/terra.proto@0.1.7 + '@terra-money/legacy.proto': '@terra-money/terra.proto@0.1.7' '@terra-money/terra.proto': 2.1.0 axios: 0.26.1 bech32: 2.0.0 @@ -4034,138 +8197,81 @@ packages: ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - debug - dev: false - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: false - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + abbrev@2.0.0: {} - /abort-controller-x@0.4.3: - resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} - dev: false + abitype@1.0.0(typescript@5.4.2): + dependencies: + typescript: 5.4.2 - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller-x@0.4.3: {} + + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - dev: false - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.2: {} - /acorn@7.1.1: - resolution: {integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==} - engines: {node: '>=0.4.0'} - hasBin: true - requiresBuild: true - dev: false + acorn@7.1.1: optional: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - dev: false + aes-js@3.0.0: {} - /aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - dev: false + aes-js@4.0.0-beta.5: {} - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + ajv-formats@2.1.1(ajv@8.12.0): dependencies: ajv: 8.12.0 - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /algo-msgpack-with-bigint@2.1.1: - resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} - engines: {node: '>= 10'} - dev: false + algo-msgpack-with-bigint@2.1.1: {} - /algosdk@2.7.0: - resolution: {integrity: sha512-sBE9lpV7bup3rZ+q2j3JQaFAE9JwZvjWKX00vPlG8e9txctXbgLL56jZhSWZndqhDI9oI+0P4NldkuQIWdrUyg==} - engines: {node: '>=18.0.0'} + algosdk@2.7.0: dependencies: algo-msgpack-with-bigint: 2.1.1 buffer: 6.0.3 @@ -4176,66 +8282,39 @@ packages: json-bigint: 1.0.0 tweetnacl: 1.0.3 vlq: 2.0.4 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /append-field@1.0.0: - resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + append-field@1.0.0: {} - /aptos@1.5.0: - resolution: {integrity: sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==} - engines: {node: '>=11.0.0'} + aptos@1.5.0: dependencies: '@noble/hashes': 1.1.3 '@scure/bip39': 1.1.0 @@ -4244,93 +8323,68 @@ packages: tweetnacl: 1.0.3 transitivePeerDependencies: - debug - dev: false - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@4.1.3: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} + array-back@3.1.0: {} - /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} + array-back@4.0.2: {} - /array-flatten@1.1.1: - resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + array-flatten@1.1.1: {} - /array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-timsort@1.0.3: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true + asap@2.0.6: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false + atomic-sleep@1.0.0: {} - /axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@0.21.4: dependencies: follow-redirects: 1.15.5 transitivePeerDependencies: - debug - dev: false - /axios@0.24.0: - resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} + axios@0.24.0: dependencies: follow-redirects: 1.15.5 transitivePeerDependencies: - debug - dev: false - /axios@0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + axios@0.26.1: dependencies: follow-redirects: 1.15.5 transitivePeerDependencies: - debug - dev: false - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + axios@0.27.2: dependencies: follow-redirects: 1.15.5 form-data: 4.0.0 + proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /babel-jest@29.7.0(@babel/core@7.24.0): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-jest@29.7.0(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 '@jest/transform': 29.7.0 @@ -4342,11 +8396,8 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.24.0 '@istanbuljs/load-nyc-config': 1.1.0 @@ -4355,22 +8406,15 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) @@ -4385,82 +8429,46 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - dev: true - /babel-preset-jest@29.6.3(@babel/core@7.24.0): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + base-x@3.0.9: dependencies: safe-buffer: 5.2.1 - dev: false - /base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - dev: false + base-x@4.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: false + bech32@1.1.4: {} - /bech32@2.0.0: - resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} - dev: false + bech32@2.0.0: {} - /big-integer@1.6.36: - resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} - engines: {node: '>=0.6'} - dev: false + big-integer@1.6.36: {} - /bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - requiresBuild: true + bigint-buffer@1.1.5: dependencies: bindings: 1.5.0 - dev: false - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: false + bignumber.js@9.1.2: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + binary-extensions@2.2.0: {} - /binary-parser@2.2.1: - resolution: {integrity: sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA==} - engines: {node: '>=12'} - dev: false + binary-parser@2.2.1: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: false - /bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - dev: false + bintrees@1.0.2: {} - /bip32@2.0.6: - resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} - engines: {node: '>=6.0.0'} + bip32@2.0.6: dependencies: '@types/node': 10.12.18 bs58check: 2.1.2 @@ -4469,48 +8477,31 @@ packages: tiny-secp256k1: 1.1.6 typeforce: 1.18.0 wif: 2.0.6 - dev: false - /bip39@3.1.0: - resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + bip39@3.1.0: dependencies: '@noble/hashes': 1.3.3 - dev: false - /bip66@1.1.5: - resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} - requiresBuild: true + bip66@1.1.5: dependencies: safe-buffer: 5.2.1 - dev: false optional: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - dev: false + blakejs@1.2.1: {} - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: false + bluebird@3.7.2: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: false + bn.js@4.12.0: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false + bn.js@5.2.1: {} - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -4527,9 +8518,7 @@ packages: transitivePeerDependencies: - supports-color - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -4546,42 +8535,30 @@ packages: transitivePeerDependencies: - supports-color - /borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + borsh@0.7.0: dependencies: bn.js: 5.2.1 bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - dev: false - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: false + brorand@1.1.0: {} - /browser-headers@0.4.1: - resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} - dev: false + browser-headers@0.4.1: {} - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - requiresBuild: true + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 cipher-base: 1.0.4 @@ -4589,93 +8566,59 @@ packages: evp_bytestokey: 1.0.3 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: false - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001596 electron-to-chromium: 1.4.695 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - dev: true - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@4.0.1: dependencies: base-x: 3.0.9 - dev: false - /bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + bs58@5.0.0: dependencies: base-x: 4.0.0 - dev: false - /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + bs58check@2.1.2: dependencies: bs58: 4.0.1 create-hash: 1.2.0 safe-buffer: 5.2.1 - dev: false - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - dev: false + buffer-layout@1.2.2: {} - /buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - dev: false + buffer-writer@2.0.0: {} - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - requiresBuild: true - dev: false + buffer-xor@1.0.3: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true + bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.0 - dev: false - /bullmq@3.15.8: - resolution: {integrity: sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A==} + bullmq@3.15.8: dependencies: cron-parser: 4.9.0 glob: 8.1.0 @@ -4687,29 +8630,19 @@ packages: uuid: 9.0.1 transitivePeerDependencies: - supports-color - dev: false - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 ylru: 1.3.2 - dev: false - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -4717,69 +8650,38 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.1 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + camelcase@7.0.1: {} - /caniuse-lite@1.0.30001596: - resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} - dev: true + caniuse-lite@1.0.30001596: {} - /capability@0.2.5: - resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==} - dev: false + capability@0.2.5: {} - /case-anything@2.1.13: - resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} - engines: {node: '>=12.13'} - dev: false + case-anything@2.1.13: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true + char-regex@1.0.2: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -4791,186 +8693,116 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.3: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - requiresBuild: true + cipher-base@1.0.4: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: false - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true + cjs-module-lexer@1.2.3: {} - /cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} + cli-color@2.0.4: dependencies: d: 1.0.2 es5-ext: 0.10.64 es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 - dev: false - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@2.9.2: {} - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.3: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-width@4.1.0: {} - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - requiresBuild: true + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false optional: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + clone@1.0.4: {} - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - dev: false + cluster-key-slot@1.1.2: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + co@4.6.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true + collect-v8-coverage@1.0.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: false - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@3.2.1: dependencies: color-convert: 1.9.3 color-string: 1.9.1 - dev: false - /colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + colorspace@1.1.4: dependencies: color: 3.2.1 text-hex: 1.0.0 - dev: false - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + command-line-args@5.2.1: dependencies: array-back: 3.1.0 find-replace: 3.0.0 lodash.camelcase: 4.3.0 typical: 4.0.0 - /command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} + command-line-usage@6.1.3: dependencies: array-back: 4.0.2 chalk: 2.4.2 table-layout: 1.0.2 typical: 5.2.0 - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: false + commander@10.0.1: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: false + commander@9.5.0: {} - /comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} + comment-json@4.2.3: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 @@ -4978,255 +8810,59 @@ packages: has-own-prop: 2.0.0 repeat-string: 1.6.1 - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: true + component-emitter@1.3.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - /condense-newlines@0.2.1: - resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} - engines: {node: '>=0.10.0'} + condense-newlines@0.2.1: dependencies: extend-shallow: 2.0.1 is-whitespace: 0.3.0 kind-of: 3.2.2 - dev: false - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: false - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + consola@2.15.3: {} - /consolidate@0.16.0(ejs@3.1.9): - resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} - engines: {node: '>= 0.10.0'} - deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^4.0.1 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true + consolidate@0.16.0(ejs@3.1.9): dependencies: bluebird: 3.7.2 ejs: 3.1.9 - dev: false - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@1.0.5: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + cookie-signature@1.0.6: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + cookie@0.5.0: {} - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: true + cookiejar@2.1.4: {} - /cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} + cookies@0.9.1: dependencies: depd: 2.0.0 keygrip: 1.1.0 - dev: false - /copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} + copy-anything@3.0.5: dependencies: is-what: 4.1.16 - dev: false - /copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - requiresBuild: true + copyfiles@2.4.1: dependencies: glob: 7.2.3 minimatch: 3.1.2 @@ -5235,85 +8871,56 @@ packages: through2: 2.0.5 untildify: 4.0.0 yargs: 16.2.0 - dev: false optional: true - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.3.3 - dev: true - /cosmjs-types@0.4.1: - resolution: {integrity: sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog==} + cosmjs-types@0.4.1: dependencies: long: 4.0.0 protobufjs: 6.11.4 - dev: false - /cosmjs-types@0.5.1: - resolution: {integrity: sha512-NcC58xUIVLlKdIimWWQAmSlmCjiMrJnuHf4i3LiD8PCextfHR0fT3V5/WlXZZreyMgdmh6ML1zPUfGTbbo3Z5g==} + cosmjs-types@0.5.1: dependencies: long: 4.0.0 protobufjs: 6.11.4 - dev: false - /cosmjs-types@0.5.2: - resolution: {integrity: sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg==} + cosmjs-types@0.5.2: dependencies: long: 4.0.0 protobufjs: 6.11.4 - dev: false - /cosmjs-types@0.7.2: - resolution: {integrity: sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==} - requiresBuild: true + cosmjs-types@0.7.2: dependencies: long: 4.0.0 protobufjs: 6.11.4 - dev: false optional: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - requiresBuild: true - dev: false + crc-32@1.2.2: optional: true - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + create-hash@1.2.0: dependencies: cipher-base: 1.0.4 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 sha.js: 2.4.11 - dev: false - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + create-hmac@1.1.7: dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 @@ -5321,12 +8928,8 @@ packages: ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: false - /create-jest@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -5340,36 +8943,26 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + create-require@1.1.1: {} - /cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} + cron-parser@4.9.0: dependencies: luxon: 3.4.4 - dev: false - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-addr-codec@0.1.8: - resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} + crypto-addr-codec@0.1.8: dependencies: base-x: 3.0.9 big-integer: 1.6.36 @@ -5378,226 +8971,118 @@ packages: ripemd160-min: 0.0.6 safe-buffer: 5.2.1 sha3: 2.1.4 - dev: false - /crypto-hash@1.3.0: - resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} - engines: {node: '>=8'} - dev: false + crypto-hash@1.3.0: {} - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: false + crypto-js@4.2.0: {} - /d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} + d@1.0.2: dependencies: es5-ext: 0.10.64 type: 2.7.2 - dev: false - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false + decimal.js@10.4.3: {} - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true + dedent@1.5.1: {} - /deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - dev: false + deep-equal@1.0.1: {} - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + deepmerge@4.3.1: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: false - /delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - dev: false + delay@5.0.0: {} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false + denque@2.1.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: false + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + depd@2.0.0: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destroy@1.2.0: {} - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: false + detect-libc@1.0.3: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true + detect-newline@3.1.0: {} - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 - dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + diff@4.0.2: {} - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + difflib@0.2.4: dependencies: heap: 0.2.7 - dev: false - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false + dotenv@16.4.5: {} - /dprint-node@1.0.8: - resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} + dprint-node@1.0.8: dependencies: detect-libc: 1.0.3 - dev: false - /drbg.js@1.0.1: - resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} - engines: {node: '>=0.10'} - requiresBuild: true + drbg.js@1.0.1: dependencies: browserify-aes: 1.2.0 create-hash: 1.2.0 create-hmac: 1.1.7 - dev: false optional: true - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} + dreamopt@0.8.0: dependencies: wordwrap: 1.0.0 - dev: false - /drizzle-kit@0.20.14: - resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} - hasBin: true + drizzle-kit@0.20.14: dependencies: '@drizzle-team/studio': 0.0.39 '@esbuild-kit/esm-loader': 2.6.5 @@ -5615,89 +9100,15 @@ packages: zod: 3.22.4 transitivePeerDependencies: - supports-color - dev: false - /drizzle-orm@0.29.5(@types/pg@8.11.2)(pg@8.11.3): - resolution: {integrity: sha512-jS3+uyzTz4P0Y2CICx8FmRQ1eplURPaIMWDn/yq6k4ShRFj9V7vlJk67lSf2kyYPzQ60GkkNGXcJcwrxZ6QCRw==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/react': '>=18' - '@types/sql.js': '*' - '@vercel/postgres': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=13.2.0' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - react: '>=18' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@libsql/client': - optional: true - '@neondatabase/serverless': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/react': - optional: true - '@types/sql.js': - optional: true - '@vercel/postgres': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - react: - optional: true - sql.js: - optional: true - sqlite3: - optional: true + drizzle-orm@0.29.5(@types/pg@8.11.2)(pg@8.11.3): dependencies: '@types/pg': 8.11.2 pg: 8.11.3 - dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /eccrypto@1.1.6: - resolution: {integrity: sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==} - requiresBuild: true + eccrypto@1.1.6: dependencies: acorn: 7.1.1 elliptic: 6.5.4 @@ -5705,37 +9116,24 @@ packages: nan: 2.14.0 optionalDependencies: secp256k1: 3.7.1 - dev: false optional: true - /editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true + editorconfig@1.0.4: dependencies: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 semver: 7.6.0 - dev: false - /ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + ee-first@1.1.1: {} - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.9: dependencies: jake: 10.8.7 - dev: false - /electron-to-chromium@1.4.695: - resolution: {integrity: sha512-eMijZmeqPtm774pCZIOrfUHMs/7ls++W1sLhxwqgu8KQ8E2WmMtzwyqOMt0XXUJ3HTIPfuwlfwF+I5cwnfItBA==} - dev: true + electron-to-chromium@1.4.695: {} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -5744,10 +9142,8 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false - /elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + elliptic@6.5.5: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -5756,130 +9152,81 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true + emittery@0.13.1: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@9.2.2: {} - /enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - dev: false + enabled@2.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /enhanced-resolve@5.15.1: - resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + env-paths@3.0.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /error-polyfill@0.1.3: - resolution: {integrity: sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==} + error-polyfill@0.1.3: dependencies: capability: 0.2.5 o3: 1.0.3 u3: 0.1.1 - dev: false - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true + es-module-lexer@1.4.1: {} - /es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - requiresBuild: true + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 - dev: false - /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es6-iterator@2.0.3: dependencies: d: 1.0.2 es5-ext: 0.10.64 es6-symbol: 3.1.4 - dev: false - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + es6-promise@4.2.8: {} - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - dev: false - /es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} + es6-symbol@3.1.4: dependencies: d: 1.0.2 ext: 1.7.0 - dev: false - /es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + es6-weak-map@2.0.3: dependencies: d: 1.0.2 es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.4 - dev: false - /esbuild-register@3.5.0(esbuild@0.19.12): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' + esbuild-register@3.5.0(esbuild@0.19.12): dependencies: debug: 4.3.4 esbuild: 0.19.12 transitivePeerDependencies: - supports-color - dev: false - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 '@esbuild/android-arm64': 0.18.20 @@ -5903,13 +9250,8 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: false - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 '@esbuild/android-arm': 0.19.12 @@ -5935,87 +9277,43 @@ packages: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true + escape-string-regexp@5.0.0: {} - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -6057,68 +9355,39 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} + esniff@2.0.1: dependencies: d: 1.0.2 es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.2 - dev: false - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + etag@1.8.1: {} - /eth-crypto@2.6.0: - resolution: {integrity: sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==} - requiresBuild: true + eth-crypto@2.6.0: dependencies: '@babel/runtime': 7.20.13 '@ethereumjs/tx': 3.5.2 @@ -6130,12 +9399,9 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - requiresBuild: true + ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 '@types/secp256k1': 4.0.6 @@ -6152,20 +9418,14 @@ packages: scrypt-js: 3.0.1 secp256k1: 4.0.3 setimmediate: 1.0.5 - dev: false - /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - requiresBuild: true + ethereumjs-abi@0.6.8: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - dev: false optional: true - /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - requiresBuild: true + ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 bn.js: 4.12.0 @@ -6174,22 +9434,17 @@ packages: ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 - dev: false optional: true - /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.5 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 - dev: false - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.7.2: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -6224,11 +9479,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /ethers@6.11.1: - resolution: {integrity: sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==} - engines: {node: '>=14.0.0'} + ethers@6.11.1: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -6240,49 +9492,30 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - requiresBuild: true + ethjs-util@0.1.6: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - dev: false optional: true - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + event-emitter@0.3.5: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: false - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false + event-target-shim@5.0.1: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + eventemitter3@4.0.7: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - requiresBuild: true + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - dev: false - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -6293,27 +9526,18 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true + exit@0.1.2: {} - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 - dev: true - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@4.18.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -6349,132 +9573,80 @@ packages: transitivePeerDependencies: - supports-color - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + ext@1.7.0: dependencies: type: 2.7.2 - dev: false - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: false - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - dev: false + eyes@0.1.8: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false + fast-redact@3.3.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-safe-stringify@2.1.1: {} - /fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - dev: false + fast-stable-stringify@1.0.0: {} - /fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - dev: false + fastestsmallesttextencoderdecoder@1.0.22: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - dev: true - /fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - dev: false + fecha@4.2.3: {} - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} + figures@5.0.0: dependencies: escape-string-regexp: 5.0.0 is-unicode-supported: 1.3.0 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + file-uri-to-path@1.0.0: {} - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -6486,68 +9658,40 @@ packages: transitivePeerDependencies: - supports-color - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + find-replace@3.0.0: dependencies: array-back: 3.1.0 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - dev: false + fn.name@1.1.0: {} - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.5: {} - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + follow-redirects@1.15.6: {} + + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): - resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 @@ -6563,84 +9707,52 @@ packages: tapable: 2.2.1 typescript: 5.3.3 webpack: 5.90.1(esbuild@0.19.12) - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - /formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + formidable@2.1.2: dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 qs: 6.12.0 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + forwarded@0.2.0: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true + fs-monkey@1.0.5: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /generic-pool@3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} - engines: {node: '>= 4'} - dev: false + generic-pool@3.9.0: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -6648,50 +9760,29 @@ packages: has-symbols: 1.0.3 hasown: 2.0.1 - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-paths@0.0.7: - resolution: {integrity: sha512-0wdJt7C1XKQxuCgouqd+ZvLJ56FQixKoki9MrFaO4EriqzXOiH9gbukaDE1ou08S8Ns3/yDzoBAISNPqj6e6tA==} - engines: {node: '>=6.4'} + get-paths@0.0.7: dependencies: pify: 4.0.1 - dev: false - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.3: dependencies: resolve-pkg-maps: 1.0.0 - dev: false - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 @@ -6699,8 +9790,7 @@ packages: minipass: 7.0.4 path-scurry: 1.10.1 - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -6709,8 +9799,7 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -6719,49 +9808,32 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} + glob@9.3.5: dependencies: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: false - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -6769,170 +9841,104 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} - dev: false + google-protobuf@3.21.2: {} - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /graphql-tag@2.12.6(graphql@16.8.1): - resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-tag@2.12.6(graphql@16.8.1): dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false optional: true - /graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - requiresBuild: true - dev: false + graphql@16.8.1: optional: true - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + hanji@0.0.5: dependencies: lodash.throttle: 4.1.1 sisteransi: 1.0.5 - dev: false - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} + has-own-prop@2.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: false - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - requiresBuild: true + hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - dev: false - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: false - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} + hasown@2.0.1: dependencies: function-bind: 1.1.2 - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: false + heap@0.2.7: {} - /hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - dev: true + hexoid@1.0.0: {} - /hi-base32@0.5.1: - resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} - dev: false + hi-base32@0.5.1: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - requiresBuild: true + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: false optional: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} + http-assert@1.5.0: dependencies: deep-equal: 1.0.1 http-errors: 1.8.1 - dev: false - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: false - /http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + http-errors@1.8.1: dependencies: depd: 1.1.2 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 - dev: false - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -6940,79 +9946,47 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - requiresBuild: true - dev: false + http-status-codes@2.3.0: optional: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: false - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + ini@1.3.8: {} - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -7029,11 +10003,8 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true - /inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} - engines: {node: '>=14.18.0'} + inquirer@9.2.12: dependencies: '@ljharb/through': 2.3.12 ansi-escapes: 4.3.2 @@ -7050,15 +10021,10 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + interpret@1.4.0: {} - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} + ioredis@5.3.2: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 @@ -7071,141 +10037,78 @@ packages: standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + ipaddr.js@1.9.1: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + is-arrayish@0.3.2: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false + is-buffer@1.1.6: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.1 - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true + is-generator-fn@2.1.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - requiresBuild: true - dev: false + is-hex-prefixed@1.0.0: optional: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + is-interactive@1.0.0: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: false + is-promise@2.2.2: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + is-unicode-supported@1.3.0: {} - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: false + is-what@4.1.16: {} - /is-whitespace@0.3.0: - resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} - engines: {node: '>=0.10.0'} - dev: false + is-whitespace@0.3.0: {} - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - requiresBuild: true - dev: false + isarray@0.0.1: optional: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isomorphic-ws@4.0.1(ws@7.5.9): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' + isomorphic-ws@4.0.1(ws@7.5.9): dependencies: ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) - dev: false - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + isows@1.0.4(ws@8.17.1): + dependencies: + ws: 8.17.1 - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.24.0 '@babel/parser': 7.24.0 @@ -7214,11 +10117,8 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.2: dependencies: '@babel/core': 7.24.0 '@babel/parser': 7.24.0 @@ -7227,63 +10127,42 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} + iterare@1.2.1: {} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.8.7: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: false - /jayson@4.1.0: - resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} - engines: {node: '>=8'} - hasBin: true + jayson@4.1.0: dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 @@ -7300,20 +10179,14 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -7338,17 +10211,8 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-cli@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 @@ -7366,19 +10230,8 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /jest-config@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): dependencies: '@babel/core': 7.24.0 '@jest/test-sequencer': 29.7.0 @@ -7407,39 +10260,27 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 - dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -7447,16 +10288,10 @@ packages: '@types/node': 20.11.25 jest-mock: 29.7.0 jest-util: 29.7.0 - dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-get-type@29.6.3: {} - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -7471,29 +10306,20 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 @@ -7504,47 +10330,27 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 - dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.25 jest-util: 29.7.0 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): dependencies: jest-resolve: 29.7.0 - dev: true - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -7555,11 +10361,8 @@ packages: resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 - dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -7584,11 +10387,8 @@ packages: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -7614,11 +10414,8 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.24.0 '@babel/generator': 7.23.6 @@ -7642,11 +10439,8 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.25 @@ -7654,11 +10448,8 @@ packages: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: true - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -7666,11 +10457,8 @@ packages: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 - dev: true - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -7680,36 +10468,21 @@ packages: emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 - dev: true - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 20.11.25 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 20.11.25 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.7.0(@types/node@20.11.25)(ts-node@10.9.2): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 @@ -7720,213 +10493,125 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - dev: false + js-base64@3.7.7: {} - /js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 glob: 10.3.10 js-cookie: 3.0.5 nopt: 7.2.0 - dev: false - /js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - dev: false + js-cookie@3.0.5: {} - /js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - dev: false + js-sha256@0.9.0: {} - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-sha3@0.8.0: {} - /js-sha512@0.8.0: - resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} - dev: false + js-sha512@0.8.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jscrypto@1.0.3: - resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==} - hasBin: true - dev: false + jscrypto@1.0.3: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - dev: false - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-diff@0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true + json-diff@0.9.0: dependencies: cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 - dev: false - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + json-stringify-safe@5.0.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.2.0: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + jsonc-parser@3.2.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + jsonparse@1.3.1: {} - /jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} - requiresBuild: true - dev: false + jsonschema@1.4.1: optional: true - /keccak256@1.0.6: - resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} - requiresBuild: true + keccak256@1.0.6: dependencies: bn.js: 5.2.1 buffer: 6.0.3 keccak: 3.0.4 - dev: false optional: true - /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - requiresBuild: true + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 node-gyp-build: 4.8.0 readable-stream: 3.6.2 - dev: false - /keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 - dev: false - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - dev: false + koa-compose@4.1.0: {} - /koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} + koa-convert@2.0.0: dependencies: co: 4.6.0 koa-compose: 4.1.0 - dev: false - /koa-mount@4.0.0: - resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} - engines: {node: '>= 7.6.0'} + koa-mount@4.0.0: dependencies: debug: 4.3.4 koa-compose: 4.1.0 transitivePeerDependencies: - supports-color - dev: false - /koa-router@10.1.1: - resolution: {integrity: sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==} - engines: {node: '>= 8.0.0'} - deprecated: '**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173' + koa-router@10.1.1: dependencies: debug: 4.3.4 http-errors: 1.8.1 @@ -7935,11 +10620,8 @@ packages: path-to-regexp: 6.2.1 transitivePeerDependencies: - supports-color - dev: false - /koa-router@12.0.1: - resolution: {integrity: sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==} - engines: {node: '>= 12'} + koa-router@12.0.1: dependencies: debug: 4.3.4 http-errors: 2.0.0 @@ -7948,37 +10630,23 @@ packages: path-to-regexp: 6.2.1 transitivePeerDependencies: - supports-color - dev: false - /koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} + koa-send@5.0.1: dependencies: debug: 4.3.4 http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: - supports-color - dev: false - /koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} + koa-static@5.0.0: dependencies: debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color - dev: false - /koa-views@7.0.2(ejs@3.1.9): - resolution: {integrity: sha512-dvx3mdVeSVuIPEaKAoGbxLcenudvhl821xxyuRbcoA+bOJ2dvN8wlGjkLu0ZFMlkCscXZV6lzxy28rafeazI/w==} - deprecated: This package is deprecated, please use the new fork @ladjs/koa-views. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/koa-views for updates and release changelog - peerDependencies: - '@types/koa': ^2.13.1 - peerDependenciesMeta: - '@types/koa': - optional: true + koa-views@7.0.2(ejs@3.1.9): dependencies: consolidate: 0.16.0(ejs@3.1.9) debug: 4.3.4 @@ -8042,11 +10710,8 @@ packages: - velocityjs - walrus - whiskers - dev: false - /koa@2.15.0: - resolution: {integrity: sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + koa@2.15.0: dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 @@ -8073,110 +10738,62 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: false - /kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - dev: false + kuler@2.0.0: {} - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /libsodium-wrappers@0.7.13: - resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==} + libsodium-wrappers@0.7.13: dependencies: libsodium: 0.7.13 - dev: false - /libsodium@0.7.13: - resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==} - dev: false + libsodium@0.7.13: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /link-module-alias@1.2.0: - resolution: {integrity: sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw==} - engines: {node: '> 8.0.0'} - hasBin: true - requiresBuild: true + link-module-alias@1.2.0: dependencies: chalk: 2.4.2 - dev: false optional: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.camelcase@4.3.0: {} - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false + lodash.defaults@4.2.0: {} - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false + lodash.isarguments@3.1.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false + lodash.throttle@4.1.1: {} - /lodash.values@4.3.0: - resolution: {integrity: sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==} - requiresBuild: true - dev: false + lodash.values@4.3.0: optional: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /logform@2.6.0: - resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} - engines: {node: '>= 12.0.0'} + logform@2.6.0: dependencies: '@colors/colors': 1.6.0 '@types/triple-beam': 1.3.5 @@ -8184,114 +10801,68 @@ packages: ms: 2.1.3 safe-stable-stringify: 2.4.3 triple-beam: 1.4.1 - dev: false - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false + long@4.0.0: {} - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false + long@5.2.3: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - requiresBuild: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false optional: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@10.2.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} - dev: false + lru-cache@9.1.2: {} - /lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lru-queue@0.1.0: dependencies: es5-ext: 0.10.64 - dev: false - /luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} - engines: {node: '>=12'} - dev: false + luxon@3.4.4: {} - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.0 - dev: true - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-error@1.3.6: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - dev: true - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + map-obj@4.3.0: optional: true - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - requiresBuild: true + md5.js@1.3.5: dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: false - - /media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} - engines: {node: '>= 0.6'} - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + media-typer@0.3.0: {} + + memfs@3.5.3: dependencies: fs-monkey: 1.0.5 - dev: true - /memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + memoizee@0.4.15: dependencies: d: 1.0.2 es5-ext: 0.10.64 @@ -8301,140 +10872,79 @@ packages: lru-queue: 0.1.0 next-tick: 1.1.0 timers-ext: 0.1.7 - dev: false - /merge-descriptors@1.0.1: - resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime@1.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: false + minimalistic-crypto-utils@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} + minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.1: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true + minipass@4.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} + minipass@7.0.4: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /msgpackr-extract@3.0.2: - resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} - hasBin: true - requiresBuild: true + msgpackr-extract@3.0.2: dependencies: node-gyp-build-optional-packages: 5.0.7 optionalDependencies: @@ -8444,18 +10954,13 @@ packages: '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 - dev: false optional: true - /msgpackr@1.10.1: - resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} + msgpackr@1.10.1: optionalDependencies: msgpackr-extract: 3.0.2 - dev: false - /multer@1.4.4-lts.1: - resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} - engines: {node: '>= 6.0.0'} + multer@1.4.4-lts.1: dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -8465,44 +10970,26 @@ packages: type-is: 1.6.18 xtend: 4.0.2 - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: false + mustache@4.2.0: {} - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + mute-stream@1.0.0: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - /nan@2.14.0: - resolution: {integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==} - requiresBuild: true - dev: false + nan@2.14.0: optional: true - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} - dev: false + nan@2.19.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /near-api-js@1.1.0: - resolution: {integrity: sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg==} + near-api-js@1.1.0: dependencies: bn.js: 5.2.1 borsh: 0.7.0 @@ -8517,193 +11004,111 @@ packages: tweetnacl: 1.0.3 transitivePeerDependencies: - encoding - dev: false - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: false + next-tick@1.1.0: {} - /nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + nice-grpc-common@2.0.2: dependencies: ts-error: 1.0.6 - dev: false - /nice-grpc@2.1.7: - resolution: {integrity: sha512-pSaZk5Y3PHGAPObOSXTrANgimA6T//szxlcKOnnyttpYwO0gyOpX2WsaFK4fbGJizPVxXjwqrXpPOSHMwM2vlg==} + nice-grpc@2.1.7: dependencies: '@grpc/grpc-js': 1.10.1 abort-controller-x: 0.4.3 nice-grpc-common: 2.0.2 - dev: false - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: true + node-abort-controller@3.1.1: {} - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - requiresBuild: true - dev: false + node-addon-api@2.0.2: {} - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - requiresBuild: true - dev: false + node-addon-api@5.1.0: optional: true - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - /node-gyp-build-optional-packages@5.0.7: - resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} - hasBin: true - requiresBuild: true - dev: false + node-gyp-build-optional-packages@5.0.7: optional: true - /node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} - hasBin: true - requiresBuild: true - dev: false + node-gyp-build@4.8.0: {} - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-int64@0.4.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true + node-releases@2.0.14: {} - /noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - requiresBuild: true + noms@0.0.0: dependencies: inherits: 2.0.4 readable-stream: 1.0.34 - dev: false optional: true - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.0: dependencies: abbrev: 2.0.0 - dev: false - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /o3@1.0.3: - resolution: {integrity: sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==} + o3@1.0.3: dependencies: capability: 0.2.5 - dev: false - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + object-hash@3.0.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obuf@1.1.2: {} - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: false + on-exit-leak-free@2.1.2: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + one-time@1.0.0: dependencies: fn.name: 1.1.0 - dev: false - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - dev: false + only@0.0.2: {} - /optimism@0.18.0: - resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} - requiresBuild: true + optimism@0.18.0: dependencies: '@wry/caches': 1.0.1 '@wry/context': 0.7.4 '@wry/trie': 0.4.3 tslib: 2.6.2 - dev: false optional: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -8711,11 +11116,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -8727,166 +11129,96 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - dev: false + packet-reader@1.0.0: {} - /pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - dev: false + pako@2.1.0: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parseurl@1.3.3: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.7: {} - /path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + path-to-regexp@3.2.0: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + path-to-regexp@6.2.1: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - requiresBuild: true + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: false - /pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - requiresBuild: true - dev: false + pg-cloudflare@1.1.1: optional: true - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - dev: false + pg-connection-string@2.6.2: {} - /pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} + pg-int8@1.0.1: {} - /pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} + pg-numeric@1.0.2: {} - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} - peerDependencies: - pg: '>=8.0' + pg-pool@3.6.1(pg@8.11.3): dependencies: pg: 8.11.3 - dev: false - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + pg-protocol@1.6.0: {} - /pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 postgres-array: 2.0.0 postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 - dev: false - /pg-types@4.0.2: - resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} - engines: {node: '>=10'} + pg-types@4.0.2: dependencies: pg-int8: 1.0.1 pg-numeric: 1.0.2 @@ -8896,14 +11228,7 @@ packages: postgres-interval: 3.0.0 postgres-range: 1.1.4 - /pg@8.11.3: - resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true + pg@8.11.3: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 @@ -8914,45 +11239,27 @@ packages: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 - dev: false - /pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + pgpass@1.0.5: dependencies: split2: 4.2.0 - dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} + picomatch@3.0.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false + pify@4.0.1: {} - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 - dev: false - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false + pino-std-serializers@6.2.2: {} - /pino@8.19.0: - resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} - hasBin: true + pino@8.19.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -8965,153 +11272,84 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 3.8.0 thread-stream: 2.4.1 - dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} + pluralize@8.0.0: {} - /postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - dev: false + postgres-array@2.0.0: {} - /postgres-array@3.0.2: - resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} - engines: {node: '>=12'} + postgres-array@3.0.2: {} - /postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - dev: false + postgres-bytea@1.0.0: {} - /postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} + postgres-bytea@3.0.0: dependencies: obuf: 1.1.2 - /postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - dev: false + postgres-date@1.0.7: {} - /postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} + postgres-date@2.1.0: {} - /postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} + postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - dev: false - /postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} + postgres-interval@3.0.0: {} - /postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + postgres-range@1.1.4: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + prettier@2.8.8: {} - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.2.5: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /pretty@2.0.0: - resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} - engines: {node: '>=0.10.0'} + pretty@2.0.0: dependencies: condense-newlines: 0.2.1 extend-shallow: 2.0.1 js-beautify: 1.15.1 - dev: false - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-nextick-args@2.0.1: {} - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false + process-warning@3.0.0: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false + process@0.11.10: {} - /prom-client@14.2.0: - resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} - engines: {node: '>=10'} + prom-client@14.2.0: dependencies: tdigest: 0.1.2 - dev: false - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - requiresBuild: true + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: false optional: true - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: false + proto-list@1.2.4: {} - /protobufjs@6.11.4: - resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} - hasBin: true - requiresBuild: true + protobufjs@6.11.4: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -9126,12 +11364,8 @@ packages: '@types/long': 4.0.2 '@types/node': 20.11.25 long: 4.0.0 - dev: false - /protobufjs@7.2.6: - resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} - engines: {node: '>=12.0.0'} - requiresBuild: true + protobufjs@7.2.6: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -9145,94 +11379,64 @@ packages: '@protobufjs/utf8': 1.1.0 '@types/node': 20.11.25 long: 5.2.3 - dev: false - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + proxy-from-env@1.1.0: {} - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - dev: true + punycode@2.3.1: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + pure-rand@6.0.4: {} + + qs@6.11.0: dependencies: side-channel: 1.0.6 - /qs@6.12.0: - resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} - engines: {node: '>=0.6'} + qs@6.12.0: dependencies: side-channel: 1.0.6 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false + quick-format-unescaped@4.0.4: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + range-parser@1.2.1: {} + + raw-body@2.5.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - requiresBuild: true - dev: false + react-is@16.13.1: optional: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.2.0: {} - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - requiresBuild: true + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false optional: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9242,206 +11446,113 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /readonly-date@1.0.0: - resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} - dev: false + readonly-date@1.0.0: {} - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false + real-require@0.2.0: {} - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + rechoir@0.6.2: dependencies: resolve: 1.22.8 - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false + redis-errors@1.2.0: {} - /redis-info@3.1.0: - resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} + redis-info@3.1.0: dependencies: lodash: 4.17.21 - dev: false - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 - dev: false - /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} + reduce-flatten@2.0.0: {} - /reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + reflect-metadata@0.1.14: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - requiresBuild: true - dev: false + regenerator-runtime@0.13.11: optional: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false + regenerator-runtime@0.14.1: {} - /rehackt@0.0.6: - resolution: {integrity: sha512-l3WEzkt4ntlEc/IB3/mF6SRgNHA6zfQR7BlGOgBTOmx7IJJXojDASav+NsgXHFjHn+6RmwqsGPFgZpabWpeOdw==} - requiresBuild: true - peerDependencies: - '@types/react': '*' - react: '*' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - dev: false + rehackt@0.0.6: optional: true - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} + repeat-string@1.6.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 path-is-absolute: 1.0.1 - dev: false - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false + resolve-pkg-maps@1.0.0: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true + resolve.exports@2.0.2: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /response-iterator@0.2.6: - resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==} - engines: {node: '>=0.8'} - requiresBuild: true - dev: false + response-iterator@0.2.6: optional: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true + rimraf@4.4.1: dependencies: glob: 9.3.5 - dev: true - /ripemd160-min@0.0.6: - resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} - engines: {node: '>=8'} - dev: false + ripemd160-min@0.0.6: {} - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - requiresBuild: true + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 - dev: false - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - requiresBuild: true + rlp@2.2.7: dependencies: bn.js: 5.2.1 - dev: false - /rpc-websockets@7.9.0: - resolution: {integrity: sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==} + rpc-websockets@7.9.0: dependencies: '@babel/runtime': 7.24.0 eventemitter3: 4.0.7 @@ -9450,60 +11561,36 @@ packages: optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - dev: false + scrypt-js@3.0.1: {} - /secp256k1@3.7.1: - resolution: {integrity: sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==} - engines: {node: '>=4.0.0'} - requiresBuild: true + secp256k1@3.7.1: dependencies: bindings: 1.5.0 bip66: 1.1.5 @@ -9513,45 +11600,28 @@ packages: elliptic: 6.5.5 nan: 2.19.0 safe-buffer: 5.2.1 - dev: false optional: true - /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - requiresBuild: true + secp256k1@4.0.3: dependencies: elliptic: 6.5.5 node-addon-api: 2.0.2 node-gyp-build: 4.8.0 - dev: false - /secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} - requiresBuild: true + secp256k1@5.0.0: dependencies: elliptic: 6.5.5 node-addon-api: 5.1.0 node-gyp-build: 4.8.0 - dev: false optional: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -9569,15 +11639,11 @@ packages: transitivePeerDependencies: - supports-color - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -9586,9 +11652,7 @@ packages: transitivePeerDependencies: - supports-color - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} + set-function-length@1.2.1: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -9597,267 +11661,161 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - requiresBuild: true - dev: false + setimmediate@1.0.5: {} - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: false + setprototypeof@1.1.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + sha.js@2.4.11: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: false - /sha3@2.1.4: - resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + sha3@2.1.4: dependencies: buffer: 6.0.3 - dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - /shx@0.3.4: - resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} - engines: {node: '>=6'} - hasBin: true - requiresBuild: true + shx@0.3.4: dependencies: minimist: 1.2.8 shelljs: 0.8.5 - dev: false optional: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: false - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /snakecase-keys@5.5.0: - resolution: {integrity: sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==} - engines: {node: '>=12'} - requiresBuild: true + snakecase-keys@5.5.0: dependencies: map-obj: 4.3.0 snake-case: 3.0.4 type-fest: 3.13.1 - dev: false optional: true - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + sonic-boom@3.8.0: dependencies: atomic-sleep: 1.0.0 - dev: false - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.4: {} - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: false + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: false + stack-trace@0.0.10: {} - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - dev: true - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false + standard-as-callback@2.1.0: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: false + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /store2@2.14.3: - resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - requiresBuild: true - dev: false + store2@2.14.3: optional: true - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + streamsearch@1.1.0: {} - /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + string-format@2.0.0: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - requiresBuild: true - dev: false + string_decoder@0.10.31: optional: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - requiresBuild: true + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - dev: false optional: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} + superagent@8.1.2: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 @@ -9871,113 +11829,61 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} + superjson@2.2.1: dependencies: copy-anything: 3.0.5 - dev: false - /superstruct@0.14.2: - resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} - dev: false + superstruct@0.14.2: {} - /superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - dev: false + superstruct@0.15.5: {} - /superstruct@1.0.3: - resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} - engines: {node: '>=14.0.0'} - dev: false + superstruct@1.0.3: {} - /supertest@6.3.4: - resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} - engines: {node: '>=6.4.0'} + supertest@6.3.4: dependencies: methods: 1.1.2 superagent: 8.1.2 transitivePeerDependencies: - supports-color - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-observable@2.0.3: - resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} - engines: {node: '>=0.10'} - dev: false + symbol-observable@2.0.3: {} - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} + symbol-observable@4.0.0: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + table-layout@1.0.2: dependencies: array-back: 4.0.2 deep-extend: 0.6.0 typical: 5.2.0 wordwrapjs: 4.0.1 - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /tdigest@0.1.2: - resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + tdigest@0.1.2: dependencies: bintrees: 1.0.2 - dev: false - /terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.90.1): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.90.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 esbuild: 0.19.12 @@ -9986,23 +11892,8 @@ packages: serialize-javascript: 6.0.2 terser: 5.29.1 webpack: 5.90.1(esbuild@0.19.12) - dev: true - /terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.90.3): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.90.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 esbuild: 0.19.12 @@ -10011,196 +11902,106 @@ packages: serialize-javascript: 6.0.2 terser: 5.29.1 webpack: 5.90.3(esbuild@0.19.12) - dev: true - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.29.1: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - dev: false + text-encoding-utf-8@1.0.2: {} - /text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - dev: false + text-hex@1.0.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + thread-stream@2.4.1: dependencies: real-require: 0.2.0 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - requiresBuild: true + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false optional: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + through@2.3.8: {} - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + timers-ext@0.1.7: dependencies: es5-ext: 0.10.64 next-tick: 1.1.0 - dev: false - /tiny-secp256k1@1.1.6: - resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} - engines: {node: '>=6.0.0'} - requiresBuild: true + tiny-secp256k1@1.1.6: dependencies: bindings: 1.5.0 bn.js: 4.12.0 create-hmac: 1.1.7 elliptic: 6.5.5 nan: 2.19.0 - dev: false - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - dev: false + tmp@0.2.3: {} - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tmpl@1.0.5: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - dev: false + toml@3.0.0: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - dev: false + triple-beam@1.4.1: {} - /ts-api-utils@1.2.1(typescript@5.4.2): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.2.1(typescript@5.4.2): dependencies: typescript: 5.4.2 - dev: true - /ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true + ts-command-line-args@2.5.1: dependencies: chalk: 4.1.2 command-line-args: 5.2.1 command-line-usage: 6.1.3 string-format: 2.0.0 - /ts-error@1.0.6: - resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} - dev: false + ts-error@1.0.6: {} - /ts-essentials@7.0.3(typescript@5.4.2): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' + ts-essentials@7.0.3(typescript@5.4.2): dependencies: typescript: 5.4.2 - /ts-invariant@0.10.3: - resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} - engines: {node: '>=8'} - requiresBuild: true + ts-invariant@0.10.3: dependencies: tslib: 2.6.2 - dev: false optional: true - /ts-jest@29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.2): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.4.2): dependencies: '@babel/core': 7.24.0 bs-logger: 0.2.6 @@ -10214,14 +12015,8 @@ packages: semver: 7.6.0 typescript: 5.4.2 yargs-parser: 21.1.1 - dev: true - /ts-loader@9.5.1(typescript@5.4.2)(webpack@5.90.3): - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 + ts-loader@9.5.1(typescript@5.4.2)(webpack@5.90.3): dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.1 @@ -10230,21 +12025,8 @@ packages: source-map: 0.7.4 typescript: 5.4.2 webpack: 5.90.3(esbuild@0.19.12) - dev: true - /ts-node@10.9.2(@types/node@20.11.25)(typescript@5.4.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@types/node@20.11.25)(typescript@5.4.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -10262,114 +12044,66 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-poet@6.7.0: - resolution: {integrity: sha512-A0wvFtpkTCWPw7ftTIwbEH+L+7ul4CU0x3jXKQ+kCnmEQIAOwhpUaBmcAYKxZCxHae9/MUl4LbyTqw25BpzW5Q==} + ts-poet@6.7.0: dependencies: dprint-node: 1.0.8 - dev: false - /ts-proto-descriptors@1.15.0: - resolution: {integrity: sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==} + ts-proto-descriptors@1.15.0: dependencies: long: 5.2.3 protobufjs: 7.2.6 - dev: false - /ts-proto@1.167.9: - resolution: {integrity: sha512-zqZ15CzqvupSpoTl/fzOs5gG7SFvj1ENmWeKMgD4Yl2BSx8I5F+qgYkr9EZYMu7Ho7u+QtwzfudROo+/jwM2pg==} - hasBin: true + ts-proto@1.167.9: dependencies: case-anything: 2.1.13 protobufjs: 7.2.6 ts-poet: 6.7.0 ts-proto-descriptors: 1.15.0 - dev: false - /tsconfig-paths-webpack-plugin@4.1.0: - resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} - engines: {node: '>=10.13.0'} + tsconfig-paths-webpack-plugin@4.1.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.1 tsconfig-paths: 4.2.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: false + tslib@2.4.0: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - dev: false + tsscmp@1.0.6: {} - /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - requiresBuild: true - dev: false + tweetnacl-util@0.15.1: optional: true - /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - dev: false + tweetnacl@1.0.3: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - requiresBuild: true - dev: false + type-fest@3.13.1: optional: true - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: false + type@2.7.2: {} - /typechain@8.3.2(typescript@5.4.2): - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' + typechain@8.3.2(typescript@5.4.2): dependencies: '@types/prettier': 2.7.3 debug: 4.3.4 @@ -10385,167 +12119,105 @@ packages: transitivePeerDependencies: - supports-color - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typedarray@0.0.6: {} - /typeforce@1.18.0: - resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} - dev: false + typeforce@1.18.0: {} - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.3.3: {} - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.4.2: {} - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} + typical@4.0.0: {} - /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} + typical@5.2.0: {} - /u3@0.1.1: - resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==} - dev: false + u3@0.1.1: {} - /uid@2.0.2: - resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} - engines: {node: '>=8'} + uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + universalify@0.1.2: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unpipe@1.0.0: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + untildify@4.0.0: optional: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.0 - dev: false - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /utils-merge@1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} - engines: {node: '>= 0.4.0'} + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + uuid@9.0.1: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache-lib@3.0.1: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vlq@2.0.4: - resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} - dev: false + viem@2.15.1(typescript@5.4.2): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.4.2) + isows: 1.0.4(ws@8.17.1) + typescript: 5.4.2 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + vlq@2.0.4: {} + + walker@1.0.8: dependencies: makeerror: 1.0.12 - dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webpack-node-externals@3.0.0: - resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} - engines: {node: '>=6'} - dev: true + webpack-node-externals@3.0.0: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack@5.90.1(esbuild@0.19.12): - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.90.1(esbuild@0.19.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -10575,17 +12247,8 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /webpack@5.90.3(esbuild@0.19.12): - resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.90.3(esbuild@0.19.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -10615,39 +12278,27 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wif@2.0.6: - resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + wif@2.0.6: dependencies: bs58check: 2.1.2 - dev: false - /winston-transport@4.7.0: - resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} - engines: {node: '>= 12.0.0'} + winston-transport@4.7.0: dependencies: logform: 2.6.0 readable-stream: 3.6.2 triple-beam: 1.4.1 - dev: false - /winston@3.12.0: - resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} - engines: {node: '>= 12.0.0'} + winston@3.13.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 @@ -10660,150 +12311,74 @@ packages: stack-trace: 0.0.10 triple-beam: 1.4.1 winston-transport: 4.7.0 - dev: false - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: false + wordwrap@1.0.0: {} - /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@7.4.6: {} - /ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false - /ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false - /ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - 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 - dev: false + ws@8.17.1: {} - /xstream@11.14.0: - resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + ws@8.5.0: {} + + xstream@11.14.0: dependencies: globalthis: 1.0.3 symbol-observable: 2.0.3 - dev: false - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - requiresBuild: true - dev: false + yargs-parser@20.2.9: optional: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - requiresBuild: true + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -10812,12 +12387,9 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false optional: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -10827,34 +12399,18 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /ylru@1.3.2: - resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} - engines: {node: '>= 4.0.0'} - dev: false + ylru@1.3.2: {} - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /zen-observable-ts@1.2.5: - resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} - requiresBuild: true + zen-observable-ts@1.2.5: dependencies: zen-observable: 0.8.15 - dev: false optional: true - /zen-observable@0.8.15: - resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} - requiresBuild: true - dev: false + zen-observable@0.8.15: optional: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + zod@3.22.4: {} diff --git a/src/app.module.ts b/src/app.module.ts index cb1f8e5..ee80018 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,13 +1,13 @@ import { Module } from '@nestjs/common'; import { CollectorModule } from './collector/collector.module'; import { ConfigModule } from './config/config.module'; -import { EvaluatorModule } from './evaluator/evaluator.module'; import { GetterModule } from './getter/getter.module'; import { LoggerModule } from './logger/logger.module'; import { SubmitterModule } from './submitter/submitter.module'; import { PersisterModule } from './store/persister/persister.module'; import { StoreModule } from './store/store.module'; import { MonitorModule } from './monitor/monitor.module'; +import { PricingModule } from './pricing/pricing.module'; @Module({ imports: [ @@ -15,8 +15,8 @@ import { MonitorModule } from './monitor/monitor.module'; LoggerModule, MonitorModule, GetterModule, - EvaluatorModule, CollectorModule, + PricingModule, SubmitterModule, PersisterModule, StoreModule, diff --git a/src/collector/layer-zero/layer-zero.ts b/src/collector/layer-zero/layer-zero.ts new file mode 100644 index 0000000..084c1a2 --- /dev/null +++ b/src/collector/layer-zero/layer-zero.ts @@ -0,0 +1,240 @@ +/** + * This file initializes and manages Layer Zero workers. + * + * Inputs: + * - ConfigService: Service to fetch configuration settings. + * - MonitorService: Service to monitor and manage workers. + * - LoggerService: Service to log information and errors. + * - ChainConfig: Configuration settings for different chains. + * - CollectorModuleInterface: Interface for the collector module. + * + * Outputs: + * - Initializes and manages Layer Zero worker threads. + * - Logs status and errors related to the worker threads. + */ + +import { join } from 'path'; +import { Worker, MessagePort } from 'worker_threads'; +import { CollectorModuleInterface } from '../collector.controller'; +import { + DEFAULT_GETTER_RETRY_INTERVAL, + DEFAULT_GETTER_PROCESSING_INTERVAL, + DEFAULT_GETTER_MAX_BLOCKS, +} from '../../getter/getter.service'; +import { + LoggerService, + STATUS_LOG_INTERVAL, +} from '../../logger/logger.service'; +import { ConfigService } from '../../config/config.service'; +import { ChainConfig } from '../../config/config.types'; +import { LoggerOptions } from 'pino'; +import { MonitorService } from '../../monitor/monitor.service'; + +interface GlobalLayerZeroConfig { + retryInterval: number; + processingInterval: number; + maxBlocks: number | null; + layerZeroChainIdMap: Record; + incentivesAddresses: Record; +} + +export interface LayerZeroWorkerData { + chainId: string; + rpc: string; + resolver: string | null; + startingBlock?: number; + stoppingBlock?: number; + retryInterval: number; + processingInterval: number; + maxBlocks: number | null; + layerZeroChainId: string; + bridgeAddress: string; + incentivesAddress: string; + receiverAddress: string; + monitorPort: MessagePort; + loggerOptions: LoggerOptions; + incentivesAddresses: Record; + layerZeroChainIdMap: Record; +} + +/** + * Loads global configuration settings specific to Layer Zero. + * + * @param configService - Service to fetch configuration settings. + * @returns Global configuration settings for Layer Zero. + */ +function loadGlobalLayerZeroConfig(configService: ConfigService): GlobalLayerZeroConfig { + + const getterConfig = configService.globalConfig.getter; + const retryInterval = getterConfig.retryInterval ?? DEFAULT_GETTER_RETRY_INTERVAL; + const processingInterval = getterConfig.processingInterval ?? DEFAULT_GETTER_PROCESSING_INTERVAL; + const maxBlocks = getterConfig.maxBlocks ?? DEFAULT_GETTER_MAX_BLOCKS; + + const layerZeroChainIdMap: Record = {}; + const incentivesAddresses: Record = {}; + + for (const [chainId] of configService.chainsConfig) { + const layerZeroChainId: string | undefined = configService.getAMBConfig( + 'layer-zero', + 'layerZeroChainId', + chainId.toString(), + ); + const incentivesAddress: string | undefined = configService.getAMBConfig( + 'layer-zero', + 'incentivesAddress', + chainId.toString(), + ); + + if (layerZeroChainId !== undefined) { + layerZeroChainIdMap[layerZeroChainId] = chainId; + if (incentivesAddress !== undefined) { + incentivesAddresses[chainId] = incentivesAddress.toLowerCase(); + } + } + } + + return { + retryInterval, + processingInterval, + maxBlocks, + layerZeroChainIdMap, + incentivesAddresses, + }; +} + +/** + * Loads worker data for a specific chain configuration. + * + * @param configService - Service to fetch configuration settings. + * @param monitorService - Service to monitor and manage workers. + * @param loggerService - Service to log information and errors. + * @param chainConfig - Configuration settings for a specific chain. + * @param globalConfig - Global configuration settings for Layer Zero. + * @returns Worker data for the specific chain or null if configuration is incomplete. + */ +async function loadWorkerData( + configService: ConfigService, + monitorService: MonitorService, + loggerService: LoggerService, + chainConfig: ChainConfig, + globalConfig: GlobalLayerZeroConfig, +): Promise { + const chainId = chainConfig.chainId.toString(); + const rpc = chainConfig.rpc; + + try { + const layerZeroChainId = configService.getAMBConfig('layer-zero', 'layerZeroChainId', chainId); + const bridgeAddress = configService.getAMBConfig('layer-zero', 'bridgeAddress', chainId); + const incentivesAddress = configService.getAMBConfig('layer-zero', 'incentivesAddress', chainId); + const receiverAddress = configService.getAMBConfig('layer-zero', 'receiverAddress', chainId); + + if (layerZeroChainId == null || bridgeAddress == null || incentivesAddress == null || receiverAddress == null) { + return null; + } + + const port = await monitorService.attachToMonitor(chainId); + + return { + chainId, + rpc, + resolver: chainConfig.resolver, + startingBlock: chainConfig.startingBlock, + stoppingBlock: chainConfig.stoppingBlock, + retryInterval: chainConfig.getter.retryInterval ?? globalConfig.retryInterval, + processingInterval: chainConfig.getter.processingInterval ?? globalConfig.processingInterval, + maxBlocks: chainConfig.getter.maxBlocks ?? globalConfig.maxBlocks, + layerZeroChainId, + bridgeAddress: bridgeAddress.toLowerCase(), + incentivesAddress: incentivesAddress.toLowerCase(), + receiverAddress: receiverAddress.toLowerCase(), + monitorPort: port, + loggerOptions: loggerService.loggerOptions, + incentivesAddresses: globalConfig.incentivesAddresses, + layerZeroChainIdMap: globalConfig.layerZeroChainIdMap, + }; + } catch (error) { + loggerService.error(error, 'Failed to load Layer Zero module: missing configuration.'); + throw error; + } +} + +/** + * Main function for initializing Layer Zero workers. + * + * @param moduleInterface - Interface for the collector module. + */ +export default async (moduleInterface: CollectorModuleInterface) => { + const { configService, monitorService, loggerService } = moduleInterface; + const globalLayerZeroConfig = loadGlobalLayerZeroConfig(configService); + + const workers: Record = {}; + const workersData: LayerZeroWorkerData[] = []; + + for (const [, chainConfig] of configService.chainsConfig) { + const workerData = await loadWorkerData(configService, monitorService, loggerService, chainConfig, globalLayerZeroConfig); + if (workerData) { + workersData.push(workerData); + } + } + + if (workersData.length === 0) { + loggerService.warn('Skipping Layer Zero worker initialization: no valid Layer Zero chain configs found'); + return; + } + + initializeWorkers(workersData, workers, loggerService); + + setInterval(() => logStatus(workers, loggerService), STATUS_LOG_INTERVAL); +}; + +/** + * Initializes workers with the given data and logs errors and exit statuses. + * + * @param workersData - Array of worker data to initialize. + * @param workers - Record to keep track of active workers. + * @param loggerService - Service to log information and errors. + */ +function initializeWorkers( + workersData: LayerZeroWorkerData[], + workers: Record, + loggerService: LoggerService, +) { + for (const workerData of workersData) { + const worker = new Worker(join(__dirname, 'layer-zero.worker.js'), { + workerData: workerData, + transferList: [workerData.monitorPort], + }); + workers[workerData.chainId] = worker; + + worker.on('error', (error) => loggerService.fatal(error, 'Error on Layer Zero Worker.')); + worker.on('exit', (exitCode) => { + workers[workerData.chainId] = null; + loggerService.info({ exitCode, chainId: workerData.chainId }, `Layer Zero Worker exited.`); + }); + } +} + +/** + * Logs the status of active and inactive workers. + * + * @param workers - Record of active and inactive workers. + * @param loggerService - Service to log information. + */ +function logStatus(workers: Record, loggerService: LoggerService) { + const activeWorkers = []; + const inactiveWorkers = []; + + for (const chainId of Object.keys(workers)) { + if (workers[chainId]) { + activeWorkers.push(chainId); + } else { + inactiveWorkers.push(chainId); + } + } + + const status = { + activeWorkers, + inactiveWorkers, + }; + loggerService.info(status, 'Layer Zero collector workers status.'); +} \ No newline at end of file diff --git a/src/collector/layer-zero/layer-zero.utils.ts b/src/collector/layer-zero/layer-zero.utils.ts new file mode 100644 index 0000000..c1543c7 --- /dev/null +++ b/src/collector/layer-zero/layer-zero.utils.ts @@ -0,0 +1,56 @@ +import { keccak256 } from "ethers6"; + + +export interface LayerZeroPacket { + nonce: number; + srcEid: number; + sender: string; + dstEid: number; + receiver: string; + guid: string; + message: string; +} + +export interface LayerZeroHeader { + version: number; + nonce: number; + srcEid: number; + sender: string; + dstEid: number; + receiver: string; +} + + + +export function decodePacket(encodedPacket: string): LayerZeroPacket { + return { + nonce: Number('0x' + encodedPacket.slice(2 + 2, 2 + 2 + 16)), + srcEid: Number('0x' + encodedPacket.slice(2 + 18, 2 + 18 + 8)), + // NOTE: keep only the last 20 bytes of the 'sender' field. + sender: ('0x' + encodedPacket.slice(2 + 26 + 24, 2 + 26 + 64)).toLowerCase(), + dstEid: Number('0x' + encodedPacket.slice(2 + 90, 2 + 90 + 8)), + // NOTE: keep only the last 20 bytes of the 'receiver' field. + receiver: ('0x' + encodedPacket.slice(2 + 98 + 24, 2 + 98 + 64)).toLowerCase(), + guid: '0x' + encodedPacket.slice(2 + 162, 2 + 162 + 64), + message: '0x' + encodedPacket.slice(2 + 226), + }; +} + +export function decodeHeader(encodedHeader: string): LayerZeroHeader { + return { + version: Number('0x' + encodedHeader.slice(2, 2 + 2)), + nonce: Number('0x' + encodedHeader.slice(2 + 2, 2 + 2 + 16)), + srcEid: Number('0x' + encodedHeader.slice(2 + 18, 2 + 18 + 8)), + // NOTE: keep only the last 20 bytes of the 'sender' field. + sender: '0x' + encodedHeader.slice(2 + 26 + 24, 2 + 26 + 64).toLowerCase(), + dstEid: Number('0x' + encodedHeader.slice(2 + 90, 2 + 90 + 8)), + // NOTE: keep only the last 20 bytes of the 'receiver' field. + receiver: '0x' + encodedHeader.slice(2 + 98 + 24, 2 + 98 + 64).toLowerCase(), + } +} + + +export function calculatePayloadHash(guid: string, message: string): string { + const payload = `${guid}${message.slice(2)}`; // 'slice(2)' used to remove the '0x' from the 'message' + return keccak256(payload).toLowerCase(); +} diff --git a/src/collector/layer-zero/layer-zero.worker.ts b/src/collector/layer-zero/layer-zero.worker.ts new file mode 100644 index 0000000..f4bb50a --- /dev/null +++ b/src/collector/layer-zero/layer-zero.worker.ts @@ -0,0 +1,837 @@ +/** + * This file initializes and manages Layer Zero workers. + * + * Inputs: + * - Worker data from worker_threads. + * - Configuration settings for Layer Zero. + * - Logger service for logging information and errors. + * + * Outputs: + * - Initializes and manages Layer Zero worker threads. + * - Logs status and errors related to the worker threads. + */ + +import pino from 'pino'; +import { workerData, MessagePort } from 'worker_threads'; +import { + JsonRpcProvider, + Log, + LogDescription, + BytesLike, + keccak256, +} from 'ethers6'; +import { Store } from '../../store/store.lib'; +import { LayerZeroWorkerData } from './layer-zero'; +import { + MonitorInterface, + MonitorStatus, +} from '../../monitor/monitor.interface'; +import { ReceiveULN302__factory } from 'src/contracts/factories/ReceiveULN302__factory'; +import { wait, tryErrorToString, defaultAbiCoder, getDestinationImplementation } from 'src/common/utils'; +import { + PayloadVerifiedEvent, + ReceiveULN302, + ReceiveULN302Interface, + UlnConfigStruct, +} from 'src/contracts/ReceiveULN302'; +import { AMBMessage, AMBProof } from 'src/store/store.types'; +import { IncentivizedMessageEscrow, IncentivizedMessageEscrow__factory, LayerZeroEnpointV2__factory } from 'src/contracts'; +import { Resolver, loadResolver } from 'src/resolvers/resolver'; +import { ParsePayload } from 'src/payload/decode.payload'; +import { LayerZeroEnpointV2Interface, PacketSentEvent } from 'src/contracts/LayerZeroEnpointV2'; +import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; +import { calculatePayloadHash, decodeHeader, decodePacket } from './layer-zero.utils'; + +const ON_PACKET_SENT_PROCESSED_CHANNEL = 'packet_sent_processed'; +const ON_PACKET_SENT_PROCESSED_DELAY = 30 * 1000; +const MAX_PENDING_PAYLOAD_VERIFIED_EVENT_DURATION = 6 * 60 * 60 * 1000; + +interface LayerZeroPayloadData { + messageIdentifier: string, + payload: string, +} + +interface PayloadVerifiedEvent { + timestamp: number, + payloadHash: string, + log: Log, +} + +class LayerZeroWorker { + private readonly config: LayerZeroWorkerData; + + private readonly chainId: string; + + private readonly store: Store; + private readonly resolver: Resolver; + private readonly provider: JsonRpcProvider; + private readonly logger: pino.Logger; + + private readonly messageEscrowContract: IncentivizedMessageEscrow; + private readonly destinationImplementationCache: Record> = {}; // Map fromApplication + toChainId => destinationImplementation + + private readonly bridgeAddress: string; + private readonly receiverAddress: string; + private readonly layerZeroEnpointV2Interface: LayerZeroEnpointV2Interface; + private readonly receiveULN302Interface: ReceiveULN302Interface; + private readonly receiveULN302: ReceiveULN302; + + private readonly filterTopics: string[][]; + private readonly layerZeroChainIdMap: Record; + private readonly incentivesAddresses: Record; + + // Keep track of unprocessed PayloadVerified events caused by not having processed yet the + // corresponding PacketSent event on the source chain. This is most relevant for when + // recovering past relays. + private readonly pendingPayloadVerifiedEvents: PayloadVerifiedEvent[] = []; + + private currentStatus: MonitorStatus | null = null; + private monitor: MonitorInterface; + + private fromBlock: number = 0; + + + constructor() { + this.config = workerData as LayerZeroWorkerData; + + this.chainId = this.config.chainId; + this.store = new Store(); + this.provider = this.initializeProvider(this.config.rpc); + this.logger = this.initializeLogger(this.chainId); + this.resolver = this.loadResolver( + this.config.resolver, + this.provider, + this.logger, + ); + + this.bridgeAddress = this.config.bridgeAddress; + this.receiverAddress = this.config.receiverAddress; + this.layerZeroEnpointV2Interface = LayerZeroEnpointV2__factory.createInterface(); + this.receiveULN302Interface = ReceiveULN302__factory.createInterface(); + this.receiveULN302 = ReceiveULN302__factory.connect( + this.config.receiverAddress, + this.provider, + ); + + this.filterTopics = [[ + this.layerZeroEnpointV2Interface.getEvent('PacketSent').topicHash, + this.receiveULN302Interface.getEvent('PayloadVerified').topicHash, + ]]; + this.layerZeroChainIdMap = this.config.layerZeroChainIdMap; + this.incentivesAddresses = this.config.incentivesAddresses; + + this.messageEscrowContract = this.initializeMessageEscrowContract( + this.config.incentivesAddress, + this.provider, + ); + + this.monitor = this.startListeningToMonitor(this.config.monitorPort); + + this.initiateIntervalStatusLog(); + } + + + + // Initialization helpers + // ******************************************************************************************** + + /** + * Initializes the logger with a specific chain ID. + * + * @param chainId - The chain ID for which to initialize the logger. + * @returns A pino logger instance. + */ + private initializeLogger(chainId: string): pino.Logger { + return pino(this.config.loggerOptions).child({ + worker: 'collector-layerzero', + chain: chainId, + }); + } + + /** + * Initializes the provider with a specific RPC URL. + * + * @param rpc - The RPC URL to use for the provider. + * @returns A JsonRpcProvider instance. + */ + private initializeProvider(rpc: string): JsonRpcProvider { + return new JsonRpcProvider(rpc, undefined, { staticNetwork: true }); + } + + /** + * Loads the resolver with a specific configuration. + * + * @param resolver - The resolver configuration. + * @param provider - The provider to use for the resolver. + * @param logger - The logger to use for the resolver. + * @returns A Resolver instance. + */ + private loadResolver( + resolver: string | null, + provider: JsonRpcProvider, + logger: pino.Logger, + ): Resolver { + return loadResolver(resolver, provider, logger); + } + + private initializeMessageEscrowContract( + incentivesAddress: string, + provider: JsonRpcProvider, + ): IncentivizedMessageEscrow { + return IncentivizedMessageEscrow__factory.connect( + incentivesAddress, + provider, + ); + } + + /** + * Starts listening to the monitor. + * + * @param port - The message port for the monitor. + * @returns A MonitorInterface instance. + */ + private startListeningToMonitor(port: MessagePort): MonitorInterface { + const monitor = new MonitorInterface(port); + monitor.addListener((status: MonitorStatus) => { + this.currentStatus = status; + }); + return monitor; + } + + + + // Main handler + // ******************************************************************************************** + + /** + * Main function to run the Layer Zero worker. + */ + async run(): Promise { + this.logger.info( + { + bridgeAddress: this.config.bridgeAddress, + receiverAddress: this.config.receiverAddress, + }, + `LayerZero collector worker started.`, + ); + + await this.listenForProcessedPackets(); + + this.fromBlock = await this.getStartingBlock(); + const stopBlock = this.config.stoppingBlock ?? Infinity; + + while (true) { + try { + let toBlock = this.currentStatus?.blockNumber; + if (!toBlock || this.fromBlock > toBlock) { + await wait(this.config.processingInterval); + continue; + } + if (toBlock > stopBlock) { + toBlock = stopBlock; + } + const blocksToProcess = toBlock - this.fromBlock; + if ( + this.config.maxBlocks != null && + blocksToProcess > this.config.maxBlocks + ) { + toBlock = this.fromBlock + this.config.maxBlocks; + } + await this.queryAndProcessEvents(this.fromBlock, toBlock); + this.logger.debug( + { fromBlock: this.fromBlock, toBlock }, + `Scanning LayerZero events.`, + ); + if (toBlock >= stopBlock) { + this.logger.info( + { stopBlock: toBlock }, + `Finished processing blocks: stopBlock reached.`, + ); + break; + } + this.fromBlock = toBlock + 1; + } catch (error) { + this.logger.error(error, `Error on Layer Zero worker: processing blocks.`); + await wait(this.config.retryInterval); + } + await wait(this.config.processingInterval); + } + this.monitor.close(); + await this.store.quit(); + } + + private async getStartingBlock(): Promise { + let fromBlock: number | null = null; + while (fromBlock == null) { + + // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if + // 'startingBlock' is specified. + if (this.currentStatus == null) { + await wait(this.config.processingInterval); + continue; + } + + if (this.config.startingBlock == null) { + fromBlock = this.currentStatus.blockNumber; + break; + } + + if (this.config.startingBlock < 0) { + fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; + if (fromBlock < 0) { + throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) + } + } else { + fromBlock = this.config.startingBlock; + } + } + + return fromBlock; + } + + /** + * Queries and processes events between two blocks. + * + * @param fromBlock - The starting block number. + * @param toBlock - The ending block number. + */ + private async queryAndProcessEvents( + fromBlock: number, + toBlock: number, + ): Promise { + const logs = await this.queryLogs(fromBlock, toBlock); + for (const log of logs) { + try { + await this.handleEvent(log); + } catch (error) { + this.logger.error( + { log, error: tryErrorToString(error) }, + `Failed to process event on layer-zero collector worker.`, + ); + } + } + } + + /** + * Queries logs between two blocks. + * + * @param fromBlock - The starting block number. + * @param toBlock - The ending block number. + * @returns A list of logs. + */ + private async queryLogs(fromBlock: number, toBlock: number): Promise { + + const filter = { + address: [this.bridgeAddress, this.receiverAddress], + fromBlock, + toBlock, + topics: this.filterTopics, + }; + + let logs: Log[] | undefined; + let i = 0; + while (logs == undefined) { + try { + logs = await this.provider.getLogs(filter); + } catch (error) { + i++; + this.logger.warn( + { ...filter, error: tryErrorToString(error), try: i }, + `Failed to 'getLogs' on layer-zero worker. Worker blocked until successful query.` + ); + await wait(this.config.retryInterval); + } + } + + return logs; + } + + private async listenForProcessedPackets(): Promise { + // Listen for whenever a packet is registered. + await this.store.on( + this.getOnPacketSentChannel(), + (payloadHash: string) => { + // Add a delay to prevent this handler from being executed at the exact same time + // as the `handlePayloadVerifiedEvent()` handler, which can cause this handler to + // search for a pending PayloadVerified event before it's registered. + setTimeout( + () => void this.onProcessedPacketHandler(payloadHash), + ON_PACKET_SENT_PROCESSED_DELAY + ); + } + ) + } + + private async onProcessedPacketHandler( + payloadHash: string + ): Promise { + + this.logger.debug( + { payloadHash }, + `On PacketSent event recovery handler triggered.` + ); + + const pendingPayloadVerifiedEventIndex = this.pendingPayloadVerifiedEvents.findIndex( + (event) => event.payloadHash === payloadHash, + ); + + if (pendingPayloadVerifiedEventIndex == -1) { + return; + } + + this.logger.info( + { payloadHash }, + `Recovering PayloadVerified event.` + ); + + const [pendingEvent] = this.pendingPayloadVerifiedEvents.splice(pendingPayloadVerifiedEventIndex, 1); + + const parsedLog = this.receiveULN302Interface.parseLog(pendingEvent!.log); + + try { + await this.handlePayloadVerifiedEvent( + pendingEvent!.log, + parsedLog! // The log has been previously parsed, `parsedLog` should never be null. + ); + } + catch (error) { + this.logger.error( + { + payloadHash, + error: tryErrorToString(error), + }, + `Error on PayloadVerified event recovery.` + ); + } + } + + + + // Event handlers + // ******************************************************************************************** + + /** + * Handles events from logs. + * + * @param log - The log data. + */ + private async handleEvent(log: Log): Promise { + let parsedLog: LogDescription | null = null; + if (log.address.toLowerCase() === this.bridgeAddress) { + parsedLog = this.layerZeroEnpointV2Interface.parseLog(log); + } else if (log.address.toLowerCase() === this.receiverAddress) { + parsedLog = this.receiveULN302Interface.parseLog(log); + } + if (parsedLog == null) { + this.logger.error( + { topics: log.topics, data: log.data }, + `Failed to parse LayerZero event.`, + ); + return; + } + + switch (parsedLog.name) { + case 'PacketSent': + await this.handlePacketSentEvent(log, parsedLog); + break; + + case 'PayloadVerified': + await this.handlePayloadVerifiedEvent(log, parsedLog); + break; + + default: + this.logger.warn( + { name: parsedLog.name, topic: parsedLog.topic }, + `Event with unknown name/topic received.`, + ); + } + } + + /** + * Handles PacketSent events. + * + * @param log - The log data. + * @param parsedLog - The parsed log description. + */ + private async handlePacketSentEvent( + log: Log, + parsedLog: LogDescription, + ): Promise { + const { + encodedPayload + } = parsedLog.args as unknown as PacketSentEvent.OutputObject; + + const packet = decodePacket(encodedPayload); + const fromChainId = this.layerZeroChainIdMap[packet.srcEid]; + const toChainId = this.layerZeroChainIdMap[packet.dstEid]; + + const payloadHash = calculatePayloadHash( + packet.guid, + packet.message, + ); + + this.logger.debug( + { + transactionHash: log.transactionHash, + payloadHash, + }, + 'PacketSent event found.', + ); + + if (fromChainId === undefined || toChainId === undefined) { + this.logger.debug( + { + transactionHash: log.transactionHash, + srcEid: packet.srcEid, + dstEid: packet.dstEid, + }, + 'Skipping PacketSent event: unsupported srcEid/dstEid.', + ); + return; + } + + if (packet.sender !== this.incentivesAddresses[fromChainId]) { + this.logger.debug( + { + transactionHash: log.transactionHash, + sender: packet.sender + }, + 'Skipping PacketSent event: unsupported packet sender.', + ); + return; + } + + const decodedMessage = ParsePayload(packet.message); + if (decodedMessage === undefined) { + throw new Error('Failed to decode GeneralisedIncentives payload.'); + } + + const messageIdentifier = '0x' + decodedMessage.messageIdentifier; + + this.logger.info( + { + messageIdentifier, + transactionHash: log.transactionHash, + payloadHash, + }, + 'Collected message.', + ); + + const transactionBlockNumber = await this.resolver.getTransactionBlockNumber(log.blockNumber); + + + const channelId = defaultAbiCoder.encode( + ['uint256'], + [packet.dstEid], + ); + + const toIncentivesAddress = await getDestinationImplementation( + decodedMessage.sourceApplicationAddress, + channelId, + this.messageEscrowContract, + this.destinationImplementationCache, + this.logger, + this.config.retryInterval + ); + + const ambMessage: AMBMessage = { + messageIdentifier, + + amb: 'layer-zero', + fromChainId, + toChainId, + fromIncentivesAddress: packet.sender, + toIncentivesAddress, + + incentivesPayload: packet.message, + + transactionBlockNumber, + + blockNumber: log.blockNumber, + blockHash: log.blockHash, + transactionHash: log.transactionHash, + } + + await this.store.setAMBMessage( + this.chainId, + ambMessage, + ); + + await this.store.setAdditionalAMBData( + 'layer-zero', + payloadHash, + { + messageIdentifier, + payload: encodedPayload + }, + ); + + // Broadcast that the PacketSent event has been processed to recover any pending logic + // resulting from PayloadVerified events. + await this.store.postMessage( + this.getOnPacketSentChannel(), + payloadHash + ); + } + + /** + * Handles PayloadVerified events. + * + * ! A PayloadVerified event is emitted every time a specific packet is verified, but a single + * ! event may not be enough to indicate that the packet is valid. Thus, there may be multiple + * ! events for a single packet, which, depending at the time at which they are processed, can + * ! result in this function submitting the proof for the same packet multiple times. This + * ! undesired side effect is mitigated by the Store's `setAMBProof()` function, which will not + * ! register proofs for the same packet more than once. + * + * @param log - The log data. + * @param parsedLog - The parsed log description. + */ + private async handlePayloadVerifiedEvent( + log: Log, + parsedLog: LogDescription, + ): Promise { + const { + dvn, + header, + proofHash: payloadHash + } = parsedLog.args as unknown as PayloadVerifiedEvent.OutputObject; + + const decodedHeader = decodeHeader(header); + const fromChainId = this.layerZeroChainIdMap[decodedHeader.srcEid]; + const toChainId = this.layerZeroChainIdMap[decodedHeader.dstEid]; + + this.logger.debug( + { + transactionHash: log.transactionHash, + payloadHash, + }, + 'PayloadVerified event found.', + ); + + if (fromChainId === undefined || toChainId === undefined) { + this.logger.debug( + { + transactionHash: log.transactionHash, + srcEid: decodedHeader.srcEid, + dstEid: decodedHeader.dstEid + }, + 'Skipping PayloadVerified event: unsupported srcEid/dstEid.', + ); + return; + } + + if (decodedHeader.sender !== this.incentivesAddresses[fromChainId]) { + this.logger.debug( + { + transactionHash: log.transactionHash, + payloadHash, + sender: decodedHeader.sender + }, + 'Skipping PayloadVerified event: unsupported packet sender.', + ); + return; + } + + // Recover the encoded payload data from storage (saved on an earlier PacketSent event). + const payloadData = await this.store.getAdditionalAMBData( + 'layer-zero', + payloadHash.toLowerCase() + ); + if (!payloadData) { + this.logger.info( + { payloadHash }, + 'No payload data found for the given payloadHash. Queueing for recovery for when the payload is available.', + ); + + this.queuePendingPayloadVerifiedEvent( + payloadHash, + log, + ); + + return; + } + + const config = await this.getConfigData( + dvn, + decodedHeader.dstEid, + ); + + const isVerifiable = await this.checkIfVerifiable( + config, + keccak256(header), + payloadHash, + ); + + if (isVerifiable) { + const ambProof: AMBProof = { + messageIdentifier: payloadData.messageIdentifier, + + amb: 'layer-zero', + fromChainId, + toChainId, + + message: payloadData.payload, + messageCtx: '0x', + }; + + this.logger.info( + { + messageIdentifier: payloadData.messageIdentifier, + payloadHash, + }, + `LayerZero proof found.` + ); + + await this.store.setAMBProof( + this.layerZeroChainIdMap[decodedHeader.dstEid]!, + ambProof, + ); + } else { + this.logger.debug( + { + messageIdentifier: payloadData.messageIdentifier, + payloadHash, + }, + 'Payload has not been verified yet.' + ); + } + } + + private queuePendingPayloadVerifiedEvent( + payloadHash: string, + log: Log, + ): void { + // Prune any old pending events (note that events are stored in chronological order). + const pruneTimestamp = Date.now() - MAX_PENDING_PAYLOAD_VERIFIED_EVENT_DURATION; + + let firstNonStaleIndex; + for ( + firstNonStaleIndex = 0; + firstNonStaleIndex < this.pendingPayloadVerifiedEvents.length; + firstNonStaleIndex++ + ) { + if (this.pendingPayloadVerifiedEvents[firstNonStaleIndex]!.timestamp > pruneTimestamp) { + break; + } + } + + if (firstNonStaleIndex != 0) { + this.pendingPayloadVerifiedEvents.splice(0, firstNonStaleIndex); + } + + + // Register the pending event if not already pending, otherwise update the pending's event + // 'timestamp'. + const alreadyPendingEvent = this.pendingPayloadVerifiedEvents.find((event) => { + event.payloadHash === payloadHash + }); + + if (alreadyPendingEvent != undefined) { + alreadyPendingEvent.timestamp = Date.now(); + } + else { + this.pendingPayloadVerifiedEvents.push({ + timestamp: Date.now(), + payloadHash, + log, + }); + } + } + + + async checkIfVerifiable( + config: UlnConfigStruct, + headerHash: BytesLike, + payloadHash: BytesLike, + maxTries: number = 3, + ): Promise { + + for (let tryCount = 0; tryCount < maxTries; tryCount++) { + try { + const isVerifiable = await this.receiveULN302.verifiable( + config, + headerHash, + payloadHash, + ); + return isVerifiable; + } catch (error) { + this.logger.warn( + { + config, + headerHash, + payloadHash, + try: tryCount + 1, + }, + `Failed to check the verifiable status of the given payload. Retrying if possible.` + ); + } + + await wait(this.config.retryInterval); + } + + throw new Error(`Failed to check verifiable status of the given payload (payload hash: ${payloadHash}).`); + } + + //TODO can this be cached? + async getConfigData( + dvn: string, + dstEid: number, + maxTries: number = 3, + ): Promise { + + for (let tryCount = 0; tryCount < maxTries; tryCount++) { + try { + const config = await this.receiveULN302.getUlnConfig( + dvn, + dstEid, + ); + + return { + confirmations: config.confirmations, + requiredDVNCount: config.requiredDVNCount, + optionalDVNCount: config.optionalDVNCount, + optionalDVNThreshold: config.optionalDVNThreshold, + requiredDVNs: config.requiredDVNs.map(dvn => dvn.toString()), + optionalDVNs: config.optionalDVNs.map(dvn => dvn.toString()), + }; + } catch (error) { + this.logger.warn( + { + dvn, + dstEid, + try: tryCount + 1, + }, + `Failed to query the ULN configuration. Retrying if possible.` + ); + } + + await wait(this.config.retryInterval); + } + + throw new Error(`Failed to query the ULN configuration. (dvn: ${dvn}, destination eid: ${dstEid}).`); + } + + private getOnPacketSentChannel(): string { + return Store.getChannel('layer-zero', ON_PACKET_SENT_PROCESSED_CHANNEL); + } + + + // Misc Helpers + // ******************************************************************************************** + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + this.logger.info( + { + latestBlock: this.currentStatus?.blockNumber, + currentBlock: this.fromBlock, + }, + 'LayerZero collector status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); + } +} + +void new LayerZeroWorker().run(); \ No newline at end of file diff --git a/src/collector/mock/mock.worker.ts b/src/collector/mock/mock.worker.ts index 02bb8b5..333e7dd 100644 --- a/src/collector/mock/mock.worker.ts +++ b/src/collector/mock/mock.worker.ts @@ -3,7 +3,7 @@ import pino from 'pino'; import { convertHexToDecimal, tryErrorToString, wait } from 'src/common/utils'; import { IncentivizedMockEscrow__factory } from 'src/contracts'; import { Store } from 'src/store/store.lib'; -import { AmbMessage, AmbPayload } from 'src/store/types/store.types'; +import { AMBMessage, AMBProof } from 'src/store/store.types'; import { workerData, MessagePort } from 'worker_threads'; import { decodeMockMessage, @@ -14,6 +14,7 @@ import { MockWorkerData } from './mock'; import { IncentivizedMockEscrowInterface, MessageEvent } from 'src/contracts/IncentivizedMockEscrow'; import { MonitorInterface, MonitorStatus } from 'src/monitor/monitor.interface'; import { Resolver, loadResolver } from 'src/resolvers/resolver'; +import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; /** @@ -53,6 +54,8 @@ class MockCollectorWorker { private currentStatus: MonitorStatus | null = null; private monitor: MonitorInterface; + private fromBlock: number = 0; + constructor() { this.config = workerData as MockWorkerData; @@ -62,7 +65,7 @@ class MockCollectorWorker { // Get a connection to the redis store. // The redis store has been wrapped into a lib to make it easier to standardise // communication between the various components. - this.store = new Store(this.chainId); + this.store = new Store(); // Get an Ethers provider with which to collect the bounties information. this.provider = this.initializeProvider(this.config.rpc); @@ -87,6 +90,8 @@ class MockCollectorWorker { // Start listening to the monitor service (get the latest block data). this.monitor = this.startListeningToMonitor(this.config.monitorPort); + + this.initiateIntervalStatusLog(); } @@ -142,34 +147,14 @@ class MockCollectorWorker { ); // Get the effective starting and stopping blocks. - let fromBlock = null; - while (fromBlock == null) { - // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if - // 'startingBlock' is specified. - if (this.currentStatus != null) { - if (this.config.startingBlock != null) { - if (this.config.startingBlock < 0) { - fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; - if (fromBlock < 0) { - throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) - } - } else { - fromBlock = this.config.startingBlock; - } - } else { - fromBlock = this.currentStatus.blockNumber; - } - } - - await wait(this.config.processingInterval); - } + this.fromBlock = await this.getStartingBlock(); const stopBlock = this.config.stoppingBlock ?? Infinity; while (true) { try { let toBlock = this.currentStatus?.blockNumber; - if (!toBlock || fromBlock > toBlock) { + if (!toBlock || this.fromBlock > toBlock) { await wait(this.config.processingInterval); continue; } @@ -180,20 +165,20 @@ class MockCollectorWorker { } // Do not process more than 'maxBlocks' within a single rpc call. - const blocksToProcess = toBlock - fromBlock; + const blocksToProcess = toBlock - this.fromBlock; if (this.config.maxBlocks != null && blocksToProcess > this.config.maxBlocks) { - toBlock = fromBlock + this.config.maxBlocks; + toBlock = this.fromBlock + this.config.maxBlocks; } - this.logger.info( + this.logger.debug( { - fromBlock, + fromBlock: this.fromBlock, toBlock, }, `Scanning mock messages.`, ); - await this.queryAndProcessEvents(fromBlock, toBlock); + await this.queryAndProcessEvents(this.fromBlock, toBlock); if (toBlock >= stopBlock) { this.logger.info( @@ -203,7 +188,7 @@ class MockCollectorWorker { break; } - fromBlock = toBlock + 1; + this.fromBlock = toBlock + 1; } catch (error) { this.logger.error(error, `Error on mock.worker`); @@ -218,6 +203,35 @@ class MockCollectorWorker { await this.store.quit(); } + private async getStartingBlock(): Promise { + let fromBlock: number | null = null; + while (fromBlock == null) { + + // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if + // 'startingBlock' is specified. + if (this.currentStatus == null) { + await wait(this.config.processingInterval); + continue; + } + + if (this.config.startingBlock == null) { + fromBlock = this.currentStatus.blockNumber; + break; + } + + if (this.config.startingBlock < 0) { + fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; + if (fromBlock < 0) { + throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) + } + } else { + fromBlock = this.config.startingBlock; + } + } + + return fromBlock; + } + private async queryAndProcessEvents( fromBlock: number, toBlock: number @@ -306,25 +320,30 @@ class MockCollectorWorker { log.blockNumber ); - const amb: AmbMessage = { - ...decodedMessage, + const ambMessage: AMBMessage = { + messageIdentifier: decodedMessage.messageIdentifier, + amb: 'mock', - sourceEscrow: this.config.incentivesAddress, - blockNumber: log.blockNumber, + fromChainId: decodedMessage.sourceChain, + toChainId: decodedMessage.destinationChain, + fromIncentivesAddress: this.config.incentivesAddress, + toIncentivesAddress: messageEvent.recipient, + + incentivesPayload: decodedMessage.payload, + transactionBlockNumber, + + blockNumber: log.blockNumber, blockHash: log.blockHash, transactionHash: log.transactionHash } // Set the collect message on-chain. This is not the proof but the raw message. // It can be used by plugins to facilitate other jobs. - await this.store.setAmb(amb, log.transactionHash); - - // Set destination address for the bounty. - await this.store.registerDestinationAddress({ - messageIdentifier: amb.messageIdentifier, - destinationAddress: messageEvent.recipient, - }); + await this.store.setAMBMessage( + this.chainId, + ambMessage + ); // Encode and sign the message for delivery. // This is the proof which enables us to submit the transaciton later. @@ -334,27 +353,48 @@ class MockCollectorWorker { const signature = this.signingKey.sign(keccak256(encodedMessage)); const executionContext = encodeSignature(signature); - const destinationChainId = convertHexToDecimal(amb.destinationChain); + const destinationChainId = convertHexToDecimal(ambMessage.toChainId); // Construct the payload. - const ambPayload: AmbPayload = { - messageIdentifier: amb.messageIdentifier, + const ambPayload: AMBProof = { + messageIdentifier: ambMessage.messageIdentifier, + amb: 'mock', - destinationChainId, + fromChainId: this.chainId, + toChainId: destinationChainId, + message: encodedMessage, messageCtx: executionContext, // If the generalised incentives implementation does not use the context set it to "0x". }; this.logger.info( { - messageIdentifier: amb.messageIdentifier, + messageIdentifier: ambMessage.messageIdentifier, destinationChainId: destinationChainId, }, `Mock message found.`, ); // Submit the proofs to any listeners. If there is a submitter, it will process the proof and submit it. - await this.store.submitProof(destinationChainId, ambPayload); + await this.store.setAMBProof(destinationChainId, ambPayload); + } + + + + // Misc Helpers + // ******************************************************************************************** + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + this.logger.info( + { + latestBlock: this.currentStatus?.blockNumber, + currentBlock: this.fromBlock, + }, + 'Mock collector status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); } } diff --git a/src/collector/polymer/polymer.worker.ts b/src/collector/polymer/polymer.worker.ts index 391a82d..428c7e7 100644 --- a/src/collector/polymer/polymer.worker.ts +++ b/src/collector/polymer/polymer.worker.ts @@ -2,13 +2,14 @@ import pino from 'pino'; import { tryErrorToString, wait } from 'src/common/utils'; import { IbcEventEmitter__factory } from 'src/contracts'; import { Store } from 'src/store/store.lib'; -import { AmbMessage } from 'src/store/types/store.types'; +import { AMBMessage } from 'src/store/store.types'; import { workerData, MessagePort } from 'worker_threads'; import { PolymerWorkerData } from './polymer'; import { AbiCoder, JsonRpcProvider, Log, LogDescription, zeroPadValue } from 'ethers6'; import { IbcEventEmitterInterface, SendPacketEvent } from 'src/contracts/IbcEventEmitter'; import { MonitorInterface, MonitorStatus } from 'src/monitor/monitor.interface'; import { Resolver, loadResolver } from 'src/resolvers/resolver'; +import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; const abi = AbiCoder.defaultAbiCoder(); @@ -31,13 +32,15 @@ class PolymerCollectorSnifferWorker { private currentStatus: MonitorStatus | null = null; private monitor: MonitorInterface; + private fromBlock: number = 0; + constructor() { this.config = workerData as PolymerWorkerData; this.chainId = this.config.chainId; - this.store = new Store(this.chainId); + this.store = new Store(); this.provider = this.initializeProvider(this.config.rpc); this.logger = this.initializeLogger(this.chainId); this.resolver = this.loadResolver( @@ -51,10 +54,13 @@ class PolymerCollectorSnifferWorker { this.polymerAddress = this.config.polymerAddress; this.ibcEventEmitterInterface = IbcEventEmitter__factory.createInterface(); this.filterTopics = [ - [this.ibcEventEmitterInterface.getEvent('SendPacket').topicHash, zeroPadValue(this.incentivesAddress, 32)] + [this.ibcEventEmitterInterface.getEvent('SendPacket').topicHash], + [zeroPadValue(this.incentivesAddress, 32)] ]; this.monitor = this.startListeningToMonitor(this.config.monitorPort); + + this.initiateIntervalStatusLog(); } @@ -105,33 +111,14 @@ class PolymerCollectorSnifferWorker { `Polymer collector sniffer worker started.`, ); - let fromBlock = null; - while (fromBlock == null) { - // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if - // 'startingBlock' is specified. - if (this.currentStatus != null) { - if (this.config.startingBlock != null) { - if (this.config.startingBlock < 0) { - fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; - if (fromBlock < 0) { - throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) - } - } else { - fromBlock = this.config.startingBlock; - } - } else { - fromBlock = this.currentStatus.blockNumber; - } - } - await wait(this.config.processingInterval); - } + this.fromBlock = await this.getStartingBlock(); const stopBlock = this.config.stoppingBlock ?? Infinity; while (true) { try { let toBlock = this.currentStatus?.blockNumber; - if (!toBlock || fromBlock > toBlock) { + if (!toBlock || this.fromBlock > toBlock) { await wait(this.config.processingInterval); continue; } @@ -140,20 +127,20 @@ class PolymerCollectorSnifferWorker { toBlock = stopBlock; } - const blocksToProcess = toBlock - fromBlock; + const blocksToProcess = toBlock - this.fromBlock; if (this.config.maxBlocks != null && blocksToProcess > this.config.maxBlocks) { - toBlock = fromBlock + this.config.maxBlocks; + toBlock = this.fromBlock + this.config.maxBlocks; } - this.logger.info( + this.logger.debug( { - fromBlock, + fromBlock: this.fromBlock, toBlock, }, `Scanning polymer messages.`, ); - await this.queryAndProcessEvents(fromBlock, toBlock); + await this.queryAndProcessEvents(this.fromBlock, toBlock); if (toBlock >= stopBlock) { this.logger.info( @@ -163,7 +150,7 @@ class PolymerCollectorSnifferWorker { break; } - fromBlock = toBlock + 1; + this.fromBlock = toBlock + 1; } catch (error) { this.logger.error(error, `Error on polymer.worker`); @@ -178,6 +165,35 @@ class PolymerCollectorSnifferWorker { await this.store.quit(); } + private async getStartingBlock(): Promise { + let fromBlock: number | null = null; + while (fromBlock == null) { + + // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if + // 'startingBlock' is specified. + if (this.currentStatus == null) { + await wait(this.config.processingInterval); + continue; + } + + if (this.config.startingBlock == null) { + fromBlock = this.currentStatus.blockNumber; + break; + } + + if (this.config.startingBlock < 0) { + fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; + if (fromBlock < 0) { + throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) + } + } else { + fromBlock = this.config.startingBlock; + } + } + + return fromBlock; + } + private async queryAndProcessEvents( fromBlock: number, toBlock: number @@ -279,32 +295,54 @@ class PolymerCollectorSnifferWorker { log.blockNumber ); - const amb: AmbMessage = { + const ambMessage: AMBMessage = { messageIdentifier, + amb: 'polymer', - sourceChain: this.chainId, - destinationChain, - sourceEscrow: event.sourcePortAddress, - payload: packet, - blockNumber: log.blockNumber, + fromChainId: this.chainId, + toChainId: destinationChain, + fromIncentivesAddress: event.sourcePortAddress, + + incentivesPayload: packet, + transactionBlockNumber, + + blockNumber: log.blockNumber, blockHash: log.blockHash, transactionHash: log.transactionHash - }; + } // Set the collect message on-chain. This is not the proof but the raw message. // It can be used by plugins to facilitate other jobs. - await this.store.setAmb(amb, log.transactionHash); + await this.store.setAMBMessage(this.chainId, ambMessage); this.logger.info( { - messageIdentifier: amb.messageIdentifier, + messageIdentifier, destinationChainId: destinationChain, }, `Polymer message found.`, ); } + + + // Misc Helpers + // ******************************************************************************************** + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + this.logger.info( + { + latestBlock: this.currentStatus?.blockNumber, + currentBlock: this.fromBlock, + }, + 'Polymer collector status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); + } + } void new PolymerCollectorSnifferWorker().run(); diff --git a/src/collector/wormhole/winston-pino-logger-transport.ts b/src/collector/wormhole/winston-pino-logger-transport.ts new file mode 100644 index 0000000..b3aa130 --- /dev/null +++ b/src/collector/wormhole/winston-pino-logger-transport.ts @@ -0,0 +1,37 @@ + +import pino from 'pino'; +import Transport from 'winston-transport'; + +// Custom transport to emit the logs generated within a 'winston' logger to a 'pino' logger. +export class PinoLoggerTransport extends Transport { + constructor(private readonly logger: pino.Logger) { + super({}); + } + + override log(info: any, callback: () => any) { + + const reportedLevel = info['level']; + + const logObject: Record = {}; + for (const property of Object.getOwnPropertyNames(info)) { + if (property == 'level') { + continue; + } + logObject[property] = info[property]; + } + + // Try to emit the log using the 'level' reported by the Winston logger. On failure default + // to 'info'. + try { + this.logger[reportedLevel as pino.Level](logObject) + } catch { + this.logger.info({ + unsupportedLogLevel: reportedLevel, + ...logObject, + }); + } + + callback(); + } + +} diff --git a/src/collector/wormhole/wormhole-engine.worker.ts b/src/collector/wormhole/wormhole-engine.worker.ts index b8e8cdd..5f44645 100644 --- a/src/collector/wormhole/wormhole-engine.worker.ts +++ b/src/collector/wormhole/wormhole-engine.worker.ts @@ -8,15 +8,16 @@ import { decodeWormholeMessage } from 'src/collector/wormhole/wormhole.utils'; import { add0X } from 'src/common/utils'; import { workerData } from 'worker_threads'; import { Store } from 'src/store/store.lib'; -import { AmbPayload } from 'src/store/types/store.types'; +import { AMBProof } from 'src/store/store.types'; import pino, { LoggerOptions } from 'pino'; import { - WormholeChainConfig, WormholeChainId, WormholeRelayerEngineWorkerData, } from './wormhole.types'; import { fetchVAAs } from './api-utils'; import { Redis } from 'ioredis'; +import winston from 'winston'; +import { PinoLoggerTransport } from './winston-pino-logger-transport'; // NOTE: the Wormhole relayer engine is only able of scanning new VAAs. For old VAA recovery // the 'wormhole-recovery' worker is used. @@ -33,13 +34,13 @@ class WormholeEngineWorker { private readonly config: WormholeRelayerEngineWorkerData; private readonly logger: pino.Logger; - private readonly stores: Map; + private readonly store: Store; constructor() { this.config = workerData as WormholeRelayerEngineWorkerData; this.logger = this.initializeLogger(this.config.loggerOptions); - this.stores = this.loadStores(this.config.wormholeChainConfigs); + this.store = new Store(); } // Initialization helpers @@ -51,15 +52,18 @@ class WormholeEngineWorker { }); } - private loadStores( - wormholeChainConfig: Map, - ): Map { - const stores: Map = new Map(); - for (const [chainId, wormholeConfig] of wormholeChainConfig) { - stores.set(wormholeConfig.wormholeChainId, new Store(chainId)); - } - - return stores; + private getCustomWormholeEngineLogger(): winston.Logger { + return winston.createLogger({ + transports: [ + new PinoLoggerTransport(this.logger) + ], + format: winston.format.combine( + winston.format.splat(), + winston.format.errors({ stack: true }), + winston.format.label({ label: 'wormhole-engine-package' }), + winston.format.json(), + ), + }); } private async loadWormholeRelayerEngine(): Promise> { @@ -91,6 +95,7 @@ class WormholeEngineWorker { }, spyEndpoint: `${this.config.spyHost ?? DEFAULT_SPY_HOST}:${this.config.spyPort}`, concurrency, + logger: this.getCustomWormholeEngineLogger() }); return app; @@ -189,6 +194,20 @@ class WormholeEngineWorker { add0X(vaa.payload.toString('hex')), ); + const sourceChainId = this.config.wormholeChainIdMap.get( + vaa.emitterChain, + ); + if (sourceChainId == undefined) { + this.logger.warn( + { + vaa, + sourceWormholeChainId: vaa.emitterChain, + }, + `Failed to process VAA: source chain id given Wormhole chain id not found.`, + ); + return; + } + const destinationChainId = this.config.wormholeChainIdMap.get( wormholeInfo.destinationWormholeChainId, ); @@ -204,10 +223,13 @@ class WormholeEngineWorker { return; } - const ambPayload: AmbPayload = { + const ambProof: AMBProof = { messageIdentifier: wormholeInfo.messageIdentifier, + amb: 'wormhole', - destinationChainId, + fromChainId: sourceChainId, + toChainId: destinationChainId, + message: add0X(vaa.bytes.toString('hex')), messageCtx: '0x', }; @@ -217,17 +239,7 @@ class WormholeEngineWorker { `Wormhole VAA found.`, ); - const store = this.stores.get(vaa.emitterChain); - if (store != undefined) { - await store.submitProof(destinationChainId, ambPayload); - } else { - this.logger.warn( - { - wormholeVAAEmitterChain: vaa.emitterChain, - }, - `No 'Store' found for the Wormhole VAA emitter chain id.`, - ); - } + await this.store.setAMBProof(destinationChainId, ambProof); } } diff --git a/src/collector/wormhole/wormhole-message-sniffer.worker.ts b/src/collector/wormhole/wormhole-message-sniffer.worker.ts index b6e405a..41ea4ad 100644 --- a/src/collector/wormhole/wormhole-message-sniffer.worker.ts +++ b/src/collector/wormhole/wormhole-message-sniffer.worker.ts @@ -8,15 +8,15 @@ import { } from 'src/contracts'; import { Store } from 'src/store/store.lib'; import { workerData, MessagePort } from 'worker_threads'; -import { tryErrorToString, wait } from '../../common/utils'; +import { defaultAbiCoder, getDestinationImplementation, tryErrorToString, wait } from '../../common/utils'; import { decodeWormholeMessage } from './wormhole.utils'; import { ParsePayload } from 'src/payload/decode.payload'; import { WormholeMessageSnifferWorkerData } from './wormhole.types'; -import { AbiCoder, JsonRpcProvider } from 'ethers6'; +import { JsonRpcProvider } from 'ethers6'; import { MonitorInterface, MonitorStatus } from 'src/monitor/monitor.interface'; import { Resolver, loadResolver } from 'src/resolvers/resolver'; - -const defaultAbiCoder = AbiCoder.defaultAbiCoder(); +import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; +import { AMBMessage } from 'src/store/store.types'; class WormholeMessageSnifferWorker { private readonly store: Store; @@ -33,16 +33,20 @@ class WormholeMessageSnifferWorker { private readonly resolver: Resolver; + private readonly destinationImplementationCache: Record> = {}; // Map fromApplication + toChainId => destinationImplementation + private currentStatus: MonitorStatus | null = null; private monitor: MonitorInterface; + private fromBlock: number = 0; + constructor() { this.config = workerData as WormholeMessageSnifferWorkerData; this.chainId = this.config.chainId; - this.store = new Store(this.chainId); + this.store = new Store(); this.logger = this.initializeLogger( this.chainId, this.config.loggerOptions, @@ -65,6 +69,8 @@ class WormholeMessageSnifferWorker { ); this.monitor = this.startListeningToMonitor(this.config.monitorPort); + + this.initiateIntervalStatusLog(); } // Initialization helpers @@ -127,32 +133,12 @@ class WormholeMessageSnifferWorker { `Wormhole worker started.`, ); - let fromBlock = null; - while (fromBlock == null) { - // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if - // 'startingBlock' is specified. - if (this.currentStatus != null) { - if (this.config.startingBlock != null) { - if (this.config.startingBlock < 0) { - fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; - if (fromBlock < 0) { - throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) - } - } else { - fromBlock = this.config.startingBlock; - } - } else { - fromBlock = this.currentStatus.blockNumber; - } - } - - await wait(this.config.processingInterval); - } + this.fromBlock = await this.getStartingBlock(); const stopBlock = this.config.stoppingBlock ?? Infinity; while (true) { let toBlock = this.currentStatus?.blockNumber; - if (!toBlock || fromBlock > toBlock) { + if (!toBlock || this.fromBlock > toBlock) { await wait(this.config.processingInterval); continue; } @@ -161,23 +147,23 @@ class WormholeMessageSnifferWorker { toBlock = stopBlock; } - const blocksToProcess = toBlock - fromBlock; + const blocksToProcess = toBlock - this.fromBlock; if ( this.config.maxBlocks != null && blocksToProcess > this.config.maxBlocks ) { - toBlock = fromBlock + this.config.maxBlocks; + toBlock = this.fromBlock + this.config.maxBlocks; } - this.logger.info( + this.logger.debug( { - fromBlock, + fromBlock: this.fromBlock, toBlock, }, `Scanning wormhole messages.`, ); - const logs = await this.queryLogs(fromBlock, toBlock); + const logs = await this.queryLogs(this.fromBlock, toBlock); for (const log of logs) { try { @@ -198,7 +184,7 @@ class WormholeMessageSnifferWorker { break; } - fromBlock = toBlock + 1; + this.fromBlock = toBlock + 1; await wait(this.config.processingInterval); } @@ -208,6 +194,35 @@ class WormholeMessageSnifferWorker { await this.store.quit(); } + private async getStartingBlock(): Promise { + let fromBlock: number | null = null; + while (fromBlock == null) { + + // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if + // 'startingBlock' is specified. + if (this.currentStatus == null) { + await wait(this.config.processingInterval); + continue; + } + + if (this.config.startingBlock == null) { + fromBlock = this.currentStatus.blockNumber; + break; + } + + if (this.config.startingBlock < 0) { + fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; + if (fromBlock < 0) { + throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) + } + } else { + fromBlock = this.config.startingBlock; + } + } + + return fromBlock; + } + private async queryLogs( fromBlock: number, toBlock: number, @@ -267,23 +282,6 @@ class WormholeMessageSnifferWorker { log.blockNumber ); - await this.store.setAmb( - { - messageIdentifier: decodedWormholeMessage.messageIdentifier, - amb: 'wormhole', - sourceChain: this.chainId, - destinationChain, - sourceEscrow: log.args.sender, - payload: decodedWormholeMessage.payload, - recoveryContext: log.args.sequence.toString(), - blockNumber: log.blockNumber, - transactionBlockNumber, - blockHash: log.blockHash, - transactionHash: log.transactionHash, - }, - log.transactionHash, - ); - // Decode payload const decodedPayload = ParsePayload(decodedWormholeMessage.payload); if (decodedPayload === undefined) { @@ -291,16 +289,61 @@ class WormholeMessageSnifferWorker { return; } - // Set destination address for the bounty. - await this.store.registerDestinationAddress({ + const channelId = defaultAbiCoder.encode( + ['uint256'], + [destinationWormholeChainId], + ); + + const toIncentivesAddress = await getDestinationImplementation( + decodedPayload.sourceApplicationAddress, + channelId, + this.messageEscrowContract, + this.destinationImplementationCache, + this.logger, + this.config.retryInterval + ); + + const ambMessage: AMBMessage = { messageIdentifier: decodedWormholeMessage.messageIdentifier, - //TODO the following contract call could fail - destinationAddress: - await this.messageEscrowContract.implementationAddress( - decodedPayload?.sourceApplicationAddress, - defaultAbiCoder.encode(['uint256'], [destinationChain]), - ), - }); + + amb: 'wormhole', + fromChainId: this.chainId, + toChainId: destinationChain, + fromIncentivesAddress: log.args.sender, + toIncentivesAddress, + + incentivesPayload: decodedWormholeMessage.payload, + recoveryContext: log.args.sequence.toString(), + + transactionBlockNumber, + + blockNumber: log.blockNumber, + blockHash: log.blockHash, + transactionHash: log.transactionHash, + }; + + await this.store.setAMBMessage( + this.chainId, + ambMessage, + ); + } + + + + // Misc Helpers + // ******************************************************************************************** + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + this.logger.info( + { + latestBlock: this.currentStatus?.blockNumber, + currentBlock: this.fromBlock, + }, + 'Wormhole message sniffer status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); } } diff --git a/src/collector/wormhole/wormhole-recovery.worker.ts b/src/collector/wormhole/wormhole-recovery.worker.ts index 8dff720..6afcf58 100644 --- a/src/collector/wormhole/wormhole-recovery.worker.ts +++ b/src/collector/wormhole/wormhole-recovery.worker.ts @@ -6,19 +6,22 @@ import { parseVaaWithBytes, } from '@wormhole-foundation/relayer-engine'; import { decodeWormholeMessage } from './wormhole.utils'; -import { add0X } from 'src/common/utils'; -import { AmbPayload } from 'src/store/types/store.types'; +import { add0X, defaultAbiCoder, getDestinationImplementation, tryErrorToString, wait } from 'src/common/utils'; +import { AMBMessage, AMBProof } from 'src/store/store.types'; import { ParsePayload } from 'src/payload/decode.payload'; import { IncentivizedMessageEscrow, IncentivizedMessageEscrow__factory, } from 'src/contracts'; import { WormholeRecoveryWorkerData } from './wormhole.types'; -import { AbiCoder, JsonRpcProvider } from 'ethers6'; +import { JsonRpcProvider } from 'ethers6'; import { fetchVAAs } from './api-utils'; +import { Resolver, loadResolver } from 'src/resolvers/resolver'; -const defaultAbiCoder = AbiCoder.defaultAbiCoder(); - +interface RecoveredVAAData { + vaa: ParsedVaaWithBytes, + transactionHash: string, +} class WormholeRecoveryWorker { private readonly store: Store; @@ -32,17 +35,26 @@ class WormholeRecoveryWorker { private readonly messageEscrowContract: IncentivizedMessageEscrow; + private readonly resolver: Resolver; + + private readonly destinationImplementationCache: Record> = {}; // Map fromApplication + toChainId => destinationImplementation + constructor() { this.config = workerData as WormholeRecoveryWorkerData; this.chainId = this.config.chainId; - this.store = new Store(this.chainId); + this.store = new Store(); this.logger = this.initializeLogger( this.chainId, this.config.loggerOptions, ); this.provider = this.initializeProvider(this.config.rpc); + this.resolver = this.loadResolver( + this.config.resolver, + this.provider, + this.logger + ); this.messageEscrowContract = this.initializeMessageEscrow( this.config.incentivesAddress, this.provider, @@ -66,6 +78,14 @@ class WormholeRecoveryWorker { return new JsonRpcProvider(rpc, undefined, { staticNetwork: true }); } + private loadResolver( + resolver: string | null, + provider: JsonRpcProvider, + logger: pino.Logger + ): Resolver { + return loadResolver(resolver, provider, logger); + } + private initializeMessageEscrow( incentivesAddress: string, provider: JsonRpcProvider, @@ -92,7 +112,7 @@ class WormholeRecoveryWorker { this.config.stoppingBlock, ); - const vaas = await this.recoverVAAs( + const recoveredVAAs = await this.recoverVAAs( timestamps.startingTimestamp, timestamps.stoppingTimestamp, this.config.wormholeChainId, @@ -101,27 +121,29 @@ class WormholeRecoveryWorker { ); // Store VAAs oldest to newest - for (const [, parsedVAA] of Array.from(vaas).reverse()) { + for (const [, data] of Array.from(recoveredVAAs).reverse()) { try { - await this.processVAA(parsedVAA); + await this.processVAA(data); } catch (error) { this.logger.warn( - { emitterAddress: parsedVAA.emitterAddress, error }, + { emitterAddress: data.vaa.emitterAddress, error }, 'Failed to process recovered VAA', ); } } } - private async processVAA(vaa: ParsedVaaWithBytes): Promise { - await this.processVAAMessage(vaa); - await this.processVAAProof(vaa); + private async processVAA(recoveredVAAData: RecoveredVAAData): Promise { + await this.processVAAMessage(recoveredVAAData); + await this.processVAAProof(recoveredVAAData); } - private async processVAAMessage(vaa: ParsedVaaWithBytes): Promise { + private async processVAAMessage(recoveredVAAData: RecoveredVAAData): Promise { // The following effectively runs the same logic as the 'wormhole.service.ts' worker. When // recovering VAAs, both this and the 'wormhole.service.ts' are executed to prevent VAAs from // being missed in some edge cases (when recovering right before the latest blocks). + const vaa = recoveredVAAData.vaa; + const decodedWormholeMessage = decodeWormholeMessage( vaa.payload.toString('hex'), ); @@ -150,58 +172,96 @@ class WormholeRecoveryWorker { // Emitter address is a 32 bytes buffer: convert to hex string and keep the last 20 bytes const sender = '0x' + vaa.emitterAddress.toString('hex').slice(24); - await this.store.setAmb( - { - messageIdentifier: decodedWormholeMessage.messageIdentifier, - amb: 'wormhole', - sourceChain, - destinationChain, //TODO this should be the chainId and not the wormholeChainId - sourceEscrow: sender, - payload: decodedWormholeMessage.payload, - recoveryContext: vaa.sequence.toString(), - }, - vaa.hash.toString('hex'), - ); - // Decode payload const decodedPayload = ParsePayload(decodedWormholeMessage.payload); if (decodedPayload === undefined) { throw new Error('Could not decode VAA payload.'); } - // Set destination address for the bounty. - await this.store.registerDestinationAddress({ + const channelId = defaultAbiCoder.encode( + ['uint256'], + [decodedWormholeMessage.destinationWormholeChainId], + ); + + const toIncentivesAddress = await getDestinationImplementation( + decodedPayload.sourceApplicationAddress, + channelId, + this.messageEscrowContract, + this.destinationImplementationCache, + this.logger, + this.config.retryInterval + ); + + const transactionHash = recoveredVAAData.transactionHash; + const transactionBlockMetadata = await this.queryTransactionBlockMetadata(transactionHash); + + if (transactionBlockMetadata == null) { + throw new Error( + `Failed to recover wormhole VAA: transaction receipt not found for the given hash (${transactionHash}).` + ); + } + + const transactionBlockNumber = await this.resolver.getTransactionBlockNumber( + transactionBlockMetadata.blockNumber + ); + + const ambMessage: AMBMessage = { messageIdentifier: decodedWormholeMessage.messageIdentifier, - destinationAddress: - //TODO the following contract call could fail - await this.messageEscrowContract.implementationAddress( - decodedPayload?.sourceApplicationAddress, - defaultAbiCoder.encode( - ['uint256'], - [decodedWormholeMessage.destinationWormholeChainId], - ), - ), - }); + + amb: 'wormhole', + fromChainId: sourceChain, + toChainId: destinationChain, + fromIncentivesAddress: sender, + toIncentivesAddress, + + incentivesPayload: decodedWormholeMessage.payload, + recoveryContext: vaa.sequence.toString(), + + transactionBlockNumber, + + transactionHash, + blockHash: transactionBlockMetadata.blockHash, + blockNumber: transactionBlockMetadata.blockNumber, + }; + + await this.store.setAMBMessage( + this.chainId, + ambMessage, + ); } - private async processVAAProof(vaa: ParsedVaaWithBytes): Promise { + private async processVAAProof(recoveredVAAData: RecoveredVAAData): Promise { + const vaa = recoveredVAAData.vaa; + const wormholeInfo = decodeWormholeMessage( add0X(vaa.payload.toString('hex')), ); + const sourceChain = this.config.wormholeChainIdMap.get( + vaa.emitterChain, + ); + if (sourceChain == undefined) { + throw new Error( + `Source chain id not found for the given wormhole chain id (${vaa.emitterChain})` + ) + } + const destinationChain = this.config.wormholeChainIdMap.get( wormholeInfo.destinationWormholeChainId, ); if (destinationChain == undefined) { throw new Error( - `Destination chain id not found for the given wormhole chain id (${vaa.emitterChain}`, + `Destination chain id not found for the given wormhole chain id (${wormholeInfo.destinationWormholeChainId}`, ); } - const ambPayload: AmbPayload = { + const ambPayload: AMBProof = { messageIdentifier: wormholeInfo.messageIdentifier, + amb: 'wormhole', - destinationChainId: destinationChain, + fromChainId: sourceChain, + toChainId: destinationChain, + message: add0X(vaa.bytes.toString('hex')), messageCtx: '0x', }; @@ -210,7 +270,7 @@ class WormholeRecoveryWorker { `Wormhole VAA found.`, ); - await this.store.submitProof(destinationChain, ambPayload); + await this.store.setAMBProof(destinationChain, ambPayload); } private async getTimestampsFromBlockNumbers( @@ -259,8 +319,8 @@ class WormholeRecoveryWorker { emitterAddress: string, pageSize = 1000, searchDelay = 1000, - ): Promise> { - const foundVAAs = new Map(); + ): Promise> { + const foundVAAs = new Map(); let pageIndex = 0; while (true) { @@ -288,7 +348,14 @@ class WormholeRecoveryWorker { const parsedVaa = parseVaaWithBytes(Buffer.from(vaa.vaa, 'base64')); - foundVAAs.set(vaa.sequence, parsedVaa); // Use 'Map' to avoid duplicates + // Use 'Map' to avoid duplicates + foundVAAs.set( + vaa.sequence, + { + vaa: parsedVaa, + transactionHash: '0x' + vaa.txHash, + } + ); } if (searchComplete) break; @@ -301,6 +368,50 @@ class WormholeRecoveryWorker { return foundVAAs; } + private async queryTransactionBlockMetadata( + transactionHash: string, + maxTries: number = 3, + ): Promise<{ + blockHash: string, + blockNumber: number, + } | undefined> { + + for (let tryCount = 0; tryCount < maxTries; tryCount++) { + try { + const transactionReceipt = await this.provider.getTransactionReceipt(transactionHash); + if (transactionReceipt != undefined) { + return { + blockHash: transactionReceipt.blockHash, + blockNumber: transactionReceipt.blockNumber, + }; + } + + throw new Error('Transaction receipt is null.'); + } + catch (error) { + this.logger.warn( + { + transactionHash, + try: tryCount + 1, + error: tryErrorToString(error), + }, + `Failed to query transaction receipt. Will retry if possible.` + ); + } + + await wait(this.config.retryInterval); + } + + this.logger.warn( + { + transactionHash + }, + `Failed to query transaction receipt.` + ); + + return undefined; + } + } void new WormholeRecoveryWorker().run(); diff --git a/src/common/utils.ts b/src/common/utils.ts index f5a138d..8927b3b 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -1,3 +1,8 @@ +import { AbiCoder, ethers } from "ethers6"; +import pino from "pino"; +import { IncentivizedMessageEscrow } from "src/contracts"; + +export const defaultAbiCoder = AbiCoder.defaultAbiCoder(); export const wait = (ms: number) => new Promise((res) => setTimeout(res, ms)); @@ -22,4 +27,95 @@ export const tryErrorToString = (error: any): string | undefined => { } catch { return 'Unable to stringify error.'; } -} \ No newline at end of file +} + + +export async function getDestinationImplementation( + fromApplication: string, + channelId: string, + escrowContract: IncentivizedMessageEscrow, + cache: Record> = {}, // Map fromApplication + channelId => destinationImplementation + logger: pino.Logger, + retryInterval: number = 1000, + maxTries: number = 3, +): Promise { + + const cachedImplementation = cache[fromApplication]?.[channelId]; + + if (cachedImplementation != undefined) { + return cachedImplementation; + } + + const destinationImplementation = await queryDestinationImplementation( + fromApplication, + channelId, + escrowContract, + logger, + retryInterval, + maxTries, + ); + + // Set the destination implementation cache + if (destinationImplementation != undefined) { + if (cache[fromApplication] == undefined) { + cache[fromApplication] = {}; + } + + cache[fromApplication]![channelId] = destinationImplementation; + } + + return destinationImplementation; +} + +export async function queryDestinationImplementation( + fromApplication: string, + channelId: string, + escrowContract: IncentivizedMessageEscrow, + logger: pino.Logger, + retryInterval: number = 1000, + maxTries: number = 3, +): Promise { + + for (let tryCount = 0; tryCount < maxTries; tryCount++) { + try { + const destinationImplementation = await escrowContract.implementationAddress( + fromApplication, + channelId, + ); + + logger.debug( + { + fromApplication, + channelId, + destinationImplementation, + }, + `Destination implementation queried.` + ); + + return '0x' + destinationImplementation.slice(26); // Keep only the last 20-bytes (discard the first '0x' + 12 null bytes) + } + catch (error) { + logger.warn( + { + fromApplication, + channelId, + try: tryCount + 1, + error: tryErrorToString(error), + }, + `Error on the destination implementation query. Retrying if possible.` + ); + } + + await wait(retryInterval); + } + + logger.error( + { + fromApplication, + channelId, + }, + `Failed to query the destination implementation.` + ); + + return undefined; +} diff --git a/src/config/config.schema.ts b/src/config/config.schema.ts index e180aa1..6d7bc94 100644 --- a/src/config/config.schema.ts +++ b/src/config/config.schema.ts @@ -78,6 +78,8 @@ const GLOBAL_SCHEMA = { monitor: { $ref: "monitor-schema" }, getter: { $ref: "getter-schema" }, + pricing: { $ref: "pricing-schema" }, + evaluator: { $ref: "evaluator-schema" }, submitter: { $ref: "submitter-schema" }, persister: { $ref: "persister-schema" }, wallet: { $ref: "wallet-schema" }, @@ -114,6 +116,7 @@ const MONITOR_SCHEMA = { maximum: 120_000, // 2 minutes }, blockDelay: { $ref: "positive-number-schema" }, + noBlockUpdateWarningInterval: { $ref: "positive-number-schema"}, }, additionalProperties: false } @@ -133,6 +136,37 @@ const GETTER_SCHEMA = { additionalProperties: false } +export const PRICING_SCHEMA = { + $id: "pricing-schema", + type: "object", + properties: { + provider: { $ref: "non-empty-string-schema" }, + coinDecimals: { $ref: "positive-non-zero-integer-schema" }, + pricingDenomination: { $ref: "non-empty-string-schema" }, + cacheDuration: { $ref: "positive-number-schema" }, + retryInterval: { $ref: "positive-number-schema" }, + maxTries: { $ref: "positive-non-zero-integer-schema" }, + }, + additionalProperties: true // Allow for provider-specific configurations +} + +const EVALUATOR_SCHEMA = { + $id: "evaluator-schema", + type: "object", + properties: { + unrewardedDeliveryGas: { $ref: "gas-field-schema" }, + verificationDeliveryGas: { $ref: "gas-field-schema" }, + minDeliveryReward: { $ref: "positive-number-schema" }, + relativeMinDeliveryReward: { $ref: "positive-number-schema" }, + unrewardedAckGas: { $ref: "gas-field-schema" }, + verificationAckGas: { $ref: "gas-field-schema" }, + minAckReward: { $ref: "positive-number-schema" }, + relativeMinAckReward: { $ref: "positive-number-schema" }, + profitabilityFactor: { $ref: "positive-number-schema" }, + }, + additionalProperties: false +} + const SUBMITTER_SCHEMA = { $id: "submitter-schema", type: "object", @@ -146,14 +180,8 @@ const SUBMITTER_SCHEMA = { maxTries: { $ref: "positive-number-schema" }, maxPendingTransactions: { $ref: "positive-number-schema" }, - gasLimitBuffer: { - type: "object", - patternProperties: { - default: { $ref: "positive-number-schema" }, - ["^[a-zA-Z0-9_-]+$"]: { $ref: "positive-number-schema" }, - }, - additionalProperties: false - }, + evaluationRetryInterval: { $ref: "positive-number-schema" }, + maxEvaluationDuration: { $ref: "positive-number-schema" }, }, additionalProperties: false } @@ -214,7 +242,8 @@ const AMBS_SCHEMA = { enabled: { type: "boolean" }, - incentivesAddress: { $ref: "address-field-schema" } + incentivesAddress: { $ref: "address-field-schema" }, + packetCost: { $ref: "gas-field-schema" } }, required: ["name"], additionalProperties: true, @@ -238,6 +267,8 @@ const CHAINS_SCHEMA = { monitor: { $ref: "monitor-schema" }, getter: { $ref: "getter-schema" }, + pricing: { $ref: "pricing-schema" }, + evaluator: { $ref: "evaluator-schema" }, submitter: { $ref: "submitter-schema" }, wallet: { $ref: "wallet-schema" }, }, @@ -262,6 +293,8 @@ export function getConfigValidator(): AnyValidateFunction { ajv.addSchema(PRIVATE_KEY_SCHEMA); ajv.addSchema(MONITOR_SCHEMA); ajv.addSchema(GETTER_SCHEMA); + ajv.addSchema(PRICING_SCHEMA); + ajv.addSchema(EVALUATOR_SCHEMA); ajv.addSchema(SUBMITTER_SCHEMA); ajv.addSchema(PERSISTER_SCHEMA); ajv.addSchema(WALLET_SCHEMA); diff --git a/src/config/config.service.ts b/src/config/config.service.ts index dfa4f0a..df86a9b 100644 --- a/src/config/config.service.ts +++ b/src/config/config.service.ts @@ -2,8 +2,9 @@ import { Injectable } from '@nestjs/common'; import { readFileSync } from 'fs'; import * as yaml from 'js-yaml'; import dotenv from 'dotenv'; -import { getConfigValidator } from './config.schema'; -import { GlobalConfig, ChainConfig, AMBConfig, GetterGlobalConfig, SubmitterGlobalConfig, PersisterConfig, WalletGlobalConfig, GetterConfig, SubmitterConfig, WalletConfig, MonitorConfig, MonitorGlobalConfig } from './config.types'; +import { PRICING_SCHEMA, getConfigValidator } from './config.schema'; +import { GlobalConfig, ChainConfig, AMBConfig, GetterGlobalConfig, SubmitterGlobalConfig, PersisterConfig, WalletGlobalConfig, GetterConfig, SubmitterConfig, WalletConfig, MonitorConfig, MonitorGlobalConfig, PricingGlobalConfig, EvaluatorGlobalConfig, PricingConfig, EvaluatorConfig } from './config.types'; +import { JsonRpcProvider } from 'ethers6'; import { loadPrivateKeyLoader } from './privateKeyLoaders/privateKeyLoader'; @Injectable() @@ -16,6 +17,8 @@ export class ConfigService { readonly chainsConfig: Map; readonly ambsConfig: Map; + readonly isReady: Promise; + constructor() { this.nodeEnv = this.loadNodeEnv(); @@ -25,6 +28,16 @@ export class ConfigService { this.globalConfig = this.loadGlobalConfig(); this.chainsConfig = this.loadChainsConfig(); this.ambsConfig = this.loadAMBsConfig(); + + this.isReady = this.initialize(); + } + + + // NOTE: The OnModuleInit hook is not being used as it does not guarantee the order in which it + // is executed across services (i.e. there is no guarantee that the config service will be the + // first to initialize). The `isReady` promise must be awaited on Relayer initialization. + private async initialize(): Promise { + await this.validateChains(this.chainsConfig); } private loadNodeEnv(): string { @@ -103,6 +116,8 @@ export class ConfigService { logLevel: rawGlobalConfig.logLevel, monitor: this.formatMonitorGlobalConfig(rawGlobalConfig.monitor), getter: this.formatGetterGlobalConfig(rawGlobalConfig.getter), + pricing: this.formatPricingGlobalConfig(rawGlobalConfig.pricing), + evaluator: this.formatEvaluatorGlobalConfig(rawGlobalConfig.evaluator), submitter: this.formatSubmitterGlobalConfig(rawGlobalConfig.submitter), persister: this.formatPersisterGlobalConfig(rawGlobalConfig.persister), wallet: this.formatWalletGlobalConfig(rawGlobalConfig.wallet), @@ -123,6 +138,8 @@ export class ConfigService { stoppingBlock: rawChainConfig.stoppingBlock, monitor: this.formatMonitorConfig(rawChainConfig.monitor), getter: this.formatGetterConfig(rawChainConfig.getter), + pricing: this.formatPricingConfig(rawChainConfig.pricing), + evaluator: this.formatEvaluatorConfig(rawChainConfig.evaluator), submitter: this.formatSubmitterConfig(rawChainConfig.submitter), wallet: this.formatWalletConfig(rawChainConfig.wallet), }); @@ -168,6 +185,34 @@ export class ConfigService { return this.ambsConfig.get(amb)?.globalProperties[key]; } + private async validateChains(chainsConfig: Map): Promise { + const validateChainIdFromRPC = async (rpc: string, expectedChainId: string): Promise => { + const provider = new JsonRpcProvider(rpc, undefined, { staticNetwork: true }); + try { + const network = await provider.getNetwork(); + const actualChainId = network.chainId.toString(); + return actualChainId === expectedChainId; + } catch (error) { + return false; + } + }; + + const validationPromises = []; + + for (const [chainId, config] of chainsConfig) { + const validationPromise = async () => { + const chainIdValidate = await validateChainIdFromRPC(config.rpc, chainId); + if (!chainIdValidate) { + throw new Error(`Error validating the Chain ID for chain ${chainId}`); + } + }; + validationPromises.push(validationPromise()); + } + + await Promise.all(validationPromises); + } + + // Formatting helpers // ******************************************************************************************** @@ -180,6 +225,43 @@ export class ConfigService { return { ...rawConfig } as GetterGlobalConfig; } + private formatPricingGlobalConfig(rawConfig: any): PricingGlobalConfig { + const commonKeys = Object.keys(PRICING_SCHEMA.properties); + + const formattedConfig: Record = {}; + formattedConfig['providerSpecificConfig'] = {} + + // Any configuration keys that do not form part of the 'PRICING_SCHEMA' definition are + // assumed to be provider-specific configuration options. + for (const [key, value] of Object.entries(rawConfig ?? {})) { + if (commonKeys.includes(key)) { + formattedConfig[key] = value; + } + else { + formattedConfig['providerSpecificConfig'][key] = value; + } + } + + return formattedConfig as PricingGlobalConfig; + } + + private formatEvaluatorGlobalConfig(rawConfig: any): EvaluatorGlobalConfig { + const config = { ...rawConfig }; + if (config.unrewardedDeliveryGas != undefined) { + config.unrewardedDeliveryGas = BigInt(config.unrewardedDeliveryGas); + } + if (config.verificationDeliveryGas != undefined) { + config.verificationDeliveryGas = BigInt(config.verificationDeliveryGas); + } + if (config.unrewardedAckGas != undefined) { + config.unrewardedAckGas = BigInt(config.unrewardedAckGas); + } + if (config.verificationAckGas != undefined) { + config.verificationAckGas = BigInt(config.verificationAckGas); + } + return config as EvaluatorGlobalConfig; + } + private formatSubmitterGlobalConfig(rawConfig: any): SubmitterGlobalConfig { return { ...rawConfig } as SubmitterGlobalConfig; } @@ -214,6 +296,14 @@ export class ConfigService { return this.formatGetterGlobalConfig(rawConfig); } + private formatPricingConfig(rawConfig: any): PricingConfig { + return this.formatPricingGlobalConfig(rawConfig); + } + + private formatEvaluatorConfig(rawConfig: any): EvaluatorConfig { + return this.formatEvaluatorGlobalConfig(rawConfig); + } + private formatSubmitterConfig(rawConfig: any): SubmitterConfig { return this.formatSubmitterGlobalConfig(rawConfig); } diff --git a/src/config/config.types.ts b/src/config/config.types.ts index 04d3231..b7f79db 100644 --- a/src/config/config.types.ts +++ b/src/config/config.types.ts @@ -4,6 +4,8 @@ export interface GlobalConfig { logLevel?: string; monitor: MonitorGlobalConfig; getter: GetterGlobalConfig; + pricing: PricingGlobalConfig; + evaluator: EvaluatorGlobalConfig; submitter: SubmitterGlobalConfig; persister: PersisterConfig; wallet: WalletGlobalConfig; @@ -16,6 +18,7 @@ export type PrivateKeyConfig = string | { export interface MonitorGlobalConfig { interval?: number; blockDelay?: number; + noBlockUpdateWarningInterval?: number; } export interface MonitorConfig extends MonitorGlobalConfig {} @@ -28,6 +31,32 @@ export interface GetterGlobalConfig { export interface GetterConfig extends GetterGlobalConfig {} +export interface PricingGlobalConfig { + provider?: string; + coinDecimals?: number; + pricingDenomination?: string; + cacheDuration?: number; + retryInterval?: number; + maxTries?: number; + providerSpecificConfig: Record; +}; + +export interface PricingConfig extends PricingGlobalConfig {} + +export interface EvaluatorGlobalConfig { + unrewardedDeliveryGas?: bigint; + verificationDeliveryGas?: bigint; + minDeliveryReward?: number; + relativeMinDeliveryReward?: number; + unrewardedAckGas?: bigint; + verificationAckGas?: bigint; + minAckReward?: number; + relativeMinAckReward?: number; + profitabilityFactor?: number; +} + +export interface EvaluatorConfig extends EvaluatorGlobalConfig {} + export interface SubmitterGlobalConfig { enabled?: boolean; newOrdersDelay?: number; @@ -36,7 +65,8 @@ export interface SubmitterGlobalConfig { maxTries?: number; maxPendingTransactions?: number; - gasLimitBuffer?: Record & { default?: number }; + evaluationRetryInterval?: number; + maxEvaluationDuration?: number; } export interface SubmitterConfig extends SubmitterGlobalConfig {} @@ -82,6 +112,8 @@ export interface ChainConfig { stoppingBlock?: number; monitor: MonitorConfig; getter: GetterConfig; + pricing: PricingConfig; + evaluator: EvaluatorConfig; submitter: SubmitterConfig; wallet: WalletConfig; } diff --git a/src/evaluator/evaluator.controller.ts b/src/evaluator/evaluator.controller.ts new file mode 100644 index 0000000..dcc8253 --- /dev/null +++ b/src/evaluator/evaluator.controller.ts @@ -0,0 +1,113 @@ +import { BadRequestException, Controller, Get, OnModuleInit, Query } from "@nestjs/common"; +import { EvaluatorInterface } from "./evaluator.interface"; +import { EvaluatorService } from "./evaluator.service"; +import { EvaluateAckQuery, EvaluateAckQueryResponse, EvaluateDeliveryQuery, EvaluteDeliveryQueryResponse } from "./evaluator.types"; + +@Controller() +export class EvaluatorController implements OnModuleInit { + private evaluator!: EvaluatorInterface; + + constructor( + private readonly evaluatorService: EvaluatorService, + ) {} + + async onModuleInit() { + await this.initializeEvaluatorInterface(); + } + + private async initializeEvaluatorInterface(): Promise { + const port = await this.evaluatorService.attachToEvaluator(); + this.evaluator = new EvaluatorInterface(port); + } + + @Get('evaluateDelivery') + async evaluateDelivery(@Query() query: EvaluateDeliveryQuery): Promise { + + //TODO validate query format + const result = await this.evaluator.evaluateDelivery( + query.chainId, + query.messageIdentifier, + { + gasEstimate: BigInt(query.gasEstimate), + observedGasEstimate: BigInt(query.observedGasEstimate), + additionalFeeEstimate: BigInt(query.additionalFeeEstimate), + }, + BigInt(query.value) + ); + + if (result.evaluation == undefined) { + throw new BadRequestException('Failed to generate an evaluation output for the given parameters.'); + } + + const response: EvaluteDeliveryQueryResponse = { + chainId: result.chainId, + messageIdentifier: result.messageIdentifier, + maxGasDelivery: result.evaluation.maxGasDelivery.toString(), + maxGasAck: result.evaluation.maxGasAck.toString(), + gasEstimate: result.evaluation.gasEstimate.toString(), + observedGasEstimate: result.evaluation.observedGasEstimate.toString(), + additionalFeeEstimate: result.evaluation.additionalFeeEstimate.toString(), + destinationGasPrice: result.evaluation.destinationGasPrice.toString(), + value: result.evaluation.value.toString(), + sourceGasPrice: result.evaluation.sourceGasPrice.toString(), + deliveryCost: result.evaluation.deliveryCost.toString(), + deliveryReward: result.evaluation.deliveryReward.toString(), + maxAckLoss: result.evaluation.maxAckLoss.toString(), + deliveryFiatCost: result.evaluation.deliveryFiatCost, + deliveryFiatReward: result.evaluation.deliveryFiatReward, + securedDeliveryFiatReward: result.evaluation.securedDeliveryFiatReward, + profitabilityFactor: result.evaluation.profitabilityFactor, + securedDeliveryFiatProfit: result.evaluation.securedDeliveryFiatProfit, + securedDeliveryRelativeProfit: result.evaluation.securedDeliveryRelativeProfit, + minDeliveryReward: result.evaluation.minDeliveryReward, + relativeMinDeliveryReward: result.evaluation.relativeMinDeliveryReward, + relayDelivery: result.evaluation.relayDelivery, + } + + return response; + } + + @Get('evaluateAck') + async evaluateAck(@Query() query: EvaluateAckQuery): Promise { + + //TODO validate query format + const result = await this.evaluator.evaluateAck( + query.chainId, + query.messageIdentifier, + { + gasEstimate: BigInt(query.gasEstimate), + observedGasEstimate: BigInt(query.observedGasEstimate), + additionalFeeEstimate: BigInt(query.additionalFeeEstimate), + }, + BigInt(query.value) + ); + + if (result.evaluation == undefined) { + throw new BadRequestException('Failed to generate an evaluation output for the given parameters.'); + } + + const response: EvaluateAckQueryResponse = { + chainId: result.chainId, + messageIdentifier: result.messageIdentifier, + maxGasDelivery: result.evaluation.maxGasDelivery.toString(), + maxGasAck: result.evaluation.maxGasAck.toString(), + gasEstimate: result.evaluation.gasEstimate.toString(), + observedGasEstimate: result.evaluation.observedGasEstimate.toString(), + additionalFeeEstimate: result.evaluation.additionalFeeEstimate.toString(), + sourceGasPrice: result.evaluation.sourceGasPrice.toString(), + ackCost: result.evaluation.ackCost.toString(), + ackReward: result.evaluation.ackReward.toString(), + profitabilityFactor: result.evaluation.profitabilityFactor, + ackFiatProfit: result.evaluation.ackFiatProfit, + ackRelativeProfit: result.evaluation.ackRelativeProfit, + minAckReward: result.evaluation.minAckReward, + relativeMinAckReward: result.evaluation.relativeMinAckReward, + deliveryCost: result.evaluation.deliveryCost.toString(), + deliveryReward: result.evaluation.deliveryReward.toString(), + relayAckForDeliveryBounty: result.evaluation.relayAckForDeliveryBounty, + relayAck: result.evaluation.relayAck, + } + + return response; + } +} diff --git a/src/evaluator/evaluator.interface.ts b/src/evaluator/evaluator.interface.ts new file mode 100644 index 0000000..daa14f3 --- /dev/null +++ b/src/evaluator/evaluator.interface.ts @@ -0,0 +1,74 @@ +import { GasEstimateComponents } from "src/resolvers/resolver"; +import { MessagePort } from "worker_threads"; +import { EvaluateAckMessage, EvaluateAckResponseMessage, EvaluateDeliveryMessage, EvaluateDeliveryResponseMessage, EvaluatorMessage, EvaluatorMessageType, EvaluatorPortData } from "./evaluator.types"; + + +export class EvaluatorInterface { + private portMessageId = 0; + + constructor(private readonly port: MessagePort) {} + + private getNextPortMessageId(): number { + return this.portMessageId++; + } + + private async submitMessage(message: EvaluatorMessage): Promise { + + const messageId = this.getNextPortMessageId(); + + const data: EvaluatorPortData = { + messageId, + message + }; + + const resultPromise = new Promise(resolve => { + const listener = (responseData: EvaluatorPortData) => { + if (responseData.messageId === messageId) { + this.port.off("message", listener); + resolve(responseData.message) + } + } + this.port.on("message", listener); + + this.port.postMessage(data); + }); + + return resultPromise; + } + + async evaluateDelivery( + chainId: string, + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint, + ): Promise { + + const message: EvaluateDeliveryMessage = { + type: EvaluatorMessageType.EvaluateDelivery, + chainId, + messageIdentifier, + gasEstimateComponents, + value + }; + + return this.submitMessage(message); + } + + async evaluateAck( + chainId: string, + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint, + ): Promise { + + const message: EvaluateAckMessage = { + type: EvaluatorMessageType.EvaluateAck, + chainId, + messageIdentifier, + gasEstimateComponents, + value + }; + + return this.submitMessage(message); + } +} diff --git a/src/evaluator/evaluator.module.ts b/src/evaluator/evaluator.module.ts index 8276e02..1f10d24 100644 --- a/src/evaluator/evaluator.module.ts +++ b/src/evaluator/evaluator.module.ts @@ -1,8 +1,14 @@ -import { Module } from '@nestjs/common'; +import { Global, Module } from '@nestjs/common'; +import { PricingModule } from './../pricing/pricing.module'; +import { WalletModule } from 'src/wallet/wallet.module'; import { EvaluatorService } from './evaluator.service'; +import { EvaluatorController } from './evaluator.controller'; +@Global() @Module({ + controllers: [EvaluatorController], providers: [EvaluatorService], exports: [EvaluatorService], + imports: [PricingModule, WalletModule], }) export class EvaluatorModule {} diff --git a/src/evaluator/evaluator.service.ts b/src/evaluator/evaluator.service.ts index 9aa5e58..918f2a2 100644 --- a/src/evaluator/evaluator.service.ts +++ b/src/evaluator/evaluator.service.ts @@ -1,25 +1,174 @@ -import { Injectable } from '@nestjs/common'; -import { Bounty } from 'src/store/types/store.types'; -import { LoggerService } from 'src/logger/logger.service'; +import { Global, Injectable, OnModuleInit } from "@nestjs/common"; +import { join } from "path"; +import { Worker, MessagePort } from 'worker_threads'; +import { tryErrorToString } from "src/common/utils"; +import { ConfigService } from "src/config/config.service"; +import { LoggerService, STATUS_LOG_INTERVAL } from "src/logger/logger.service"; +import { EvaluatorGetPortResponse, EvaluatorGetPortMessage, EvaluationConfig, EvaluatorWorkerData, EVALUATOR_DEFAULT_MIN_ACK_REWARD, EVALUATOR_DEFAULT_MIN_DELIVERY_REWARD, EVALUATOR_DEFAULT_PROFITABILITY_FACTOR, EVALUATOR_DEFAULT_RELATIVE_MIN_ACK_REWARD, EVALUATOR_DEFAULT_RELATIVE_MIN_DELIVERY_REWARD, EVALUATOR_DEFAULT_UNREWARDED_ACK_GAS, EVALUATOR_DEFAULT_UNREWARDED_DELIVERY_GAS, EVALUATOR_DEFAULT_VERIFICATION_ACK_GAS, EVALUATOR_DEFAULT_VERIFICATION_DELIVERY_GAS } from "./evaluator.types"; +import { PricingService } from "src/pricing/pricing.service"; +import { WalletService } from "src/wallet/wallet.service"; + +@Global() @Injectable() -export class EvaluatorService { - constructor(private readonly logger: LoggerService) {} +export class EvaluatorService implements OnModuleInit { + private worker: Worker | null = null; + private requestPortMessageId = 0; + + private setReady!: () => void; + readonly isReady: Promise; + + constructor( + private readonly configService: ConfigService, + private readonly pricingService: PricingService, + private readonly walletService: WalletService, + private readonly loggerService: LoggerService, + ) { + this.isReady = this.initializeIsReady(); + } + + async onModuleInit() { + this.loggerService.info(`Starting Evaluator worker...`); + + await this.initializeWorker(); + + this.initiateIntervalStatusLog(); + + this.setReady(); + } + + private initializeIsReady(): Promise { + return new Promise((resolve) => { + this.setReady = resolve; + }); + } - /** - * Evaluates bounties to gauge their profitability - * @param bounty - * @param chain - * @param address - * @returns The bounty mutation with the evaluation parameters - */ - async evaluateBounty(bounty: Bounty, _address: string): Promise { - this.logger.info( - `Checking gas price for bounty ${bounty.messageIdentifier}`, - ); + private async initializeWorker(): Promise { + const workerData = await this.loadWorkerConfig(); + + this.worker = new Worker(join(__dirname, 'evaluator.worker.js'), { + workerData, + transferList: [ + workerData.pricingPort, + workerData.walletPort + ] + }); - //TODO implement evaluating currently it's just being forwarded + this.worker.on('error', (error) => { + this.loggerService.fatal( + { error: tryErrorToString(error) }, + `Error on evaluator worker.`, + ); + }); - return bounty; + this.worker.on('exit', (exitCode) => { + this.worker = null; + this.loggerService.fatal( + { exitCode }, + `Evaluator worker exited.`, + ); + }); } + + private async loadWorkerConfig(): Promise { + const globalEvaluatorConfig = this.configService.globalConfig.evaluator; + + const evaluationConfigs: Record = {}; + + for (const [chainId, chainConfig] of this.configService.chainsConfig) { + const chainEvaluatorConfig = chainConfig.evaluator; + + const chainEvaluationConfig: EvaluationConfig = { + + unrewardedDeliveryGas: chainEvaluatorConfig.unrewardedDeliveryGas + ?? globalEvaluatorConfig.unrewardedDeliveryGas + ?? EVALUATOR_DEFAULT_UNREWARDED_DELIVERY_GAS, + + verificationDeliveryGas: chainEvaluatorConfig.verificationDeliveryGas + ?? globalEvaluatorConfig.verificationDeliveryGas + ?? EVALUATOR_DEFAULT_VERIFICATION_DELIVERY_GAS, + + minDeliveryReward: chainEvaluatorConfig.minDeliveryReward + ?? globalEvaluatorConfig.minDeliveryReward + ?? EVALUATOR_DEFAULT_MIN_DELIVERY_REWARD, + + relativeMinDeliveryReward: chainEvaluatorConfig.relativeMinDeliveryReward + ?? globalEvaluatorConfig.relativeMinDeliveryReward + ?? EVALUATOR_DEFAULT_RELATIVE_MIN_DELIVERY_REWARD, + + unrewardedAckGas: chainEvaluatorConfig.unrewardedAckGas + ?? globalEvaluatorConfig.unrewardedAckGas + ?? EVALUATOR_DEFAULT_UNREWARDED_ACK_GAS, + + verificationAckGas: chainEvaluatorConfig.verificationAckGas + ?? globalEvaluatorConfig.verificationAckGas + ?? EVALUATOR_DEFAULT_VERIFICATION_ACK_GAS, + + minAckReward: chainEvaluatorConfig.minAckReward + ?? globalEvaluatorConfig.minAckReward + ?? EVALUATOR_DEFAULT_MIN_ACK_REWARD, + + relativeMinAckReward: chainEvaluatorConfig.relativeMinAckReward + ?? globalEvaluatorConfig.relativeMinAckReward + ?? EVALUATOR_DEFAULT_RELATIVE_MIN_ACK_REWARD, + + profitabilityFactor: chainEvaluatorConfig.profitabilityFactor + ?? globalEvaluatorConfig.profitabilityFactor + ?? EVALUATOR_DEFAULT_PROFITABILITY_FACTOR, + + } + + evaluationConfigs[chainId] = chainEvaluationConfig; + } + + return { + evaluationConfigs, + pricingPort: await this.pricingService.attachToPricing(), + walletPort: await this.walletService.attachToWallet(), + loggerOptions: this.loggerService.loggerOptions + } + } + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + const isActive = this.worker != null; + this.loggerService.info( + { isActive }, + 'Evaluator worker status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); + } + + + private getNextRequestPortMessageId(): number { + return this.requestPortMessageId++; + } + + async attachToEvaluator(): Promise { + + await this.isReady; + + const worker = this.worker; + if (worker == undefined) { + throw new Error(`Evaluator worker is null.`); + } + + const messageId = this.getNextRequestPortMessageId(); + const portPromise = new Promise((resolve) => { + const listener = (data: EvaluatorGetPortResponse) => { + if (data.messageId === messageId) { + worker.off("message", listener); + resolve(data.port); + } + }; + worker.on("message", listener); + + const portMessage: EvaluatorGetPortMessage = { messageId }; + worker.postMessage(portMessage); + }); + + return portPromise; + } + } diff --git a/src/evaluator/evaluator.types.ts b/src/evaluator/evaluator.types.ts new file mode 100644 index 0000000..3be2697 --- /dev/null +++ b/src/evaluator/evaluator.types.ts @@ -0,0 +1,222 @@ +import { LoggerOptions } from "pino"; +import { GasEstimateComponents } from "src/resolvers/resolver"; +import { MessagePort } from "worker_threads"; + + + +// Constants +// ************************************************************************************************ + +export const EVALUATOR_DEFAULT_UNREWARDED_DELIVERY_GAS = 0n; +export const EVALUATOR_DEFAULT_VERIFICATION_DELIVERY_GAS = 0n; +export const EVALUATOR_DEFAULT_MIN_DELIVERY_REWARD = 0; +export const EVALUATOR_DEFAULT_RELATIVE_MIN_DELIVERY_REWARD = 0; +export const EVALUATOR_DEFAULT_UNREWARDED_ACK_GAS = 0n; +export const EVALUATOR_DEFAULT_VERIFICATION_ACK_GAS = 0n; +export const EVALUATOR_DEFAULT_MIN_ACK_REWARD = 0; +export const EVALUATOR_DEFAULT_RELATIVE_MIN_ACK_REWARD = 0; +export const EVALUATOR_DEFAULT_PROFITABILITY_FACTOR = 1; + + + +// Config and Worker Types +// ************************************************************************************************ + +export interface EvaluationConfig { + + unrewardedDeliveryGas: bigint; + verificationDeliveryGas: bigint; + minDeliveryReward: number; + relativeMinDeliveryReward: number, + + unrewardedAckGas: bigint; + verificationAckGas: bigint; + minAckReward: number; + relativeMinAckReward: number; + + profitabilityFactor: number; +} + +export interface EvaluatorWorkerData { + evaluationConfigs: Record; + pricingPort: MessagePort; + walletPort: MessagePort; + loggerOptions: LoggerOptions; +} + + + +// Port Channels Types +// ************************************************************************************************ +export interface EvaluatorGetPortMessage { + messageId: number; +} + +export interface EvaluatorGetPortResponse { + messageId: number; + port: MessagePort; +} + + +export interface EvaluatorPortData { + messageId: number; + message: EvaluatorMessage; +} + +export enum EvaluatorMessageType { + EvaluateDelivery, + EvaluateDeliveryResponse, + EvaluateAck, + EvaluateAckResponse, + EmptyResponse, +} + +export type EvaluatorMessage = EvaluateDeliveryMessage + | EvaluateDeliveryResponseMessage + | EvaluateAckMessage + | EvaluateAckResponseMessage + | EmptyResponseMessage; + + +export interface EvaluateDeliveryMessage { + type: EvaluatorMessageType.EvaluateDelivery; + chainId: string; + messageIdentifier: string; + gasEstimateComponents: GasEstimateComponents; + value: bigint; +} + +export interface EvaluateDeliveryResponseMessage { + type: EvaluatorMessageType.EvaluateDeliveryResponse; + chainId: string; + messageIdentifier: string; + evaluation: { + maxGasDelivery: bigint; + maxGasAck: bigint; + gasEstimate: bigint; + observedGasEstimate: bigint; + additionalFeeEstimate: bigint; + destinationGasPrice: bigint; + value: bigint; + sourceGasPrice: bigint; + deliveryCost: bigint; + deliveryReward: bigint; + maxAckLoss: bigint; + deliveryFiatCost: number; + deliveryFiatReward: number; + securedDeliveryFiatReward: number; + profitabilityFactor: number; + securedDeliveryFiatProfit: number; + securedDeliveryRelativeProfit: number; + minDeliveryReward: number; + relativeMinDeliveryReward: number; + relayDelivery: boolean; + } | null; +} + +export interface EvaluateAckMessage { + type: EvaluatorMessageType.EvaluateAck; + chainId: string; + messageIdentifier: string; + gasEstimateComponents: GasEstimateComponents; + value: bigint; +} + +export interface EvaluateAckResponseMessage { + type: EvaluatorMessageType.EvaluateAckResponse; + chainId: string; + messageIdentifier: string; + evaluation: { + maxGasDelivery: bigint; + maxGasAck: bigint; + gasEstimate: bigint; + observedGasEstimate: bigint; + additionalFeeEstimate: bigint; + sourceGasPrice: bigint; + ackCost: bigint; + ackReward: bigint; + profitabilityFactor: number; + ackFiatProfit: number; + ackRelativeProfit: number; + minAckReward: number; + relativeMinAckReward: number; + deliveryCost: bigint; + deliveryReward: bigint; + relayAckForDeliveryBounty: boolean; + relayAck: boolean; + } | null; +} + +export interface EmptyResponseMessage { + type: EvaluatorMessageType.EmptyResponse; +} + + + +// Controller Types +// ************************************************************************************************ + +export interface EvaluateDeliveryQuery { + chainId: string; + messageIdentifier: string; + gasEstimate: string; + observedGasEstimate: string; + additionalFeeEstimate: string; + value: string; +} + +export interface EvaluteDeliveryQueryResponse { + chainId: string; + messageIdentifier: string; + maxGasDelivery: string; + maxGasAck: string; + gasEstimate: string; + observedGasEstimate: string; + additionalFeeEstimate: string; + destinationGasPrice: string; + value: string; + sourceGasPrice: string; + deliveryCost: string; + deliveryReward: string; + maxAckLoss: string; + deliveryFiatCost: number; + deliveryFiatReward: number; + securedDeliveryFiatReward: number; + profitabilityFactor: number; + securedDeliveryFiatProfit: number; + securedDeliveryRelativeProfit: number; + minDeliveryReward: number; + relativeMinDeliveryReward: number; + relayDelivery: boolean; +} + +export interface EvaluateAckQuery { + chainId: string; + messageIdentifier: string; + gasEstimate: string; + observedGasEstimate: string; + additionalFeeEstimate: string; + value: string; +} + +export interface EvaluateAckQueryResponse { + chainId: string; + messageIdentifier: string; + maxGasDelivery: string; + maxGasAck: string; + gasEstimate: string; + observedGasEstimate: string; + additionalFeeEstimate: string; + sourceGasPrice: string; + ackCost: string; + ackReward: string; + profitabilityFactor: number; + ackFiatProfit: number; + ackRelativeProfit: number; + minAckReward: number; + relativeMinAckReward: number; + deliveryCost: string; + deliveryReward: string; + relayAckForDeliveryBounty: boolean; + relayAck: boolean; +} diff --git a/src/evaluator/evaluator.worker.ts b/src/evaluator/evaluator.worker.ts new file mode 100644 index 0000000..8516e71 --- /dev/null +++ b/src/evaluator/evaluator.worker.ts @@ -0,0 +1,549 @@ +import pino from "pino"; +import { parentPort, workerData, MessagePort, MessageChannel } from "worker_threads"; +import { EvaluateAckResponseMessage, EvaluateDeliveryResponseMessage, EvaluatorGetPortMessage, EvaluatorGetPortResponse, EvaluatorMessage, EvaluatorMessageType, EvaluatorPortData, EvaluatorWorkerData } from "./evaluator.types"; +import { Store } from "src/store/store.lib"; +import { GasEstimateComponents } from "src/resolvers/resolver"; +import { BytesLike, MaxUint256 } from "ethers6"; +import { WalletInterface } from "src/wallet/wallet.interface"; +import { PricingInterface } from "src/pricing/pricing.interface"; +import { MessageContext, ParsePayload } from "src/payload/decode.payload"; +import { tryErrorToString } from "src/common/utils"; + + +const DECIMAL_BASE = 10_000; +const DECIMAL_BASE_BIG_INT = BigInt(DECIMAL_BASE); + +class EvaluatorWorker { + private readonly config: EvaluatorWorkerData; + + private readonly logger: pino.Logger; + + private readonly store: Store; + + private readonly pricing: PricingInterface; + private readonly wallet: WalletInterface; + + private portsCount = 0; + private readonly ports: Record = {}; + + constructor() { + this.config = workerData as EvaluatorWorkerData; + + this.store = new Store(); + + this.pricing = new PricingInterface(this.config.pricingPort); + this.wallet = new WalletInterface(this.config.walletPort); + + this.logger = this.initializeLogger(); + + this.initializePorts(); + } + + + + // Initialization helpers + // ******************************************************************************************** + + private initializeLogger(): pino.Logger { + return pino(this.config.loggerOptions).child({ + worker: 'evaluator' + }); + } + + private initializePorts(): void { + parentPort!.on('message', (message: EvaluatorGetPortMessage) => { + const port = this.registerNewPort(); + const response: EvaluatorGetPortResponse = { + messageId: message.messageId, + port + }; + parentPort!.postMessage(response, [port]); + }); + } + + private registerNewPort(): MessagePort { + + const portId = this.portsCount++; + + const { port1, port2 } = new MessageChannel(); + + port1.on('message', (message: EvaluatorPortData) => { + void this.processRequest(message) + .then((response) => port1.postMessage(response)); + }) + + this.ports[portId] = port1; + + return port2; + } + + private async processRequest(data: EvaluatorPortData): Promise { + const messageType = data.message.type; + let returnData: EvaluatorMessage | null = null; + try { + switch (messageType) { + case EvaluatorMessageType.EvaluateDelivery: + returnData = await this.evaluateDelivery( + data.message.chainId, + data.message.messageIdentifier, + data.message.gasEstimateComponents, + data.message.value, + ); + break; + case EvaluatorMessageType.EvaluateAck: + returnData = await this.evaluateAck( + data.message.chainId, + data.message.messageIdentifier, + data.message.gasEstimateComponents, + data.message.value, + ); + break; + default: + this.logger.error( + { + messageType, + request: data + }, + `Unable to handle evaluator request: unknown message type` + ); + } + + } + catch (error) { + this.logger.error( + { + messageType, + request: data, + error: tryErrorToString(error), + }, + `Error on evaluator request processing.` + ); + } + + return { + messageId: data.messageId, + message: returnData ?? { type: EvaluatorMessageType.EmptyResponse }, + } + } + + + private async evaluateDelivery( + chainId: string, + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint + ): Promise { + + const response: EvaluateDeliveryResponseMessage = { + type: EvaluatorMessageType.EvaluateDeliveryResponse, + chainId, + messageIdentifier, + evaluation: null, + }; + + const evaluationConfig = this.config.evaluationConfigs[chainId]; + if (evaluationConfig == null) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Unable to perform delivery evaluation: no evaluation config found for the 'chainId' provided.` + ); + // Send a 'null' evaluation response + return response; + } + + const relayState = await this.store.getRelayState(messageIdentifier); + // TODO ideally the check `relayState.toChainId != chainId` would be performed at this point + // for extra precaution, but with the current implementation the `toChainId` field is not + // available until the message is delivered. + if (relayState?.bountyPlacedEvent == null) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Unable to perform delivery evaluation: no BountyPlaced information found for the 'messageIdentifier' provided.` + ); + // Send a 'null' evaluation response + return response; + } + + const { + gasEstimate, + observedGasEstimate, + additionalFeeEstimate + } = gasEstimateComponents; + + const destinationGasPrice = await this.getGasPrice(chainId); + const sourceGasPrice = await this.getGasPrice(relayState.bountyPlacedEvent.fromChainId); + + const bountyPlacedEvent = relayState?.bountyPlacedEvent; + const priceOfDeliveryGas = relayState.bountyIncreasedEvent?.newDeliveryGasPrice + ?? bountyPlacedEvent.priceOfDeliveryGas; + const priceOfAckGas = relayState.bountyIncreasedEvent?.newAckGasPrice + ?? bountyPlacedEvent.priceOfAckGas; + + const deliveryCost = this.calcGasCost( // ! In destination chain gas value + gasEstimate, + destinationGasPrice, + additionalFeeEstimate + value + ); + + const deliveryReward = this.calcGasReward( // ! In source chain gas value + observedGasEstimate, + evaluationConfig.unrewardedDeliveryGas, + bountyPlacedEvent.maxGasDelivery, + priceOfDeliveryGas + ); + + const maxAckLoss = this.calcMaxGasLoss( // ! In source chain gas value + sourceGasPrice, + evaluationConfig.unrewardedAckGas, + evaluationConfig.verificationAckGas, + bountyPlacedEvent.maxGasAck, + priceOfAckGas, + ); + + + // Compute the cost and reward of the message delivery in Fiat and evaluate the message + // delivery profit. + const deliveryFiatCost = await this.getGasCostFiatPrice( + deliveryCost, + chainId + ); + + const adjustedDeliveryReward = evaluationConfig.profitabilityFactor == 0 + ? MaxUint256 + : deliveryReward * DECIMAL_BASE_BIG_INT + / BigInt(evaluationConfig.profitabilityFactor * DECIMAL_BASE); + + const securedDeliveryReward = adjustedDeliveryReward + maxAckLoss; + + const securedDeliveryFiatReward = await this.getGasCostFiatPrice( + securedDeliveryReward, + bountyPlacedEvent.fromChainId + ); + + // Compute the 'deliveryFiatReward' for logging purposes (i.e. without the 'maxAckLoss' factor) + // If `adjustedDeliveryReward` is 0, then `maxAckLoss` is the sole contributor to + // `securedDeliveryFiatReward`, and thus `deliveryFiatReward` is 0. + const securedRewardFactor = adjustedDeliveryReward == 0n + ? Infinity + : Number( + ((adjustedDeliveryReward + maxAckLoss) * DECIMAL_BASE_BIG_INT) / (adjustedDeliveryReward) + ) / DECIMAL_BASE; + const deliveryFiatReward = securedDeliveryFiatReward / securedRewardFactor; + + const securedDeliveryFiatProfit = securedDeliveryFiatReward - deliveryFiatCost; + const securedDeliveryRelativeProfit = securedDeliveryFiatProfit / deliveryFiatCost; + + const relayDelivery = ( + securedDeliveryFiatProfit > evaluationConfig.minDeliveryReward || + securedDeliveryRelativeProfit > evaluationConfig.relativeMinDeliveryReward + ); + + response.evaluation = { + maxGasDelivery: bountyPlacedEvent.maxGasDelivery, + maxGasAck: bountyPlacedEvent.maxGasAck, + gasEstimate, + observedGasEstimate, + additionalFeeEstimate, + value, + destinationGasPrice, + sourceGasPrice, + deliveryCost, + deliveryReward, + maxAckLoss, + deliveryFiatCost, + deliveryFiatReward, + securedDeliveryFiatReward, + profitabilityFactor: evaluationConfig.profitabilityFactor, + securedDeliveryFiatProfit, + securedDeliveryRelativeProfit, + minDeliveryReward: evaluationConfig.minDeliveryReward, + relativeMinDeliveryReward: evaluationConfig.relativeMinDeliveryReward, + relayDelivery, + }; + + return response; + } + + private async evaluateAck( + chainId: string, + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint, + ): Promise { + + const response: EvaluateAckResponseMessage = { + type: EvaluatorMessageType.EvaluateAckResponse, + chainId, + messageIdentifier, + evaluation: null, + }; + + const evaluationConfig = this.config.evaluationConfigs[chainId]; + if (evaluationConfig == null) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Unable to perform ack evaluation: no evaluation config found for the 'chainId' provided.` + ); + // Send a 'null' evaluation response + return response + } + + const relayState = await this.store.getRelayState(messageIdentifier); + if (relayState?.bountyPlacedEvent == null) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Unable to perform ack evaluation: no BountyPlaced information found for the 'messageIdentifier' provided.` + ); + // Send a 'null' evaluation response + return response + } + + const bountyPlacedEvent = relayState.bountyPlacedEvent; + if (bountyPlacedEvent.fromChainId != chainId) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Unable to perform ack evaluation: the specified 'chainId' does not match the 'fromChainId' stored on the bounty registry.` + ); + // Send a 'null' evaluation response + return response + } + + const toChainId = relayState.messageDeliveredEvent?.toChainId; + const ackAMBMessage = toChainId != undefined + ? await this.store.getAMBMessage(toChainId, messageIdentifier) + : undefined; + if (!ackAMBMessage) { + this.logger.info( + { + chainId, + messageIdentifier, + }, + `Message delivery data not found, ack evaluation will be less accurate.` + ); + } + const ackIncentivesPayload = ackAMBMessage?.incentivesPayload; + + const { + gasEstimate, + observedGasEstimate, + additionalFeeEstimate + } = gasEstimateComponents; + + const sourceGasPrice = await this.getGasPrice(chainId); + + const priceOfDeliveryGas = relayState.bountyIncreasedEvent?.newDeliveryGasPrice + ?? bountyPlacedEvent.priceOfDeliveryGas; + const priceOfAckGas = relayState.bountyIncreasedEvent?.newAckGasPrice + ?? bountyPlacedEvent.priceOfAckGas; + + const ackCost = this.calcGasCost( // ! In source chain gas value + gasEstimate, + sourceGasPrice, + additionalFeeEstimate + value + ); + + const ackReward = this.calcGasReward( // ! In source chain gas value + observedGasEstimate, + evaluationConfig.unrewardedAckGas, + bountyPlacedEvent.maxGasAck, + priceOfAckGas + ); + + const adjustedAckReward = evaluationConfig.profitabilityFactor == 0 + ? MaxUint256 + : ackReward * DECIMAL_BASE_BIG_INT + / BigInt(evaluationConfig.profitabilityFactor * DECIMAL_BASE); + + const ackProfit = adjustedAckReward - ackCost; // ! In source chain gas value + const ackFiatProfit = await this.getGasCostFiatPrice(ackProfit, chainId); + const ackRelativeProfit = Number(ackProfit) / Number(ackCost); + + let deliveryReward = 0n; + const deliveryCost = relayState.deliveryGasCost ?? 0n; // This is only present if *this* relayer submitted the message delivery. + if (deliveryCost != 0n) { + + // Recalculate the delivery reward using the latest pricing info + const usedGasDelivery = ackIncentivesPayload + ? await this.getGasUsedForDelivery(ackIncentivesPayload) ?? 0n + : 0n; // 'gasUsed' should not be 'undefined', but if it is, continue as if it was 0 + + deliveryReward = this.calcGasReward( // ! In source chain gas value + usedGasDelivery, + 0n, // No 'unrewarded' gas, as 'usedGasDelivery' is the exact value that is used to compute the reward. + bountyPlacedEvent.maxGasDelivery, + priceOfDeliveryGas + ); + } + + // If the delivery was submitted by *this* relayer, always submit the ack *unless* + // the net result of doing so is worse than not getting paid for the message + // delivery. + const relayAckForDeliveryBounty = deliveryCost != 0n && (ackProfit + deliveryReward > 0n); + + const relayAck = ( + relayAckForDeliveryBounty || + ackFiatProfit > evaluationConfig.minAckReward || + ackRelativeProfit > evaluationConfig.relativeMinAckReward + ); + + response.evaluation = { + maxGasDelivery: bountyPlacedEvent.maxGasDelivery, + maxGasAck: bountyPlacedEvent.maxGasAck, + gasEstimate, + observedGasEstimate, + additionalFeeEstimate, + sourceGasPrice, + ackCost, + ackReward, + profitabilityFactor: evaluationConfig.profitabilityFactor, + ackFiatProfit, + ackRelativeProfit, + minAckReward: evaluationConfig.minAckReward, + relativeMinAckReward: evaluationConfig.relativeMinAckReward, + deliveryCost, + deliveryReward, + relayAckForDeliveryBounty, + relayAck, + }; + + return response; + } + + private calcGasCost( + gas: bigint, + gasPrice: bigint, + additionalFee?: bigint, + ): bigint { + return gas * gasPrice + (additionalFee ?? 0n); + } + + private calcGasReward( + gas: bigint, + unrewardedGas: bigint, + bountyMaxGas: bigint, + bountyPriceOfGas: bigint, + ): bigint { + + // Subtract the 'unrewardable' gas amount estimate from the gas usage estimation. + const rewardableGasEstimation = gas > unrewardedGas + ? gas - unrewardedGas + : 0n; + + const rewardEstimate = bountyPriceOfGas * ( + rewardableGasEstimation > bountyMaxGas + ? bountyMaxGas + : rewardableGasEstimation + ); + + return rewardEstimate; + } + + private calcMaxGasLoss( + gasPrice: bigint, + unrewardedGas: bigint, + verificationGas: bigint, + bountyMaxGas: bigint, + bountyPriceOfGas: bigint, + ): bigint { + + // The gas used for the 'ack' submission is composed of 3 amounts: + // - Logic overhead: is never computed for the reward. + // - Verification logic: is only computed for the reward if the source application's + // 'ack' handler does not use all of the 'ack' gas allowance ('bountyMaxGas'). + // - Source application's 'ack' handler: it is always computed for the reward (up to a + // maximum of 'bountyMaxGas'). + + // Evaluate the minimum expected profit from the 'ack' delivery. There are 2 possible + // scenarios: + // - No gas is used by the source application's 'ack' handler. + // - The maximum allowed amount of gas is used by the source application's 'ack' handler. + + // NOTE: strictly speaking, 'verificationGas' should be upperbounded by 'bountyMaxGas' on + // the following line. However, this is not necessary, as in such a case + // 'maximumGasUsageProfit' will always return a smaller profit than 'minimumGasUsageProfit'. + const minimumGasUsageReward = verificationGas * bountyPriceOfGas; + const minimumGasUsageCost = (unrewardedGas + verificationGas) * gasPrice; + const minimumGasUsageProfit = minimumGasUsageReward - minimumGasUsageCost; + + const maximumGasUsageReward = bountyMaxGas * bountyPriceOfGas; + const maximumGasUsageCost = (unrewardedGas + verificationGas + bountyMaxGas) * gasPrice; + const maximumGasUsageProfit = maximumGasUsageReward - maximumGasUsageCost; + + const worstCaseProfit = minimumGasUsageProfit < maximumGasUsageProfit + ? minimumGasUsageProfit + : maximumGasUsageProfit; + + // Only return the 'worstCaseProfit' if it's negative. + return worstCaseProfit < 0n + ? worstCaseProfit + : 0n; + } + + private async getGasPrice(chainId: string): Promise { + const feeData = await this.wallet.getFeeData(chainId); + // If gas fee data is missing or incomplete, default the gas price to an extremely high + // value. + // ! Use 'gasPrice' over 'maxFeePerGas', as 'maxFeePerGas' defines the highest gas fee + // ! allowed, which does not necessarilly represent the real gas fee at which the + // ! transactions are going through. + const gasPrice = feeData?.gasPrice + ?? feeData?.maxFeePerGas + ?? MaxUint256; + + return gasPrice; + } + + private async getGasCostFiatPrice(amount: bigint, chainId: string): Promise { + //TODO add timeout? + const price = await this.pricing.getPrice(chainId, amount); + if (price == null) { + throw new Error('Unable to fetch price.'); + } + return price; + } + + private async getGasUsedForDelivery(message: BytesLike): Promise { + try { + const payload = ParsePayload(message.toString()); + + if (payload == undefined) { + return null; + } + + if (payload.context != MessageContext.CTX_DESTINATION_TO_SOURCE) { + this.logger.warn( + { payload }, + `Unable to extract the 'gasUsed' for delivery. Payload is not a 'destination-to-source' message.`, + ); + return null; + } + + return payload.gasSpent; + } + catch (error) { + this.logger.warn( + { message }, + `Failed to parse generalised incentives payload for 'gasSpent' (on delivery).` + ); + } + + return null; + } +} + +new EvaluatorWorker(); diff --git a/src/getter/getter.service.ts b/src/getter/getter.service.ts index 2fda37c..640ae9b 100644 --- a/src/getter/getter.service.ts +++ b/src/getter/getter.service.ts @@ -60,7 +60,7 @@ export class GetterService implements OnModuleInit { { chainId }, 'Skipping getter worker creation: no incentive address to listen for found.', ); - return; + continue; } const worker = new Worker(join(__dirname, 'getter.worker.js'), { diff --git a/src/getter/getter.worker.ts b/src/getter/getter.worker.ts index 242a106..0fe5aee 100644 --- a/src/getter/getter.worker.ts +++ b/src/getter/getter.worker.ts @@ -7,6 +7,8 @@ import { GetterWorkerData } from './getter.service'; import { JsonRpcProvider, Log, LogDescription } from 'ethers6'; import { BountyClaimedEvent, BountyIncreasedEvent, BountyPlacedEvent, IMessageEscrowEventsInterface, MessageDeliveredEvent } from 'src/contracts/IMessageEscrowEvents'; import { MonitorInterface, MonitorStatus } from 'src/monitor/monitor.interface'; +import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; +import { BountyClaimedEventDetails, BountyIncreasedEventDetails, BountyPlacedEventDetails, MessageDeliveredEventDetails } from 'src/store/store.types'; class GetterWorker { @@ -25,22 +27,26 @@ class GetterWorker { private currentStatus: MonitorStatus | null = null; private monitor: MonitorInterface; + private fromBlock: number = 0; + constructor() { this.config = workerData as GetterWorkerData; this.chainId = this.config.chainId; - this.store = new Store(this.chainId); + this.store = new Store(); this.provider = this.initializeProvider(this.config.rpc); this.logger = this.initializeLogger(this.chainId); this.incentiveAddresses = this.config.incentivesAddresses; const contractTypes = this.initializeContractTypes(); - this.incentivesEscrowInterface = contractTypes.chainInterfaceInterface; + this.incentivesEscrowInterface = contractTypes.incentivesEscrowInterface; this.topics = contractTypes.topics; this.monitor = this.startListeningToMonitor(this.config.monitorPort); + + this.initiateIntervalStatusLog(); } @@ -64,22 +70,22 @@ class GetterWorker { } private initializeContractTypes(): { - chainInterfaceInterface: IMessageEscrowEventsInterface, + incentivesEscrowInterface: IMessageEscrowEventsInterface, topics: string[][] } { - const chainInterfaceInterface = IMessageEscrowEvents__factory.createInterface(); + const incentivesEscrowInterface = IMessageEscrowEvents__factory.createInterface(); const topics = [ [ - chainInterfaceInterface.getEvent('BountyPlaced').topicHash, - chainInterfaceInterface.getEvent('BountyClaimed').topicHash, - chainInterfaceInterface.getEvent('MessageDelivered').topicHash, - chainInterfaceInterface.getEvent('BountyIncreased').topicHash, + incentivesEscrowInterface.getEvent('BountyPlaced').topicHash, + incentivesEscrowInterface.getEvent('BountyClaimed').topicHash, + incentivesEscrowInterface.getEvent('MessageDelivered').topicHash, + incentivesEscrowInterface.getEvent('BountyIncreased').topicHash, ] ]; return { - chainInterfaceInterface, + incentivesEscrowInterface, topics } } @@ -104,34 +110,14 @@ class GetterWorker { `Getter worker started.`, ); - let fromBlock = null; - while (fromBlock == null) { - // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if - // 'startingBlock' is specified. - if (this.currentStatus != null) { - if (this.config.startingBlock != null) { - if (this.config.startingBlock < 0) { - fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; - if (fromBlock < 0) { - throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) - } - } else { - fromBlock = this.config.startingBlock; - } - } else { - fromBlock = this.currentStatus.blockNumber; - } - } - - await wait(this.config.processingInterval); - } + this.fromBlock = await this.getStartingBlock(); const stopBlock = this.config.stoppingBlock ?? Infinity; while (true) { try { let toBlock = this.currentStatus?.blockNumber; - if (!toBlock || fromBlock > toBlock) { + if (!toBlock || this.fromBlock > toBlock) { await wait(this.config.processingInterval); continue; } @@ -140,20 +126,20 @@ class GetterWorker { toBlock = stopBlock; } - const blocksToProcess = toBlock - fromBlock; + const blocksToProcess = toBlock - this.fromBlock; if (this.config.maxBlocks != null && blocksToProcess > this.config.maxBlocks) { - toBlock = fromBlock + this.config.maxBlocks; + toBlock = this.fromBlock + this.config.maxBlocks; } - this.logger.info( + this.logger.debug( { - fromBlock, + fromBlock: this.fromBlock, toBlock, }, `Scanning bounties.`, ); - await this.queryAndProcessEvents(fromBlock, toBlock); + await this.queryAndProcessEvents(this.fromBlock, toBlock); if (toBlock >= stopBlock) { this.logger.info( @@ -163,7 +149,7 @@ class GetterWorker { break; } - fromBlock = toBlock + 1; + this.fromBlock = toBlock + 1; } catch (error) { this.logger.error(error, `Failed on getter.worker`); @@ -178,6 +164,35 @@ class GetterWorker { await this.store.quit(); } + private async getStartingBlock(): Promise { + let fromBlock: number | null = null; + while (fromBlock == null) { + + // Do not initialize 'fromBlock' whilst 'currentStatus' is null, even if + // 'startingBlock' is specified. + if (this.currentStatus == null) { + await wait(this.config.processingInterval); + continue; + } + + if (this.config.startingBlock == null) { + fromBlock = this.currentStatus.blockNumber; + break; + } + + if (this.config.startingBlock < 0) { + fromBlock = this.currentStatus.blockNumber + this.config.startingBlock; + if (fromBlock < 0) { + throw new Error(`Invalid 'startingBlock': negative offset is larger than the current block number.`) + } + } else { + fromBlock = this.config.startingBlock; + } + } + + return fromBlock; + } + private async queryAndProcessEvents( fromBlock: number, toBlock: number @@ -190,7 +205,7 @@ class GetterWorker { await this.handleEvent(log); } catch (error) { this.logger.error( - { log, error }, + { log, error: tryErrorToString(error) }, `Failed to process event on getter worker.` ); } @@ -275,16 +290,29 @@ class GetterWorker { const event = parsedLog.args as unknown as BountyPlacedEvent.OutputObject; const messageIdentifier = event.messageIdentifier; - const incentive = event.incentive; this.logger.info({ messageIdentifier }, `BountyPlaced event found.`); - await this.store.registerBountyPlaced({ - messageIdentifier, - incentive, - incentivesAddress: log.address, + const eventDetails: BountyPlacedEventDetails = { transactionHash: log.transactionHash, - }); + blockHash: log.blockHash, + blockNumber: log.blockNumber, + + fromChainId: this.chainId, + incentivesAddress: log.address, + + maxGasDelivery: event.incentive.maxGasDelivery, + maxGasAck: event.incentive.maxGasAck, + refundGasTo: event.incentive.refundGasTo, + priceOfDeliveryGas: event.incentive.priceOfDeliveryGas, + priceOfAckGas: event.incentive.priceOfAckGas, + targetDelta: event.incentive.targetDelta, + }; + + await this.store.setBountyPlaced( + messageIdentifier, + eventDetails, + ); }; private async handleBountyClaimedEvent( @@ -298,11 +326,16 @@ class GetterWorker { this.logger.info({ messageIdentifier }, `BountyClaimed event found.`); - await this.store.registerBountyClaimed({ - messageIdentifier, - incentivesAddress: log.address, + const eventDetails: BountyClaimedEventDetails = { transactionHash: log.transactionHash, - }); + blockHash: log.blockHash, + blockNumber: log.blockNumber, + }; + + await this.store.setBountyClaimed( + messageIdentifier, + eventDetails + ); }; private async handleMessageDeliveredEvent( @@ -316,11 +349,18 @@ class GetterWorker { this.logger.info({ messageIdentifier }, `MessageDelivered event found.`); - await this.store.registerMessageDelivered({ - messageIdentifier, - incentivesAddress: log.address, + const eventDetails: MessageDeliveredEventDetails = { transactionHash: log.transactionHash, - }); + blockHash: log.blockHash, + blockNumber: log.blockNumber, + + toChainId: this.chainId, + }; + + await this.store.setMessageDelivered( + messageIdentifier, + eventDetails, + ); }; private async handleBountyIncreasedEvent( @@ -334,15 +374,39 @@ class GetterWorker { this.logger.info({ messageIdentifier }, `BountyIncreased event found.`); - await this.store.registerBountyIncreased({ - messageIdentifier, + const eventDetails: BountyIncreasedEventDetails = { + transactionHash: log.transactionHash, + blockHash: log.blockHash, + blockNumber: log.blockNumber, + newDeliveryGasPrice: event.newDeliveryGasPrice, newAckGasPrice: event.newAckGasPrice, - incentivesAddress: log.address, - transactionHash: log.transactionHash, - }); + }; + + await this.store.setBountyIncreased( + messageIdentifier, + eventDetails, + ); }; + + + // Misc Helpers + // ******************************************************************************************** + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + this.logger.info( + { + latestBlock: this.currentStatus?.blockNumber, + currentBlock: this.fromBlock, + }, + 'Getter status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); + } + } void new GetterWorker().run(); \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 37253e4..486f3d2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,6 +32,8 @@ async function bootstrap() { logLoadedOptions(configService, loggerService); + await configService.isReady; + await app.listen(configService.globalConfig.port); } void bootstrap(); diff --git a/src/monitor/monitor.gateway.ts b/src/monitor/monitor.gateway.ts index 44ab553..0979b59 100644 --- a/src/monitor/monitor.gateway.ts +++ b/src/monitor/monitor.gateway.ts @@ -35,7 +35,7 @@ export class MonitorGateway implements OnModuleInit { } private async listenToMonitors(): Promise { - this.loggerService.info(`Listening to Monitor services to broadcast state events.`); + this.loggerService.debug(`Listening to Monitor services to broadcast state events.`); for (const [chainId] of this.configService.chainsConfig) { const monitorPort = await this.monitorService.attachToMonitor(chainId); diff --git a/src/monitor/monitor.service.ts b/src/monitor/monitor.service.ts index 8c26fcf..71c1d38 100644 --- a/src/monitor/monitor.service.ts +++ b/src/monitor/monitor.service.ts @@ -10,11 +10,13 @@ import { ChainConfig } from 'src/config/config.types'; export const DEFAULT_MONITOR_INTERVAL = 5000; export const DEFAULT_MONITOR_BLOCK_DELAY = 1; +export const DEFAULT_MONITOR_NO_BLOCK_UPDATE_WARNING_INTERVAL = 5 * 60000; interface DefaultMonitorWorkerData { interval: number, blockDelay: number, + noBlockUpdateWarningInterval: number, } export interface MonitorWorkerData { @@ -22,6 +24,7 @@ export interface MonitorWorkerData { chainName: string, rpc: string, blockDelay: number, + noBlockUpdateWarningInterval: number, interval: number, loggerOptions: LoggerOptions } @@ -79,10 +82,12 @@ export class MonitorService implements OnModuleInit { const blockDelay = globalMonitorConfig.blockDelay ?? DEFAULT_MONITOR_BLOCK_DELAY; const interval = globalMonitorConfig.interval ?? DEFAULT_MONITOR_INTERVAL; + const noBlockUpdateWarningInterval = globalMonitorConfig.noBlockUpdateWarningInterval ?? DEFAULT_MONITOR_NO_BLOCK_UPDATE_WARNING_INTERVAL; return { interval, blockDelay, + noBlockUpdateWarningInterval, } } @@ -98,6 +103,7 @@ export class MonitorService implements OnModuleInit { rpc: chainConfig.rpc, blockDelay: chainMonitorConfig.blockDelay ?? defaultConfig.blockDelay, interval: chainMonitorConfig.interval ?? defaultConfig.interval, + noBlockUpdateWarningInterval: chainMonitorConfig.noBlockUpdateWarningInterval ?? defaultConfig.noBlockUpdateWarningInterval, loggerOptions: this.loggerService.loggerOptions }; } diff --git a/src/monitor/monitor.worker.ts b/src/monitor/monitor.worker.ts index 840767f..0aa78a2 100644 --- a/src/monitor/monitor.worker.ts +++ b/src/monitor/monitor.worker.ts @@ -18,6 +18,8 @@ class MonitorWorker { private portsCount = 0; private readonly ports: Record = {}; + private noBlockUpdateReferenceTimestamp = Date.now(); + private lastBroadcastBlockNumber = -1; private latestBlock: Block | null = null; @@ -95,6 +97,22 @@ class MonitorWorker { try { const newBlock = await this.provider.getBlock(-this.config.blockDelay); if (!newBlock || newBlock.number <= this.lastBroadcastBlockNumber) { + + const noBlockUpdateWarningElapsedTime = Date.now() + - this.noBlockUpdateReferenceTimestamp; + + if (noBlockUpdateWarningElapsedTime > this.config.noBlockUpdateWarningInterval) { + this.logger.warn( + { + warningInterval: this.config.noBlockUpdateWarningInterval, + latestBlockQuery: newBlock + }, + `Failed to update block.` + ); + + // Avoid the logs from getting filled with warnings once 'noBlockUpdateWarningInterval' has elapsed + this.noBlockUpdateReferenceTimestamp = Date.now(); + } await wait(this.config.interval); continue; } @@ -104,6 +122,8 @@ class MonitorWorker { ); this.latestBlock = newBlock; + this.noBlockUpdateReferenceTimestamp = Date.now(); + this.broadcastStatus(); } catch (error) { @@ -116,7 +136,7 @@ class MonitorWorker { private broadcastStatus(): void { if (!this.latestBlock) { - this.logger.warn('Unable to broadcast status. \'latestBlock\' is null.'); + this.logger.error('Unable to broadcast status. \'latestBlock\' is null.'); return; } diff --git a/src/pricing/pricing.controller.ts b/src/pricing/pricing.controller.ts new file mode 100644 index 0000000..9aaae21 --- /dev/null +++ b/src/pricing/pricing.controller.ts @@ -0,0 +1,48 @@ +import { Controller, Get, OnModuleInit, Query } from "@nestjs/common"; +import { PricingService } from './pricing.service'; +import { PricingInterface } from './pricing.interface'; +import { GetPriceQuery, GetPriceQueryResponse } from './pricing.types'; + + +@Controller() +export class PricingController implements OnModuleInit { + private pricing!: PricingInterface; + + constructor( + private readonly pricingService: PricingService, + ) {} + + async onModuleInit() { + await this.initializePricingInterface(); + } + + private async initializePricingInterface(): Promise { + const port = await this.pricingService.attachToPricing(); + this.pricing = new PricingInterface(port); + } + + @Get('getPrice') + async getPrice(@Query() query: GetPriceQuery): Promise { + //TODO schema validate request + + if (query.chainId == undefined || query.amount == undefined) { + return undefined; //TODO return error + } + + const amount = BigInt(query.amount); + const price = await this.pricing.getPrice( + query.chainId, + amount, + query.tokenId, + ); + + const response: GetPriceQueryResponse = { + chainId: query.chainId, + tokenId: query.tokenId, + amount: amount.toString(), + price: price != null ? price : null, + }; + + return response; + } +} \ No newline at end of file diff --git a/src/pricing/pricing.interface.ts b/src/pricing/pricing.interface.ts new file mode 100644 index 0000000..1705500 --- /dev/null +++ b/src/pricing/pricing.interface.ts @@ -0,0 +1,41 @@ +import { MessagePort } from 'worker_threads'; +import { GetPriceMessage, GetPriceResponse } from './pricing.types'; + +export class PricingInterface { + private portMessageId = 0; + + constructor(private readonly port: MessagePort) {} + + private getNextPortMessageId(): number { + return this.portMessageId++; + } + + async getPrice( + chainId: string, + amount: bigint, + tokenId?: string, + ): Promise { + + const messageId = this.getNextPortMessageId(); + + const resultPromise = new Promise(resolve => { + const listener = (data: GetPriceResponse) => { + if (data.messageId === messageId) { + this.port.off("message", listener); + resolve(data.price); + } + }; + this.port.on("message", listener); + + const request: GetPriceMessage = { + messageId, + chainId, + amount, + tokenId + }; + this.port.postMessage(request); + }); + + return resultPromise; + } +} diff --git a/src/pricing/pricing.module.ts b/src/pricing/pricing.module.ts new file mode 100644 index 0000000..8cc718e --- /dev/null +++ b/src/pricing/pricing.module.ts @@ -0,0 +1,11 @@ +import { Global, Module } from '@nestjs/common'; +import { PricingService } from './pricing.service'; +import { PricingController } from './pricing.controller'; + +@Global() +@Module({ + controllers: [PricingController], + providers: [PricingService], + exports: [PricingService], +}) +export class PricingModule {} diff --git a/src/pricing/pricing.provider.ts b/src/pricing/pricing.provider.ts new file mode 100644 index 0000000..d15d8a5 --- /dev/null +++ b/src/pricing/pricing.provider.ts @@ -0,0 +1,176 @@ +import pino from "pino"; +import { tryErrorToString, wait } from "src/common/utils"; + +export const MAX_CACHE_DURATION = 1 * 60 * 60 * 1000; // 1 hour + +export interface PricingProviderConfig { + provider: string; + coinDecimals: number; + pricingDenomination: string; + cacheDuration: number; + retryInterval: number; + maxTries: number; + [key: string]: any; // Allow for additional provider-specific options +} + +export function loadPricingProvider( + config: Config, + logger: pino.Logger +): PricingProvider { + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const module = require(`./providers/${config.provider}`); + const providerClass: typeof BasePricingProvider = module.default; + return new providerClass( + config, + logger, + ) as unknown as PricingProvider; +} + +export async function loadPricingProviderAsync( + config: Config, + logger: pino.Logger +): Promise> { + + const module = await import(`./providers/${config.provider}`); + const providerClass: typeof BasePricingProvider = module.default; + return new providerClass( + config, + logger, + ) as unknown as PricingProvider; +} + +interface CachedPriceData { + price: number; + timestamp: number; +} + + +export abstract class PricingProvider { + readonly abstract pricingProviderType: string; + + protected cachedGasPrice: CachedPriceData | undefined; + protected cachedTokenPrices: Record = {}; + + constructor( + protected readonly config: Config, + protected readonly logger: pino.Logger, + ) { + this.validateConfig(this.config); + } + + + + // Initialization helpers + // ******************************************************************************************** + + private validateConfig(config: Config): void { + if (config.cacheDuration > MAX_CACHE_DURATION) { + throw new Error( + `Invalid 'cacheDuration': exceeds maximum allowed (${config.cacheDuration} exceeds ${MAX_CACHE_DURATION}).` + ); + } + } + + + + // Pricing functions + // ******************************************************************************************** + + abstract queryCoinPrice(tokenId?: string): Promise; + + async getPrice(amount: bigint, tokenId?: string): Promise { + const cachedPriceData = tokenId == undefined + ? this.cachedGasPrice + : this.cachedTokenPrices[tokenId]; + + const cacheValidUntilTimestamp = cachedPriceData != undefined + ? cachedPriceData.timestamp + this.config.cacheDuration + : null; + + const isCacheValid = cacheValidUntilTimestamp != null && Date.now() < cacheValidUntilTimestamp; + + const latestPriceData = isCacheValid + ? cachedPriceData! + : await this.updateCoinPrice(tokenId); + + return latestPriceData.price * Number(amount) / 10**this.config.coinDecimals; + } + + private async updateCoinPrice(tokenId?: string): Promise { + + const cachedPriceData = tokenId == undefined + ? this.cachedGasPrice + : this.cachedTokenPrices[tokenId]; + + let latestPrice: number | undefined; + + let tryCount = 0; + while (latestPrice == undefined) { + try { + latestPrice = await this.queryCoinPrice(tokenId); + } + catch (error) { + this.logger.warn( + { + error: tryErrorToString(error), + try: ++tryCount, + }, + `Failed to query coin price. Retrying if possible.` + ); + + // Skip update and continue with 'stale' pricing info if 'maxTries' is reached, unless + // the price has never been successfully queried from the provider. + if (tryCount >= this.config.maxTries && cachedPriceData != undefined) { + this.logger.warn( + { + try: tryCount, + maxTries: this.config.maxTries, + price: cachedPriceData.price, + pricingDenomination: this.config.pricingDenomination, + lastUpdate: cachedPriceData.timestamp, + tokenId, + }, + `Failed to query token price. Max tries reached. Continuing with stale data.` + ); + return cachedPriceData; + } + + await wait(this.config.retryInterval); + } + } + + const latestPriceData: CachedPriceData = { + price: latestPrice, + timestamp: Date.now(), + }; + + if (tokenId == undefined) { + this.cachedGasPrice = latestPriceData; + } + else { + this.cachedTokenPrices[tokenId] = latestPriceData; + } + + this.logger.info( + { + price: latestPrice, + pricingDenomination: this.config.pricingDenomination, + tokenId, + }, + 'Token price updated.' + ) + return latestPriceData; + } + +} + +// ! The following class should not be used, rather it is only provided for typing purposes. +export class BasePricingProvider extends PricingProvider { + readonly pricingProviderType: string = 'basePricingProvider'; + + async queryCoinPrice(): Promise { + throw new Error("Method not implemented."); + } + +} diff --git a/src/pricing/pricing.service.ts b/src/pricing/pricing.service.ts new file mode 100644 index 0000000..6fe3cbb --- /dev/null +++ b/src/pricing/pricing.service.ts @@ -0,0 +1,178 @@ +import { LoggerService, STATUS_LOG_INTERVAL } from './../logger/logger.service'; +import { ConfigService } from './../config/config.service'; +import { Global, Injectable, OnModuleInit } from "@nestjs/common"; +import { join } from 'path'; +import { Worker, MessagePort } from 'worker_threads'; +import { tryErrorToString } from 'src/common/utils'; +import { PricingProviderConfig } from './pricing.provider'; +import { LoggerOptions } from 'pino'; +import { PricingGetPortMessage, PricingGetPortResponse } from './pricing.types'; + +export const PRICING_DEFAULT_COIN_DECIMALS = 18; +export const PRICING_DEFAULT_CACHE_DURATION = 5 * 60 * 1000; +export const PRICING_DEFAULT_PRICING_DENOMINATION = 'usd'; +export const PRICING_DEFAULT_RETRY_INTERVAL = 2000; +export const PRICING_DEFAULT_MAX_TRIES = 3; + +export interface PricingWorkerData { + chainPricingProviderConfigs: Record; + loggerOptions: LoggerOptions; +} + +@Global() +@Injectable() +export class PricingService implements OnModuleInit { + private worker: Worker | null = null; + private requestPortMessageId = 0; + + private setReady!: () => void; + readonly isReady: Promise; + + constructor( + private readonly configService: ConfigService, + private readonly loggerService: LoggerService, + ) { + this.isReady = this.initializeIsReady(); + } + + onModuleInit() { + this.loggerService.info(`Starting Pricing worker...`); + + this.initializeWorker(); + + this.initiateIntervalStatusLog(); + + this.setReady(); + } + + private initializeIsReady(): Promise { + return new Promise((resolve) => { + this.setReady = resolve; + }); + } + + private initializeWorker(): void { + const workerData = this.loadWorkerConfig(); + + this.worker = new Worker(join(__dirname, 'pricing.worker.js'), { + workerData + }); + + this.worker.on('error', (error) => { + this.loggerService.fatal( + { error: tryErrorToString(error) }, + `Error on pricing worker.`, + ); + }); + + this.worker.on('exit', (exitCode) => { + this.worker = null; + this.loggerService.fatal( + { exitCode }, + `Pricing worker exited.`, + ); + }); + } + + private loadWorkerConfig(): PricingWorkerData { + const globalPricingConfig = this.configService.globalConfig.pricing; + + const chainPricingProviderConfigs: Record = {}; + + for (const [chainId, chainConfig] of this.configService.chainsConfig) { + const chainPricingConfig = chainConfig.pricing; + + const provider = chainPricingConfig.provider ?? globalPricingConfig.provider; + if (provider == undefined) { + this.loggerService.warn( + { chainId }, + `No pricing provider specified. Skipping chain. (CHAIN WILL NOT BE ABLE TO RELAY PACKETS)` + ); + continue; + } + + // Set the 'common' pricing configuration + const pricingProviderConfig: PricingProviderConfig = { + provider, + coinDecimals: chainPricingConfig.coinDecimals + ?? globalPricingConfig.coinDecimals + ?? PRICING_DEFAULT_COIN_DECIMALS, + pricingDenomination: chainPricingConfig.pricingDenomination + ?? globalPricingConfig.pricingDenomination + ?? PRICING_DEFAULT_PRICING_DENOMINATION, + cacheDuration: chainPricingConfig.cacheDuration + ?? globalPricingConfig.cacheDuration + ?? PRICING_DEFAULT_CACHE_DURATION, + retryInterval: chainPricingConfig.retryInterval + ?? globalPricingConfig.retryInterval + ?? PRICING_DEFAULT_RETRY_INTERVAL, + maxTries: chainPricingConfig.maxTries + ?? globalPricingConfig.maxTries + ?? PRICING_DEFAULT_MAX_TRIES, + } + + // Set the 'default' provider-specific options (if the chain provider matches the + // default one) + if (provider === globalPricingConfig.provider) { + for (const [key, value] of Object.entries(globalPricingConfig.providerSpecificConfig)) { + pricingProviderConfig[key] = value; + } + } + + // Set the chain provider-specific options (will override any 'default' options set + // that have matching keys) + for (const [key, value] of Object.entries(chainPricingConfig.providerSpecificConfig)) { + pricingProviderConfig[key] = value; + } + + chainPricingProviderConfigs[chainId] = pricingProviderConfig; + } + + return { + chainPricingProviderConfigs: chainPricingProviderConfigs, + loggerOptions: this.loggerService.loggerOptions + } + } + + private initiateIntervalStatusLog(): void { + const logStatus = () => { + const isActive = this.worker != null; + this.loggerService.info( + { isActive }, + 'Pricing worker status.' + ); + }; + setInterval(logStatus, STATUS_LOG_INTERVAL); + } + + + private getNextRequestPortMessageId(): number { + return this.requestPortMessageId++; + } + + async attachToPricing(): Promise { + + await this.isReady; + + const worker = this.worker; + if (worker == undefined) { + throw new Error(`Pricing worker is null.`); + } + + const messageId = this.getNextRequestPortMessageId(); + const portPromise = new Promise((resolve) => { + const listener = (data: PricingGetPortResponse) => { + if (data.messageId === messageId) { + worker.off("message", listener); + resolve(data.port); + } + }; + worker.on("message", listener); + + const portMessage: PricingGetPortMessage = { messageId }; + worker.postMessage(portMessage); + }); + + return portPromise; + } +} \ No newline at end of file diff --git a/src/pricing/pricing.types.ts b/src/pricing/pricing.types.ts new file mode 100644 index 0000000..7c7be0c --- /dev/null +++ b/src/pricing/pricing.types.ts @@ -0,0 +1,48 @@ +import { MessagePort } from "worker_threads"; + + + +// Port Channels Types +// ************************************************************************************************ +export interface PricingGetPortMessage { + messageId: number; +} + +export interface PricingGetPortResponse { + messageId: number; + port: MessagePort; +} + + +export interface GetPriceMessage { + messageId: number; + chainId: string; + amount: bigint; + tokenId?: string; +} + +export interface GetPriceResponse { + messageId: number; + chainId: string; + amount: bigint; + price: number | null; + tokenId?: string; +} + + + +// Controller Types +// ************************************************************************************************ + +export interface GetPriceQuery { + chainId: string; + tokenId?: string; + amount: string; +} + +export interface GetPriceQueryResponse { + chainId: string; + tokenId?: string; + amount: string; + price: number | null; +} \ No newline at end of file diff --git a/src/pricing/pricing.worker.ts b/src/pricing/pricing.worker.ts new file mode 100644 index 0000000..993792e --- /dev/null +++ b/src/pricing/pricing.worker.ts @@ -0,0 +1,97 @@ +import pino from "pino"; +import { BasePricingProvider, PricingProviderConfig, loadPricingProvider } from "./pricing.provider"; +import { PricingWorkerData } from "./pricing.service"; +import { parentPort, workerData, MessagePort, MessageChannel } from "worker_threads"; +import { GetPriceResponse, PricingGetPortMessage, PricingGetPortResponse, GetPriceMessage } from "./pricing.types"; + + +class PricingWorker { + private readonly config: PricingWorkerData; + + private readonly providers = new Map(); + + private readonly logger: pino.Logger; + + + private portsCount = 0; + private readonly ports: Record = {}; + + constructor() { + this.config = workerData as PricingWorkerData; + this.logger = this.initializeLogger(); + + this.initializeProviders(); + + this.initializePorts(); + } + + + + // Initialization helpers + // ******************************************************************************************** + + private initializeLogger(): pino.Logger { + return pino(this.config.loggerOptions).child({ + worker: 'pricing' + }); + } + + private initializeProviders() { + for (const [chainId, config] of Object.entries(this.config.chainPricingProviderConfigs)) { + this.initializeProvider(chainId, config); + } + } + + private initializeProvider(chainId: string, config: PricingProviderConfig) { + const logger = this.logger.child({ chainId }); + const provider = loadPricingProvider(config, logger); + this.providers.set(chainId, provider); + } + + private initializePorts(): void { + parentPort!.on('message', (message: PricingGetPortMessage) => { + const port = this.registerNewPort(); + const response: PricingGetPortResponse = { + messageId: message.messageId, + port + }; + parentPort!.postMessage(response, [port]); + }); + } + + private registerNewPort(): MessagePort { + + const portId = this.portsCount++; + + const { port1, port2 } = new MessageChannel(); + + port1.on('message', (request: GetPriceMessage) => { + const pricePromise = this.getPrice(request.chainId, request.amount, request.tokenId); + void pricePromise.then((price) => { + const response: GetPriceResponse = { + messageId: request.messageId, + chainId: request.chainId, + amount: request.amount, + price + }; + port1.postMessage(response); + }); + }) + + this.ports[portId] = port1; + + return port2; + } + + private async getPrice(chainId: string, amount: bigint, tokenId?: string): Promise { + const provider = this.providers.get(chainId); + if (provider == undefined) { + return null; + } + + return provider.getPrice(amount, tokenId); + } + +} + +new PricingWorker(); diff --git a/src/pricing/providers/coin-gecko.ts b/src/pricing/providers/coin-gecko.ts new file mode 100644 index 0000000..dceec2e --- /dev/null +++ b/src/pricing/providers/coin-gecko.ts @@ -0,0 +1,55 @@ +import pino from "pino"; +import axios from "axios"; +import { PricingProviderConfig, PricingProvider } from "../pricing.provider"; + +export const PRICING_TYPE_COIN_GECKO = 'coin-gecko'; +export const BASE_COIN_GECKO_URL = 'https://api.coingecko.com/api/v3'; + +//TODO add support for an api key + +export interface CoinGeckoPricingConfig extends PricingProviderConfig { + gasCoinId: string; +} + +export class CoinGeckoPricingProvider extends PricingProvider { + readonly pricingProviderType = PRICING_TYPE_COIN_GECKO; + + private readonly client = axios.create({ + baseURL: BASE_COIN_GECKO_URL, + }) + + constructor( + config: CoinGeckoPricingConfig, + logger: pino.Logger, + ) { + super(config, logger); + this.validateCoinGeckoConfig(config); + } + + private validateCoinGeckoConfig(config: CoinGeckoPricingConfig): void { + if (config.gasCoinId == undefined) { + throw new Error('Invalid CoinGecko config: no gasCoinId specified.') + } + } + + async queryCoinPrice(tokenId?: string): Promise { + + const coinId = tokenId ?? this.config.gasCoinId; + const denom = this.config.pricingDenomination.toLowerCase(); + const path = `/simple/price?ids=${coinId}&vs_currencies=${denom}`; + + const { data } = await this.client.get(path); + + const price = Number(data[coinId]?.[denom]); + + if (isNaN(price)) { + throw new Error( + `Failed to parse api query response (url ${BASE_COIN_GECKO_URL}, path ${path}, response ${JSON.stringify(data)})` + ); + } + + return price; + } +} + +export default CoinGeckoPricingProvider; diff --git a/src/pricing/providers/fixed.ts b/src/pricing/providers/fixed.ts new file mode 100644 index 0000000..31990cb --- /dev/null +++ b/src/pricing/providers/fixed.ts @@ -0,0 +1,25 @@ +import pino from "pino"; +import { PricingProviderConfig, PricingProvider } from "../pricing.provider"; + +export const PRICING_TYPE_FIXED = 'fixed'; + +export interface FixedPricingConfig extends PricingProviderConfig { + value: number; +} + +export class FixedPricingProvider extends PricingProvider { + readonly pricingProviderType = PRICING_TYPE_FIXED; + + constructor( + config: FixedPricingConfig, + logger: pino.Logger, + ) { + super(config, logger); + } + + async queryCoinPrice(): Promise { + return this.config.value; + } +} + +export default FixedPricingProvider; diff --git a/src/resolvers/arbitrum.ts b/src/resolvers/arbitrum.ts index 89403ce..c9dfb39 100644 --- a/src/resolvers/arbitrum.ts +++ b/src/resolvers/arbitrum.ts @@ -1,13 +1,22 @@ -import { JsonRpcProvider } from "ethers6"; -import { Resolver, ResolverConfig } from "./resolver"; +import { Interface, JsonRpcProvider, TransactionRequest } from "ethers6"; +import { GasEstimateComponents, Resolver, ResolverConfig } from "./resolver"; import pino from "pino"; import { tryErrorToString, wait } from "src/common/utils"; export const RESOLVER_TYPE_ARBITRUM = 'arbitrum'; +// Arbitrum NodeInterface docs: +// https://docs.arbitrum.io/build-decentralized-apps/nodeinterface/reference +const ARBITRUM_NODE_INTERFACE_ADDRESS = '0x00000000000000000000000000000000000000c8'; +const GAS_ESTIMATE_COMPONENTS_SIGNATURE = 'function gasEstimateComponents(address to, bool contractCreation, bytes calldata data) returns (uint64, uint64, uint256, uint256)'; + export class ArbitrumResolver extends Resolver { override readonly resolverType; + private arbitrumNodeInterface = new Interface([ + GAS_ESTIMATE_COMPONENTS_SIGNATURE + ]); + constructor( config: ResolverConfig, provider: JsonRpcProvider, @@ -65,6 +74,50 @@ export class ArbitrumResolver extends Resolver { throw new Error(`Failed to map an 'observedBlockNumber' to an 'l1BlockNumber'. Max tries reached.`); }; + override async estimateGas( + transactionRequest: TransactionRequest + ): Promise { + + // This function relies on Arbitrum's 'gasEstimateComponents' to estimate the gas components. + // https://github.com/OffchainLabs/nitro-contracts/blob/1cab72ff3dfcfe06ceed371a9db7a54a527e3bfb/src/node-interface/NodeInterface.sol#L84 + + // Set the requested transaction's 'to' and 'data' fields within the + // 'gasEstimateComponents' function arguments, as these fields will be replaced when + // calling the `gasEstimateComponents` function. + const transactionData = this.arbitrumNodeInterface.encodeFunctionData( + "gasEstimateComponents", + [ + transactionRequest.to, + false, // 'contractCreation' + transactionRequest.data ?? "0x" + ] + ); + + const result = await this.provider.call({ + ...transactionRequest, + to: ARBITRUM_NODE_INTERFACE_ADDRESS, // Replace the 'to' address with Arbitrum's NodeInterface address. + data: transactionData // Replace the tx data with the encoded function arguments above. + }); + + const decodedResult = this.arbitrumNodeInterface.decodeFunctionResult( + "gasEstimateComponents", + result + ); + + const gasEstimate: bigint = decodedResult[0]; + const l1GasEstimate: bigint = decodedResult[1]; + + if (l1GasEstimate > gasEstimate) { + throw new Error(`Error on 'gasEstimateComponents' call (Arbitrum): returned 'l1GasEstimate' is larger than 'gasEstimate'.`); + } + + return { + gasEstimate, + observedGasEstimate: gasEstimate - l1GasEstimate, + additionalFeeEstimate: 0n, + } + + } } export default ArbitrumResolver; diff --git a/src/resolvers/base-sepolia.ts b/src/resolvers/base-sepolia.ts new file mode 100644 index 0000000..2bbb034 --- /dev/null +++ b/src/resolvers/base-sepolia.ts @@ -0,0 +1,24 @@ +import pino from "pino"; +import { JsonRpcProvider } from "ethers6"; +import { ResolverConfig } from "./resolver"; +import OPStackResolver from "./op-stack"; + +export const BASE_SEPOLIA_CHAIN_NAME = 'baseSepolia'; + +export class BaseSepoliaResolver extends OPStackResolver { + + constructor( + config: ResolverConfig, + provider: JsonRpcProvider, + logger: pino.Logger, + ) { + super( + BASE_SEPOLIA_CHAIN_NAME, + config, + provider, + logger, + ); + } +} + +export default BaseSepoliaResolver; diff --git a/src/resolvers/base.ts b/src/resolvers/base.ts new file mode 100644 index 0000000..ada6095 --- /dev/null +++ b/src/resolvers/base.ts @@ -0,0 +1,24 @@ +import pino from "pino"; +import { JsonRpcProvider } from "ethers6"; +import { ResolverConfig } from "./resolver"; +import OPStackResolver from "./op-stack"; + +export const BASE_CHAIN_NAME = 'base'; + +export class BaseResolver extends OPStackResolver { + + constructor( + config: ResolverConfig, + provider: JsonRpcProvider, + logger: pino.Logger, + ) { + super( + BASE_CHAIN_NAME, + config, + provider, + logger, + ); + } +} + +export default BaseResolver; diff --git a/src/resolvers/op-stack.ts b/src/resolvers/op-stack.ts new file mode 100644 index 0000000..aa8f4c2 --- /dev/null +++ b/src/resolvers/op-stack.ts @@ -0,0 +1,54 @@ +import { JsonRpcProvider, TransactionRequest } from "ethers6"; +import { Resolver, ResolverConfig } from "./resolver"; +import pino from "pino"; +import { createPublicClient, http } from "viem"; +import { publicActionsL2 } from 'viem/op-stack' + +export const RESOLVER_TYPE_OP_STACK = 'op-stack'; + +export class OPStackResolver extends Resolver { + override readonly resolverType; + + private client: any; //TODO use VIEM types + + constructor( + chainName: string, + config: ResolverConfig, + provider: JsonRpcProvider, + logger: pino.Logger, + ) { + super( + config, + provider, + logger, + ); + + this.resolverType = RESOLVER_TYPE_OP_STACK; + + this.client = this.loadClient( + chainName, + this.provider._getConnection().url //TODO the 'rpc' url should be added to the ResolverConfig + ); + } + + private loadClient( + chainName: string, + rpc: string, + ): any { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const chain = require(`viem/chains`)[chainName]; + + return createPublicClient({ + chain, + transport: http(rpc), + }).extend(publicActionsL2()); + } + + override async estimateAdditionalFee( + transactionRequest: TransactionRequest + ): Promise { + return this.client.estimateL1Fee(transactionRequest) + } +} + +export default OPStackResolver; diff --git a/src/resolvers/optimism-sepolia.ts b/src/resolvers/optimism-sepolia.ts new file mode 100644 index 0000000..1fec480 --- /dev/null +++ b/src/resolvers/optimism-sepolia.ts @@ -0,0 +1,24 @@ +import pino from "pino"; +import { JsonRpcProvider } from "ethers6"; +import { ResolverConfig } from "./resolver"; +import OPStackResolver from "./op-stack"; + +export const OPTIMISM_SEPOLIA_CHAIN_NAME = 'optimismSepolia'; + +export class OptimismSepoliaResolver extends OPStackResolver { + + constructor( + config: ResolverConfig, + provider: JsonRpcProvider, + logger: pino.Logger, + ) { + super( + OPTIMISM_SEPOLIA_CHAIN_NAME, + config, + provider, + logger, + ); + } +} + +export default OptimismSepoliaResolver; diff --git a/src/resolvers/optimism.ts b/src/resolvers/optimism.ts new file mode 100644 index 0000000..c21e72d --- /dev/null +++ b/src/resolvers/optimism.ts @@ -0,0 +1,24 @@ +import pino from "pino"; +import { JsonRpcProvider } from "ethers6"; +import { ResolverConfig } from "./resolver"; +import OPStackResolver from "./op-stack"; + +export const OPTIMISM_CHAIN_NAME = 'optimism'; + +export class OptimismResolver extends OPStackResolver { + + constructor( + config: ResolverConfig, + provider: JsonRpcProvider, + logger: pino.Logger, + ) { + super( + OPTIMISM_CHAIN_NAME, + config, + provider, + logger, + ); + } +} + +export default OptimismResolver; diff --git a/src/resolvers/resolver.ts b/src/resolvers/resolver.ts index 1d1cb1e..ba8b9d1 100644 --- a/src/resolvers/resolver.ts +++ b/src/resolvers/resolver.ts @@ -1,4 +1,4 @@ -import { JsonRpcProvider } from "ethers6"; +import { JsonRpcProvider, TransactionRequest } from "ethers6"; import pino from "pino"; export const RESOLVER_TYPE_DEFAULT = 'default'; @@ -62,6 +62,12 @@ export async function loadResolverAsync( ); } +export interface GasEstimateComponents { + gasEstimate: bigint; // The overall gas usage (used to set the transaction 'gasLimit'). + observedGasEstimate: bigint; // The gas usage observed by the contract. + additionalFeeEstimate: bigint; // Any additional fee incurred by the transaction. +} + export class Resolver { readonly resolverType; @@ -78,4 +84,28 @@ export class Resolver { ): Promise { return new Promise((resolve) => resolve(observedBlockNumber)); }; + + async estimateGas( + transactionRequest: TransactionRequest + ): Promise { + const gasEstimatePromise = this.provider.estimateGas(transactionRequest); + const additionalFeeEstimatePromise = this.estimateAdditionalFee(transactionRequest); + + const [ + gasEstimate, + additionalFeeEstimate + ] = await Promise.all([gasEstimatePromise, additionalFeeEstimatePromise]); + + return { + gasEstimate, + observedGasEstimate: gasEstimate, + additionalFeeEstimate, + }; + } + + estimateAdditionalFee( + _transactionRequest: TransactionRequest + ): Promise { + return new Promise((resolve) => resolve(0n)); + } } diff --git a/src/store/persister/persister.worker.ts b/src/store/persister/persister.worker.ts index 82afaab..374450b 100644 --- a/src/store/persister/persister.worker.ts +++ b/src/store/persister/persister.worker.ts @@ -4,7 +4,7 @@ import { workerData } from 'worker_threads'; import { NodePgDatabase, drizzle } from 'drizzle-orm/node-postgres'; import { migrate } from 'drizzle-orm/node-postgres/migrator'; import { Client } from 'pg'; -import { AmbMessage, BountyJson } from '../types/store.types'; +import { AMBMessage, KeyActionMessage, RelayStateJSON } from '../store.types'; import { bounties, transactions, @@ -13,10 +13,6 @@ import { import { bountyFromJson } from '../postgres/postgres.transformer'; import { and, eq } from 'drizzle-orm'; -type StoreUpdate = { - key: string; - action: 'set' | 'del'; -}; const REDIS_QUEUE_KEY = 'relayer:presister:queue'; @@ -76,47 +72,33 @@ class PersisterWorker { } } - async queueGet(): Promise { - const queue = await this.store.redis.get(REDIS_QUEUE_KEY); - if (queue) return JSON.parse(queue); - return undefined; + async queueGet(): Promise { + const queue = await this.store.redis.lrange(REDIS_QUEUE_KEY, 0, -1); + return queue.map((element) => JSON.parse(element)); } - async queueShift(): Promise { - const queue = await this.store.redis.get(REDIS_QUEUE_KEY); - if (queue) { - const parsedQueue: StoreUpdate[] = JSON.parse(queue); - const returnElement = parsedQueue.shift(); - - await this.store.redis.set(REDIS_QUEUE_KEY, JSON.stringify(parsedQueue)); - - return returnElement; - } - return undefined; + async queueShift(): Promise { + const firstElement = await this.store.redis.lpop(REDIS_QUEUE_KEY); + return firstElement != undefined + ? JSON.parse(firstElement) + : undefined; } - async queuePush(message: StoreUpdate) { - const queue = await this.store.redis.get(REDIS_QUEUE_KEY); - if (queue) { - const parsedQueue: StoreUpdate[] = JSON.parse(queue); - parsedQueue.push(message); - - return this.store.redis.set(REDIS_QUEUE_KEY, JSON.stringify(parsedQueue)); - } else { - return this.store.redis.set(REDIS_QUEUE_KEY, JSON.stringify([message])); - } + async queuePush(message: KeyActionMessage) { + await this.store.redis.rpush(REDIS_QUEUE_KEY, JSON.stringify(message)); } async consumeQueue() { // Copy queue to memory. - while (((await this.queueGet())?.length ?? 0) > 0) { - const message = await this.queueShift(); - if (!message) break; + let nextElement: KeyActionMessage | undefined = await this.queueShift(); + while (nextElement != undefined) { this.logger.info( - `Got a key: ${message.key} with action: ${message.action}`, + `Got a key: ${nextElement.key} with action: ${nextElement.action}`, ); - await this.examineKey(message.key); + await this.examineKey(nextElement.key); + + nextElement = await this.queueShift(); } } @@ -133,7 +115,7 @@ class PersisterWorker { await this.store.on('key', (event: any) => { //TODO verify event format - const message = event as StoreUpdate; + const message = event as KeyActionMessage; void this.queuePush(message); }); // Listen for proofs. Notice that proofs aren't submitted so we need to listen seperately. @@ -149,20 +131,19 @@ class PersisterWorker { // I don't know why, but without the function factory, 'this' is empty and we cannot use this.store or this.logger. async examineKey(key: string) { const keyKeys = key.split(':'); - if (keyKeys.includes(Store.bountyMidfix)) { + if (keyKeys.includes(Store.RELAY_STATE_KEY_PREFIX)) { this.logger.debug(`${key}, bounty`); const value: string | null = await this.store.get(key); if (value === null) return; - const parsedValue: BountyJson = JSON.parse(value); + const parsedValue: RelayStateJSON = JSON.parse(value); // Get or set all transactions. - const { - fromChainId, - toChainId, - submitTransactionHash, - execTransactionHash, - ackTransactionHash, - } = parsedValue; + const fromChainId = parsedValue.bountyPlacedEvent?.fromChainId; + const toChainId = parsedValue.messageDeliveredEvent?.toChainId; + const submitTransactionHash = parsedValue?.bountyPlacedEvent?.transactionHash; + const execTransactionHash = parsedValue?.messageDeliveredEvent?.transactionHash; + const ackTransactionHash = parsedValue?.bountyClaimedEvent?.transactionHash; + let submitTransactionId: number | undefined, execTransactionId: number | undefined, ackTransactionId: number | undefined; @@ -270,11 +251,11 @@ class PersisterWorker { eq(bounties.bountyIdentifier, sqlReadyBounty.bountyIdentifier), ); } - } else if (keyKeys.includes(Store.ambMidfix)) { + } else if (keyKeys.includes(Store.AMB_MESSAGE_KEY_PREFIX)) { this.logger.debug(`${key}, amb`); const value: string | null = await this.store.get(key); if (value === null) return; - const parsedValue: AmbMessage = JSON.parse(value); + const parsedValue: AMBMessage = JSON.parse(value); let bountyId: number; // Get or set an associated bounty. @@ -291,20 +272,30 @@ class PersisterWorker { bountyId = ( await this.db .insert(bounties) - .values({ bountyIdentifier: parsedValue.messageIdentifier }) + .values({ + bountyIdentifier: parsedValue.messageIdentifier, + destinationAddress: parsedValue.toIncentivesAddress, + }) .returning({ id: bounties.id }) )[0]!.id; } else { // Set the bountyId based on the selected. bountyId = bountiesSelected[0]!.id; + // Set the `destinationAddress` within the existing record + await this.db + .update(bounties) + .set({ destinationAddress: parsedValue.toIncentivesAddress }) + .where( + eq(bounties.bountyIdentifier, parsedValue.messageIdentifier), + ); } const sqlReadyBounty: typeof ambPayloads.$inferInsert = { bountyId, amb: parsedValue.amb, - sourceChain: parsedValue.sourceChain, - destinationChain: parsedValue.destinationChain, - payload: parsedValue.payload, + sourceChain: parsedValue.fromChainId, + destinationChain: parsedValue.toChainId, + payload: parsedValue.incentivesPayload, recoveryContext: parsedValue.recoveryContext, }; @@ -327,7 +318,7 @@ class PersisterWorker { this.logger.debug(`Inserting ${key} as amb`); return this.db.insert(ambPayloads).values(sqlReadyBounty); } - } else if (keyKeys.includes(Store.proofMidfix)) { + } else if (keyKeys.includes(Store.AMB_PROOF_KEY_PREFIX)) { this.logger.debug(`${key}, proof`); } return undefined; diff --git a/src/store/postgres/postgres.transformer.ts b/src/store/postgres/postgres.transformer.ts index d4dde18..92194e3 100644 --- a/src/store/postgres/postgres.transformer.ts +++ b/src/store/postgres/postgres.transformer.ts @@ -1,8 +1,8 @@ -import { BountyJson } from '../types/store.types'; +import { RelayStateJSON } from '../store.types'; import { bounties } from './postgres.schema'; export function bountyFromJson( - bounty: BountyJson, + bounty: RelayStateJSON, ): typeof bounties.$inferInsert & { submitTransactionHash?: string; execTransactionHash?: string; @@ -10,17 +10,22 @@ export function bountyFromJson( } { return { bountyIdentifier: bounty.messageIdentifier, - fromChainId: bounty.fromChainId, - toChainId: bounty.toChainId, - maxGasDelivery: bounty.maxGasDelivery?.toString(), - maxGasAck: bounty.maxGasAck?.toString(), - refundGasTo: bounty.refundGasTo, - priceOfDeliveryGas: bounty.priceOfDeliveryGas, - priceOfAckGas: bounty.priceOfAckGas, - targetDelta: bounty.targetDelta, + + fromChainId: bounty.bountyPlacedEvent?.fromChainId, + toChainId: bounty.messageDeliveredEvent?.toChainId, + + maxGasDelivery: bounty.bountyPlacedEvent?.maxGasDelivery?.toString(), + maxGasAck: bounty.bountyPlacedEvent?.maxGasAck?.toString(), + refundGasTo: bounty.bountyPlacedEvent?.refundGasTo, + priceOfDeliveryGas: bounty.bountyIncreasedEvent?.newDeliveryGasPrice + ?? bounty.bountyPlacedEvent?.priceOfDeliveryGas, + priceOfAckGas: bounty.bountyIncreasedEvent?.newAckGasPrice + ?? bounty.bountyPlacedEvent?.priceOfAckGas, + targetDelta: bounty.bountyPlacedEvent?.targetDelta, + bountyStatus: bounty.status, - sourceAddress: bounty.sourceAddress, - destinationAddress: bounty.destinationAddress, + + sourceAddress: bounty.bountyPlacedEvent?.incentivesAddress, }; } diff --git a/src/store/store.controller.ts b/src/store/store.controller.ts index 6d2d8bc..7f18db4 100644 --- a/src/store/store.controller.ts +++ b/src/store/store.controller.ts @@ -1,14 +1,19 @@ import { Body, Controller, Get, Post, Query } from '@nestjs/common'; import { LoggerService } from 'src/logger/logger.service'; import { Store } from './store.lib'; -import { PrioritiseMessage } from './types/store.types'; +import { PrioritiseMessage } from './store.types'; @Controller() export class StoreController { + + private readonly store: Store; + constructor( private readonly loggerService: LoggerService, - ) {} + ) { + this.store = new Store(); + } @Get('getAMBMessages') async getAMBMessages(@Query() query: any): Promise { @@ -19,8 +24,7 @@ export class StoreController { return undefined; //TODO return error } - const store = new Store(chainId); - const amb = await store.getAMBsByTxHash(chainId, txHash); + const amb = await this.store.getAMBMessagesByTransactionHash(chainId, txHash); if (amb != null) return JSON.stringify(amb); } @@ -38,8 +42,8 @@ export class StoreController { `Message prioritisation requested.` ) - const store = new Store(); - await store.setAmbPriority( + await this.store.setAMBMessagePriority( + body.sourceChainId, body.messageIdentifier, true, ); diff --git a/src/store/store.gateway.ts b/src/store/store.gateway.ts index 3a6257b..6b26df3 100644 --- a/src/store/store.gateway.ts +++ b/src/store/store.gateway.ts @@ -1,7 +1,7 @@ import { OnGatewayInit, SubscribeMessage, WebSocketGateway, WsResponse } from "@nestjs/websockets"; import { Observable, Subject } from 'rxjs'; import { LoggerService } from "src/logger/logger.service"; -import { AmbMessage } from "./types/store.types"; +import { AMBMessage } from "./store.types"; import { Store } from "./store.lib"; const newAMBMessageEventName = 'ambMessage'; @@ -12,7 +12,7 @@ export class StoreGateway implements OnGatewayInit { constructor(private readonly loggerService: LoggerService) {} private store = new Store(); - private onAMBMessageObservable = new Subject>(); + private onAMBMessageObservable = new Subject>(); async afterInit() { this.loggerService.info("Store gateway initialized."); @@ -20,7 +20,7 @@ export class StoreGateway implements OnGatewayInit { } @SubscribeMessage(newAMBMessageEventName) - subscribeToAMBMessages(): Observable> { + subscribeToAMBMessages(): Observable> { this.loggerService.info("Client subscribed to new AMB messages.") return this.onAMBMessageObservable; } @@ -28,10 +28,11 @@ export class StoreGateway implements OnGatewayInit { private async listenForNewAMBMessages(): Promise { this.loggerService.info(`Listening for new AMB messages to broadcast.`); - await this.store.on(Store.newAMBChannel, (event: any) => { + const onAMBMessageChannelPattern = Store.getOnAMBMessageChannel('*'); - //TODO verify event format - const message = event as AmbMessage; + await this.store.onPattern(onAMBMessageChannelPattern, (event: any) => { + + const message = event as AMBMessage; this.onAMBMessageObservable.next({ event: newAMBMessageEventName, data: message diff --git a/src/store/store.lib.ts b/src/store/store.lib.ts index fd90351..41b5459 100644 --- a/src/store/store.lib.ts +++ b/src/store/store.lib.ts @@ -1,127 +1,136 @@ import { Redis } from 'ioredis'; -import { BountyStatus } from 'src/store/types/bounty.enum'; import { - AmbMessage, - AmbPayload, - Bounty, - BountyJson, -} from 'src/store/types/store.types'; + AMBMessage, + AMBProof, + BountyClaimedEventDetails, + BountyIncreasedEventDetails, + BountyPlacedEventDetails, + RelayState, + RelayStateJSON, + RelayStatus, + MessageDeliveredEventDetails, + KeyActionMessage, + AMBMessageJSON, + AMBProofJSON, +} from 'src/store/store.types'; // Monkey patch BigInt. https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291 (BigInt.prototype as any).toJSON = function () { return this.toString(); }; + +// Constants const DEFAULT_REDIS_PORT = 6379; const DEFAULT_REDIS_DB_INDEX = 4; -//---------- STORE LAYOUT ----------// -// The redis store is used for 2 things: -// 1. Storing bounty information. -// 2. pub/sub for communication between workers. - -// For the storage, bounties are stored against their messageIdentifier. - -// For pub/sub, below are a list of the channels being used: -// 'submit-': { messageIdentifier, destinationChain, message, messageCtx, priority? } -// 'amb': { messageIdentifier, destinationChain, payload } -// 'key': { key, action} - -// Below is a list of general todos on this library. -// TODO: add chainId to the index. -// TODO: Carify storage types: Move Bounty type here? -// TODO: Fix cases where bounty doesn't exist. - -//---------- UNIQUE KEYS ----------// -// Generalised Incentives uses a message identifier: -// return keccak256( -// abi.encodePacked( -// bytes32(block.number), -// chainId(), <-- Assume to be ~unique for an AMB. -// destinationIdentifier, -// message -// ) -// ); -// Assume that only 1 AMB exist -// The result is that the message identifier is unique. -// In a single block, there cannot be 2 equal message identifiers since there is a check to protect -// against 2 equal active message identifiers. Between 2 different blocks they aren't the same since -// hash contains the block number. - -// Now assume multiple exists. None of the previous findings apply since if any -// 2 AMBs share similar chain ids structures you could compute an equal value. - -// As a result, we need to add the AMB id to the message identifier. -// TODO: Figure out how to do. + +// ! IMPORTANT +// ! The 'RelayState' information (i.e. the bounty/message state information gathered from the +// ! GeneralisedIncentives events) is stored just under the `messageIdentifier` that is present on +// ! the queried events. This `messageIdentifier` is generated by the GeneralisedIncentives +// ! contracts; nothing prevents a malicious contract from crafting an identifier that clashes with +// ! that of another GenerlisedIncentives contract. +// ! +// ! Ideally, the 'RelayState' data storage should be also indexed by the source chain id and the +// ! emitting contract address. However, given the limited information contained by the +// ! GeneralisedIncentives events, this is quite complex to achieve. +// ! +// ! For the correct operation of this store it is very important for the `messageIdentifier`s +// ! across the GeneralisedIncentives implementations not to collide. This will always be the +// ! case when using the unaltered GeneralisedIncentives contracts, each deployed with a unique +// ! `uniqueSourceIdentifier`. + + +// TODO find a way to add the chainId to the RelayState index? +// TODO add the 'amb' to the RelayState index? + export class Store { + + // Redis Keys + static readonly KEY_SEPARATOR: string = ':'; + + static readonly RELAY_STATE_KEY_PREFIX: string = 'relay_state'; + static readonly AMB_MESSAGE_KEY_PREFIX: string = 'amb_message'; + static readonly AMB_PROOF_KEY_PREFIX: string = 'amb_proof'; + static readonly AMB_TRANSACTION_HASH_MAP_KEY_PREFIX: string = 'amb_transaction_hash_map'; + + // Redis Channels + static readonly ON_KEY_CHANGE_CHANNEL: string = 'on_key_change_channel'; + static readonly ON_AMB_MESSAGE_CHANNEL_PREFIX: string = 'on_amb_message_channel'; + static readonly ON_AMB_PROOF_CHANNEL_PREFIX: string = 'on_amb_proof_channel'; + + readonly redis: Redis; + readonly redisSubscriptions: Redis; readonly redisHost: string | undefined; readonly redisPort: number; readonly redisDBIndex: number; - // When a redis connection is used to listen for subscriptions, it cannot be - // used for anything except to modify the subscription set which is being listened - // to. As a result, we need a dedicated connection if we ever decide to listen to - // subscriptions. - redisSubscriptions: Redis | undefined; - - static readonly relayerStorePrefix: string = 'relayer'; - static readonly bountyMidfix: string = 'bounty'; - static readonly ambMidfix: string = 'amb'; - static readonly ambPayloadMidfix: string = 'ambPayload'; - static readonly hashAmbMapMidfix: string = 'hashAmbMap'; - static readonly proofMidfix: string = 'proof'; - static readonly wordConnecter: string = ':'; - static readonly destinationAddressPostfix: string = 'destinationAddress'; + private readonly redisConnections: Redis[] = []; - static readonly newAMBChannel: string = 'newAMBChannel'; - readonly chainId: string | null; - - // If chainId is set to null, this should only be used for reading. - constructor(chainId: string | null = null) { - this.chainId = chainId; + constructor() { this.redisHost = this.loadRedisHost(); this.redisPort = this.loadRedisPort(); this.redisDBIndex = this.loadRedisDBIndex(); - this.redis = new Redis(this.redisPort, { - db: this.redisDBIndex, - host: this.redisHost, - }); + // Once a 'redis' connection is used for subscriptions, it may not be used to manage the + // redis storage. Keep 2 distinct redis objects for each purpose. + this.redis = this.getRedisConnection(); + this.redisSubscriptions = this.getRedisConnection(); } + + + // Initialization and state/redis management utils + // ******************************************************************************************** + private loadRedisHost(): string | undefined { return process.env['REDIS_HOST']; } private loadRedisPort(): number { - return process.env['REDIS_PORT'] ? parseInt(process.env['REDIS_PORT']) : DEFAULT_REDIS_PORT; + return process.env['REDIS_PORT'] + ? parseInt(process.env['REDIS_PORT']) + : DEFAULT_REDIS_PORT; } private loadRedisDBIndex(): number { - return process.env['REDIS_DB_INDEX'] ? parseInt(process.env['REDIS_DB_INDEX']) : DEFAULT_REDIS_DB_INDEX; + return process.env['REDIS_DB_INDEX'] + ? parseInt(process.env['REDIS_DB_INDEX']) + : DEFAULT_REDIS_DB_INDEX; + } + + getRedisConnection(): Redis { + const redis = new Redis(this.redisPort, { + db: this.redisDBIndex, + host: this.redisHost, + }); + + this.redisConnections.push(redis); + + return redis; } async quit(): Promise { - await this.redis.quit(); + const quitPromises = this.redisConnections.map( + (redis) => redis.quit() + ); + + await Promise.all(quitPromises); } - // ----- Translation ----- + - async scan(callback: (key: string) => void) { - const stream = this.redis.scanStream({ - match: `${Store.relayerStorePrefix}:*`, - }); + // Key management helpers + // ******************************************************************************************** - stream.on('data', (keys) => { - for (const key of keys) { - callback(key); - } - }); + static formatKey(...components: string[]): string { + return components.join(Store.KEY_SEPARATOR); } async get(key: string) { @@ -129,481 +138,484 @@ export class Store { } async set(key: string, value: string) { - // We want to notify a potential subscribed that there has been a change to this key. - // Lets set the key first. await this.redis.set(key, value); - // Then post that message. - await this.postMessage('key', { key, action: 'set' }); + await this.postMessage( + Store.ON_KEY_CHANGE_CHANNEL, + { key, action: 'set' } + ); } async del(key: string) { await this.redis.del(key); - await this.postMessage('key', { key, action: 'del' }); - } - - // ----- Subscriptions ------ - - /** - * @notice Use this function to get a redis connection for any subscriptions. - * This is because when a SUBSCRIBE calls goes out to redis, the connection can - * only be used to modify the subscriptions or receive them. As a result, any - * redis.get or redis.set or redis.del does not work. - */ - getOrOpenSubscription(): Redis { - if (!this.redisSubscriptions) { - this.redisSubscriptions = new Redis(this.redisPort, { - db: this.redisDBIndex, - host: this.redisHost, - }); - } - return this.redisSubscriptions; + await this.postMessage( + Store.ON_KEY_CHANGE_CHANNEL, + { key, action: 'del' } + ); } + - static getChannel(channel: string, describer: string): string { - return Store.combineString(channel, describer); - } - static combineString(...vals: string[]): string { - return vals.join(Store.wordConnecter); + // Channel helpers + // ******************************************************************************************** + + static getChannel(...components: string[]): string { + return components.join(Store.KEY_SEPARATOR); } - async postMessage(channel: string, payload: { [key: string]: any }) { + async postMessage( + channel: string, + payload: T, + ) { return this.redis.publish( - Store.combineString(Store.relayerStorePrefix, channel), + channel, JSON.stringify(payload), ); } - async on( + async on( channel: string, - callback: (payload: { [key: string]: any }) => void, + callback: (payload: T) => void, ) { - const redisSubscriptions = this.getOrOpenSubscription(); - // Subscribe to the channel so that we get messages. - const channelWithprefix = Store.combineString( - Store.relayerStorePrefix, - channel, - ); - await redisSubscriptions.subscribe(channelWithprefix); - // Set the callback when we receive messages function. - redisSubscriptions.on('message', (redis_channel, redis_message) => { - if (redis_channel === channelWithprefix) - callback(JSON.parse(redis_message)); + await this.redisSubscriptions.subscribe(channel); + + this.redisSubscriptions.on('message', (callbackChannel, callbackMessage) => { + if (callbackChannel === channel) { + callback(JSON.parse(callbackMessage)); + } + }); + } + + async onPattern( + pattern: string, + callback: (payload: T) => void, + ) { + await this.redisSubscriptions.psubscribe(pattern); + + this.redisSubscriptions.on('pmessage', (callbackPattern, _, callbackMessage) => { + if (callbackPattern === pattern) { + callback(JSON.parse(callbackMessage)); + } }); } - // ----- Bounties ------ - //TODO also filter by chain? - async getBounty(messageIdentifier: string): Promise { - const query: string | null = await this.redis.get( - Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, - messageIdentifier, - ), + + // Relay state utils + // ******************************************************************************************** + + static getRelayStateKey(messageIdentifier: string): string { + return Store.formatKey( + Store.RELAY_STATE_KEY_PREFIX, + messageIdentifier.toLowerCase(), ); - const bounty: Bounty | null = - query === null ? undefined : JSON.parse(query); - if ( - bounty != null && - bounty.priceOfDeliveryGas && - bounty.priceOfAckGas && - bounty.targetDelta - ) { - bounty.priceOfDeliveryGas = BigInt(bounty.priceOfDeliveryGas); - bounty.priceOfAckGas = BigInt(bounty.priceOfAckGas); - bounty.targetDelta = BigInt(bounty.targetDelta); - } else { - // TODO: handle this case better. + } + + + async getRelayStateByKey(key: string): Promise { + + const data = await this.redis.get(key); + + const rawState = data != null + ? JSON.parse(data) + : null; + + if (rawState == null) { return null; } - return bounty; - } - - /** - * @dev This is generally assumed to be the first time that a bounty is ever seen. - * However, we also wanna be able to run the relayer in a way where registerBountyPlaced might be called - * AFTER it has already been stored. (say the relayer is rerun from scratch on an already populated redis store) - */ - async registerBountyPlaced(event: { - messageIdentifier: string; - incentive: any; - incentivesAddress: string; - transactionHash: string; - }) { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const messageIdentifier = event.messageIdentifier; - const incentive = event.incentive; - - //TODO after the ethers 6 upgrade `maxGasDelivery` and `maxGasAck` are now a bigint. The rest of the code should be refactored/reviewed to work with this change (including persister/explorer). - let bounty: Bounty = { - messageIdentifier: messageIdentifier, - fromChainId: chainId, - maxGasDelivery: Number(incentive.maxGasDelivery), - maxGasAck: Number(incentive.maxGasAck), - refundGasTo: incentive.refundGasTo, - priceOfDeliveryGas: incentive.priceOfDeliveryGas, - priceOfAckGas: incentive.priceOfAckGas, - targetDelta: incentive.targetDelta, - status: BountyStatus.BountyPlaced, - sourceAddress: event.incentivesAddress, - finalised: false, - submitTransactionHash: event.transactionHash, + + // Recover format of types lost on JSON.stringify (bigints). + return { + ...rawState, + + bountyPlacedEvent: rawState.bountyPlacedEvent != undefined + ? { + ...rawState.bountyPlacedEvent, + maxGasDelivery: BigInt(rawState.bountyPlacedEvent.maxGasDelivery), + maxGasAck: BigInt(rawState.bountyPlacedEvent.maxGasAck), + priceOfDeliveryGas: BigInt(rawState.bountyPlacedEvent.priceOfDeliveryGas), + priceOfAckGas: BigInt(rawState.bountyPlacedEvent.priceOfAckGas), + targetDelta: BigInt(rawState.bountyPlacedEvent.targetDelta), + } + : undefined, + + bountyIncreasedEvent: rawState.bountyIncreasedEvent != undefined + ? { + ...rawState.bountyIncreasedEvent, + newDeliveryGasPrice: BigInt(rawState.bountyIncreasedEvent.newDeliveryGasPrice), + newAckGasPrice: BigInt(rawState.bountyIncreasedEvent.newAckGasPrice), + } + : undefined, + + deliveryGasCost: rawState.deliveryGasCost != undefined + ? BigInt(rawState.deliveryGasCost) + : undefined, }; + } - const key = Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, - messageIdentifier, - ); + async getRelayState(messageIdentifier: string): Promise { + const key = Store.getRelayStateKey(messageIdentifier); + return this.getRelayStateByKey(key); + } + + + // Update the saved RelayState using the existing and incoming state information. + private async updateRelayState(incomingState: RelayState): Promise { + + const key = Store.getRelayStateKey(incomingState.messageIdentifier); + + const data = await this.redis.get(key); + const currentState: RelayStateJSON | null = data != null + ? JSON.parse(data) + : null; + + const overridingState = currentState != null; + const newState = overridingState ? currentState : incomingState; + + if (overridingState) { + newState.bountyPlacedEvent = incomingState.bountyPlacedEvent + ?? currentState.bountyPlacedEvent; + newState.messageDeliveredEvent = incomingState.messageDeliveredEvent + ?? currentState.messageDeliveredEvent; + newState.bountyClaimedEvent = incomingState.bountyClaimedEvent + ?? currentState.bountyClaimedEvent; + + // Only override the 'BountyIncreased' event data if the new prices are higher than the + // currently registered ones (events may not be processed in order). + if (currentState.bountyIncreasedEvent && incomingState.bountyIncreasedEvent) { + const currentIncreaseEvent = currentState.bountyIncreasedEvent; + const incomingIncreaseEvent = incomingState.bountyIncreasedEvent; + + // NOTE: if either field increases, it is guaranteed that the other field will not + // have decreased. + if ( + incomingIncreaseEvent.newDeliveryGasPrice > BigInt(currentIncreaseEvent.newDeliveryGasPrice) + || incomingIncreaseEvent.newAckGasPrice > BigInt(currentIncreaseEvent.newAckGasPrice) + ) { + newState.bountyIncreasedEvent = incomingState.bountyIncreasedEvent; + } else { + newState.bountyIncreasedEvent = currentState.bountyIncreasedEvent; + } + } + else { + newState.bountyIncreasedEvent = currentState.bountyIncreasedEvent + ?? incomingState.bountyIncreasedEvent; + } + + newState.deliveryGasCost = incomingState.deliveryGasCost + ?? currentState.deliveryGasCost; + } - // Check if there exists an object already here. - const existingValue = await this.get(key); - if (existingValue) { - // There are 2 ways for there to already be a key here. - // 1. The key was set by another event on another chain because the origin chain is too slow / we missed the event. - // 2. We are going over blocks again and hit this event. Either way, we should set the key again but not modify anything which could have - // been entered or modified. - // As a result, fill out the bounty but override the bounty information by anything which might already be present. - bounty = { - ...bounty, // Init the dictionary with the bounty. - ...JSON.parse(existingValue), // Then overwrite with anything that is already stored. - }; + if (newState.bountyClaimedEvent) { + newState.status = RelayStatus.BountyClaimed; + } else if (newState.messageDeliveredEvent) { + newState.status = RelayStatus.MessageDelivered; + } else { + newState.status = RelayStatus.BountyPlaced; } - await this.set(key, JSON.stringify(bounty)); - } - - /** - * Register the destination address of a bounty. - */ - async registerDestinationAddress(event: { - messageIdentifier: string; - destinationAddress: string; - }) { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const messageIdentifier = event.messageIdentifier; - - // Lets get the bounty. - const key = Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, + + await this.set(key, JSON.stringify(newState)); + } + + + async setBountyPlaced( + messageIdentifier: string, + bountyPlacedEvent: BountyPlacedEventDetails, + ) { + const relayState: RelayState = { + status: RelayStatus.BountyPlaced, messageIdentifier, - Store.destinationAddressPostfix, - ); + bountyPlacedEvent, + }; + + await this.updateRelayState(relayState); + } - const bounty = { + async setMessageDelivered( + messageIdentifier: string, + messageDeliveredEvent: MessageDeliveredEventDetails, + ) { + const relayState: RelayState = { + status: RelayStatus.MessageDelivered, messageIdentifier, - destinationAddress: event.destinationAddress, + messageDeliveredEvent, }; - // We can set this value now. - return this.set(key, JSON.stringify(bounty)); - } - - /** - * @dev This is generally assumed to be the first time the event is seen and the second time that a bounty is seen. - * However, we also wanna be able to run the relayer in a way where the event is seen for the second time AND/OR - * it is the first time the bounty has been seen. - */ - async registerMessageDelivered(event: { - messageIdentifier: string; - incentivesAddress: string; - transactionHash: string; - }) { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const messageIdentifier = event.messageIdentifier; - - // Lets get the bounty. - const key = Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, + + await this.updateRelayState(relayState); + } + + async setBountyClaimed( + messageIdentifier: string, + bountyClaimedEvent: BountyClaimedEventDetails, + ) { + const relayState: RelayState = { + status: RelayStatus.MessageDelivered, messageIdentifier, - ); - const existingValue = await this.redis.get(key); - if (!existingValue) { - // Then we need to create some kind of baseline with the information we know. - const bounty = { - messageIdentifier: messageIdentifier, // we know the ID. The ID isn't going to change. - status: BountyStatus.MessageDelivered, // Well, we know the the message has now been delivered. - execTransactionHash: event.transactionHash, - toChainId: this.chainId, - }; - // We can set this value now. - return this.set(key, JSON.stringify(bounty)); - } - // Okay, we know a bounty exists at this value. Lets try to update it without destorying any information. - const bountyAsRead: BountyJson = JSON.parse(existingValue); - const bounty = { - destinationAddress: event.incentivesAddress, - ...bountyAsRead, - status: Math.max(bountyAsRead.status, BountyStatus.MessageDelivered), - execTransactionHash: event.transactionHash, - toChainId: this.chainId, + bountyClaimedEvent, }; - await this.set(key, JSON.stringify(bounty)); - } - - /** - * @dev This is generally assumed to be the first time the event is seen and the third time that a bounty is seen. - * However, we also wanna be able to run the relayer in a way where the event is seen for the second time AND/OR - * it is the first time the bounty has been seen. - */ - async registerBountyClaimed(event: { - messageIdentifier: string; - incentivesAddress: string; - transactionHash: string; - }) { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const messageIdentifier = event.messageIdentifier; - - // Lets get the bounty. - const key = Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, + + await this.updateRelayState(relayState); + } + + async setBountyIncreased( + messageIdentifier: string, + bountyIncreasedEvent: BountyIncreasedEventDetails, + ) { + const relayState: RelayState = { + status: RelayStatus.MessageDelivered, messageIdentifier, - ); - const existingValue = await this.redis.get(key); - if (!existingValue) { - // Then we need to create some kind of baseline with the information we know. - const bounty = { - messageIdentifier: messageIdentifier, // we know the ID. The ID isn't going to change. - status: BountyStatus.BountyClaimed, // Well, we know the the message has now been delivered. - ackTransactionHash: event.transactionHash, - fromChainId: this.chainId, - sourceAddress: event.incentivesAddress, - }; - // We can set this value now. - return this.set(key, JSON.stringify(bounty)); - } - // Okay, we know a bounty exists at this value. Lets try to update it without destorying any information. - const bountyAsRead: BountyJson = JSON.parse(existingValue); - const bounty = { - sourceAddress: event.incentivesAddress, - ...bountyAsRead, - status: Math.max(BountyStatus.BountyClaimed, bountyAsRead.status), - ackTransactionHash: event.transactionHash, - fromChainId: this.chainId, + bountyIncreasedEvent, }; - await this.set(key, JSON.stringify(bounty)); - } - - /** - * @dev This is STRICTLY assumed to be the second time that a bounty is seen. - * This function cannot handle the case where it is the first time that the bounty is seen. - */ - async registerBountyIncreased(event: { - messageIdentifier: string; - newDeliveryGasPrice: bigint; - newAckGasPrice: bigint; - incentivesAddress: string; - transactionHash: string; - }) { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const messageIdentifier = event.messageIdentifier; - const newDeliveryGasPrice: bigint = event.newDeliveryGasPrice; - const newAckGasPrice: bigint = event.newAckGasPrice; - - // Lets get the bounty. - const key = Store.combineString( - Store.relayerStorePrefix, - Store.bountyMidfix, + + await this.updateRelayState(relayState); + } + + async setDeliveryCost( + messageIdentifier: string, + deliveryGasCost: bigint, + ): Promise { + const relayState: RelayState = { + status: RelayStatus.MessageDelivered, messageIdentifier, + deliveryGasCost, + }; + + await this.updateRelayState(relayState); + } + + + + // AMB data utils + // ******************************************************************************************** + + // ! NOTE: AMB messages are stored under the source chain id, whereas AMB proofs are stored + // ! under the destination chain id. + + // ! Filter by `chainId` to prevent message deliveries/acks from overwriting each other. + static getAMBMessageKey( + chainId: string, + messageIdentifier: string + ): string { + return Store.formatKey( + Store.AMB_MESSAGE_KEY_PREFIX, + chainId.toLowerCase(), + messageIdentifier.toLowerCase(), ); - const existingValue = await this.redis.get(key); - if (!existingValue) { - // Then we need to create some kind of baseline with the information we know. - const bounty = { - messageIdentifier: messageIdentifier, // we know the ID. The ID isn't going to change. - priceOfDeliveryGas: newDeliveryGasPrice, - priceOfAckGas: newAckGasPrice, - sourceAddress: event.incentivesAddress, - }; - // We can set this value now. - return this.set(key, JSON.stringify(bounty)); - } - // We know a bounty exists at this value. - const bountyAsRead: BountyJson = JSON.parse(existingValue); - // Lets check if there exists values for it, otherwise set to 0. Remember, these are stored as strings. - const currentDeliveryGasPrice = BigInt( - bountyAsRead.priceOfDeliveryGas ?? '0', + } + + // ! Filter by `chainId` to prevent message deliveries/acks from overwriting each other. + static getAMBProofKey( + chainId: string, + messageIdentifier: string + ): string { + return Store.formatKey( + Store.AMB_PROOF_KEY_PREFIX, + chainId.toLowerCase(), + messageIdentifier.toLowerCase(), + ); + } + + // Key to be used to store any additional information required by the AMB-specific collector. + static getAdditionalAMBDataKey( + amb: string, + key: string + ): string { + return Store.formatKey( + Store.AMB_PROOF_KEY_PREFIX, + amb, + key, ); - const currentAckGasPrice = BigInt(bountyAsRead.priceOfAckGas ?? '0'); - // Otherwise we need to check get the maximums of current and observed new values. - const hasDeliveryGasPriceIncreased = - currentDeliveryGasPrice < newDeliveryGasPrice; - const hasAckGasPriceIncreased = currentAckGasPrice < newAckGasPrice; - const hasChanged = hasDeliveryGasPriceIncreased || hasAckGasPriceIncreased; - // If hasChanged is false, then we don't need to do anything. - if (hasChanged) { - const newBounty = { - sourceAddress: event.incentivesAddress, - ...bountyAsRead, - priceOfDeliveryGas: hasDeliveryGasPriceIncreased - ? newDeliveryGasPrice - : currentDeliveryGasPrice, - priceOfAckGas: hasAckGasPriceIncreased - ? newAckGasPrice - : currentAckGasPrice, - }; - - await this.set(key, JSON.stringify(newBounty)); - } } - // ----- AMB ------ + static getAMBMessagesByTransactionHashKey( + chainId: string, + txHash: string, + ): string { + return Store.formatKey( + Store.AMB_TRANSACTION_HASH_MAP_KEY_PREFIX, + chainId.toLowerCase(), + txHash.toLowerCase(), + ); + } + + - async getAmb(swapIdentifier: string): Promise { - const query: string | null = await this.redis.get( - Store.combineString( - Store.relayerStorePrefix, - Store.ambMidfix, - swapIdentifier, - ), + static getOnAMBMessageChannel( + chainId: string, + ): string { + return Store.getChannel( + Store.ON_AMB_MESSAGE_CHANNEL_PREFIX, + chainId.toLowerCase(), ); - const amb: AmbMessage | null = - query === null ? undefined : JSON.parse(query); + } - return amb; + static getOnAMBProofChannel( + chainId: string, + ): string { + return Store.getChannel( + Store.ON_AMB_PROOF_CHANNEL_PREFIX, + chainId.toLowerCase(), + ); } - async getAmbPayload( + + + async getAMBMessage( chainId: string, - messageIdentifier: string, - ): Promise { - const query: string | null = await this.redis.get( - Store.combineString( - Store.relayerStorePrefix, - Store.ambPayloadMidfix, - chainId, - messageIdentifier, - ), + messageIdentifier: string + ): Promise { + const key = Store.getAMBMessageKey( + chainId, + messageIdentifier, ); - const amb: AmbPayload | null = - query === null ? undefined : JSON.parse(query); - return amb; + const data = await this.redis.get(key); + + const parsedData: AMBMessageJSON | null = data != null + ? JSON.parse(data) + : null; + + return parsedData; } - async getAMBsByTxHash( + async getAMBProof( chainId: string, - txHash: string, - ): Promise { - const query: string | null = await this.redis.get( - Store.combineString( - Store.relayerStorePrefix, - Store.hashAmbMapMidfix, - chainId, - txHash, - ), + messageIdentifier: string, + ): Promise { + const key = Store.getAMBProofKey( + chainId, + messageIdentifier, ); - const messageIdentifiers: string[] = - query === null ? [] : JSON.parse(query); + const data = await this.redis.get(key); + + const parsedData: AMBProofJSON | null = data != null + ? JSON.parse(data) + : null; + + return parsedData; + } + + async getAMBMessagesByTransactionHash( + chainId: string, + transactionHash: string, + ): Promise { + const key = Store.getAMBMessagesByTransactionHashKey( + chainId, + transactionHash, + ); + const messageIdentifiers: string[] = await this.redis.lrange(key, 0, -1); - const ambs: Promise[] = []; + const ambMessagesPromise: Promise[] = []; for (const messageId of messageIdentifiers) { - ambs.push(this.getAmb(messageId)); + ambMessagesPromise.push(this.getAMBMessage(chainId, messageId)); } - return (await Promise.all(ambs)).filter( - (amb) => amb != undefined, - ) as AmbMessage[]; + return (await Promise.all(ambMessagesPromise)).filter( + (amb): amb is AMBMessage => amb != undefined, + ); } - /** - * Set an Amb message (not payload). - */ - async setAmb(amb: AmbMessage, txHash: string): Promise { - const key = Store.combineString( - Store.relayerStorePrefix, - Store.ambMidfix, - amb.messageIdentifier, + + async setAMBMessage( + chainId: string, + ambMessage: AMBMessage, + ): Promise { + + const key = Store.getAMBMessageKey( + chainId, + ambMessage.messageIdentifier, ); - await this.set(key, JSON.stringify(amb)); - await this.registerAmbTxHash( - amb.sourceChain, - amb.messageIdentifier, - txHash, + await this.set(key, JSON.stringify(ambMessage)); + + await this.setAMBMessageTransactionHash( + ambMessage.fromChainId, + ambMessage.messageIdentifier, + ambMessage.transactionHash, ); - await this.postMessage(Store.newAMBChannel, amb); + const channel = Store.getOnAMBMessageChannel( + chainId + ); + await this.postMessage(channel, ambMessage); } - async setAmbPriority(messageIdentifier: string, priority: boolean): Promise { - const key = Store.combineString( - Store.relayerStorePrefix, - Store.ambMidfix, - messageIdentifier, + async setAMBMessagePriority( + chainId: string, + messageIdentifier: string, + priority: boolean + ): Promise { + const key = Store.getAMBMessageKey( + chainId, + messageIdentifier ); - const query: string | null = await this.redis.get(key); + const data = await this.redis.get(key); - if (query == null) { + if (data == null) { throw new Error( - `Unable to set AMB priority: AMB message not found (message identifier: ${messageIdentifier}` + `Unable to set AMB priority: AMB message not found (message identifier: ${messageIdentifier})` ); } - const amb: AmbMessage = JSON.parse(query); + const amb: AMBMessageJSON = JSON.parse(data); amb.priority = priority; - await this.set(key, JSON.stringify(amb)); - } - async setAmbPayload(amb: AmbPayload): Promise { - const chainId = this.chainId; - if (chainId === null) - throw new Error('ChainId is not set: This connection is readonly'); - const key = Store.combineString( - Store.relayerStorePrefix, - Store.ambPayloadMidfix, - chainId, - amb.messageIdentifier, - ); await this.set(key, JSON.stringify(amb)); } - async registerAmbTxHash( + async setAMBMessageTransactionHash( chainId: string, messageIdentifier: string, - txHash: string, + transactionHash: string, ): Promise { - const key = Store.combineString( - Store.relayerStorePrefix, - Store.hashAmbMapMidfix, + const key = Store.getAMBMessagesByTransactionHashKey( chainId, - txHash, + transactionHash, ); - const currentValue = await this.get(key); - if (currentValue == null) { - await this.set(key, JSON.stringify([messageIdentifier])); - } else { - const parsedValue = JSON.parse(currentValue); - parsedValue.push(messageIdentifier); - await this.set(key, JSON.stringify(parsedValue)); + await this.redis.rpush(key, messageIdentifier); + } + + async setAMBProof(chainId: string, ambProof: AMBProof) { + const key = Store.getAMBProofKey( + chainId, + ambProof.messageIdentifier + ); + + const currentProof = await this.get(key); + if (currentProof != undefined) { + //TODO log + // Do not allow proofs to be set multiple times (prevent submitting the same relay more than once). + return; } + + await this.set(key, JSON.stringify(ambProof)); + + const channel = Store.getOnAMBProofChannel( + chainId + ); + await this.postMessage(channel, ambProof); } - /** - * Proofs are only available through subscriptions. This posts the messages to any - * listeners on Store.getChannel('submit', destinationChain). - */ - async submitProof(destinationChain: string, ambPayload: AmbPayload) { - const emitToChannel = Store.getChannel('submit', destinationChain); + async setAdditionalAMBData(amb: string, key: string, data: T): Promise { + const fullKey = Store.getAdditionalAMBDataKey( + amb, + key + ); + await this.set(fullKey, JSON.stringify(data)); + } + + async getAdditionalAMBData(amb: string, key: string): Promise { + const fullKey = Store.getAdditionalAMBDataKey( + amb, + key + ); + const rawData = await this.get(fullKey); - await this.setAmbPayload(ambPayload); - await this.postMessage(emitToChannel, ambPayload); + return rawData != null + ? JSON.parse(rawData) + : null; } } diff --git a/src/store/store.types.ts b/src/store/store.types.ts new file mode 100644 index 0000000..f80553b --- /dev/null +++ b/src/store/store.types.ts @@ -0,0 +1,149 @@ +// Store types +// ************************************************************************************************ + +export interface TransactionDescription { + transactionHash: string; + blockHash: string; + blockNumber: number; +} + +export interface KeyActionMessage { + key: string; + action: 'set' | 'del'; +} + + + +// AMB related types +// ************************************************************************************************ + +export interface AMBMessage extends TransactionDescription { + messageIdentifier: string; + + amb: string; + fromChainId: string; + toChainId: string; + fromIncentivesAddress: string; + toIncentivesAddress?: string; + + incentivesPayload: string; + recoveryContext?: string; + additionalData?: T; + + transactionBlockNumber?: number; // The block number as seen by the transaction. + + priority?: boolean; +}; + +export type AMBMessageJSON = AMBMessage; + + +export interface AMBProof { + messageIdentifier: string; + + amb: string; + fromChainId: string; + toChainId: string; + + message: string; + messageCtx?: string; +}; + +export type AMBProofJSON = AMBProof; + + + +// Relay and Bounty types +// ************************************************************************************************ + +export enum RelayStatus { + BountyPlaced, + MessageDelivered, + BountyClaimed, +} + +export interface RelayState { + + // Common fields (derived from events) + status: RelayStatus; + messageIdentifier: string; + + // GeneralisedIncentives specific details + bountyPlacedEvent?: BountyPlacedEventDetails; + messageDeliveredEvent?: MessageDeliveredEventDetails; + bountyClaimedEvent?: BountyClaimedEventDetails; + bountyIncreasedEvent?: BountyIncreasedEventDetails; + + // Delivery information + deliveryGasCost?: bigint; +} + +export interface BountyPlacedEventDetails extends TransactionDescription { + fromChainId: string; + incentivesAddress: string; + + maxGasDelivery: bigint; + maxGasAck: bigint; + refundGasTo: string; + priceOfDeliveryGas: bigint; + priceOfAckGas: bigint; + targetDelta: bigint; +} + +export interface MessageDeliveredEventDetails extends TransactionDescription { + toChainId: string; +} + +export interface BountyClaimedEventDetails extends TransactionDescription { +} + +export interface BountyIncreasedEventDetails extends TransactionDescription { + newDeliveryGasPrice: bigint; + newAckGasPrice: bigint; +} + + +export interface RelayStateJSON { + status: RelayStatus; + messageIdentifier: string; + + bountyPlacedEvent?: BountyPlacedEventDetailsJSON; + messageDeliveredEvent?: MessageDeliveredEventDetailsJSON; + bountyClaimedEvent?: BountyClaimedEventDetailsJSON; + bountyIncreasedEvent?: BountyIncreasedEventDetailsJSON; + + deliveryGasCost?: string; +} + +export interface BountyPlacedEventDetailsJSON extends TransactionDescription { + fromChainId: string; + incentivesAddress: string; + + maxGasDelivery: string; + maxGasAck: string; + refundGasTo: string; + priceOfDeliveryGas: string; + priceOfAckGas: string; + targetDelta: string; +} + +export type MessageDeliveredEventDetailsJSON = MessageDeliveredEventDetails; + +export type BountyClaimedEventDetailsJSON = BountyClaimedEventDetails; + +export interface BountyIncreasedEventDetailsJSON extends TransactionDescription { + newDeliveryGasPrice: string; + newAckGasPrice: string; +} + + + +// Controller Types +// ************************************************************************************************ + +export interface PrioritiseMessage { + messageIdentifier: string; + amb: string; + sourceChainId: string; + destinationChainId: string; +}; diff --git a/src/store/types/bounty.enum.ts b/src/store/types/bounty.enum.ts deleted file mode 100644 index 33fff83..0000000 --- a/src/store/types/bounty.enum.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum BountyStatus { - BountyPlaced, - MessageDelivered, - BountyClaimed, -} diff --git a/src/store/types/store.types.ts b/src/store/types/store.types.ts deleted file mode 100644 index 2ba1fad..0000000 --- a/src/store/types/store.types.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { BountyStatus } from './bounty.enum'; - -export type AmbMessage = { - messageIdentifier: string; - amb: string; - sourceChain: string; - destinationChain: string; - sourceEscrow: string; - payload: string; // This is specifically Generalised Incentive payload. - recoveryContext?: string; // Normally we would listen for the proofs but sometimes we might miss or somethings goes wrong. If this field is set, then it can be used to recover the tx. The encoding scheme depends entirely on the amb. - priority?: boolean; - blockNumber?: number; // The block number as returned by the rpc. - transactionBlockNumber?: number; // The block number as seen by the transaction. - blockHash?: string; - transactionHash?: string; -}; - -export type AmbPayload = { - messageIdentifier: string; - amb: string; - destinationChainId: string; - message: string; - messageCtx?: string; - priority?: boolean; -}; - -export type PrioritiseMessage = { - messageIdentifier: string; - amb: string; - sourceChainId: string; - destinationChainId: string; -}; - -export type Bounty = { - messageIdentifier: string; - fromChainId: string; - toChainId?: string; - maxGasDelivery: number; - maxGasAck: number; - refundGasTo: string; - priceOfDeliveryGas: bigint; - priceOfAckGas: bigint; - targetDelta: bigint; - status: BountyStatus; - sourceAddress: string; - destinationAddress?: string; - finalised?: boolean; - submitTransactionHash?: string; - execTransactionHash?: string; - ackTransactionHash?: string; -}; - -export type BountyJson = { - messageIdentifier: string; - fromChainId?: string; - toChainId?: string; - maxGasDelivery?: number; - maxGasAck?: number; - refundGasTo?: string; - priceOfDeliveryGas?: string; - priceOfAckGas?: string; - targetDelta?: string; - status: BountyStatus; - sourceAddress?: string; - destinationAddress?: string; - finalised?: boolean; - submitTransactionHash?: string; - execTransactionHash?: string; - ackTransactionHash?: string; -}; diff --git a/src/submitter/queues/eval-queue.ts b/src/submitter/queues/eval-queue.ts index 541ac90..69b0f61 100644 --- a/src/submitter/queues/eval-queue.ts +++ b/src/submitter/queues/eval-queue.ts @@ -2,42 +2,139 @@ import { HandleOrderResult, ProcessingQueue, } from '../../processing-queue/processing-queue'; -import { EvalOrder, SubmitOrder } from '../submitter.types'; +import { Bounty, EvalOrder, SubmitOrder } from '../submitter.types'; import pino from 'pino'; import { Store } from 'src/store/store.lib'; -import { Bounty } from 'src/store/types/store.types'; -import { BountyStatus } from 'src/store/types/bounty.enum'; -import { IncentivizedMessageEscrow } from 'src/contracts'; +import { RelayState, RelayStatus } from 'src/store/store.types'; +import { IncentivizedMockEscrow__factory } from 'src/contracts'; import { tryErrorToString } from 'src/common/utils'; -import { zeroPadValue } from 'ethers6'; +import { TransactionRequest, zeroPadValue } from 'ethers6'; +import { Resolver, GasEstimateComponents } from 'src/resolvers/resolver'; +import { IncentivizedMockEscrowInterface } from 'src/contracts/IncentivizedMockEscrow'; +import { EvaluatorInterface } from 'src/evaluator/evaluator.interface'; export class EvalQueue extends ProcessingQueue { - readonly relayerAddress: string; + readonly paddedRelayerAddress: string; + private readonly escrowInterface: IncentivizedMockEscrowInterface; constructor( retryInterval: number, maxTries: number, + private readonly relayerAddress: string, + private readonly resolver: Resolver, private readonly store: Store, - private readonly incentivesContracts: Map, + private readonly incentivesContracts: Map, + private readonly packetCosts: Map, private readonly chainId: string, - private readonly gasLimitBuffer: Record, - relayerAddress: string, + private readonly evaluator: EvaluatorInterface, private readonly logger: pino.Logger, ) { super(retryInterval, maxTries); - this.relayerAddress = zeroPadValue(relayerAddress, 32); + this.paddedRelayerAddress = zeroPadValue(relayerAddress, 32); + this.escrowInterface = IncentivizedMockEscrow__factory.createInterface(); } protected async handleOrder( order: EvalOrder, _retryCount: number, ): Promise | null> { - const gasLimit = await this.evaluateBounty(order); + this.logger.debug( + { messageIdentifier: order.messageIdentifier }, + `Handling submitter eval order.`, + ); + + // Double check the 'priority' status in case prioritisation was recently requested. + if (!order.priority) { + const ambMessage = await this.store.getAMBMessage( + order.fromChainId, + order.messageIdentifier + ); + + if (ambMessage?.priority) { + this.logger.info( + { + fromChainId: order.fromChainId, + messageIdentifier: order.messageIdentifier, + }, + `Order elevated to priority status.` + ); + + order.priority = true; + } + } - if (gasLimit > 0) { + const relayState = await this.store.getRelayState(order.messageIdentifier); + if (relayState == null) { + throw Error( + `Relay state of message not found on evaluation (message ${order.messageIdentifier})`, + ); + } + + const bounty = this.getBountyFromRelayState(relayState); + if (bounty == null) { + throw Error( + `Bounty of message not found on evaluation (message ${order.messageIdentifier})`, + ); + } + + // Check if the message has already been submitted. + const isDelivery = bounty.fromChainId != this.chainId; + if (isDelivery) { + // Source to Destination + if (relayState.status >= RelayStatus.MessageDelivered) { + this.logger.info( + { messageIdentifier: bounty.messageIdentifier }, + `Bounty evaluation (source to destination). Message already delivered.`, + ); + return null; // Do not relay packet + } + } else { + // Destination to Source + if (relayState.status >= RelayStatus.BountyClaimed) { + this.logger.info( + { messageIdentifier: bounty.messageIdentifier }, + `Bounty evaluation (destination to source). Ack already delivered.`, + ); + return null; // Do not relay packet + } + } + + const contractAddress = this.incentivesContracts.get(order.amb)!; //TODO handle undefined case + + const transactionData = this.escrowInterface.encodeFunctionData("processPacket", [ + order.messageCtx, + order.message, + this.paddedRelayerAddress, + ]); + + const value = isDelivery + ? this.packetCosts.get(order.amb) ?? 0n + : 0n; + + const transactionRequest: TransactionRequest = { + from: this.relayerAddress, + to: contractAddress, + data: transactionData, + value, + } + + const gasEstimateComponents = await this.resolver.estimateGas(transactionRequest); + + const submitRelay = await this.evaluateRelaySubmission( + gasEstimateComponents, + value, + bounty, + order + ); + + if (submitRelay) { // Move the order to the submit queue - return { result: { ...order, gasLimit } }; + transactionRequest.gasLimit = gasEstimateComponents.gasEstimate; + return { result: { ...order, transactionRequest, isDelivery } }; } else { + // Request the order to be retried in the future. + order.retryEvaluation = true; + return null; } } @@ -79,15 +176,15 @@ export class EvalQueue extends ProcessingQueue { }; if (success) { - if (result?.gasLimit != null && result.gasLimit > 0) { - this.logger.debug( + if (result != null) { + this.logger.info( orderDescription, `Successful bounty evaluation: submit order.`, ); } else { - this.logger.debug( + this.logger.info( orderDescription, - `Successful bounty evaluation: drop order.`, + `Successful bounty evaluation: do not submit order.`, ); } } else { @@ -105,102 +202,143 @@ export class EvalQueue extends ProcessingQueue { } } - /** - * TODO: What is the point of this helper? - */ - private async queryBountyInfo( - messageIdentifier: string, - ): Promise { - return this.store.getBounty(messageIdentifier); - } - - private async evaluateBounty(order: EvalOrder): Promise { + private async evaluateRelaySubmission( + gasEstimateComponents: GasEstimateComponents, + value: bigint, + bounty: Bounty, + order: EvalOrder, + ): Promise { const messageIdentifier = order.messageIdentifier; - const bounty = await this.queryBountyInfo(messageIdentifier); - if (bounty === null || bounty === undefined) { - throw Error( - `Bounty of message not found on evaluation (message ${messageIdentifier})`, - ); - } - // Check if the bounty has already been submitted/is in process of being submitted const isDelivery = bounty.fromChainId != this.chainId; + if (isDelivery) { // Source to Destination - if (bounty.status >= BountyStatus.MessageDelivered) { + if (order.priority) { this.logger.debug( - { messageIdentifier }, - `Bounty evaluation (source to destination). Bounty already delivered.`, + { + messageIdentifier, + maxGasDelivery: bounty.maxGasDelivery, + gasEstimate: gasEstimateComponents.gasEstimate.toString(), + additionalFeeEstimate: gasEstimateComponents.additionalFeeEstimate.toString(), + priority: true, + }, + `Bounty evaluation (source to destination): submit delivery (priority order).`, ); - return 0n; // Do not relay packet + + return true; } + + return this.evaluateDeliverySubmission( + bounty.messageIdentifier, + gasEstimateComponents, + value, + ); } else { // Destination to Source - if (bounty.status >= BountyStatus.BountyClaimed) { + if (order.priority) { this.logger.debug( - { messageIdentifier }, - `Bounty evaluation (destination to source). Bounty already acked.`, + { + messageIdentifier, + maxGasAck: bounty.maxGasAck, + gasEstimate: gasEstimateComponents.gasEstimate.toString(), + additionalFeeEstimate: gasEstimateComponents.additionalFeeEstimate.toString(), + priority: true, + }, + `Bounty evaluation (destination to source): submit ack (priority order).`, ); - return 0n; // Do not relay packet + + return true; } + + return this.evaluateAckSubmission( + bounty.messageIdentifier, + gasEstimateComponents, + value + ); } + } - const contract = this.incentivesContracts.get(order.amb)!; //TODO handle undefined case - const gasEstimation = await contract.processPacket.estimateGas( - order.messageCtx, - order.message, - this.relayerAddress, + private async evaluateDeliverySubmission( + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint, + ): Promise { + + const result = await this.evaluator.evaluateDelivery( + this.chainId, + messageIdentifier, + gasEstimateComponents, + value, ); - const gasLimitBuffer = this.getGasLimitBuffer(order.amb); + if (result.evaluation == null) { + throw new Error('Failed to evaluate delivery submission: evaluation result is null.'); + } - //TODO gas prices are not being considered at this point - if (isDelivery) { - // Source to Destination - const gasLimit = BigInt(bounty.maxGasDelivery + gasLimitBuffer); - - this.logger.debug( - { - messageIdentifier, - gasLimit, - maxGasDelivery: bounty.maxGasDelivery, - gasLimitBuffer, - gasEstimation: gasEstimation.toString(), - }, - `Bounty evaluation (source to destination).`, - ); + this.logger.info( + { + messageIdentifier, + ...result.evaluation, + }, + `Bounty evaluation (source to destination).`, + ); - const isGasLimitEnough = gasLimit >= gasEstimation; - const relayDelivery = order.priority || isGasLimitEnough; - return relayDelivery - ? (isGasLimitEnough ? gasLimit : gasEstimation) // Return the largest of gasLimit and gasEstimation - : 0n; - } else { - // Destination to Source - const gasLimit = BigInt(bounty.maxGasAck + gasLimitBuffer); - - this.logger.debug( - { - messageIdentifier, - gasLimit, - maxGasAck: bounty.maxGasAck, - gasLimitBuffer, - gasEstimation: gasEstimation.toString(), - }, - `Bounty evaluation (destination to source).`, - ); + return result.evaluation.relayDelivery; + } + + private async evaluateAckSubmission( + messageIdentifier: string, + gasEstimateComponents: GasEstimateComponents, + value: bigint, + ): Promise { + + const result = await this.evaluator.evaluateAck( + this.chainId, + messageIdentifier, + gasEstimateComponents, + value, + ); - const isGasLimitEnough = gasLimit >= gasEstimation; - const relayAck = order.priority || isGasLimitEnough; - return relayAck - ? (isGasLimitEnough ? gasLimit : gasEstimation) // Return the largest of gasLimit and gasEstimation - : 0n; + if (result.evaluation == null) { + throw new Error('Failed to evaluate ack submission: evaluation result is null.'); } - return 0n; // Do not relay packet + this.logger.info( + { + messageIdentifier, + ...result.evaluation, + }, + `Bounty evaluation (destination to source).`, + ); + + return result.evaluation.relayAck; } - private getGasLimitBuffer(amb: string): number { - return this.gasLimitBuffer[amb] ?? this.gasLimitBuffer['default'] ?? 0; + private getBountyFromRelayState(relayState: RelayState): Bounty | null { + const bountyPlacedEvent = relayState.bountyPlacedEvent; + if (bountyPlacedEvent == undefined) { + return null; + } + + const priceOfDeliveryGas = relayState.bountyIncreasedEvent?.newDeliveryGasPrice + ?? bountyPlacedEvent.priceOfDeliveryGas; + const priceOfAckGas = relayState.bountyIncreasedEvent?.newAckGasPrice + ?? bountyPlacedEvent.priceOfAckGas; + + return { + messageIdentifier: relayState.messageIdentifier, + + fromChainId: bountyPlacedEvent.fromChainId, + + maxGasDelivery: bountyPlacedEvent.maxGasDelivery, + maxGasAck: bountyPlacedEvent.maxGasAck, + refundGasTo: bountyPlacedEvent.refundGasTo, + priceOfDeliveryGas, + priceOfAckGas, + targetDelta: bountyPlacedEvent.targetDelta, + + deliveryGasCost: relayState.deliveryGasCost, + } } } diff --git a/src/submitter/queues/submit-queue.ts b/src/submitter/queues/submit-queue.ts index 738d1bd..ea49788 100644 --- a/src/submitter/queues/submit-queue.ts +++ b/src/submitter/queues/submit-queue.ts @@ -3,28 +3,27 @@ import { ProcessingQueue, } from '../../processing-queue/processing-queue'; import { SubmitOrder, SubmitOrderResult } from '../submitter.types'; -import { TransactionRequest, zeroPadValue } from 'ethers6'; +import { AbstractProvider } from 'ethers6'; import pino from 'pino'; import { tryErrorToString } from 'src/common/utils'; -import { IncentivizedMessageEscrow } from 'src/contracts'; +import { Store } from 'src/store/store.lib'; import { WalletInterface } from 'src/wallet/wallet.interface'; export class SubmitQueue extends ProcessingQueue< SubmitOrder, SubmitOrderResult > { - readonly relayerAddress: string; constructor( retryInterval: number, maxTries: number, - private readonly incentivesContracts: Map, - relayerAddress: string, + private readonly store: Store, + private readonly chainId: string, + private readonly provider: AbstractProvider, private readonly wallet: WalletInterface, private readonly logger: pino.Logger, ) { super(retryInterval, maxTries); - this.relayerAddress = zeroPadValue(relayerAddress, 32); } protected async handleOrder( @@ -33,39 +32,19 @@ export class SubmitQueue extends ProcessingQueue< ): Promise | null> { this.logger.debug( { messageIdentifier: order.messageIdentifier }, - `Handling submit order`, + `Handling submitter submit order`, ); - + // Simulate the packet submission as a static call. Skip if it's the first submission try, // as in that case the packet 'evaluation' will have been executed shortly before. - const contract = this.incentivesContracts.get(order.amb)!; //TODO handle undefined case - if (retryCount > 0 || (order.requeueCount ?? 0) > 0) { - await contract.processPacket.staticCall( - order.messageCtx, - order.message, - this.relayerAddress, - { - gasLimit: order.gasLimit, - }, - ); + await this.provider.call(order.transactionRequest) } // Execute the relay transaction if the static call did not fail. - const txData = contract.interface.encodeFunctionData("processPacket", [ - order.messageCtx, - order.message, - this.relayerAddress, - ]); - - const txRequest: TransactionRequest = { - to: await contract.getAddress(), - data: txData, - gasLimit: order.gasLimit, - }; - const txPromise = this.wallet.submitTransaction( - txRequest, + this.chainId, + order.transactionRequest, order, ).then((transactionResult): SubmitOrderResult => { if (transactionResult.submissionError) { @@ -134,18 +113,20 @@ export class SubmitQueue extends ProcessingQueue< if (success) { if (result != null) { - this.logger.debug( + this.logger.info( orderDescription, `Successful submit order: message submitted.`, ); + + void this.registerSubmissionCost(order, result.txReceipt.gasUsed); } else { - this.logger.debug( + this.logger.info( orderDescription, `Successful submit order: message not submitted.`, ); } } else { - this.logger.error(orderDescription, `Unsuccessful submit order.`); + this.logger.warn(orderDescription, `Unsuccessful submit order.`); if (order.priority) { this.logger.warn( @@ -158,4 +139,17 @@ export class SubmitQueue extends ProcessingQueue< } } } + + private async registerSubmissionCost( + order: SubmitOrder, + gasUsed: bigint, + ): Promise { + // Currently the 'ack' submission cost is not registered. + if (order.isDelivery) { + void this.store.setDeliveryCost( + order.messageIdentifier, + gasUsed, + ); + } + } } diff --git a/src/submitter/submitter.module.ts b/src/submitter/submitter.module.ts index 03569ed..d876a54 100644 --- a/src/submitter/submitter.module.ts +++ b/src/submitter/submitter.module.ts @@ -1,3 +1,4 @@ +import { EvaluatorModule } from './../evaluator/evaluator.module'; import { Module } from '@nestjs/common'; import { SubmitterService } from './submitter.service'; import { WalletModule } from 'src/wallet/wallet.module'; @@ -5,6 +6,6 @@ import { WalletModule } from 'src/wallet/wallet.module'; @Module({ providers: [SubmitterService], exports: [SubmitterService], - imports: [WalletModule], + imports: [EvaluatorModule, WalletModule], }) export class SubmitterModule {} diff --git a/src/submitter/submitter.service.ts b/src/submitter/submitter.service.ts index 6c3b6d4..68ded12 100644 --- a/src/submitter/submitter.service.ts +++ b/src/submitter/submitter.service.ts @@ -8,12 +8,15 @@ import { LoggerOptions } from 'pino'; import { WalletService } from 'src/wallet/wallet.service'; import { Wallet } from 'ethers6'; import { tryErrorToString } from 'src/common/utils'; +import { EvaluatorService } from 'src/evaluator/evaluator.service'; const RETRY_INTERVAL_DEFAULT = 30000; const PROCESSING_INTERVAL_DEFAULT = 100; const MAX_TRIES_DEFAULT = 3; const MAX_PENDING_TRANSACTIONS = 50; const NEW_ORDERS_DELAY_DEFAULT = 0; +const EVALUATION_RETRY_INTERVAL_DEFAULT = 60 * 60 * 1000; +const MAX_EVALUATION_DURATION_DEFAULT = 24 * 60 * 60 * 1000; interface GlobalSubmitterConfig { enabled: boolean; @@ -22,21 +25,25 @@ interface GlobalSubmitterConfig { processingInterval: number; maxTries: number; maxPendingTransactions: number; - gasLimitBuffer: Record & { default?: number }; + evaluationRetryInterval: number; + maxEvaluationDuration: number; walletPublicKey: string; } export interface SubmitterWorkerData { chainId: string; rpc: string; - relayerPrivateKey: string; + resolver: string | null; incentivesAddresses: Map; + packetCosts: Map; newOrdersDelay: number; retryInterval: number; processingInterval: number; maxTries: number; maxPendingTransactions: number; - gasLimitBuffer: Record; + evaluationRetryInterval: number; + maxEvaluationDuration: number; + evaluatorPort: MessagePort; walletPublicKey: string; walletPort: MessagePort; loggerOptions: LoggerOptions; @@ -48,6 +55,7 @@ export class SubmitterService { constructor( private readonly configService: ConfigService, + private readonly evaluatorService: EvaluatorService, private readonly walletService: WalletService, private readonly loggerService: LoggerService, ) {} @@ -73,7 +81,10 @@ export class SubmitterService { const worker = new Worker(join(__dirname, 'submitter.worker.js'), { workerData, - transferList: [workerData.walletPort] + transferList: [ + workerData.evaluatorPort, + workerData.walletPort + ] }); worker.on('error', (error) => @@ -113,10 +124,10 @@ export class SubmitterService { const maxPendingTransactions = submitterConfig.maxPendingTransactions ?? MAX_PENDING_TRANSACTIONS; - const gasLimitBuffer = submitterConfig.gasLimitBuffer ?? {}; - if (!('default' in gasLimitBuffer)) { - gasLimitBuffer['default'] = 0; - } + const evaluationRetryInterval = + submitterConfig.evaluationRetryInterval ?? EVALUATION_RETRY_INTERVAL_DEFAULT; + const maxEvaluationDuration = + submitterConfig.maxEvaluationDuration ?? MAX_EVALUATION_DURATION_DEFAULT; const walletPublicKey = (new Wallet(await this.configService.globalConfig.privateKey)).address; @@ -127,8 +138,9 @@ export class SubmitterService { processingInterval, maxTries, maxPendingTransactions, - gasLimitBuffer, walletPublicKey, + evaluationRetryInterval, + maxEvaluationDuration, }; } @@ -138,7 +150,6 @@ export class SubmitterService { ): Promise { const chainId = chainConfig.chainId; const rpc = chainConfig.rpc; - const relayerPrivateKey = await this.configService.globalConfig.privateKey; const incentivesAddresses = new Map(); this.configService.ambsConfig.forEach((amb) => { @@ -151,11 +162,27 @@ export class SubmitterService { } }); + const packetCosts = new Map(); + this.configService.ambsConfig.forEach((amb) => { + const packetCost: string = this.configService.getAMBConfig( + amb.name, + 'packetCost', + chainConfig.chainId + ); + if (packetCost != undefined) { + packetCosts.set( + amb.name, + BigInt(packetCost), //TODO add log error if this fails + ); + } + }); + return { chainId, rpc, - relayerPrivateKey, + resolver: chainConfig.resolver, incentivesAddresses, + packetCosts, newOrdersDelay: chainConfig.submitter.newOrdersDelay ?? globalConfig.newOrdersDelay, @@ -172,34 +199,21 @@ export class SubmitterService { maxPendingTransactions: chainConfig.submitter.maxPendingTransactions ?? globalConfig.maxPendingTransactions, + + evaluationRetryInterval: + chainConfig.submitter.evaluationRetryInterval ?? + globalConfig.evaluationRetryInterval, + + maxEvaluationDuration: + chainConfig.submitter.maxEvaluationDuration ?? + globalConfig.maxEvaluationDuration, - gasLimitBuffer: this.getChainGasLimitBufferConfig( - globalConfig.gasLimitBuffer, - chainConfig.submitter.gasLimitBuffer ?? {}, - ), + + evaluatorPort: await this.evaluatorService.attachToEvaluator(), walletPublicKey: globalConfig.walletPublicKey, - walletPort: await this.walletService.attachToWallet(chainId), + walletPort: await this.walletService.attachToWallet(), loggerOptions: this.loggerService.loggerOptions, }; } - - private getChainGasLimitBufferConfig( - defaultGasLimitBufferConfig: Record, - chainGasLimitBufferConfig: Record, - ): Record { - const gasLimitBuffers: Record = {}; - - // Apply defaults - for (const key in defaultGasLimitBufferConfig) { - gasLimitBuffers[key] = defaultGasLimitBufferConfig[key]!; - } - - // Apply chain overrides - for (const key in chainGasLimitBufferConfig) { - gasLimitBuffers[key] = chainGasLimitBufferConfig[key]!; - } - - return gasLimitBuffers; - } } diff --git a/src/submitter/submitter.types.ts b/src/submitter/submitter.types.ts index 9c40270..0b10ef7 100644 --- a/src/submitter/submitter.types.ts +++ b/src/submitter/submitter.types.ts @@ -1,19 +1,24 @@ -import { BytesLike, TransactionReceipt, TransactionResponse } from 'ethers6'; +import { BytesLike, TransactionReceipt, TransactionRequest, TransactionResponse } from 'ethers6'; export interface Order { amb: string; + fromChainId: string; messageIdentifier: string; message: BytesLike; messageCtx: BytesLike; + incentivesPayload?: BytesLike; } export interface EvalOrder extends Order { priority: boolean; + evaluationDeadline: number; + retryEvaluation?: boolean; } export interface SubmitOrder extends Order { + isDelivery: boolean; priority: boolean; - gasLimit: bigint | undefined; + transactionRequest: TransactionRequest; requeueCount?: number; } @@ -22,7 +27,23 @@ export interface SubmitOrderResult extends SubmitOrder { txReceipt: TransactionReceipt; } -export interface NewOrder { +export interface PendingOrder { order: OrderType; processAt: number; } + + +export interface Bounty { + messageIdentifier: string; + + fromChainId: string; + + maxGasDelivery: bigint; + maxGasAck: bigint; + refundGasTo: string; + priceOfDeliveryGas: bigint; + priceOfAckGas: bigint; + targetDelta: bigint; + + deliveryGasCost?: bigint; +} diff --git a/src/submitter/submitter.worker.ts b/src/submitter/submitter.worker.ts index 3fb2ffd..4b92d99 100644 --- a/src/submitter/submitter.worker.ts +++ b/src/submitter/submitter.worker.ts @@ -1,21 +1,17 @@ -import { - BytesLike, - JsonRpcProvider, - Wallet, -} from 'ethers6'; +import { BytesLike, JsonRpcProvider } from 'ethers6'; import pino, { LoggerOptions } from 'pino'; import { Store } from 'src/store/store.lib'; -import { IncentivizedMessageEscrow } from 'src/contracts'; -import { IncentivizedMessageEscrow__factory } from 'src/contracts/factories/IncentivizedMessageEscrow__factory'; import { workerData } from 'worker_threads'; -import { AmbPayload } from 'src/store/types/store.types'; +import { AMBProof } from 'src/store/store.types'; import { STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; -import { EvalOrder, NewOrder } from './submitter.types'; +import { EvalOrder, PendingOrder } from './submitter.types'; import { EvalQueue } from './queues/eval-queue'; import { SubmitQueue } from './queues/submit-queue'; import { wait } from 'src/common/utils'; import { SubmitterWorkerData } from './submitter.service'; import { WalletInterface } from 'src/wallet/wallet.interface'; +import { Resolver, loadResolver } from 'src/resolvers/resolver'; +import { EvaluatorInterface } from 'src/evaluator/evaluator.interface'; class SubmitterWorker { private readonly store: Store; @@ -24,13 +20,15 @@ class SubmitterWorker { private readonly config: SubmitterWorkerData; private readonly provider: JsonRpcProvider; - private readonly signer: Wallet; private readonly chainId: string; + private readonly resolver: Resolver; + + private readonly evaluator: EvaluatorInterface; private readonly wallet: WalletInterface; - private readonly newOrdersQueue: NewOrder[] = []; + private readonly pendingQueue: PendingOrder[] = []; private readonly evalQueue: EvalQueue; private readonly submitQueue: SubmitQueue; @@ -41,7 +39,7 @@ class SubmitterWorker { this.chainId = this.config.chainId; - this.store = new Store(this.chainId); + this.store = new Store(); this.logger = this.initializeLogger( this.chainId, this.config.loggerOptions, @@ -49,19 +47,28 @@ class SubmitterWorker { this.provider = new JsonRpcProvider(this.config.rpc, undefined, { staticNetwork: true, }); - this.signer = new Wallet(this.config.relayerPrivateKey, this.provider); + this.resolver = loadResolver( + this.config.resolver, + this.provider, + this.logger + ); + + this.evaluator = new EvaluatorInterface(this.config.evaluatorPort); this.wallet = new WalletInterface(this.config.walletPort); [this.evalQueue, this.submitQueue] = this.initializeQueues( this.config.retryInterval, this.config.maxTries, + this.config.walletPublicKey, + this.resolver, this.store, - this.loadIncentivesContracts(this.config.incentivesAddresses), + this.config.incentivesAddresses, + this.config.packetCosts, this.config.chainId, - this.config.gasLimitBuffer, - this.config.walletPublicKey, + this.evaluator, + this.provider, this.wallet, this.logger, ); @@ -84,30 +91,36 @@ class SubmitterWorker { private initializeQueues( retryInterval: number, maxTries: number, + walletPublicKey: string, + resolver: Resolver, store: Store, - incentivesContracts: Map, + incentivesContracts: Map, + packetCosts: Map, chainId: string, - gasLimitBuffer: Record, - walletPublicKey: string, + evaluator: EvaluatorInterface, + provider: JsonRpcProvider, wallet: WalletInterface, logger: pino.Logger, ): [EvalQueue, SubmitQueue] { const evalQueue = new EvalQueue( retryInterval, maxTries, + walletPublicKey, + resolver, store, incentivesContracts, + packetCosts, chainId, - gasLimitBuffer, - walletPublicKey, + evaluator, logger, ); const submitQueue = new SubmitQueue( retryInterval, maxTries, - incentivesContracts, - walletPublicKey, + store, + chainId, + provider, wallet, logger, ); @@ -124,7 +137,7 @@ class SubmitterWorker { const logStatus = () => { const status = { capacity: this.getSubmitterCapacity(), - newOrdersQueue: this.newOrdersQueue.length, + pendingQueue: this.pendingQueue.length, evalQueue: this.evalQueue.size, evalRetryQueue: this.evalQueue.retryQueue.length, submitQueue: this.submitQueue.size, @@ -136,26 +149,10 @@ class SubmitterWorker { setInterval(logStatus, STATUS_LOG_INTERVAL); } - private loadIncentivesContracts( - incentivesAddresses: Map, - ): Map { - const incentivesContracts = new Map(); - - incentivesAddresses.forEach((address: string, amb: string) => { - const contract = IncentivizedMessageEscrow__factory.connect( - address, - this.signer, - ); - incentivesContracts.set(amb, contract); - }); - - return incentivesContracts; - } - /*************** Main Logic Loop. ***************/ async run(): Promise { - this.logger.debug({ relayer: this.signer.address }, `Relaying messages.`); + this.logger.debug({ relayer: this.config.walletPublicKey }, `Relaying messages.`); // Initialize the queues await this.evalQueue.init(); @@ -165,110 +162,176 @@ class SubmitterWorker { await this.listenForOrders(); while (true) { - const evalOrders = await this.processNewOrdersQueue(); + const evalOrders = await this.processPendingQueue(); await this.evalQueue.addOrders(...evalOrders); await this.evalQueue.processOrders(); - const [newSubmitOrders, ,] = this.evalQueue.getFinishedOrders(); + const [newSubmitOrders, noSubmitEvalOrders,] = this.evalQueue.getFinishedOrders(); + this.processNoSubmitEvalOrders(noSubmitEvalOrders); await this.submitQueue.addOrders(...newSubmitOrders); await this.submitQueue.processOrders(); + //TODO process failed submissions in any way? + this.submitQueue.getFinishedOrders(); // Flush the internal queues await wait(this.config.processingInterval); } } + private processNoSubmitEvalOrders(evalOrders: EvalOrder[]): void { + for (const order of evalOrders) { + if (order.retryEvaluation) { + + // Clear the 'retryEvaluation' flag to avoid unexpected retries. + order.retryEvaluation = undefined; + + const nextEvaluationTime = Date.now() + this.config.evaluationRetryInterval; + if (nextEvaluationTime > order.evaluationDeadline) { + this.logger.info( + { + messageIdentifier: order.messageIdentifier, + nextEvaluationTime, + evaluationDeadline: order.evaluationDeadline, + }, + 'Dropping evaluation order.' + ); + } + else { + this.logger.info( + { + messageIdentifier: order.messageIdentifier, + nextEvaluationTime, + evaluationDeadline: order.evaluationDeadline, + }, + 'Queueing order for reevaluation.' + ); + this.addPendingOrder(nextEvaluationTime, order); + } + } + } + } + /** * Subscribe to the Store to listen for relevant payloads to submit. */ private async listenForOrders(): Promise { - const listenToChannel = Store.getChannel('submit', this.chainId); + const onAMBProofChannel = Store.getOnAMBProofChannel(this.chainId); this.logger.info( - { globalChannel: listenToChannel }, + { channel: onAMBProofChannel }, `Listing for messages to submit.`, ); - await this.store.on(listenToChannel, (event: any) => { - - //TODO verify event format - const message = event as AmbPayload; - - void this.store.getAmb(message.messageIdentifier) - .then(ambMessage => { - if (ambMessage == null) { - this.logger.warn( - { - messageIdentifier: message.messageIdentifier, - }, - `AMB message not found on submit order. Priority set to 'false'.` - ) - } - - return this.addSubmitOrder( - message.amb, - message.messageIdentifier, - message.message, - message.messageCtx ?? '', - ambMessage?.priority ?? false, // eval priority => undefined = false. + await this.store.on(onAMBProofChannel, (event: any) => { + + const ambProof = event as AMBProof; + + void this.store.getAMBMessage( + ambProof.fromChainId, + ambProof.messageIdentifier + ).then(ambMessage => { + if (ambMessage == null) { + this.logger.warn( + { + messageIdentifier: ambProof.messageIdentifier, + }, + `AMB message not found on submit order. Submission evaluation will be less accurate.` ); - }) + } + + return this.addSubmitOrder( + ambProof.amb, + ambProof.fromChainId, + ambProof.messageIdentifier, + ambProof.message, + ambProof.messageCtx ?? '0x', + ambMessage?.priority ?? false, + ambMessage?.incentivesPayload, + ); + }); }); } private async addSubmitOrder( amb: string, + fromChainId: string, messageIdentifier: string, message: BytesLike, messageCtx: BytesLike, priority: boolean, + incentivesPayload?: BytesLike, ) { - this.logger.debug( + this.logger.info( { messageIdentifier, priority }, `Submit order received.`, ); if (priority) { - // Push directly into the submit queue + // Push directly into the eval queue await this.evalQueue.addOrders({ amb, + fromChainId, messageIdentifier, message, messageCtx, priority: true, + evaluationDeadline: Date.now() + this.config.maxEvaluationDuration, + incentivesPayload, }); } else { - // Push into the evaluation queue - this.newOrdersQueue.push({ - processAt: Date.now() + this.config.newOrdersDelay, - order: { + // Push into the pending queue + this.addPendingOrder( + Date.now() + this.config.newOrdersDelay, + { amb, + fromChainId, messageIdentifier, message, messageCtx, priority: false, + evaluationDeadline: Date.now() + this.config.maxEvaluationDuration, + incentivesPayload, }, - }); + ); } } - /*************** New Order Queue ***************/ + /*************** Pending Orders Queue ***************/ + + private addPendingOrder(processAt: number, order: EvalOrder): void { + + // Insert the new order into the 'pendingQueue' keeping the queue order. + const insertIndex = this.pendingQueue.findIndex(order => { + return order.processAt > processAt; + }); + + const pendingOrder: PendingOrder = { + order, + processAt + }; + + if (insertIndex == -1) { + this.pendingQueue.push(pendingOrder); + } else { + this.pendingQueue.splice(insertIndex, 0, pendingOrder); + } + } - private async processNewOrdersQueue(): Promise { + private async processPendingQueue(): Promise { const currentTimestamp = Date.now(); const capacity = this.getSubmitterCapacity(); let i; - for (i = 0; i < this.newOrdersQueue.length; i++) { - const nextNewOrder = this.newOrdersQueue[i]!; + for (i = 0; i < this.pendingQueue.length; i++) { + const nextPendingOrder = this.pendingQueue[i]!; - if (nextNewOrder.processAt > currentTimestamp || i + 1 > capacity) { + if (nextPendingOrder.processAt > currentTimestamp || i + 1 > capacity) { break; } } - const ordersToEval = this.newOrdersQueue.splice(0, i).map((newOrder) => { - return newOrder.order; + const ordersToEval = this.pendingQueue.splice(0, i).map((pendingOrder) => { + return pendingOrder.order; }); return ordersToEval; diff --git a/src/wallet/queues/confirm-queue.ts b/src/wallet/queues/confirm-queue.ts index fad86ac..1a66725 100644 --- a/src/wallet/queues/confirm-queue.ts +++ b/src/wallet/queues/confirm-queue.ts @@ -38,6 +38,11 @@ export class ConfirmQueue extends ProcessingQueue | null> { + this.logger.debug( + { txRequest: order.txRequest }, + `Handling wallet confirm order.`, + ); + // If it's the first time the order is processed, just wait for it if (retryCount == 0) { const transactionReceipt = order.tx.wait( @@ -206,7 +211,7 @@ export class ConfirmQueue extends ProcessingQueue | null> { + this.logger.debug( + { txRequest: order.txRequest }, + `Handling wallet submit order.`, + ); const txDeadline = order.options.deadline ?? Infinity; if (Date.now() > txDeadline) { @@ -104,12 +108,12 @@ export class SubmitQueue extends ProcessingQueue { txRequest: TransactionRequest; @@ -22,6 +21,7 @@ export class WalletInterface { } async submitTransaction( + chainId: string, transaction: TransactionRequest, metadata?: T, options?: WalletTransactionOptions @@ -30,22 +30,25 @@ export class WalletInterface { const messageId = this.getNextPortMessageId(); const resultPromise = new Promise>(resolve => { - const listener = (data: any) => { + const listener = (data: WalletPortData) => { if (data.messageId === messageId) { this.port.off("message", listener); - const walletResponse = data as WalletTransactionRequestResponse; + const walletResponse = data.message as WalletTransactionRequestResponseMessage; const result = { txRequest: walletResponse.txRequest, metadata: walletResponse.metadata, tx: walletResponse.tx, txReceipt: walletResponse.txReceipt, - submissionError: data.submissionError, - confirmationError: data.confirmationError + submissionError: walletResponse.submissionError, + confirmationError: walletResponse.confirmationError }; resolve(result); - } else if (data.messageId === WALLET_WORKER_CRASHED_MESSAGE_ID) { + } else if ( + data.messageId === WALLET_WORKER_CRASHED_MESSAGE_ID + && data.chainId == chainId + ) { this.port.off("message", listener); const result = { @@ -59,13 +62,67 @@ export class WalletInterface { }; this.port.on("message", listener); - const request: WalletTransactionRequestMessage = { - messageId, + const message: WalletTransactionRequestMessage = { + type: WalletMessageType.TransactionRequest, txRequest: transaction, metadata, options }; - this.port.postMessage(request); + + const portData: WalletPortData = { + chainId, + messageId, + message, + } + this.port.postMessage(portData); + }); + + return resultPromise; + } + + async getFeeData( + chainId: string, + priority?: boolean, + ): Promise { + + const messageId = this.getNextPortMessageId(); + + const resultPromise = new Promise(resolve => { + const listener = (data: WalletPortData) => { + if (data.messageId === messageId) { + this.port.off("message", listener); + + const walletResponse = data.message as WalletFeeDataMessage; + + const result = { + gasPrice: walletResponse.gasPrice, + maxFeePerGas: walletResponse.maxFeePerGas, + maxPriorityFeePerGas: walletResponse.maxPriorityFeePerGas, + } as FeeData; + resolve(result); + } else if ( + data.messageId === WALLET_WORKER_CRASHED_MESSAGE_ID + && data.chainId == chainId + ) { + this.port.off("message", listener); + + const result = {} as FeeData; + resolve(result); + } + }; + this.port.on("message", listener); + + const message: WalletGetFeeDataMessage = { + type: WalletMessageType.GetFeeData, + priority: priority ?? false, + }; + + const portData: WalletPortData = { + chainId, + messageId, + message, + } + this.port.postMessage(portData); }); return resultPromise; diff --git a/src/wallet/wallet.service.ts b/src/wallet/wallet.service.ts index bd35aec..1e40ee6 100644 --- a/src/wallet/wallet.service.ts +++ b/src/wallet/wallet.service.ts @@ -4,12 +4,10 @@ import { LoggerOptions } from 'pino'; import { Worker, MessagePort, MessageChannel } from 'worker_threads'; import { ConfigService } from 'src/config/config.service'; import { LoggerService, STATUS_LOG_INTERVAL } from 'src/logger/logger.service'; -import { WalletServiceRoutingMessage, WalletTransactionRequestMessage } from './wallet.types'; +import { WALLET_WORKER_CRASHED_MESSAGE_ID, WalletCrashedMessage, WalletMessageType, WalletPortData, WalletServiceRoutingData } from './wallet.types'; import { Wallet } from 'ethers6'; import { tryErrorToString } from 'src/common/utils'; -export const WALLET_WORKER_CRASHED_MESSAGE_ID = -1; - const DEFAULT_WALLET_RETRY_INTERVAL = 30000; const DEFAULT_WALLET_PROCESSING_INTERVAL = 100; const DEFAULT_WALLET_MAX_TRIES = 3; @@ -58,11 +56,6 @@ export interface WalletWorkerData { } -interface PortDescription { - chainId: string; - port: MessagePort; -} - @Global() @Injectable() export class WalletService implements OnModuleInit { @@ -70,9 +63,9 @@ export class WalletService implements OnModuleInit { private workers: Record = {}; private portsCount = 0; - private readonly ports: Record = {}; + private readonly ports: Record = {}; - private readonly queuedRequests: Record = {}; + private readonly queuedMessages: Record = {}; readonly publicKey: Promise; @@ -247,17 +240,23 @@ export class WalletService implements OnModuleInit { this.recoverQueuedMessages(chainId); }); - worker.on('message', (message: WalletServiceRoutingMessage) => { - const portDescription = this.ports[message.portId]; - if (portDescription == undefined) { + worker.on('message', (routingData: WalletServiceRoutingData) => { + const port = this.ports[routingData.portId]; + if (port == undefined) { this.loggerService.error( - message, + { routingData }, `Unable to route transaction response on wallet: port id not found.` ); return; } - portDescription.port.postMessage(message.data); + const portData: WalletPortData = { + chainId, + messageId: routingData.messageId, + message: routingData.message, + }; + + port.postMessage(portData); }); } @@ -278,38 +277,35 @@ export class WalletService implements OnModuleInit { setInterval(logStatus, STATUS_LOG_INTERVAL); } - async attachToWallet(chainId: string): Promise { + async attachToWallet(): Promise { const portId = this.portsCount++; const { port1, port2 } = new MessageChannel(); - port1.on('message', (message: WalletTransactionRequestMessage) => { - this.handleTransactionRequestMessage( - chainId, + port1.on('message', (portData: WalletPortData) => { + this.handleWalletPortData( portId, - message, + portData, ); }); - this.ports[portId] = { - chainId, - port: port1, - }; + this.ports[portId] = port1; return port2; } - private handleTransactionRequestMessage( - chainId: string, + private handleWalletPortData( portId: number, - message: WalletTransactionRequestMessage + portData: WalletPortData, ): void { + const chainId = portData.chainId; const worker = this.workers[chainId]; - const routingMessage: WalletServiceRoutingMessage = { + const routingData: WalletServiceRoutingData = { portId, - data: message + messageId: portData.messageId, + message: portData.message, }; if (worker == undefined) { @@ -317,51 +313,60 @@ export class WalletService implements OnModuleInit { { chainId, portId, - message + message: portData.message }, `Wallet does not exist for the requested chain. Queueing message.` ); - if (!(chainId in this.queuedRequests)) { - this.queuedRequests[chainId] = []; + if (!(chainId in this.queuedMessages)) { + this.queuedMessages[chainId] = []; } - this.queuedRequests[chainId]!.push(routingMessage); + this.queuedMessages[chainId]!.push(routingData); } else { - worker.postMessage(routingMessage); + worker.postMessage(routingData); } } private abortPendingRequests( chainId: string, ): void { - for (const portDescription of Object.values(this.ports)) { - if (portDescription.chainId === chainId) { - portDescription.port.postMessage({ - messageId: WALLET_WORKER_CRASHED_MESSAGE_ID - }); - } + const message: WalletCrashedMessage = { + type: WalletMessageType.WalletCrashed, + }; + + const walletCrashBroadcast: WalletPortData = { + chainId, + messageId: WALLET_WORKER_CRASHED_MESSAGE_ID, + message, + } + + for (const port of Object.values(this.ports)) { + port.postMessage(walletCrashBroadcast); } } private recoverQueuedMessages( chainId: string, ): void { - const queuedRequests = this.queuedRequests[chainId] ?? []; - this.queuedRequests[chainId] = []; + const queuedMessages = this.queuedMessages[chainId] ?? []; + this.queuedMessages[chainId] = []; this.loggerService.info( { chainId, - count: queuedRequests.length, + count: queuedMessages.length, }, `Recovering queued wallet requests.` ); - for (const request of queuedRequests) { - this.handleTransactionRequestMessage( - chainId, - request.portId, - request.data, + for (const queuedMessage of queuedMessages) { + this.handleWalletPortData( + queuedMessage.portId, + { + chainId, + messageId: queuedMessage.messageId, + message: queuedMessage.message, + }, ); } } diff --git a/src/wallet/wallet.types.ts b/src/wallet/wallet.types.ts index a800af5..0fc461b 100644 --- a/src/wallet/wallet.types.ts +++ b/src/wallet/wallet.types.ts @@ -4,21 +4,46 @@ import { TransactionRequest, TransactionReceipt, TransactionResponse } from "eth // Port Channels Types // ************************************************************************************************ -export interface WalletServiceRoutingMessage { + +export const WALLET_WORKER_CRASHED_MESSAGE_ID = -1; + +export interface WalletPortData { + chainId: string; + messageId: number; + message: WalletMessage; +} + +export interface WalletServiceRoutingData { portId: number; - data: T; + messageId: number; + message: WalletMessage; } +export enum WalletMessageType { + TransactionRequest, + TransactionRequestResponse, + GetFeeData, + FeeData, + WalletCrashed, +} + +export type WalletMessage = WalletTransactionRequestMessage + | WalletTransactionRequestResponseMessage + | WalletGetFeeDataMessage + | WalletFeeDataMessage + | WalletCrashedMessage; + + //TODO add 'priority' export interface WalletTransactionRequestMessage { - messageId: number; + type: WalletMessageType.TransactionRequest, txRequest: TransactionRequest; metadata: T; options?: WalletTransactionOptions; } -export interface WalletTransactionRequestResponse { - messageId: number; +export interface WalletTransactionRequestResponseMessage { + type: WalletMessageType.TransactionRequestResponse, txRequest: TransactionRequest; metadata: T; tx?: TransactionResponse; @@ -27,6 +52,23 @@ export interface WalletTransactionRequestResponse { confirmationError?: any; } +export interface WalletGetFeeDataMessage { + type: WalletMessageType.GetFeeData, + priority: boolean, +} + +export interface WalletFeeDataMessage { + type: WalletMessageType.FeeData, + priority: boolean, + gasPrice?: bigint; + maxFeePerGas?: bigint; + maxPriorityFeePerGas?: bigint; +} + +export interface WalletCrashedMessage { + type: WalletMessageType.WalletCrashed, +} + // Processing Types diff --git a/src/wallet/wallet.worker.ts b/src/wallet/wallet.worker.ts index 70b0605..90d9da6 100644 --- a/src/wallet/wallet.worker.ts +++ b/src/wallet/wallet.worker.ts @@ -6,7 +6,7 @@ import { STATUS_LOG_INTERVAL } from "src/logger/logger.service"; import { TransactionHelper } from "./transaction-helper"; import { ConfirmQueue } from "./queues/confirm-queue"; import { WalletWorkerData } from "./wallet.service"; -import { ConfirmedTransaction, GasFeeConfig, PendingTransaction, WalletTransactionOptions, WalletTransactionRequest, WalletTransactionRequestResponse, BalanceConfig, WalletServiceRoutingMessage } from "./wallet.types"; +import { ConfirmedTransaction, GasFeeConfig, PendingTransaction, WalletTransactionOptions, WalletTransactionRequest, WalletTransactionRequestResponseMessage, BalanceConfig, WalletServiceRoutingData, WalletMessageType, WalletFeeDataMessage } from "./wallet.types"; import { SubmitQueue } from "./queues/submit-queue"; @@ -150,17 +150,38 @@ class WalletWorker { } private initializePort(): void { - parentPort!.on('message', (message: WalletServiceRoutingMessage) => { - this.addTransaction( - message.portId, - message.data.messageId, - message.data.txRequest, - message.data.metadata, - message.data.options - ); + parentPort!.on('message', (message: WalletServiceRoutingData) => { + this.processRequest(message); }); } + private processRequest(data: WalletServiceRoutingData): void { + const messageType = data.message.type; + switch(messageType) { + case WalletMessageType.TransactionRequest: + this.addTransaction( + data.portId, + data.messageId, + data.message.txRequest, + data.message.metadata, + data.message.options + ) + break; + case WalletMessageType.GetFeeData: + this.handleGetFeeDataRequest( + data.portId, + data.messageId, + data.message.priority, + ); + break; + default: + this.logger.error( + data, + 'Unable to process request: wallet message type unsupported.' + ); + } + } + private addTransaction( portId: number, messageId: number, @@ -177,11 +198,35 @@ class WalletWorker { requeueCount: 0 }; - this.logger.debug(request, `Transaction received.`); + this.logger.info(request, `Transaction received.`); this.newRequestsQueue.push(request); } + private handleGetFeeDataRequest( + portId: number, + messageId: number, + priority: boolean, + ): void { + const adjustedFeeData = this.transactionHelper.getAdjustedFeeData(priority); + + const feeDataMessage: WalletFeeDataMessage = { + type: WalletMessageType.FeeData, + priority, + maxFeePerGas: adjustedFeeData?.maxFeePerGas ?? undefined, + maxPriorityFeePerGas: adjustedFeeData?.maxPriorityFeePerGas ?? undefined, + gasPrice: adjustedFeeData?.gasPrice ?? undefined, + }; + + const routingResponse: WalletServiceRoutingData = { + portId, + messageId, + message: feeDataMessage, + }; + + parentPort!.postMessage(routingResponse); + } + private initiateIntervalStatusLog(): void { const logStatus = () => { const status = { @@ -276,7 +321,7 @@ class WalletWorker { submissionError: tryErrorToString(transaction.submissionError) }; - this.logger.debug( + this.logger.info( logDescription, `Unsuccessful transaction processing: transaction failed.`, ); @@ -303,7 +348,7 @@ class WalletWorker { blockNumber: transaction.txReceipt.blockNumber }; - this.logger.debug( + this.logger.info( logDescription, `Successful transaction processing: transaction confirmed.`, ); @@ -352,7 +397,7 @@ class WalletWorker { await this.submitQueue.addOrders(requeueRequest); } else { - this.logger.debug( + this.logger.info( logDescription, `Unsuccessful transaction processing: transaction rejected.`, ); @@ -388,7 +433,7 @@ class WalletWorker { return null; } - this.logger.debug( + this.logger.info( { cancelTxNonce }, 'Submitting transaction cancellation' ); @@ -458,8 +503,8 @@ class WalletWorker { confirmationError?: any, ): void { - const transactionResponse: WalletTransactionRequestResponse = { - messageId: request.messageId, + const transactionResponse: WalletTransactionRequestResponseMessage = { + type: WalletMessageType.TransactionRequestResponse, txRequest: request.txRequest, metadata: request.metadata, tx, @@ -468,9 +513,10 @@ class WalletWorker { confirmationError: tryErrorToString(confirmationError), } - const routingResponse: WalletServiceRoutingMessage = { + const routingResponse: WalletServiceRoutingData = { portId: request.portId, - data: transactionResponse, + messageId: request.messageId, + message: transactionResponse, } parentPort!.postMessage(routingResponse);