From dedaa34c9feb357682df0efb47d2060aa5ec7a60 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:07:36 +0330 Subject: [PATCH 01/45] merge with main repo latest changes --- .vscode/launch.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..37fcc6042b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": ["/**"], + "program": "$${workspaceFolder}/**/*.ts", + "outFiles": ["${workspaceFolder}/**/*.js"] + } + ] +} From ba0d6eafa115c5fe6f6c70a5af0b2ba92247cb4a Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 7 Nov 2024 16:39:03 +0100 Subject: [PATCH 02/45] feat: Singe/MultiVM signer strategy --- typescript/cli/cli.ts | 5 +- typescript/cli/src/commands/options.ts | 1 + typescript/cli/src/commands/strategy.ts | 207 ++++++++++++++++++ typescript/cli/src/commands/warp.ts | 1 - typescript/cli/src/config/strategy.ts | 16 ++ typescript/cli/src/context/context.ts | 48 +++- .../cli/src/context/manager/ContextManager.ts | 44 ++++ .../src/context/strategies/signer/signer.ts | 192 ++++++++++++++++ .../submitter/GnosisSafeStrategy.ts | 15 ++ .../strategies/submitter/JsonRpcStrategy.ts | 24 ++ .../strategies/submitter/SubmitterStrategy.ts | 22 ++ .../submitter/SubmitterStrategyFactory.ts | 21 ++ typescript/cli/src/context/types.ts | 9 + typescript/cli/src/deploy/core.ts | 6 +- typescript/cli/src/deploy/utils.ts | 25 ++- typescript/cli/src/deploy/warp.ts | 44 +--- typescript/cli/src/send/transfer.ts | 15 +- typescript/cli/src/utils/balances.ts | 5 +- .../transactions/submitter/schemas.ts | 1 + 19 files changed, 635 insertions(+), 66 deletions(-) create mode 100644 typescript/cli/src/commands/strategy.ts create mode 100644 typescript/cli/src/config/strategy.ts create mode 100644 typescript/cli/src/context/manager/ContextManager.ts create mode 100644 typescript/cli/src/context/strategies/signer/signer.ts create mode 100644 typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts create mode 100644 typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts create mode 100644 typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts create mode 100644 typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts diff --git a/typescript/cli/cli.ts b/typescript/cli/cli.ts index 77be0b86f8..672d84247d 100644 --- a/typescript/cli/cli.ts +++ b/typescript/cli/cli.ts @@ -24,10 +24,11 @@ import { registryCommand } from './src/commands/registry.js'; import { relayerCommand } from './src/commands/relayer.js'; import { sendCommand } from './src/commands/send.js'; import { statusCommand } from './src/commands/status.js'; +import { strategyCommand } from './src/commands/strategy.js'; import { submitCommand } from './src/commands/submit.js'; import { validatorCommand } from './src/commands/validator.js'; import { warpCommand } from './src/commands/warp.js'; -import { contextMiddleware } from './src/context/context.js'; +import { contextMiddleware, signerMiddleware } from './src/context/context.js'; import { configureLogger, errorRed } from './src/logger.js'; import { checkVersion } from './src/utils/version-check.js'; import { VERSION } from './src/version.js'; @@ -55,6 +56,7 @@ try { configureLogger(argv.log as LogFormat, argv.verbosity as LogLevel); }, contextMiddleware, + signerMiddleware, ]) .command(avsCommand) .command(configCommand) @@ -69,6 +71,7 @@ try { .command(submitCommand) .command(validatorCommand) .command(warpCommand) + .command(strategyCommand) .version(VERSION) .demandCommand() .strict() diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index f23194c804..3ffffa410f 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -95,6 +95,7 @@ export const DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH = './configs/warp-route-deployment.yaml'; export const DEFAULT_CORE_DEPLOYMENT_CONFIG_PATH = './configs/core-config.yaml'; +export const DEFAULT_STRATEGY_CONFIG_PATH = './configs/default-strategy.yaml'; export const warpDeploymentConfigCommandOption: Options = { type: 'string', diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts new file mode 100644 index 0000000000..2425389129 --- /dev/null +++ b/typescript/cli/src/commands/strategy.ts @@ -0,0 +1,207 @@ +// import { input, select } from '@inquirer/prompts'; +import { input, select } from '@inquirer/prompts'; +import { ethers } from 'ethers'; +import { stringify as yamlStringify } from 'yaml'; +import { CommandModule } from 'yargs'; + +import { + ChainSubmissionStrategy, + ChainSubmissionStrategySchema, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, assert } from '@hyperlane-xyz/utils'; + +import { CommandModuleWithWriteContext } from '../context/types.js'; +import { + errorRed, + log, + logBlue, + logCommandHeader, + logGreen, +} from '../logger.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; +import { + indentYamlOrJson, + mergeYamlOrJson, + readYamlOrJson, + writeYamlOrJson, +} from '../utils/files.js'; + +import { + DEFAULT_STRATEGY_CONFIG_PATH, + outputFileCommandOption, +} from './options.js'; + +/** + * Parent command + */ +export const strategyCommand: CommandModule = { + command: 'strategy', + describe: 'Manage Hyperlane deployment strategies', + builder: (yargs) => yargs.command(init).version(false).demandCommand(), + handler: () => log('Command required'), +}; + +export const init: CommandModuleWithWriteContext<{ + chain: string; + config: string; +}> = { + command: 'init', + describe: 'Initiates strategy', + builder: { + config: outputFileCommandOption( + DEFAULT_STRATEGY_CONFIG_PATH, + false, + 'The path to output a Key Config JSON or YAML file.', + ), + type: { + type: 'string', + description: + 'Type of submitter (jsonRpc, impersonatedAccount, gnosisSafe, gnosisSafeTxBuilder)', + }, + safeAddress: { + type: 'string', + description: + 'Safe address (required for gnosisSafe and gnosisSafeTxBuilder types)', + }, + userAddress: { + type: 'string', + description: 'User address (required for impersonatedAccount type)', + }, + }, + handler: async ({ + context, + type: inputType, + safeAddress: inputSafeAddress, + userAddress: inputUserAddress, + }) => { + logCommandHeader(`Hyperlane Key Init`); + + try { + await readYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH); + } catch (e) { + writeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, {}, 'yaml'); + } + + const chain = await runSingleChainSelectionStep(context.chainMetadata); + const chainProtocol = context.chainMetadata[chain].protocol; + assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); + + // If type wasn't provided via command line, prompt for it + const type = + inputType || + (await select({ + message: 'Enter the type of submitter', + choices: Object.values(TxSubmitterType).map((value) => ({ + name: value, + value: value, + })), + })); + + let submitter: any = { + type: type, + }; + + // Configure submitter based on type + switch (type) { + case TxSubmitterType.JSON_RPC: + const privateKey = await input({ + message: 'Enter your private key', + validate: (pk) => isValidPrivateKey(pk), + }); + submitter.privateKey = privateKey; + break; + + case TxSubmitterType.IMPERSONATED_ACCOUNT: + const userAddress = + inputUserAddress || + (await input({ + message: 'Enter the user address to impersonate', + validate: (address) => { + try { + return ethers.utils.isAddress(address) + ? true + : 'Invalid Ethereum address'; + } catch { + return 'Invalid Ethereum address'; + } + }, + })); + assert( + userAddress, + 'User address is required for impersonated account', + ); + submitter.userAddress = userAddress; + break; + + case TxSubmitterType.GNOSIS_SAFE: + case TxSubmitterType.GNOSIS_TX_BUILDER: + const safeAddress = + inputSafeAddress || + (await input({ + message: 'Enter the Safe address', + validate: (address) => { + try { + return ethers.utils.isAddress(address) + ? true + : 'Invalid Safe address'; + } catch { + return 'Invalid Safe address'; + } + }, + })); + assert(safeAddress, 'Safe address is required for Gnosis Safe'); + + submitter = { + type: type, + chain: chain, + safeAddress: safeAddress, + }; + + if (type === TxSubmitterType.GNOSIS_TX_BUILDER) { + const version = await input({ + message: 'Enter the Safe version (default: 1.0)', + default: '1.0', + }); + submitter.version = version; + } + break; + + default: + throw new Error(`Unsupported submitter type: ${type}`); + } + + let result: ChainSubmissionStrategy = { + [chain]: { + submitter: submitter, + }, + }; + + try { + const strategyConfig = ChainSubmissionStrategySchema.parse(result); + logBlue( + `Strategy config is valid, writing to file ${DEFAULT_STRATEGY_CONFIG_PATH}:\n`, + ); + log(indentYamlOrJson(yamlStringify(strategyConfig, null, 2), 4)); + + mergeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, strategyConfig); + logGreen('✅ Successfully created new key config.'); + } catch (e) { + errorRed( + `Key config is invalid, please check the submitter configuration.`, + ); + throw e; + } + process.exit(0); + }, +}; + +function isValidPrivateKey(privateKey: string): boolean { + try { + // Attempt to create a Wallet instance with the private key + const wallet = new ethers.Wallet(privateKey); + return wallet.privateKey === privateKey; + } catch (error) { + return false; + } +} diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index b7fb456243..388c478b03 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -138,7 +138,6 @@ export const deploy: CommandModuleWithWriteContext<{ try { await runWarpRouteDeploy({ context, - warpRouteDeploymentConfigPath: config, }); } catch (error: any) { evaluateIfDryRunFailure(error, dryRun); diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts new file mode 100644 index 0000000000..36925250a6 --- /dev/null +++ b/typescript/cli/src/config/strategy.ts @@ -0,0 +1,16 @@ +import { + ChainSubmissionStrategy, + ChainSubmissionStrategySchema, +} from '@hyperlane-xyz/sdk'; + +import { readYamlOrJson } from '../utils/files.js'; + +export async function readDefaultStrategyConfig( + filePath: string, +): Promise { + let config = readYamlOrJson(filePath); + if (!config) + throw new Error(`No default strategy config found at ${filePath}`); + + return ChainSubmissionStrategySchema.parse(config); +} diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 30390f4b40..f641157cf3 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -16,14 +16,20 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; +import { + DEFAULT_STRATEGY_CONFIG_PATH, // DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, +} from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; +import { readDefaultStrategyConfig } from '../config/strategy.js'; +// import { readWarpRouteDeployConfig } from '../config/warp.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; -import { getImpersonatedSigner, getSigner } from '../utils/keys.js'; +import { getImpersonatedSigner } from '../utils/keys.js'; +import { SignerStrategyFactory } from './strategies/signer/signer.js'; import { CommandContext, ContextSettings, @@ -32,6 +38,7 @@ import { export async function contextMiddleware(argv: Record) { const isDryRun = !isNullish(argv.dryRun); + const requiresKey = isSignCommand(argv); const settings: ContextSettings = { registryUri: argv.registry, @@ -42,16 +49,44 @@ export async function contextMiddleware(argv: Record) { disableProxy: argv.disableProxy, skipConfirmation: argv.yes, }; + if (!isDryRun && settings.fromAddress) throw new Error( "'--from-address' or '-f' should only be used for dry-runs", ); + const context = isDryRun ? await getDryRunContext(settings, argv.dryRun) : await getContext(settings); argv.context = context; } +export async function signerMiddleware(argv: Record) { + const { requiresKey, multiProvider } = argv.context; + + if (!requiresKey) return argv; + + const defaultStrategy = await readDefaultStrategyConfig( + argv.strategy || DEFAULT_STRATEGY_CONFIG_PATH, + ); + + // Select appropriate strategy + const strategy = SignerStrategyFactory.createStrategy(argv); + + // Determine chains + const chains = await strategy.determineChains(argv); + + // Create context manager + const contextManager = strategy.createContextManager(chains, defaultStrategy); + + // Figure out if a command requires --origin and --destination + + // Configure signers + await strategy.configureSigners(argv, multiProvider, contextManager); + + return argv; +} + /** * Retrieves context for the user-selected command * @returns context for the current command @@ -63,21 +98,18 @@ export async function getContext({ requiresKey, skipConfirmation, disableProxy = false, + signers, }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); - - let signer: ethers.Wallet | undefined = undefined; - if (key || requiresKey) { - ({ key, signer } = await getSigner({ key, skipConfirmation })); - } - const multiProvider = await getMultiProvider(registry, signer); + const multiProvider = await getMultiProvider(registry); return { registry, + requiresKey, chainMetadata: multiProvider.metadata, multiProvider, key, - signer, + signers, skipConfirmation: !!skipConfirmation, } as CommandContext; } diff --git a/typescript/cli/src/context/manager/ContextManager.ts b/typescript/cli/src/context/manager/ContextManager.ts new file mode 100644 index 0000000000..baa68e5ee7 --- /dev/null +++ b/typescript/cli/src/context/manager/ContextManager.ts @@ -0,0 +1,44 @@ +import { Signer } from 'ethers'; + +import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; + +import { ISubmitterStrategy } from '../strategies/submitter/SubmitterStrategy.js'; +import { SubmitterStrategyFactory } from '../strategies/submitter/SubmitterStrategyFactory.js'; + +export class ContextManager { + private strategy: ISubmitterStrategy; + + constructor( + defaultStrategy: any, + private chains: ChainName[], + submitterType: TxSubmitterType, + ) { + this.strategy = SubmitterStrategyFactory.createStrategy( + submitterType, + defaultStrategy, + ); + } + + async getChainKeys(): Promise< + Array<{ chainName: ChainName; privateKey: string }> + > { + const chainKeys = await Promise.all( + this.chains.map(async (chain) => ({ + chainName: chain, + privateKey: await this.strategy.getPrivateKey(chain), + })), + ); + + return chainKeys; + } + + async getSigners(): Promise> { + const chainKeys = await this.getChainKeys(); + return Object.fromEntries( + chainKeys.map(({ chainName, privateKey }) => [ + chainName, + this.strategy.getSigner(privateKey), + ]), + ); + } +} diff --git a/typescript/cli/src/context/strategies/signer/signer.ts b/typescript/cli/src/context/strategies/signer/signer.ts new file mode 100644 index 0000000000..3da8bf9c70 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/signer.ts @@ -0,0 +1,192 @@ +import { confirm } from '@inquirer/prompts'; + +import { ChainName, MultiProvider, TxSubmitterType } from '@hyperlane-xyz/sdk'; + +import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { readWarpRouteDeployConfig } from '../../../config/warp.js'; +import { runSingleChainSelectionStep } from '../../../utils/chains.js'; +import { isFile, runFileSelectionStep } from '../../../utils/files.js'; +import { ContextManager } from '../../manager/ContextManager.js'; + +export interface WarpDeployContextResult { + warpRouteConfig: Record; + chains: ChainName[]; +} + +export interface SignerStrategy { + /** + * Determines the chains to be used for signing + * @param argv Command arguments + * @returns Array of chain names + */ + determineChains(argv: Record): Promise; + + /** + * Creates a context manager for the selected chains + * @param chains Selected chains + * @param defaultStrategy Default strategy configuration + * @returns ContextManager instance + */ + createContextManager( + chains: ChainName[], + defaultStrategy: any, + ): ContextManager; + + /** + * Configures signers for the multi-provider + * @param argv Command arguments + * @param multiProvider MultiProvider instance + * @param contextManager ContextManager instance + */ + configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise; +} + +export class SingleChainSignerStrategy implements SignerStrategy { + async determineChains(argv: Record): Promise { + const chain: ChainName = + argv.chain || + (await runSingleChainSelectionStep( + argv.context.chainMetadata, + 'Select chain to connect:', + )); + + argv.chain = chain; + return [chain]; // Explicitly return as single-item array + } + + createContextManager( + chains: ChainName[], + defaultStrategy: any, + ): ContextManager { + return new ContextManager( + defaultStrategy, + chains, + TxSubmitterType.JSON_RPC, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise { + const signers = await contextManager.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.contextManager = contextManager; + } +} + +export class WarpDeploySignerStrategy implements SignerStrategy { + async determineChains(argv: Record): Promise { + const { warpRouteConfig, chains } = await getWarpDeployContext({ + configPath: argv.wd || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, + skipConfirmation: argv.skipConfirmation, + context: argv.context, + }); + + argv.context.warpRouteConfig = warpRouteConfig; + argv.context.chains = chains; + return chains; + } + + createContextManager( + chains: ChainName[], + defaultStrategy: any, + ): ContextManager { + return new ContextManager( + defaultStrategy, + chains, + TxSubmitterType.JSON_RPC, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise { + const signers = await contextManager.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.contextManager = contextManager; + } +} + +export class SignerStrategyFactory { + static createStrategy(argv: Record): SignerStrategy { + if ( + argv._[0] === 'warp' && + (argv._[1] === 'deploy' || argv._[1] === 'send') + ) { + return new WarpDeploySignerStrategy(); + } + + if (argv._[0] === 'send') { + // You might want to create a specific multi-chain send strategy + return new WarpDeploySignerStrategy(); + } + + return new SingleChainSignerStrategy(); + } +} + +export async function getWarpDeployContext({ + configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, + skipConfirmation = false, + context, +}: { + configPath?: string; + skipConfirmation?: boolean; + context: any; +}): Promise { + // Validate config path + if (!configPath || !isFile(configPath)) { + if (skipConfirmation) { + throw new Error('Warp route deployment config is required'); + } + + // Interactive file selection if no path provided + configPath = await runFileSelectionStep( + './configs', + 'Warp route deployment config', + 'warp', + ); + } else { + console.log(`Using warp route deployment config at ${configPath}`); + } + + // Read warp route deployment configuration + const warpRouteConfig = await readWarpRouteDeployConfig(configPath, context); + + // Extract chains from configuration + const chains = Object.keys(warpRouteConfig) as ChainName[]; + + // Validate chains + if (chains.length === 0) { + throw new Error('No chains found in warp route deployment config'); + } + + // Optional: Confirm multi-chain deployment + if (!skipConfirmation && chains.length > 1) { + const confirmMultiChain = await confirm({ + message: `Deploy warp route across ${chains.length} chains: ${chains.join( + ', ', + )}?`, + default: true, + }); + + if (!confirmMultiChain) { + throw new Error('Deployment cancelled by user'); + } + } + + return { + warpRouteConfig, + chains, + }; +} diff --git a/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts b/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts new file mode 100644 index 0000000000..8369be9b00 --- /dev/null +++ b/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts @@ -0,0 +1,15 @@ +import { TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; + +export class GnosisSafeStrategy extends BaseSubmitterStrategy { + async getPrivateKey(chain: ChainName): Promise { + // Implement Gnosis Safe specific logic + throw new Error('Not implemented'); + } + + getType(): TxSubmitterType { + return TxSubmitterType.GNOSIS_SAFE; + } +} diff --git a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts new file mode 100644 index 0000000000..55ca636931 --- /dev/null +++ b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts @@ -0,0 +1,24 @@ +import { password } from '@inquirer/prompts'; + +import { TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; + +export class JsonRpcStrategy extends BaseSubmitterStrategy { + async getPrivateKey(chain: ChainName): Promise { + let pk = this.config[chain]?.submitter?.privateKey; + + if (!pk) { + pk = await password({ + message: `Please enter the private key for chain ${chain}`, + }); + } + + return pk; + } + + getType(): TxSubmitterType { + return TxSubmitterType.JSON_RPC; + } +} diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts new file mode 100644 index 0000000000..10bc3f3123 --- /dev/null +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts @@ -0,0 +1,22 @@ +import { ethers } from 'ethers'; + +import { TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +export interface ISubmitterStrategy { + getPrivateKey(chain: ChainName): Promise; + getSigner(privateKey: string): ethers.Signer; + getType(): TxSubmitterType; +} + +export abstract class BaseSubmitterStrategy implements ISubmitterStrategy { + constructor(protected config: any) {} + + abstract getPrivateKey(chain: ChainName): Promise; + + getSigner(privateKey: string): ethers.Signer { + return new ethers.Wallet(privateKey); + } + + abstract getType(): TxSubmitterType; +} diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts new file mode 100644 index 0000000000..9c32f992c7 --- /dev/null +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts @@ -0,0 +1,21 @@ +import { TxSubmitterType } from '@hyperlane-xyz/sdk'; + +import { GnosisSafeStrategy } from './GnosisSafeStrategy.js'; +import { JsonRpcStrategy } from './JsonRpcStrategy.js'; +import { ISubmitterStrategy } from './SubmitterStrategy.js'; + +export class SubmitterStrategyFactory { + static createStrategy( + type: TxSubmitterType, + config: any, + ): ISubmitterStrategy { + switch (type) { + case TxSubmitterType.JSON_RPC: + return new JsonRpcStrategy(config); + case TxSubmitterType.GNOSIS_SAFE: + return new GnosisSafeStrategy(config); + default: + throw new Error(`Unsupported submitter type: ${type}`); + } + } +} diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 6c3a17c5ff..e3ada01b2b 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -5,9 +5,13 @@ import type { IRegistry } from '@hyperlane-xyz/registry'; import type { ChainMap, ChainMetadata, + ChainName, MultiProvider, + WarpRouteDeployConfig, } from '@hyperlane-xyz/sdk'; +// TODO: revisit ContextSettings & CommandContext for improvements + export interface ContextSettings { registryUri: string; registryOverrideUri: string; @@ -16,6 +20,7 @@ export interface ContextSettings { requiresKey?: boolean; disableProxy?: boolean; skipConfirmation?: boolean; + signers?: any; } export interface CommandContext { @@ -25,6 +30,10 @@ export interface CommandContext { skipConfirmation: boolean; key?: string; signer?: ethers.Signer; + signers?: ethers.Signer[]; + chain?: ChainName; + chains?: ChainName[]; + warpRouteConfig?: WarpRouteDeployConfig; } export interface WriteCommandContext extends CommandContext { diff --git a/typescript/cli/src/deploy/core.ts b/typescript/cli/src/deploy/core.ts index f0848458fc..6eaed956f8 100644 --- a/typescript/cli/src/deploy/core.ts +++ b/typescript/cli/src/deploy/core.ts @@ -42,7 +42,6 @@ export async function runCoreDeploy(params: DeployParams) { let chain = params.chain; const { - signer, isDryRun, chainMetadata, dryRunChain, @@ -61,13 +60,14 @@ export async function runCoreDeploy(params: DeployParams) { 'Select chain to connect:', ); } - let apiKeys: ChainMap = {}; if (!skipConfirmation) apiKeys = await getOrRequestApiKeys([chain], chainMetadata); + const signer = multiProvider.getSigner(chain); + const deploymentParams: DeployParams = { - context, + context: { ...context, signer }, chain, config, }; diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index d8ced32dc7..71ea6cbb65 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -41,7 +41,7 @@ export async function runPreflightChecksForChains({ chainsToGasCheck?: ChainName[]; }) { log('Running pre-flight checks for chains...'); - const { signer, multiProvider } = context; + const { multiProvider } = context; if (!chains?.length) throw new Error('Empty chain selection'); for (const chain of chains) { @@ -49,15 +49,15 @@ export async function runPreflightChecksForChains({ if (!metadata) throw new Error(`No chain config found for ${chain}`); if (metadata.protocol !== ProtocolType.Ethereum) throw new Error('Only Ethereum chains are supported for now'); + const signer = multiProvider.getSigner(chain); + assertSigner(signer); + logGreen(`✅ ${chain} signer is valid`); } logGreen('✅ Chains are valid'); - assertSigner(signer); - logGreen('✅ Signer is valid'); - await nativeBalancesAreSufficient( multiProvider, - signer, + null, chainsToGasCheck ?? chains, minGas, ); @@ -70,8 +70,13 @@ export async function runDeployPlanStep({ context: WriteCommandContext; chain: ChainName; }) { - const { signer, chainMetadata: chainMetadataMap, skipConfirmation } = context; - const address = await signer.getAddress(); + const { + chainMetadata: chainMetadataMap, + multiProvider, + skipConfirmation, + } = context; + + const address = await multiProvider.getSigner(chain).getAddress(); logBlue('\nDeployment plan'); logGray('==============='); @@ -124,7 +129,7 @@ export function isZODISMConfig(filepath: string): boolean { export async function prepareDeploy( context: WriteCommandContext, - userAddress: Address, + userAddress: Address | null, chains: ChainName[], ): Promise> { const { multiProvider, isDryRun } = context; @@ -134,6 +139,7 @@ export async function prepareDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); + const userAddress = await multiProvider.getSigner(chain).getAddress(); const currentBalance = await provider.getBalance(userAddress); initialBalances[chain] = currentBalance; }), @@ -145,7 +151,7 @@ export async function completeDeploy( context: WriteCommandContext, command: string, initialBalances: Record, - userAddress: Address, + userAddress: Address | null, chains: ChainName[], ) { const { multiProvider, isDryRun } = context; @@ -154,6 +160,7 @@ export async function completeDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); + const userAddress = await multiProvider.getSigner(chain).getAddress(); const currentBalance = await provider.getBalance(userAddress); const balanceDelta = initialBalances[chain].sub(currentBalance); if (isDryRun && balanceDelta.lt(0)) break; diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 36bbc2ad8f..71eed010c5 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -62,7 +62,6 @@ import { retryAsync, } from '@hyperlane-xyz/utils'; -import { readWarpRouteDeployConfig } from '../config/warp.js'; import { MINIMUM_WARP_DEPLOY_GAS } from '../consts.js'; import { getOrRequestApiKeys } from '../context/context.js'; import { WriteCommandContext } from '../context/types.js'; @@ -70,9 +69,7 @@ import { log, logBlue, logGray, logGreen, logTable } from '../logger.js'; import { getSubmitterBuilder } from '../submit/submit.js'; import { indentYamlOrJson, - isFile, readYamlOrJson, - runFileSelectionStep, writeYamlOrJson, } from '../utils/files.js'; @@ -95,43 +92,24 @@ interface WarpApplyParams extends DeployParams { export async function runWarpRouteDeploy({ context, - warpRouteDeploymentConfigPath, }: { context: WriteCommandContext; - warpRouteDeploymentConfigPath?: string; }) { - const { signer, skipConfirmation, chainMetadata } = context; - - if ( - !warpRouteDeploymentConfigPath || - !isFile(warpRouteDeploymentConfigPath) - ) { - if (skipConfirmation) - throw new Error('Warp route deployment config required'); - warpRouteDeploymentConfigPath = await runFileSelectionStep( - './configs', - 'Warp route deployment config', - 'warp', - ); - } else { - log( - `Using warp route deployment config at ${warpRouteDeploymentConfigPath}`, - ); - } - const warpRouteConfig = await readWarpRouteDeployConfig( - warpRouteDeploymentConfigPath, - context, - ); - - const chains = Object.keys(warpRouteConfig); + const { + skipConfirmation, + chainMetadata, + warpRouteConfig, + chains: contextChains, + } = context; + const chains = contextChains!; let apiKeys: ChainMap = {}; if (!skipConfirmation) apiKeys = await getOrRequestApiKeys(chains, chainMetadata); const deploymentParams = { context, - warpDeployConfig: warpRouteConfig, + warpDeployConfig: warpRouteConfig!, }; await runDeployPlanStep(deploymentParams); @@ -142,9 +120,7 @@ export async function runWarpRouteDeploy({ minGas: MINIMUM_WARP_DEPLOY_GAS, }); - const userAddress = await signer.getAddress(); - - const initialBalances = await prepareDeploy(context, userAddress, chains); + const initialBalances = await prepareDeploy(context, null, chains); const deployedContracts = await executeDeploy(deploymentParams, apiKeys); @@ -155,7 +131,7 @@ export async function runWarpRouteDeploy({ await writeDeploymentArtifacts(warpCoreConfig, context); - await completeDeploy(context, 'warp', initialBalances, userAddress, chains); + await completeDeploy(context, 'warp', initialBalances, null, chains!); } async function runDeployPlanStep({ context, warpDeployConfig }: DeployParams) { diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index a89eb6aa99..2e94fdd53f 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -106,8 +106,9 @@ async function executeDelivery({ skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { signer, multiProvider, registry } = context; + const { multiProvider, registry } = context; + const signer = multiProvider.getSigner(origin); const signerAddress = await signer.getAddress(); recipient ||= signerAddress; @@ -136,12 +137,12 @@ async function executeDelivery({ token = warpCore.findToken(origin, routerAddress)!; } - const senderAddress = await signer.getAddress(); + // const senderAddress = await multiProvider.getSigner(origin).getAddress(); const errors = await warpCore.validateTransfer({ originTokenAmount: token.amount(amount), destination, - recipient: recipient ?? senderAddress, - sender: senderAddress, + recipient: recipient ?? signerAddress, + sender: signerAddress, }); if (errors) { logRed('Error validating transfer', JSON.stringify(errors)); @@ -152,8 +153,8 @@ async function executeDelivery({ const transferTxs = await warpCore.getTransferRemoteTxs({ originTokenAmount: new TokenAmount(amount, token), destination, - sender: senderAddress, - recipient: recipient ?? senderAddress, + sender: signerAddress, + recipient: recipient ?? signerAddress, }); const txReceipts = []; @@ -172,7 +173,7 @@ async function executeDelivery({ const parsed = parseWarpRouteMessage(message.parsed.body); logBlue( - `Sent transfer from sender (${senderAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, + `Sent transfer from sender (${signerAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, ); logBlue(`Message ID: ${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index 5cf8019771..ef497e6261 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -7,14 +7,13 @@ import { logGreen, logRed } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, - signer: ethers.Signer, + signer: ethers.Signer | null, chains: ChainName[], minGas: string, ) { - const address = await signer.getAddress(); - const sufficientBalances: boolean[] = []; for (const chain of chains) { + const address = multiProvider.getSigner(chain).getAddress(); const provider = multiProvider.getProvider(chain); const gasPrice = await provider.getGasPrice(); const minBalanceWei = gasPrice.mul(minGas).toString(); diff --git a/typescript/sdk/src/providers/transactions/submitter/schemas.ts b/typescript/sdk/src/providers/transactions/submitter/schemas.ts index 89c891c09c..81dfba7e45 100644 --- a/typescript/sdk/src/providers/transactions/submitter/schemas.ts +++ b/typescript/sdk/src/providers/transactions/submitter/schemas.ts @@ -10,6 +10,7 @@ import { export const SubmitterMetadataSchema = z.discriminatedUnion('type', [ z.object({ type: z.literal(TxSubmitterType.JSON_RPC), + privateKey: z.string().optional(), }), z.object({ type: z.literal(TxSubmitterType.IMPERSONATED_ACCOUNT), From 2bf349b0202a7089e69bfb3e5426702b91750e29 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 8 Nov 2024 16:58:49 +0100 Subject: [PATCH 03/45] feat: Deployment strategies & refactoring --- typescript/cli/src/commands/options.ts | 2 +- typescript/cli/src/commands/signCommands.ts | 2 +- typescript/cli/src/commands/strategy.ts | 14 +- typescript/cli/src/context/context.ts | 44 ++-- .../cli/src/context/manager/ContextManager.ts | 28 ++- .../signer/OriginDestinationSignerStrategy.ts | 62 ++++++ .../strategies/signer/SignerStrategy.ts | 45 ++++ .../signer/SignerStrategyFactory.ts | 23 +++ .../signer/SingleChainSignerStrategy.ts | 49 +++++ .../signer/WarpDeploySignerStrategy.ts | 117 +++++++++++ .../src/context/strategies/signer/signer.ts | 192 ------------------ typescript/cli/src/context/types.ts | 2 - typescript/cli/src/deploy/warp.ts | 33 ++- 13 files changed, 384 insertions(+), 229 deletions(-) create mode 100644 typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts create mode 100644 typescript/cli/src/context/strategies/signer/SignerStrategy.ts create mode 100644 typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts create mode 100644 typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts create mode 100644 typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts delete mode 100644 typescript/cli/src/context/strategies/signer/signer.ts diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index 3ffffa410f..7f34ac8cb0 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -95,7 +95,7 @@ export const DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH = './configs/warp-route-deployment.yaml'; export const DEFAULT_CORE_DEPLOYMENT_CONFIG_PATH = './configs/core-config.yaml'; -export const DEFAULT_STRATEGY_CONFIG_PATH = './configs/default-strategy.yaml'; +export const DEFAULT_STRATEGY_CONFIG_PATH = `${os.homedir()}/.hyperlane/strategies/default-strategy.yaml`; export const warpDeploymentConfigCommandOption: Options = { type: 'string', diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 79c243ca6f..e420677958 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,7 +1,7 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit']; +export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit', 'apply']; export function isSignCommand(argv: any): boolean { return ( diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 2425389129..8bc92a4365 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -22,7 +22,6 @@ import { import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, - mergeYamlOrJson, readYamlOrJson, writeYamlOrJson, } from '../utils/files.js'; @@ -76,11 +75,15 @@ export const init: CommandModuleWithWriteContext<{ userAddress: inputUserAddress, }) => { logCommandHeader(`Hyperlane Key Init`); - + let defaultStrategy; try { - await readYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH); + defaultStrategy = await readYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH); } catch (e) { - writeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, {}, 'yaml'); + defaultStrategy = writeYamlOrJson( + DEFAULT_STRATEGY_CONFIG_PATH, + {}, + 'yaml', + ); } const chain = await runSingleChainSelectionStep(context.chainMetadata); @@ -172,6 +175,7 @@ export const init: CommandModuleWithWriteContext<{ } let result: ChainSubmissionStrategy = { + ...defaultStrategy, [chain]: { submitter: submitter, }, @@ -184,7 +188,7 @@ export const init: CommandModuleWithWriteContext<{ ); log(indentYamlOrJson(yamlStringify(strategyConfig, null, 2), 4)); - mergeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, strategyConfig); + writeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, strategyConfig); logGreen('✅ Successfully created new key config.'); } catch (e) { errorRed( diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index f641157cf3..bae7754b84 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -16,12 +16,9 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; -import { - DEFAULT_STRATEGY_CONFIG_PATH, // DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, -} from '../commands/options.js'; +import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; import { readDefaultStrategyConfig } from '../config/strategy.js'; -// import { readWarpRouteDeployConfig } from '../config/warp.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -29,7 +26,7 @@ import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; -import { SignerStrategyFactory } from './strategies/signer/signer.js'; +import { SignerStrategyFactory } from './strategies/signer/SignerStrategyFactory.js'; import { CommandContext, ContextSettings, @@ -66,25 +63,33 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - const defaultStrategy = await readDefaultStrategyConfig( - argv.strategy || DEFAULT_STRATEGY_CONFIG_PATH, - ); - - // Select appropriate strategy - const strategy = SignerStrategyFactory.createStrategy(argv); + const strategyUrl = argv.strategy || DEFAULT_STRATEGY_CONFIG_PATH; + const strategyConfig = await readDefaultStrategyConfig(strategyUrl); - // Determine chains - const chains = await strategy.determineChains(argv); + // Select the appropriate signing strategy based on the provided hyperlane command + // e.g command `core deploy` uses SingleChainSignerStrategy + const signerStrategy = SignerStrategyFactory.createStrategy(argv); - // Create context manager - const contextManager = strategy.createContextManager(chains, defaultStrategy); + // Determine the chains that will be used for signing based on the selected strategy + // e.g. SingleChainSignerStrategy extracts jsonRpc private key from strategyConfig else prompts user PK input + const chains = await signerStrategy.determineChains(argv); - // Figure out if a command requires --origin and --destination + // Create a context manager for the signer, which will manage the signing context for the specified chains + // default: TxSubmitterType.JSON_RPC + const signerContextManager = signerStrategy.createContextManager( + chains, + strategyConfig, + argv, + ); - // Configure signers - await strategy.configureSigners(argv, multiProvider, contextManager); + // Configure the signers using the selected strategy, multiProvider, and context manager + await signerStrategy.configureSigners( + argv, + multiProvider, + signerContextManager, + ); - return argv; + return { ...argv, strategy: strategyUrl }; } /** @@ -101,6 +106,7 @@ export async function getContext({ signers, }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); + const multiProvider = await getMultiProvider(registry); return { diff --git a/typescript/cli/src/context/manager/ContextManager.ts b/typescript/cli/src/context/manager/ContextManager.ts index baa68e5ee7..4cb3f46450 100644 --- a/typescript/cli/src/context/manager/ContextManager.ts +++ b/typescript/cli/src/context/manager/ContextManager.ts @@ -2,36 +2,58 @@ import { Signer } from 'ethers'; import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ENV } from '../../utils/env.js'; import { ISubmitterStrategy } from '../strategies/submitter/SubmitterStrategy.js'; import { SubmitterStrategyFactory } from '../strategies/submitter/SubmitterStrategyFactory.js'; +/** + * @title ContextManager + * @dev Manages the context for transaction submitters, including retrieving chain keys and signers. + */ export class ContextManager { private strategy: ISubmitterStrategy; + /** + * @param strategyConfig Configuration for the submitter strategy. + * @param chains Array of chain names to manage. + * @param submitterType Type of transaction submitter to use. + */ constructor( - defaultStrategy: any, + strategyConfig: any, private chains: ChainName[], submitterType: TxSubmitterType, + private argv?: any, ) { this.strategy = SubmitterStrategyFactory.createStrategy( submitterType, - defaultStrategy, + strategyConfig, ); } + /** + * @dev Retrieves the private keys for the specified chains. + * @return An array of objects containing chain names and their corresponding private keys. + */ async getChainKeys(): Promise< Array<{ chainName: ChainName; privateKey: string }> > { const chainKeys = await Promise.all( this.chains.map(async (chain) => ({ chainName: chain, - privateKey: await this.strategy.getPrivateKey(chain), + privateKey: + this.argv.key || // argv.key overrides strategy key + (await this.strategy.getPrivateKey(chain)) || + ENV.HYP_KEY, // argv.key and ENV.HYP_KEY for backwards compatibility })), ); return chainKeys; } + /** + * @dev Retrieves signers for the specified chains using their private keys. + * @return A record mapping chain names to their corresponding Signer objects. + */ async getSigners(): Promise> { const chainKeys = await this.getChainKeys(); return Object.fromEntries( diff --git a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts new file mode 100644 index 0000000000..ce441206f9 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts @@ -0,0 +1,62 @@ +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; + +import { runSingleChainSelectionStep } from '../../../utils/chains.js'; +import { ContextManager } from '../../manager/ContextManager.js'; + +import { SignerStrategy } from './SignerStrategy.js'; + +export class OriginDestinationSignerStrategy implements SignerStrategy { + async determineChains(argv: Record): Promise { + const { context } = argv; + let origin = argv.origin; + let destination = argv.destination; + + if (!origin) { + origin = await runSingleChainSelectionStep( + context.chainMetadata, + 'Select the origin chain', + ); + } + + if (!destination) { + destination = await runSingleChainSelectionStep( + context.chainMetadata, + 'Select the destination chain', + ); + } + const chains = [origin, destination]; + argv.chains = chains; + argv.origin = origin; + argv.destination = origin; + return chains; // Explicitly return as single-item array + } + + createContextManager( + chains: ChainName[], + strategyConfig: ChainSubmissionStrategy, + argv?: any, + ): ContextManager { + return new ContextManager( + strategyConfig, + chains, + TxSubmitterType.JSON_RPC, + argv, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise { + const signers = await contextManager.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.contextManager = contextManager; + } +} diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts new file mode 100644 index 0000000000..459796876a --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts @@ -0,0 +1,45 @@ +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, +} from '@hyperlane-xyz/sdk'; + +import { ContextManager } from '../../manager/ContextManager.js'; + +export interface WarpDeployContextResult { + warpRouteConfig: Record; + chains: ChainName[]; +} + +export interface SignerStrategy { + /** + * Determines the chains to be used for signing + * @param argv Command arguments + * @returns Array of chain names + */ + determineChains(argv: Record): Promise; + + /** + * Creates a context manager for the selected chains + * @param chains Selected chains + * @param strategyConfig Default strategy configuration + * @returns ContextManager instance + */ + createContextManager( + chains: ChainName[], + strategyConfig: ChainSubmissionStrategy, + argv?: any, + ): ContextManager; + + /** + * Configures signers for the multi-provider + * @param argv Command arguments + * @param multiProvider MultiProvider instance + * @param contextManager ContextManager instance + */ + configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise; +} diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts new file mode 100644 index 0000000000..8b259098f5 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts @@ -0,0 +1,23 @@ +import { OriginDestinationSignerStrategy } from './OriginDestinationSignerStrategy.js'; +import { SignerStrategy } from './SignerStrategy.js'; +import { SingleChainSignerStrategy } from './SingleChainSignerStrategy.js'; +import { WarpDeploySignerStrategy } from './WarpDeploySignerStrategy.js'; + +export class SignerStrategyFactory { + static createStrategy(argv: Record): SignerStrategy { + const strategyMap: Record SignerStrategy> = { + 'core:apply': () => new SingleChainSignerStrategy(), + 'warp:deploy': () => new WarpDeploySignerStrategy(), + 'warp:send': () => new WarpDeploySignerStrategy(), // Assuming same strategy for 'send' + 'warp:apply': () => new WarpDeploySignerStrategy(), // Assuming same strategy for 'appl' + 'send:message': () => new OriginDestinationSignerStrategy(), + }; + + const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim(); + + const createStrategy = + strategyMap[commandKey] || (() => new SingleChainSignerStrategy()); + + return createStrategy(); + } +} diff --git a/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts new file mode 100644 index 0000000000..a7c9b154a2 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts @@ -0,0 +1,49 @@ +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; + +import { runSingleChainSelectionStep } from '../../../utils/chains.js'; +import { ContextManager } from '../../manager/ContextManager.js'; + +import { SignerStrategy } from './SignerStrategy.js'; + +export class SingleChainSignerStrategy implements SignerStrategy { + async determineChains(argv: Record): Promise { + const chain: ChainName = + argv.chain || + (await runSingleChainSelectionStep( + argv.context.chainMetadata, + 'Select chain to connect:', + )); + + argv.chain = chain; + return [chain]; // Explicitly return as single-item array + } + + createContextManager( + chains: ChainName[], + strategyConfig: ChainSubmissionStrategy, + argv?: any, + ): ContextManager { + return new ContextManager( + strategyConfig, + chains, + TxSubmitterType.JSON_RPC, + argv, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise { + const signers = await contextManager.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.contextManager = contextManager; + } +} diff --git a/typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts b/typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts new file mode 100644 index 0000000000..48a6e34607 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts @@ -0,0 +1,117 @@ +import { confirm } from '@inquirer/prompts'; + +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; + +import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { + isFile, + readYamlOrJson, + runFileSelectionStep, +} from '../../../utils/files.js'; +import { ContextManager } from '../../manager/ContextManager.js'; + +import { SignerStrategy } from './SignerStrategy.js'; + +export interface WarpDeployContextResult { + warpRouteConfig: Record; + chains: ChainName[]; +} + +export class WarpDeploySignerStrategy implements SignerStrategy { + async determineChains(argv: Record): Promise { + const configPath = argv.wd || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; + const { chains } = await getWarpDeployContext({ + configPath, + skipConfirmation: argv.skipConfirmation, + }); + + argv.context.config = configPath; + argv.context.chains = chains; + return chains; + } + + createContextManager( + chains: ChainName[], + strategyConfig: ChainSubmissionStrategy, + argv: any, + ): ContextManager { + return new ContextManager( + strategyConfig, + chains, + TxSubmitterType.JSON_RPC, + argv, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + contextManager: ContextManager, + ): Promise { + const signers = await contextManager.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.contextManager = contextManager; + } +} + +export async function getWarpDeployContext({ + configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, + skipConfirmation = false, +}: { + configPath?: string; + skipConfirmation?: boolean; +}): Promise { + // Validate config path + if (!configPath || !isFile(configPath)) { + if (skipConfirmation) { + throw new Error('Warp route deployment config is required'); + } + + // Interactive file selection if no path provided + configPath = await runFileSelectionStep( + './configs', + 'Warp route deployment config', + 'warp', + ); + } else { + console.log(`Using warp route deployment config at ${configPath}`); + } + + // Read warp route deployment configuration + let warpRouteConfig = readYamlOrJson(configPath); + if (!warpRouteConfig) + throw new Error(`No warp route deploy config found at ${configPath}`); + + // Extract chains from configuration + const chains = Object.keys(warpRouteConfig) as ChainName[]; + + // Validate chains + if (chains.length === 0) { + throw new Error('No chains found in warp route deployment config'); + } + + // Optional: Confirm multi-chain deployment + if (!skipConfirmation && chains.length > 1) { + const confirmMultiChain = await confirm({ + message: `Deploy warp route across ${chains.length} chains: ${chains.join( + ', ', + )}?`, + default: true, + }); + + if (!confirmMultiChain) { + throw new Error('Deployment cancelled by user'); + } + } + + return { + warpRouteConfig, + chains, + }; +} diff --git a/typescript/cli/src/context/strategies/signer/signer.ts b/typescript/cli/src/context/strategies/signer/signer.ts deleted file mode 100644 index 3da8bf9c70..0000000000 --- a/typescript/cli/src/context/strategies/signer/signer.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { confirm } from '@inquirer/prompts'; - -import { ChainName, MultiProvider, TxSubmitterType } from '@hyperlane-xyz/sdk'; - -import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; -import { readWarpRouteDeployConfig } from '../../../config/warp.js'; -import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { isFile, runFileSelectionStep } from '../../../utils/files.js'; -import { ContextManager } from '../../manager/ContextManager.js'; - -export interface WarpDeployContextResult { - warpRouteConfig: Record; - chains: ChainName[]; -} - -export interface SignerStrategy { - /** - * Determines the chains to be used for signing - * @param argv Command arguments - * @returns Array of chain names - */ - determineChains(argv: Record): Promise; - - /** - * Creates a context manager for the selected chains - * @param chains Selected chains - * @param defaultStrategy Default strategy configuration - * @returns ContextManager instance - */ - createContextManager( - chains: ChainName[], - defaultStrategy: any, - ): ContextManager; - - /** - * Configures signers for the multi-provider - * @param argv Command arguments - * @param multiProvider MultiProvider instance - * @param contextManager ContextManager instance - */ - configureSigners( - argv: Record, - multiProvider: MultiProvider, - contextManager: ContextManager, - ): Promise; -} - -export class SingleChainSignerStrategy implements SignerStrategy { - async determineChains(argv: Record): Promise { - const chain: ChainName = - argv.chain || - (await runSingleChainSelectionStep( - argv.context.chainMetadata, - 'Select chain to connect:', - )); - - argv.chain = chain; - return [chain]; // Explicitly return as single-item array - } - - createContextManager( - chains: ChainName[], - defaultStrategy: any, - ): ContextManager { - return new ContextManager( - defaultStrategy, - chains, - TxSubmitterType.JSON_RPC, - ); - } - - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - contextManager: ContextManager, - ): Promise { - const signers = await contextManager.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.contextManager = contextManager; - } -} - -export class WarpDeploySignerStrategy implements SignerStrategy { - async determineChains(argv: Record): Promise { - const { warpRouteConfig, chains } = await getWarpDeployContext({ - configPath: argv.wd || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, - skipConfirmation: argv.skipConfirmation, - context: argv.context, - }); - - argv.context.warpRouteConfig = warpRouteConfig; - argv.context.chains = chains; - return chains; - } - - createContextManager( - chains: ChainName[], - defaultStrategy: any, - ): ContextManager { - return new ContextManager( - defaultStrategy, - chains, - TxSubmitterType.JSON_RPC, - ); - } - - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - contextManager: ContextManager, - ): Promise { - const signers = await contextManager.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.contextManager = contextManager; - } -} - -export class SignerStrategyFactory { - static createStrategy(argv: Record): SignerStrategy { - if ( - argv._[0] === 'warp' && - (argv._[1] === 'deploy' || argv._[1] === 'send') - ) { - return new WarpDeploySignerStrategy(); - } - - if (argv._[0] === 'send') { - // You might want to create a specific multi-chain send strategy - return new WarpDeploySignerStrategy(); - } - - return new SingleChainSignerStrategy(); - } -} - -export async function getWarpDeployContext({ - configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, - skipConfirmation = false, - context, -}: { - configPath?: string; - skipConfirmation?: boolean; - context: any; -}): Promise { - // Validate config path - if (!configPath || !isFile(configPath)) { - if (skipConfirmation) { - throw new Error('Warp route deployment config is required'); - } - - // Interactive file selection if no path provided - configPath = await runFileSelectionStep( - './configs', - 'Warp route deployment config', - 'warp', - ); - } else { - console.log(`Using warp route deployment config at ${configPath}`); - } - - // Read warp route deployment configuration - const warpRouteConfig = await readWarpRouteDeployConfig(configPath, context); - - // Extract chains from configuration - const chains = Object.keys(warpRouteConfig) as ChainName[]; - - // Validate chains - if (chains.length === 0) { - throw new Error('No chains found in warp route deployment config'); - } - - // Optional: Confirm multi-chain deployment - if (!skipConfirmation && chains.length > 1) { - const confirmMultiChain = await confirm({ - message: `Deploy warp route across ${chains.length} chains: ${chains.join( - ', ', - )}?`, - default: true, - }); - - if (!confirmMultiChain) { - throw new Error('Deployment cancelled by user'); - } - } - - return { - warpRouteConfig, - chains, - }; -} diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index e3ada01b2b..eb573e84dc 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -30,8 +30,6 @@ export interface CommandContext { skipConfirmation: boolean; key?: string; signer?: ethers.Signer; - signers?: ethers.Signer[]; - chain?: ChainName; chains?: ChainName[]; warpRouteConfig?: WarpRouteDeployConfig; } diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 71eed010c5..de50ac34a7 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -62,6 +62,7 @@ import { retryAsync, } from '@hyperlane-xyz/utils'; +import { readWarpRouteDeployConfig } from '../config/warp.js'; import { MINIMUM_WARP_DEPLOY_GAS } from '../consts.js'; import { getOrRequestApiKeys } from '../context/context.js'; import { WriteCommandContext } from '../context/types.js'; @@ -69,7 +70,9 @@ import { log, logBlue, logGray, logGreen, logTable } from '../logger.js'; import { getSubmitterBuilder } from '../submit/submit.js'; import { indentYamlOrJson, + isFile, readYamlOrJson, + runFileSelectionStep, writeYamlOrJson, } from '../utils/files.js'; @@ -92,15 +95,33 @@ interface WarpApplyParams extends DeployParams { export async function runWarpRouteDeploy({ context, + warpRouteDeploymentConfigPath, }: { context: WriteCommandContext; + warpRouteDeploymentConfigPath?: string; }) { - const { - skipConfirmation, - chainMetadata, - warpRouteConfig, - chains: contextChains, - } = context; + const { skipConfirmation, chainMetadata, chains: contextChains } = context; + + if ( + !warpRouteDeploymentConfigPath || + !isFile(warpRouteDeploymentConfigPath) + ) { + if (skipConfirmation) + throw new Error('Warp route deployment config required'); + warpRouteDeploymentConfigPath = await runFileSelectionStep( + './configs', + 'Warp route deployment config', + 'warp', + ); + } else { + log( + `Using warp route deployment config at ${warpRouteDeploymentConfigPath}`, + ); + } + const warpRouteConfig = await readWarpRouteDeployConfig( + warpRouteDeploymentConfigPath, + context, + ); const chains = contextChains!; let apiKeys: ChainMap = {}; From 9c43d1c27cceab8343764db15db43f5f475013d6 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 11 Nov 2024 15:50:50 +0100 Subject: [PATCH 04/45] fix: e2e test working --- typescript/cli/src/commands/send.ts | 4 +-- typescript/cli/src/commands/signCommands.ts | 9 ++++- typescript/cli/src/commands/strategy.ts | 2 +- typescript/cli/src/commands/warp.ts | 1 + .../signer/OriginDestinationSignerStrategy.ts | 7 ++-- .../strategies/signer/SignerStrategy.ts | 5 --- .../signer/SignerStrategyFactory.ts | 35 +++++++++++------- ...trategy.ts => WarpConfigSignerStrategy.ts} | 36 ++++--------------- .../strategies/submitter/JsonRpcStrategy.ts | 2 +- typescript/cli/src/send/transfer.ts | 21 ++--------- typescript/cli/src/tests/commands/helpers.ts | 8 +++++ 11 files changed, 54 insertions(+), 76 deletions(-) rename typescript/cli/src/context/strategies/signer/{WarpDeploySignerStrategy.ts => WarpConfigSignerStrategy.ts} (72%) diff --git a/typescript/cli/src/commands/send.ts b/typescript/cli/src/commands/send.ts index 1167b3b559..27f59a52dc 100644 --- a/typescript/cli/src/commands/send.ts +++ b/typescript/cli/src/commands/send.ts @@ -46,8 +46,8 @@ export const messageOptions: { [k: string]: Options } = { }; export interface MessageOptionsArgTypes { - origin?: string; - destination?: string; + origin: string; + destination: string; timeout: number; quick: boolean; relay: boolean; diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index e420677958..7cf23d129a 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,7 +1,14 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit', 'apply']; +export const SIGN_COMMANDS = [ + 'deploy', + 'send', + 'status', + 'submit', + 'apply', + 'read', +]; export function isSignCommand(argv: any): boolean { return ( diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 8bc92a4365..687deb7e9b 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -51,7 +51,7 @@ export const init: CommandModuleWithWriteContext<{ config: outputFileCommandOption( DEFAULT_STRATEGY_CONFIG_PATH, false, - 'The path to output a Key Config JSON or YAML file.', + 'The path to output a Strategy Config JSON or YAML file.', ), type: { type: 'string', diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index 388c478b03..b7fb456243 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -138,6 +138,7 @@ export const deploy: CommandModuleWithWriteContext<{ try { await runWarpRouteDeploy({ context, + warpRouteDeploymentConfigPath: config, }); } catch (error: any) { evaluateIfDryRunFailure(error, dryRun); diff --git a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts index ce441206f9..85e63e2e25 100644 --- a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts @@ -29,11 +29,10 @@ export class OriginDestinationSignerStrategy implements SignerStrategy { 'Select the destination chain', ); } - const chains = [origin, destination]; - argv.chains = chains; + argv.origin = origin; - argv.destination = origin; - return chains; // Explicitly return as single-item array + argv.destination = destination; + return [origin, destination]; // Explicitly return as single-item array } createContextManager( diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts index 459796876a..ddb92f2a7b 100644 --- a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts @@ -6,11 +6,6 @@ import { import { ContextManager } from '../../manager/ContextManager.js'; -export interface WarpDeployContextResult { - warpRouteConfig: Record; - chains: ChainName[]; -} - export interface SignerStrategy { /** * Determines the chains to be used for signing diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts index 8b259098f5..ae4c00eeef 100644 --- a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts +++ b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts @@ -1,23 +1,32 @@ import { OriginDestinationSignerStrategy } from './OriginDestinationSignerStrategy.js'; import { SignerStrategy } from './SignerStrategy.js'; import { SingleChainSignerStrategy } from './SingleChainSignerStrategy.js'; -import { WarpDeploySignerStrategy } from './WarpDeploySignerStrategy.js'; +import { WarpConfigSignerStrategy } from './WarpConfigSignerStrategy.js'; -export class SignerStrategyFactory { - static createStrategy(argv: Record): SignerStrategy { - const strategyMap: Record SignerStrategy> = { - 'core:apply': () => new SingleChainSignerStrategy(), - 'warp:deploy': () => new WarpDeploySignerStrategy(), - 'warp:send': () => new WarpDeploySignerStrategy(), // Assuming same strategy for 'send' - 'warp:apply': () => new WarpDeploySignerStrategy(), // Assuming same strategy for 'appl' - 'send:message': () => new OriginDestinationSignerStrategy(), - }; +enum CommandType { + CORE_APPLY = 'core:apply', + WARP_DEPLOY = 'warp:deploy', + WARP_SEND = 'warp:send', + WARP_APPLY = 'warp:apply', + WARP_READ = 'warp:read', + WARP_MESSAGE = 'send:message', +} - const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim(); +export class SignerStrategyFactory { + private static strategyMap: Map SignerStrategy> = new Map([ + [CommandType.CORE_APPLY, () => new SingleChainSignerStrategy()], + [CommandType.WARP_DEPLOY, () => new WarpConfigSignerStrategy()], + [CommandType.WARP_SEND, () => new OriginDestinationSignerStrategy()], + [CommandType.WARP_APPLY, () => new WarpConfigSignerStrategy()], + [CommandType.WARP_READ, () => new SingleChainSignerStrategy()], + [CommandType.WARP_MESSAGE, () => new OriginDestinationSignerStrategy()], + ]); + static createStrategy(argv: Record): SignerStrategy { + const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; const createStrategy = - strategyMap[commandKey] || (() => new SingleChainSignerStrategy()); - + this.strategyMap.get(commandKey) || + (() => new SingleChainSignerStrategy()); return createStrategy(); } } diff --git a/typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts b/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts similarity index 72% rename from typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts rename to typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts index 48a6e34607..88a6aea214 100644 --- a/typescript/cli/src/context/strategies/signer/WarpDeploySignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts @@ -1,5 +1,3 @@ -import { confirm } from '@inquirer/prompts'; - import { ChainName, ChainSubmissionStrategy, @@ -17,15 +15,10 @@ import { ContextManager } from '../../manager/ContextManager.js'; import { SignerStrategy } from './SignerStrategy.js'; -export interface WarpDeployContextResult { - warpRouteConfig: Record; - chains: ChainName[]; -} - -export class WarpDeploySignerStrategy implements SignerStrategy { +export class WarpConfigSignerStrategy implements SignerStrategy { async determineChains(argv: Record): Promise { - const configPath = argv.wd || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; - const { chains } = await getWarpDeployContext({ + const configPath = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; + const { chains } = await getWarpConfigChains({ configPath, skipConfirmation: argv.skipConfirmation, }); @@ -60,13 +53,13 @@ export class WarpDeploySignerStrategy implements SignerStrategy { } } -export async function getWarpDeployContext({ +export async function getWarpConfigChains({ configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, skipConfirmation = false, }: { configPath?: string; skipConfirmation?: boolean; -}): Promise { +}): Promise<{ chains: ChainName[] }> { // Validate config path if (!configPath || !isFile(configPath)) { if (skipConfirmation) { @@ -96,22 +89,5 @@ export async function getWarpDeployContext({ throw new Error('No chains found in warp route deployment config'); } - // Optional: Confirm multi-chain deployment - if (!skipConfirmation && chains.length > 1) { - const confirmMultiChain = await confirm({ - message: `Deploy warp route across ${chains.length} chains: ${chains.join( - ', ', - )}?`, - default: true, - }); - - if (!confirmMultiChain) { - throw new Error('Deployment cancelled by user'); - } - } - - return { - warpRouteConfig, - chains, - }; + return { chains }; } diff --git a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts index 55ca636931..ad9adeda18 100644 --- a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts @@ -7,7 +7,7 @@ import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; export class JsonRpcStrategy extends BaseSubmitterStrategy { async getPrivateKey(chain: ChainName): Promise { - let pk = this.config[chain]?.submitter?.privateKey; + let pk = this.config[chain]?.submitter?.privateKey; // HYP_KEY for backwards compatibility if (!pk) { pk = await password({ diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 2e94fdd53f..75205a7c57 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -18,7 +18,6 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { log, logBlue, logGreen, logRed } from '../logger.js'; -import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; import { runTokenSelectionStep } from '../utils/tokens.js'; @@ -40,30 +39,14 @@ export async function sendTestTransfer({ }: { context: WriteCommandContext; warpCoreConfig: WarpCoreConfig; - origin?: ChainName; - destination?: ChainName; + origin: ChainName; + destination: ChainName; amount: string; recipient?: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { chainMetadata } = context; - - if (!origin) { - origin = await runSingleChainSelectionStep( - chainMetadata, - 'Select the origin chain', - ); - } - - if (!destination) { - destination = await runSingleChainSelectionStep( - chainMetadata, - 'Select the destination chain', - ); - } - await runPreflightChecksForChains({ context, chains: [origin, destination], diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index c4ad036519..f689d8c61a 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,3 +1,5 @@ +import { ethers } from 'ethers'; + import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; import { ChainAddresses } from '@hyperlane-xyz/registry'; import { @@ -136,6 +138,9 @@ export async function deployToken(privateKey: string, chain: string) { key: privateKey, }); + // Future works: make signer compatible with protocol/chain stack + multiProvider.setSigner(chain, new ethers.Wallet(privateKey)); + const token = await new ERC20Test__factory( multiProvider.getSigner(chain), ).deploy('token', 'token', '100000000000000000000', 18); @@ -155,6 +160,9 @@ export async function deploy4626Vault( key: privateKey, }); + // Future works: make signer compatible with protocol/chain stack + multiProvider.setSigner(chain, new ethers.Wallet(privateKey)); + const vault = await new ERC4626Test__factory( multiProvider.getSigner(chain), ).deploy(tokenAddress, 'VAULT', 'VAULT'); From 3602abd9177e7ccfaf5d21a6e899ad752c2b8606 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 11 Nov 2024 17:39:18 +0100 Subject: [PATCH 05/45] chore: add comments & minor refactoring --- typescript/cli/src/config/strategy.ts | 4 +- typescript/cli/src/context/context.ts | 11 ++-- .../signer/OriginDestinationSignerStrategy.ts | 32 +++++++++--- .../strategies/signer/SignerStrategy.ts | 14 +++--- .../signer/SingleChainSignerStrategy.ts | 34 ++++++++++--- .../signer/WarpConfigSignerStrategy.ts | 50 +++++++++++++------ .../submitter/GnosisSafeStrategy.ts | 2 +- .../submitter/SubmitterContext.ts} | 23 +++++---- typescript/cli/src/send/message.ts | 21 +------- 9 files changed, 116 insertions(+), 75 deletions(-) rename typescript/cli/src/context/{manager/ContextManager.ts => strategies/submitter/SubmitterContext.ts} (76%) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 36925250a6..547d71a49c 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -2,6 +2,7 @@ import { ChainSubmissionStrategy, ChainSubmissionStrategySchema, } from '@hyperlane-xyz/sdk'; +import { assert } from '@hyperlane-xyz/utils'; import { readYamlOrJson } from '../utils/files.js'; @@ -9,8 +10,7 @@ export async function readDefaultStrategyConfig( filePath: string, ): Promise { let config = readYamlOrJson(filePath); - if (!config) - throw new Error(`No default strategy config found at ${filePath}`); + assert(config, `No default strategy config found at ${filePath}`); return ChainSubmissionStrategySchema.parse(config); } diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index bae7754b84..4c1d5ce901 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -71,22 +71,23 @@ export async function signerMiddleware(argv: Record) { const signerStrategy = SignerStrategyFactory.createStrategy(argv); // Determine the chains that will be used for signing based on the selected strategy - // e.g. SingleChainSignerStrategy extracts jsonRpc private key from strategyConfig else prompts user PK input + // e.g. SingleChainSignerStrategy extracts jsonRpc private key from strategyConfig else prompts user private key input const chains = await signerStrategy.determineChains(argv); - // Create a context manager for the signer, which will manage the signing context for the specified chains + // Creates a submitter context for the signer, which manages the signing context for the specified chains // default: TxSubmitterType.JSON_RPC - const signerContextManager = signerStrategy.createContextManager( + const signerSubmitterContext = signerStrategy.createSubmitterContext( chains, strategyConfig, argv, ); - // Configure the signers using the selected strategy, multiProvider, and context manager + // Configure the signers using the selected strategy, multiProvider, and submitter context + // manipulates argv values await signerStrategy.configureSigners( argv, multiProvider, - signerContextManager, + signerSubmitterContext, ); return { ...argv, strategy: strategyUrl }; diff --git a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts index 85e63e2e25..80a5080426 100644 --- a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts @@ -6,11 +6,20 @@ import { } from '@hyperlane-xyz/sdk'; import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { ContextManager } from '../../manager/ContextManager.js'; +import { SubmitterContext } from '../submitter/SubmitterContext.js'; import { SignerStrategy } from './SignerStrategy.js'; +/** + * @title OriginDestinationSignerStrategy + * @notice Strategy implementation for managing multiVM operations requiring both origin and destination chains + * @dev This strategy is used by the SignerStrategyFactory for sending messages and tokens across chains + */ export class OriginDestinationSignerStrategy implements SignerStrategy { + /** + * @notice Determines and validates the origin and destination chains + * @dev If origin or destination are not provided in argv, prompts user for interactive selection + */ async determineChains(argv: Record): Promise { const { context } = argv; let origin = argv.origin; @@ -35,12 +44,15 @@ export class OriginDestinationSignerStrategy implements SignerStrategy { return [origin, destination]; // Explicitly return as single-item array } - createContextManager( + /** + * @dev Hardcoded: JSON_RPC as the transaction submitter type + */ + createSubmitterContext( chains: ChainName[], strategyConfig: ChainSubmissionStrategy, - argv?: any, - ): ContextManager { - return new ContextManager( + argv?: Record, + ): SubmitterContext { + return new SubmitterContext( strategyConfig, chains, TxSubmitterType.JSON_RPC, @@ -48,14 +60,18 @@ export class OriginDestinationSignerStrategy implements SignerStrategy { ); } + /** + * @notice Configures signers for both origin and destination chains + * @dev Sets up signers in the MultiProvider and updates the context with necessary references + */ async configureSigners( argv: Record, multiProvider: MultiProvider, - contextManager: ContextManager, + submitterContext: SubmitterContext, ): Promise { - const signers = await contextManager.getSigners(); + const signers = await submitterContext.getSigners(); multiProvider.setSigners(signers); argv.context.multiProvider = multiProvider; - argv.contextManager = contextManager; + argv.submitterContext = submitterContext; } } diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts index ddb92f2a7b..1b802831d1 100644 --- a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/SignerStrategy.ts @@ -4,7 +4,7 @@ import { MultiProvider, } from '@hyperlane-xyz/sdk'; -import { ContextManager } from '../../manager/ContextManager.js'; +import { SubmitterContext } from '../submitter/SubmitterContext.js'; export interface SignerStrategy { /** @@ -18,23 +18,23 @@ export interface SignerStrategy { * Creates a context manager for the selected chains * @param chains Selected chains * @param strategyConfig Default strategy configuration - * @returns ContextManager instance + * @returns SubmitterContext instance */ - createContextManager( + createSubmitterContext( chains: ChainName[], strategyConfig: ChainSubmissionStrategy, - argv?: any, - ): ContextManager; + argv?: Record, + ): SubmitterContext; /** * Configures signers for the multi-provider * @param argv Command arguments * @param multiProvider MultiProvider instance - * @param contextManager ContextManager instance + * @param submitterContext SubmitterContext instance */ configureSigners( argv: Record, multiProvider: MultiProvider, - contextManager: ContextManager, + submitterContext: SubmitterContext, ): Promise; } diff --git a/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts index a7c9b154a2..26bad17c71 100644 --- a/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts @@ -6,11 +6,22 @@ import { } from '@hyperlane-xyz/sdk'; import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { ContextManager } from '../../manager/ContextManager.js'; +import { SubmitterContext } from '../submitter/SubmitterContext.js'; import { SignerStrategy } from './SignerStrategy.js'; +/** + * @title SingleChainSignerStrategy + * @notice Strategy implementation for managing single-chain operations + * @dev This strategy is used by commands that operate on a single blockchain + * It implements the SignerStrategy interface and is primarily used for + * operations like 'core:apply' and 'warp:read' (see SignerStrategyFactory) + */ export class SingleChainSignerStrategy implements SignerStrategy { + /** + * @notice Determines the chain to be used for signing operations + * @dev Either uses the chain specified in argv or prompts for interactive selection + */ async determineChains(argv: Record): Promise { const chain: ChainName = argv.chain || @@ -23,12 +34,15 @@ export class SingleChainSignerStrategy implements SignerStrategy { return [chain]; // Explicitly return as single-item array } - createContextManager( + /** + * @dev Hardcoded: JSON_RPC as the transaction submitter type + */ + createSubmitterContext( chains: ChainName[], strategyConfig: ChainSubmissionStrategy, - argv?: any, - ): ContextManager { - return new ContextManager( + argv?: Record, + ): SubmitterContext { + return new SubmitterContext( strategyConfig, chains, TxSubmitterType.JSON_RPC, @@ -36,14 +50,18 @@ export class SingleChainSignerStrategy implements SignerStrategy { ); } + /** + * @notice Sets up signers for the specified chain in the MultiProvider + * @dev Sets up signers for single chain + */ async configureSigners( argv: Record, multiProvider: MultiProvider, - contextManager: ContextManager, + submitterContext: SubmitterContext, ): Promise { - const signers = await contextManager.getSigners(); + const signers = await submitterContext.getSigners(); multiProvider.setSigners(signers); argv.context.multiProvider = multiProvider; - argv.contextManager = contextManager; + argv.submitterContext = submitterContext; } } diff --git a/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts index 88a6aea214..ad06bec157 100644 --- a/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts @@ -4,6 +4,7 @@ import { MultiProvider, TxSubmitterType, } from '@hyperlane-xyz/sdk'; +import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; import { @@ -11,11 +12,21 @@ import { readYamlOrJson, runFileSelectionStep, } from '../../../utils/files.js'; -import { ContextManager } from '../../manager/ContextManager.js'; +import { SubmitterContext } from '../submitter/SubmitterContext.js'; import { SignerStrategy } from './SignerStrategy.js'; +/** + * @title WarpConfigSignerStrategy + * @notice Strategy implementation for managing Warp route deployments and configurations + * @dev This strategy is used by commands like 'warp:deploy' and 'warp:apply' + */ export class WarpConfigSignerStrategy implements SignerStrategy { + /** + * @notice Determines the chains to be used based on the Warp configuration file + * @dev Reads and validates a YAML/JSON config file to extract chain information + * If no config is provided, prompts for interactive file selection + */ async determineChains(argv: Record): Promise { const configPath = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; const { chains } = await getWarpConfigChains({ @@ -28,12 +39,12 @@ export class WarpConfigSignerStrategy implements SignerStrategy { return chains; } - createContextManager( + createSubmitterContext( chains: ChainName[], strategyConfig: ChainSubmissionStrategy, - argv: any, - ): ContextManager { - return new ContextManager( + argv: Record, + ): SubmitterContext { + return new SubmitterContext( strategyConfig, chains, TxSubmitterType.JSON_RPC, @@ -41,18 +52,25 @@ export class WarpConfigSignerStrategy implements SignerStrategy { ); } + /** + * @dev Sets up signers for all chains [can be one or more] specified in the Warp config + */ async configureSigners( argv: Record, multiProvider: MultiProvider, - contextManager: ContextManager, + submitterContext: SubmitterContext, ): Promise { - const signers = await contextManager.getSigners(); + const signers = await submitterContext.getSigners(); multiProvider.setSigners(signers); argv.context.multiProvider = multiProvider; - argv.contextManager = contextManager; + argv.submitterContext = submitterContext; } } +/** + * @notice Helper function to extract and validate chains from a Warp config file + * @dev Supports both YAML and JSON config formats + */ export async function getWarpConfigChains({ configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, skipConfirmation = false, @@ -61,10 +79,9 @@ export async function getWarpConfigChains({ skipConfirmation?: boolean; }): Promise<{ chains: ChainName[] }> { // Validate config path + if (!configPath || !isFile(configPath)) { - if (skipConfirmation) { - throw new Error('Warp route deployment config is required'); - } + assert(!skipConfirmation, 'Warp route deployment config is required'); // Interactive file selection if no path provided configPath = await runFileSelectionStep( @@ -78,16 +95,17 @@ export async function getWarpConfigChains({ // Read warp route deployment configuration let warpRouteConfig = readYamlOrJson(configPath); - if (!warpRouteConfig) - throw new Error(`No warp route deploy config found at ${configPath}`); + + assert(warpRouteConfig, `No warp route deploy config found at ${configPath}`); // Extract chains from configuration const chains = Object.keys(warpRouteConfig) as ChainName[]; // Validate chains - if (chains.length === 0) { - throw new Error('No chains found in warp route deployment config'); - } + assert( + chains.length !== 0, + 'No chains found in warp route deployment config', + ); return { chains }; } diff --git a/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts b/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts index 8369be9b00..44f3686ca2 100644 --- a/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts @@ -5,7 +5,7 @@ import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; export class GnosisSafeStrategy extends BaseSubmitterStrategy { async getPrivateKey(chain: ChainName): Promise { - // Implement Gnosis Safe specific logic + // Future works: Implement Gnosis Safe specific logic throw new Error('Not implemented'); } diff --git a/typescript/cli/src/context/manager/ContextManager.ts b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts similarity index 76% rename from typescript/cli/src/context/manager/ContextManager.ts rename to typescript/cli/src/context/strategies/submitter/SubmitterContext.ts index 4cb3f46450..cf09e92d21 100644 --- a/typescript/cli/src/context/manager/ContextManager.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts @@ -1,16 +1,21 @@ import { Signer } from 'ethers'; -import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { + ChainName, + ChainSubmissionStrategy, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; -import { ENV } from '../../utils/env.js'; -import { ISubmitterStrategy } from '../strategies/submitter/SubmitterStrategy.js'; -import { SubmitterStrategyFactory } from '../strategies/submitter/SubmitterStrategyFactory.js'; +import { ENV } from '../../../utils/env.js'; + +import { ISubmitterStrategy } from './SubmitterStrategy.js'; +import { SubmitterStrategyFactory } from './SubmitterStrategyFactory.js'; /** - * @title ContextManager + * @title SubmitterContext * @dev Manages the context for transaction submitters, including retrieving chain keys and signers. */ -export class ContextManager { +export class SubmitterContext { private strategy: ISubmitterStrategy; /** @@ -19,10 +24,10 @@ export class ContextManager { * @param submitterType Type of transaction submitter to use. */ constructor( - strategyConfig: any, + strategyConfig: ChainSubmissionStrategy, private chains: ChainName[], submitterType: TxSubmitterType, - private argv?: any, + private argv?: Record, ) { this.strategy = SubmitterStrategyFactory.createStrategy( submitterType, @@ -41,7 +46,7 @@ export class ContextManager { this.chains.map(async (chain) => ({ chainName: chain, privateKey: - this.argv.key || // argv.key overrides strategy key + this.argv?.key || // argv.key overrides strategy key (await this.strategy.getPrivateKey(chain)) || ENV.HYP_KEY, // argv.key and ENV.HYP_KEY for backwards compatibility })), diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index 430d3b7bcf..5ece5529f9 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -7,7 +7,6 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { CommandContext, WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; -import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; @@ -21,29 +20,13 @@ export async function sendTestMessage({ selfRelay, }: { context: WriteCommandContext; - origin?: ChainName; - destination?: ChainName; + origin: ChainName; + destination: ChainName; messageBody: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { chainMetadata } = context; - - if (!origin) { - origin = await runSingleChainSelectionStep( - chainMetadata, - 'Select the origin chain', - ); - } - - if (!destination) { - destination = await runSingleChainSelectionStep( - chainMetadata, - 'Select the destination chain', - ); - } - await runPreflightChecksForChains({ context, chains: [origin, destination], From ce81b48f89bc415ea659115be17d2d4fae024088 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Tue, 12 Nov 2024 10:01:38 +0100 Subject: [PATCH 06/45] chore: minor fixes --- .../signer/OriginDestinationSignerStrategy.ts | 18 ++++++++---------- .../strategies/signer/SignerStrategyFactory.ts | 4 ++-- typescript/cli/src/context/types.ts | 2 -- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts index 80a5080426..aea8cb1d45 100644 --- a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts @@ -22,22 +22,20 @@ export class OriginDestinationSignerStrategy implements SignerStrategy { */ async determineChains(argv: Record): Promise { const { context } = argv; - let origin = argv.origin; - let destination = argv.destination; - if (!origin) { - origin = await runSingleChainSelectionStep( + let origin = + argv.origin ?? + (await runSingleChainSelectionStep( context.chainMetadata, 'Select the origin chain', - ); - } + )); - if (!destination) { - destination = await runSingleChainSelectionStep( + let destination = + argv.destination ?? + (await runSingleChainSelectionStep( context.chainMetadata, 'Select the destination chain', - ); - } + )); argv.origin = origin; argv.destination = destination; diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts index ae4c00eeef..399ea61e65 100644 --- a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts +++ b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts @@ -9,7 +9,7 @@ enum CommandType { WARP_SEND = 'warp:send', WARP_APPLY = 'warp:apply', WARP_READ = 'warp:read', - WARP_MESSAGE = 'send:message', + SEND_MESSAGE = 'send:message', } export class SignerStrategyFactory { @@ -19,7 +19,7 @@ export class SignerStrategyFactory { [CommandType.WARP_SEND, () => new OriginDestinationSignerStrategy()], [CommandType.WARP_APPLY, () => new WarpConfigSignerStrategy()], [CommandType.WARP_READ, () => new SingleChainSignerStrategy()], - [CommandType.WARP_MESSAGE, () => new OriginDestinationSignerStrategy()], + [CommandType.SEND_MESSAGE, () => new OriginDestinationSignerStrategy()], ]); static createStrategy(argv: Record): SignerStrategy { diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index eb573e84dc..79499bd987 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -10,8 +10,6 @@ import type { WarpRouteDeployConfig, } from '@hyperlane-xyz/sdk'; -// TODO: revisit ContextSettings & CommandContext for improvements - export interface ContextSettings { registryUri: string; registryOverrideUri: string; From e4839a135ff3e6c97856d93073b9d0e5b096acda Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Tue, 12 Nov 2024 16:42:02 +0100 Subject: [PATCH 07/45] perf: removed unused code and refactoring --- typescript/cli/src/commands/options.ts | 7 + typescript/cli/src/commands/signCommands.ts | 9 +- typescript/cli/src/commands/strategy.ts | 32 ++-- typescript/cli/src/config/strategy.ts | 2 +- typescript/cli/src/context/context.ts | 28 +-- .../strategies/chain/ChainCommandHandler.ts | 34 ++++ .../strategies/chain/MultiChainHandler.ts | 166 ++++++++++++++++++ .../SingleChainHandler.ts} | 15 +- .../SignerStrategy.ts => chain/types.ts} | 2 +- .../signer/OriginDestinationSignerStrategy.ts | 75 -------- .../signer/SignerStrategyFactory.ts | 32 ---- .../signer/WarpConfigSignerStrategy.ts | 111 ------------ .../submitter/GnosisSafeStrategy.ts | 15 -- .../strategies/submitter/JsonRpcStrategy.ts | 16 +- .../strategies/submitter/SubmitterContext.ts | 22 ++- .../strategies/submitter/SubmitterStrategy.ts | 4 +- .../submitter/SubmitterStrategyFactory.ts | 10 +- typescript/cli/src/deploy/agent.ts | 1 + .../submitter/ethersV5/schemas.ts | 1 + 19 files changed, 278 insertions(+), 304 deletions(-) create mode 100644 typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts create mode 100644 typescript/cli/src/context/strategies/chain/MultiChainHandler.ts rename typescript/cli/src/context/strategies/{signer/SingleChainSignerStrategy.ts => chain/SingleChainHandler.ts} (79%) rename typescript/cli/src/context/strategies/{signer/SignerStrategy.ts => chain/types.ts} (96%) delete mode 100644 typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts delete mode 100644 typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts delete mode 100644 typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts delete mode 100644 typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index 7f34ac8cb0..96be4c77a8 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -128,6 +128,13 @@ export const chainTargetsCommandOption: Options = { alias: 'c', }; +export const strategyConfigUrlCommandOption: Options = { + type: 'string', + description: 'A path to a JSON or YAML file with a strategy config.', + default: DEFAULT_STRATEGY_CONFIG_PATH, + alias: 's', +}; + export const outputFileCommandOption = ( defaultPath?: string, demandOption = false, diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 7cf23d129a..d80dc9c0f5 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,14 +1,7 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = [ - 'deploy', - 'send', - 'status', - 'submit', - 'apply', - 'read', -]; +export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'apply']; export function isSignCommand(argv: any): boolean { return ( diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 687deb7e9b..b645646540 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -101,22 +101,22 @@ export const init: CommandModuleWithWriteContext<{ })), })); - let submitter: any = { + const submitter: any = { type: type, }; // Configure submitter based on type switch (type) { case TxSubmitterType.JSON_RPC: - const privateKey = await input({ + submitter.privateKey = await input({ message: 'Enter your private key', validate: (pk) => isValidPrivateKey(pk), }); - submitter.privateKey = privateKey; + submitter.chain = chain; break; case TxSubmitterType.IMPERSONATED_ACCOUNT: - const userAddress = + submitter.userAddress = inputUserAddress || (await input({ message: 'Enter the user address to impersonate', @@ -131,15 +131,14 @@ export const init: CommandModuleWithWriteContext<{ }, })); assert( - userAddress, + submitter.userAddress, 'User address is required for impersonated account', ); - submitter.userAddress = userAddress; break; case TxSubmitterType.GNOSIS_SAFE: case TxSubmitterType.GNOSIS_TX_BUILDER: - const safeAddress = + submitter.safeAddress = inputSafeAddress || (await input({ message: 'Enter the Safe address', @@ -153,20 +152,17 @@ export const init: CommandModuleWithWriteContext<{ } }, })); - assert(safeAddress, 'Safe address is required for Gnosis Safe'); - - submitter = { - type: type, - chain: chain, - safeAddress: safeAddress, - }; + assert( + submitter.safeAddress, + 'Safe address is required for Gnosis Safe', + ); + submitter.chain = chain; if (type === TxSubmitterType.GNOSIS_TX_BUILDER) { - const version = await input({ + submitter.version = await input({ message: 'Enter the Safe version (default: 1.0)', default: '1.0', }); - submitter.version = version; } break; @@ -174,8 +170,8 @@ export const init: CommandModuleWithWriteContext<{ throw new Error(`Unsupported submitter type: ${type}`); } - let result: ChainSubmissionStrategy = { - ...defaultStrategy, + const result: ChainSubmissionStrategy = { + ...defaultStrategy, // if there are changes in ChainSubmissionStrategy, the defaultStrategy may no longer be compatible [chain]: { submitter: submitter, }, diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 547d71a49c..48c668993f 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -9,7 +9,7 @@ import { readYamlOrJson } from '../utils/files.js'; export async function readDefaultStrategyConfig( filePath: string, ): Promise { - let config = readYamlOrJson(filePath); + const config = readYamlOrJson(filePath); assert(config, `No default strategy config found at ${filePath}`); return ChainSubmissionStrategySchema.parse(config); diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 3545972a5f..8417bd123d 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -16,9 +16,9 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; -import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; import { readDefaultStrategyConfig } from '../config/strategy.js'; +// import { readDefaultStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -26,7 +26,7 @@ import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; -import { SignerStrategyFactory } from './strategies/signer/SignerStrategyFactory.js'; +import { ChainCommandHandler } from './strategies/chain/ChainCommandHandler.js'; import { CommandContext, ContextSettings, @@ -63,20 +63,24 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - const strategyUrl = argv.strategy || DEFAULT_STRATEGY_CONFIG_PATH; - const strategyConfig = await readDefaultStrategyConfig(strategyUrl); - // Select the appropriate signing strategy based on the provided hyperlane command - // e.g command `core deploy` uses SingleChainSignerStrategy - const signerStrategy = SignerStrategyFactory.createStrategy(argv); + // e.g command `core deploy` uses SingleChainHandler + const chainHandler = ChainCommandHandler.getHandler(argv); // Determine the chains that will be used for signing based on the selected strategy - // e.g. SingleChainSignerStrategy extracts jsonRpc private key from strategyConfig else prompts user private key input - const chains = await signerStrategy.determineChains(argv); + // e.g. SingleChainHandler extracts jsonRpc private key from strategyConfig else prompts user private key input + const chains = await chainHandler.determineChains(argv); + + let strategyConfig = {}; + try { + strategyConfig = await readDefaultStrategyConfig(argv.strategy); + } catch (error) { + strategyConfig = {}; + } // Creates a submitter context for the signer, which manages the signing context for the specified chains // default: TxSubmitterType.JSON_RPC - const signerSubmitterContext = signerStrategy.createSubmitterContext( + const signerSubmitterContext = chainHandler.createSubmitterContext( chains, strategyConfig, argv, @@ -84,13 +88,13 @@ export async function signerMiddleware(argv: Record) { // Configure the signers using the selected strategy, multiProvider, and submitter context // manipulates argv values - await signerStrategy.configureSigners( + await chainHandler.configureSigners( argv, multiProvider, signerSubmitterContext, ); - return { ...argv, strategy: strategyUrl }; + return argv; } /** diff --git a/typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts b/typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts new file mode 100644 index 0000000000..595282326b --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts @@ -0,0 +1,34 @@ +import { MultiChainHandler } from './MultiChainHandler.js'; +import { SingleChainHandler } from './SingleChainHandler.js'; +import { ChainHandler } from './types.js'; + +enum CommandType { + CORE_APPLY = 'core:apply', + WARP_DEPLOY = 'warp:deploy', + WARP_SEND = 'warp:send', + WARP_APPLY = 'warp:apply', + WARP_READ = 'warp:read', + SEND_MESSAGE = 'send:message', + AGENT_KURTOSIS = 'deploy:kurtosis-agents', + STATUS = 'status:', +} + +export class ChainCommandHandler { + private static strategyMap: Map ChainHandler> = new Map([ + [CommandType.CORE_APPLY, () => new SingleChainHandler()], + [CommandType.WARP_DEPLOY, () => MultiChainHandler.forWarpConfig()], + [CommandType.WARP_SEND, () => MultiChainHandler.forOriginDestination()], + [CommandType.WARP_APPLY, () => MultiChainHandler.forWarpConfig()], + [CommandType.WARP_READ, () => new SingleChainHandler()], + [CommandType.SEND_MESSAGE, () => MultiChainHandler.forOriginDestination()], + [CommandType.AGENT_KURTOSIS, () => MultiChainHandler.forAgentKurtosis()], + [CommandType.STATUS, () => MultiChainHandler.forOriginDestination()], + ]); + + static getHandler(argv: Record): ChainHandler { + const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; + const createStrategy = + this.strategyMap.get(commandKey) || (() => new SingleChainHandler()); + return createStrategy(); + } +} diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts new file mode 100644 index 0000000000..ac9381abb6 --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -0,0 +1,166 @@ +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; +import { assert } from '@hyperlane-xyz/utils'; + +import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { + runMultiChainSelectionStep, + runSingleChainSelectionStep, +} from '../../../utils/chains.js'; +import { + isFile, + readYamlOrJson, + runFileSelectionStep, +} from '../../../utils/files.js'; +import { SubmitterContext } from '../submitter/SubmitterContext.js'; + +import { ChainHandler } from './types.js'; + +enum ChainSelectionMode { + ORIGIN_DESTINATION, + AGENT_KURTOSIS, + WARP_CONFIG, +} + +export class MultiChainHandler implements ChainHandler { + constructor(private mode: ChainSelectionMode) {} + + async determineChains(argv: Record): Promise { + const { context } = argv; + + switch (this.mode) { + case ChainSelectionMode.WARP_CONFIG: + return this.determineWarpConfigChains(argv); + case ChainSelectionMode.AGENT_KURTOSIS: + return this.determineAgentChains(argv, context); + case ChainSelectionMode.ORIGIN_DESTINATION: + default: + return this.determineOriginDestinationChains(argv, context); + } + } + + private async determineWarpConfigChains( + argv: Record, + ): Promise { + argv.config = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; + argv.context.chains = await this.getWarpConfigChains( + argv.config, + argv.skipConfirmation, + ); + return argv.context.chains; + } + + private async determineAgentChains( + argv: Record, + context: any, + ): Promise { + argv.origin = + argv.origin ?? + (await runSingleChainSelectionStep( + context.chainMetadata, + 'Select the origin chain', + )); + + if (!argv.targets) { + const selectedRelayChains = await runMultiChainSelectionStep({ + chainMetadata: context.chainMetadata, + message: 'Select chains to relay between', + requireNumber: 2, + }); + argv.targets = selectedRelayChains.join(','); + } + + return [argv.origin, ...argv.targets]; + } + + private async determineOriginDestinationChains( + argv: Record, + context: any, + ): Promise { + argv.origin = + argv.origin ?? + (await runSingleChainSelectionStep( + context.chainMetadata, + 'Select the origin chain', + )); + + argv.destination = + argv.destination ?? + (await runSingleChainSelectionStep( + context.chainMetadata, + 'Select the destination chain', + )); + + return [argv.origin, argv.destination]; + } + + private async getWarpConfigChains( + configPath: string, + skipConfirmation: boolean, + ): Promise { + if (!configPath || !isFile(configPath)) { + assert(!skipConfirmation, 'Warp route deployment config is required'); + configPath = await runFileSelectionStep( + './configs', + 'Warp route deployment config', + 'warp', + ); + } else { + console.log(`Using warp route deployment config at ${configPath}`); + } + + const warpRouteConfig = readYamlOrJson(configPath); + assert( + warpRouteConfig, + `No warp route deploy config found at ${configPath}`, + ); + + const chains = Object.keys(warpRouteConfig) as ChainName[]; + assert( + chains.length !== 0, + 'No chains found in warp route deployment config', + ); + + return chains; + } + + createSubmitterContext( + chains: ChainName[], + strategyConfig: ChainSubmissionStrategy, + argv?: Record, + ): SubmitterContext { + return new SubmitterContext( + strategyConfig, + chains, + TxSubmitterType.JSON_RPC, + argv, + ); + } + + async configureSigners( + argv: Record, + multiProvider: MultiProvider, + submitterContext: SubmitterContext, + ): Promise { + const signers = await submitterContext.getSigners(); + multiProvider.setSigners(signers); + argv.context.multiProvider = multiProvider; + argv.submitterContext = submitterContext; + } + + static forOriginDestination(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.ORIGIN_DESTINATION); + } + + static forAgentKurtosis(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.AGENT_KURTOSIS); + } + + static forWarpConfig(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.WARP_CONFIG); + } +} diff --git a/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts similarity index 79% rename from typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts rename to typescript/cli/src/context/strategies/chain/SingleChainHandler.ts index 26bad17c71..37d6c36c69 100644 --- a/typescript/cli/src/context/strategies/signer/SingleChainSignerStrategy.ts +++ b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts @@ -8,30 +8,29 @@ import { import { runSingleChainSelectionStep } from '../../../utils/chains.js'; import { SubmitterContext } from '../submitter/SubmitterContext.js'; -import { SignerStrategy } from './SignerStrategy.js'; +import { ChainHandler } from './types.js'; /** - * @title SingleChainSignerStrategy + * @title SingleChainHandler * @notice Strategy implementation for managing single-chain operations * @dev This strategy is used by commands that operate on a single blockchain - * It implements the SignerStrategy interface and is primarily used for - * operations like 'core:apply' and 'warp:read' (see SignerStrategyFactory) + * It implements the ChainHandler interface and is primarily used for + * operations like 'core:apply' and 'warp:read' */ -export class SingleChainSignerStrategy implements SignerStrategy { +export class SingleChainHandler implements ChainHandler { /** * @notice Determines the chain to be used for signing operations * @dev Either uses the chain specified in argv or prompts for interactive selection */ async determineChains(argv: Record): Promise { - const chain: ChainName = + argv.chain = argv.chain || (await runSingleChainSelectionStep( argv.context.chainMetadata, 'Select chain to connect:', )); - argv.chain = chain; - return [chain]; // Explicitly return as single-item array + return [argv.chain]; // Explicitly return as single-item array } /** diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts b/typescript/cli/src/context/strategies/chain/types.ts similarity index 96% rename from typescript/cli/src/context/strategies/signer/SignerStrategy.ts rename to typescript/cli/src/context/strategies/chain/types.ts index 1b802831d1..5b429739c9 100644 --- a/typescript/cli/src/context/strategies/signer/SignerStrategy.ts +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -6,7 +6,7 @@ import { import { SubmitterContext } from '../submitter/SubmitterContext.js'; -export interface SignerStrategy { +export interface ChainHandler { /** * Determines the chains to be used for signing * @param argv Command arguments diff --git a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts deleted file mode 100644 index aea8cb1d45..0000000000 --- a/typescript/cli/src/context/strategies/signer/OriginDestinationSignerStrategy.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; - -import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { SubmitterContext } from '../submitter/SubmitterContext.js'; - -import { SignerStrategy } from './SignerStrategy.js'; - -/** - * @title OriginDestinationSignerStrategy - * @notice Strategy implementation for managing multiVM operations requiring both origin and destination chains - * @dev This strategy is used by the SignerStrategyFactory for sending messages and tokens across chains - */ -export class OriginDestinationSignerStrategy implements SignerStrategy { - /** - * @notice Determines and validates the origin and destination chains - * @dev If origin or destination are not provided in argv, prompts user for interactive selection - */ - async determineChains(argv: Record): Promise { - const { context } = argv; - - let origin = - argv.origin ?? - (await runSingleChainSelectionStep( - context.chainMetadata, - 'Select the origin chain', - )); - - let destination = - argv.destination ?? - (await runSingleChainSelectionStep( - context.chainMetadata, - 'Select the destination chain', - )); - - argv.origin = origin; - argv.destination = destination; - return [origin, destination]; // Explicitly return as single-item array - } - - /** - * @dev Hardcoded: JSON_RPC as the transaction submitter type - */ - createSubmitterContext( - chains: ChainName[], - strategyConfig: ChainSubmissionStrategy, - argv?: Record, - ): SubmitterContext { - return new SubmitterContext( - strategyConfig, - chains, - TxSubmitterType.JSON_RPC, - argv, - ); - } - - /** - * @notice Configures signers for both origin and destination chains - * @dev Sets up signers in the MultiProvider and updates the context with necessary references - */ - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - submitterContext: SubmitterContext, - ): Promise { - const signers = await submitterContext.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.submitterContext = submitterContext; - } -} diff --git a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts b/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts deleted file mode 100644 index 399ea61e65..0000000000 --- a/typescript/cli/src/context/strategies/signer/SignerStrategyFactory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { OriginDestinationSignerStrategy } from './OriginDestinationSignerStrategy.js'; -import { SignerStrategy } from './SignerStrategy.js'; -import { SingleChainSignerStrategy } from './SingleChainSignerStrategy.js'; -import { WarpConfigSignerStrategy } from './WarpConfigSignerStrategy.js'; - -enum CommandType { - CORE_APPLY = 'core:apply', - WARP_DEPLOY = 'warp:deploy', - WARP_SEND = 'warp:send', - WARP_APPLY = 'warp:apply', - WARP_READ = 'warp:read', - SEND_MESSAGE = 'send:message', -} - -export class SignerStrategyFactory { - private static strategyMap: Map SignerStrategy> = new Map([ - [CommandType.CORE_APPLY, () => new SingleChainSignerStrategy()], - [CommandType.WARP_DEPLOY, () => new WarpConfigSignerStrategy()], - [CommandType.WARP_SEND, () => new OriginDestinationSignerStrategy()], - [CommandType.WARP_APPLY, () => new WarpConfigSignerStrategy()], - [CommandType.WARP_READ, () => new SingleChainSignerStrategy()], - [CommandType.SEND_MESSAGE, () => new OriginDestinationSignerStrategy()], - ]); - - static createStrategy(argv: Record): SignerStrategy { - const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; - const createStrategy = - this.strategyMap.get(commandKey) || - (() => new SingleChainSignerStrategy()); - return createStrategy(); - } -} diff --git a/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts b/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts deleted file mode 100644 index ad06bec157..0000000000 --- a/typescript/cli/src/context/strategies/signer/WarpConfigSignerStrategy.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; -import { assert } from '@hyperlane-xyz/utils'; - -import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; -import { - isFile, - readYamlOrJson, - runFileSelectionStep, -} from '../../../utils/files.js'; -import { SubmitterContext } from '../submitter/SubmitterContext.js'; - -import { SignerStrategy } from './SignerStrategy.js'; - -/** - * @title WarpConfigSignerStrategy - * @notice Strategy implementation for managing Warp route deployments and configurations - * @dev This strategy is used by commands like 'warp:deploy' and 'warp:apply' - */ -export class WarpConfigSignerStrategy implements SignerStrategy { - /** - * @notice Determines the chains to be used based on the Warp configuration file - * @dev Reads and validates a YAML/JSON config file to extract chain information - * If no config is provided, prompts for interactive file selection - */ - async determineChains(argv: Record): Promise { - const configPath = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; - const { chains } = await getWarpConfigChains({ - configPath, - skipConfirmation: argv.skipConfirmation, - }); - - argv.context.config = configPath; - argv.context.chains = chains; - return chains; - } - - createSubmitterContext( - chains: ChainName[], - strategyConfig: ChainSubmissionStrategy, - argv: Record, - ): SubmitterContext { - return new SubmitterContext( - strategyConfig, - chains, - TxSubmitterType.JSON_RPC, - argv, - ); - } - - /** - * @dev Sets up signers for all chains [can be one or more] specified in the Warp config - */ - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - submitterContext: SubmitterContext, - ): Promise { - const signers = await submitterContext.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.submitterContext = submitterContext; - } -} - -/** - * @notice Helper function to extract and validate chains from a Warp config file - * @dev Supports both YAML and JSON config formats - */ -export async function getWarpConfigChains({ - configPath = DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH, - skipConfirmation = false, -}: { - configPath?: string; - skipConfirmation?: boolean; -}): Promise<{ chains: ChainName[] }> { - // Validate config path - - if (!configPath || !isFile(configPath)) { - assert(!skipConfirmation, 'Warp route deployment config is required'); - - // Interactive file selection if no path provided - configPath = await runFileSelectionStep( - './configs', - 'Warp route deployment config', - 'warp', - ); - } else { - console.log(`Using warp route deployment config at ${configPath}`); - } - - // Read warp route deployment configuration - let warpRouteConfig = readYamlOrJson(configPath); - - assert(warpRouteConfig, `No warp route deploy config found at ${configPath}`); - - // Extract chains from configuration - const chains = Object.keys(warpRouteConfig) as ChainName[]; - - // Validate chains - assert( - chains.length !== 0, - 'No chains found in warp route deployment config', - ); - - return { chains }; -} diff --git a/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts b/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts deleted file mode 100644 index 44f3686ca2..0000000000 --- a/typescript/cli/src/context/strategies/submitter/GnosisSafeStrategy.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TxSubmitterType } from '@hyperlane-xyz/sdk'; -import { ChainName } from '@hyperlane-xyz/sdk'; - -import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; - -export class GnosisSafeStrategy extends BaseSubmitterStrategy { - async getPrivateKey(chain: ChainName): Promise { - // Future works: Implement Gnosis Safe specific logic - throw new Error('Not implemented'); - } - - getType(): TxSubmitterType { - return TxSubmitterType.GNOSIS_SAFE; - } -} diff --git a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts index ad9adeda18..66d466e89c 100644 --- a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts @@ -7,15 +7,17 @@ import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; export class JsonRpcStrategy extends BaseSubmitterStrategy { async getPrivateKey(chain: ChainName): Promise { - let pk = this.config[chain]?.submitter?.privateKey; // HYP_KEY for backwards compatibility + const submitter = this.config[chain]?.submitter as { + type: TxSubmitterType.JSON_RPC; + privateKey?: string; + }; - if (!pk) { - pk = await password({ + return ( + submitter?.privateKey ?? + (await password({ message: `Please enter the private key for chain ${chain}`, - }); - } - - return pk; + })) + ); } getType(): TxSubmitterType { diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts index cf09e92d21..9757194121 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts @@ -39,18 +39,22 @@ export class SubmitterContext { * @dev Retrieves the private keys for the specified chains. * @return An array of objects containing chain names and their corresponding private keys. */ - async getChainKeys(): Promise< + private async getChainKeys(): Promise< Array<{ chainName: ChainName; privateKey: string }> > { - const chainKeys = await Promise.all( - this.chains.map(async (chain) => ({ + const chainKeys = []; + + for (const chain of this.chains) { + const privateKey = + this.argv?.key ?? // argv.key overrides strategy private key + (await this.strategy.getPrivateKey(chain)) ?? + ENV.HYP_KEY; // argv.key and ENV.HYP_KEY for backwards compatibility + + chainKeys.push({ chainName: chain, - privateKey: - this.argv?.key || // argv.key overrides strategy key - (await this.strategy.getPrivateKey(chain)) || - ENV.HYP_KEY, // argv.key and ENV.HYP_KEY for backwards compatibility - })), - ); + privateKey: privateKey, + }); + } return chainKeys; } diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts index 10bc3f3123..fa623515ff 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; import { ChainName } from '@hyperlane-xyz/sdk'; export interface ISubmitterStrategy { @@ -10,7 +10,7 @@ export interface ISubmitterStrategy { } export abstract class BaseSubmitterStrategy implements ISubmitterStrategy { - constructor(protected config: any) {} + constructor(protected config: ChainSubmissionStrategy) {} abstract getPrivateKey(chain: ChainName): Promise; diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts index 9c32f992c7..4efc173760 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts @@ -1,19 +1,19 @@ -import { TxSubmitterType } from '@hyperlane-xyz/sdk'; +import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; -import { GnosisSafeStrategy } from './GnosisSafeStrategy.js'; import { JsonRpcStrategy } from './JsonRpcStrategy.js'; import { ISubmitterStrategy } from './SubmitterStrategy.js'; export class SubmitterStrategyFactory { static createStrategy( type: TxSubmitterType, - config: any, + config: ChainSubmissionStrategy, ): ISubmitterStrategy { switch (type) { case TxSubmitterType.JSON_RPC: return new JsonRpcStrategy(config); - case TxSubmitterType.GNOSIS_SAFE: - return new GnosisSafeStrategy(config); + // TO BE IMPLEMENTED! + // case TxSubmitterType.STARKNET_JSON_RPC: + // return new StarknetJsonRpcStrategy(config); default: throw new Error(`Unsupported submitter type: ${type}`); } diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index ca490fc5fb..8873062994 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -21,6 +21,7 @@ export async function runKurtosisAgentDeploy({ relayChains?: string; agentConfigurationPath?: string; }) { + // TODO: decide what to do with this, since its handled in MultiChainHandler - AGENT_KURTOSIS mode if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, diff --git a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts index 1586ec6b28..c589857370 100644 --- a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts +++ b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts @@ -15,6 +15,7 @@ export const EV5GnosisSafeTxBuilderPropsSchema = z.object({ export const EV5JsonRpcTxSubmitterPropsSchema = z.object({ chain: ZChainName, + privateKey: ZHash.optional(), }); export const EV5ImpersonatedAccountTxSubmitterPropsSchema = From 4abd806989e31ef48dd53cbfe70024e4b7d034ce Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 13 Nov 2024 15:48:08 +0100 Subject: [PATCH 08/45] feat: masked pk, refactoring --- typescript/cli/cli.ts | 4 +- typescript/cli/src/commands/config.ts | 15 ++ typescript/cli/src/commands/options.ts | 8 +- typescript/cli/src/commands/strategy.ts | 209 +++--------------- typescript/cli/src/config/strategy.ts | 200 ++++++++++++++++- typescript/cli/src/context/context.ts | 5 +- .../strategies/chain/MultiChainHandler.ts | 16 +- typescript/cli/src/context/types.ts | 2 - typescript/cli/src/deploy/utils.ts | 10 +- .../submitter/ethersV5/schemas.ts | 1 + typescript/utils/src/addresses.ts | 6 +- typescript/utils/src/index.ts | 1 + 12 files changed, 267 insertions(+), 210 deletions(-) diff --git a/typescript/cli/cli.ts b/typescript/cli/cli.ts index 672d84247d..45cad33bb8 100644 --- a/typescript/cli/cli.ts +++ b/typescript/cli/cli.ts @@ -19,6 +19,7 @@ import { overrideRegistryUriCommandOption, registryUriCommandOption, skipConfirmationOption, + strategyCommandOption, } from './src/commands/options.js'; import { registryCommand } from './src/commands/registry.js'; import { relayerCommand } from './src/commands/relayer.js'; @@ -50,6 +51,7 @@ try { .option('key', keyCommandOption) .option('disableProxy', disableProxyCommandOption) .option('yes', skipConfirmationOption) + .option('strategy', strategyCommandOption) .global(['log', 'verbosity', 'registry', 'overrides', 'yes']) .middleware([ (argv) => { @@ -68,10 +70,10 @@ try { .command(relayerCommand) .command(sendCommand) .command(statusCommand) + .command(strategyCommand) .command(submitCommand) .command(validatorCommand) .command(warpCommand) - .command(strategyCommand) .version(VERSION) .demandCommand() .strict() diff --git a/typescript/cli/src/commands/config.ts b/typescript/cli/src/commands/config.ts index e72b72452a..acebf77d18 100644 --- a/typescript/cli/src/commands/config.ts +++ b/typescript/cli/src/commands/config.ts @@ -3,6 +3,7 @@ import { CommandModule } from 'yargs'; import { readChainConfigs } from '../config/chain.js'; import { readIsmConfig } from '../config/ism.js'; import { readMultisigConfig } from '../config/multisig.js'; +import { readStrategyConfig } from '../config/strategy.js'; import { readWarpRouteDeployConfig } from '../config/warp.js'; import { CommandModuleWithContext } from '../context/types.js'; import { log, logGreen } from '../logger.js'; @@ -31,6 +32,7 @@ const validateCommand: CommandModule = { .command(validateChainCommand) .command(validateIsmCommand) .command(validateIsmAdvancedCommand) + .command(validateStrategyCommand) .command(validateWarpCommand) .version(false) .demandCommand(), @@ -76,6 +78,19 @@ const validateIsmAdvancedCommand: CommandModuleWithContext<{ path: string }> = { }, }; +const validateStrategyCommand: CommandModuleWithContext<{ path: string }> = { + command: 'strategy', + describe: 'Validate a Strategy config file', + builder: { + path: inputFileCommandOption(), + }, + handler: async ({ path }) => { + await readStrategyConfig(path); + logGreen('Config is valid'); + process.exit(0); + }, +}; + const validateWarpCommand: CommandModuleWithContext<{ path: string }> = { command: 'warp', describe: 'Validate a Warp Route deployment config file', diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index 96be4c77a8..9b4d1d19e8 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -128,13 +128,6 @@ export const chainTargetsCommandOption: Options = { alias: 'c', }; -export const strategyConfigUrlCommandOption: Options = { - type: 'string', - description: 'A path to a JSON or YAML file with a strategy config.', - default: DEFAULT_STRATEGY_CONFIG_PATH, - alias: 's', -}; - export const outputFileCommandOption = ( defaultPath?: string, demandOption = false, @@ -205,6 +198,7 @@ export const strategyCommandOption: Options = { type: 'string', description: 'The submission strategy input file path.', alias: 's', + default: DEFAULT_STRATEGY_CONFIG_PATH, demandOption: true, }; diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index b645646540..0dae34292e 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -1,34 +1,19 @@ -// import { input, select } from '@inquirer/prompts'; -import { input, select } from '@inquirer/prompts'; -import { ethers } from 'ethers'; import { stringify as yamlStringify } from 'yaml'; import { CommandModule } from 'yargs'; import { - ChainSubmissionStrategy, - ChainSubmissionStrategySchema, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; -import { ProtocolType, assert } from '@hyperlane-xyz/utils'; - + createStrategyConfig, + maskSensitiveData, + readStrategyConfig, +} from '../config/strategy.js'; import { CommandModuleWithWriteContext } from '../context/types.js'; -import { - errorRed, - log, - logBlue, - logCommandHeader, - logGreen, -} from '../logger.js'; -import { runSingleChainSelectionStep } from '../utils/chains.js'; -import { - indentYamlOrJson, - readYamlOrJson, - writeYamlOrJson, -} from '../utils/files.js'; +import { log, logCommandHeader } from '../logger.js'; +import { indentYamlOrJson } from '../utils/files.js'; import { DEFAULT_STRATEGY_CONFIG_PATH, outputFileCommandOption, + strategyCommandOption, } from './options.js'; /** @@ -37,171 +22,45 @@ import { export const strategyCommand: CommandModule = { command: 'strategy', describe: 'Manage Hyperlane deployment strategies', - builder: (yargs) => yargs.command(init).version(false).demandCommand(), + builder: (yargs) => + yargs.command(init).command(read).version(false).demandCommand(), handler: () => log('Command required'), }; export const init: CommandModuleWithWriteContext<{ - chain: string; - config: string; + out: string; }> = { command: 'init', - describe: 'Initiates strategy', + describe: 'Initiates default strategy configuration', builder: { - config: outputFileCommandOption( - DEFAULT_STRATEGY_CONFIG_PATH, - false, - 'The path to output a Strategy Config JSON or YAML file.', - ), - type: { - type: 'string', - description: - 'Type of submitter (jsonRpc, impersonatedAccount, gnosisSafe, gnosisSafeTxBuilder)', - }, - safeAddress: { - type: 'string', - description: - 'Safe address (required for gnosisSafe and gnosisSafeTxBuilder types)', - }, - userAddress: { - type: 'string', - description: 'User address (required for impersonatedAccount type)', - }, + out: outputFileCommandOption(DEFAULT_STRATEGY_CONFIG_PATH), }, - handler: async ({ - context, - type: inputType, - safeAddress: inputSafeAddress, - userAddress: inputUserAddress, - }) => { - logCommandHeader(`Hyperlane Key Init`); - let defaultStrategy; - try { - defaultStrategy = await readYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH); - } catch (e) { - defaultStrategy = writeYamlOrJson( - DEFAULT_STRATEGY_CONFIG_PATH, - {}, - 'yaml', - ); - } - - const chain = await runSingleChainSelectionStep(context.chainMetadata); - const chainProtocol = context.chainMetadata[chain].protocol; - assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); - - // If type wasn't provided via command line, prompt for it - const type = - inputType || - (await select({ - message: 'Enter the type of submitter', - choices: Object.values(TxSubmitterType).map((value) => ({ - name: value, - value: value, - })), - })); - - const submitter: any = { - type: type, - }; - - // Configure submitter based on type - switch (type) { - case TxSubmitterType.JSON_RPC: - submitter.privateKey = await input({ - message: 'Enter your private key', - validate: (pk) => isValidPrivateKey(pk), - }); - submitter.chain = chain; - break; - - case TxSubmitterType.IMPERSONATED_ACCOUNT: - submitter.userAddress = - inputUserAddress || - (await input({ - message: 'Enter the user address to impersonate', - validate: (address) => { - try { - return ethers.utils.isAddress(address) - ? true - : 'Invalid Ethereum address'; - } catch { - return 'Invalid Ethereum address'; - } - }, - })); - assert( - submitter.userAddress, - 'User address is required for impersonated account', - ); - break; - - case TxSubmitterType.GNOSIS_SAFE: - case TxSubmitterType.GNOSIS_TX_BUILDER: - submitter.safeAddress = - inputSafeAddress || - (await input({ - message: 'Enter the Safe address', - validate: (address) => { - try { - return ethers.utils.isAddress(address) - ? true - : 'Invalid Safe address'; - } catch { - return 'Invalid Safe address'; - } - }, - })); - assert( - submitter.safeAddress, - 'Safe address is required for Gnosis Safe', - ); - submitter.chain = chain; + handler: async ({ context, out }) => { + logCommandHeader(`Hyperlane Strategy Init`); - if (type === TxSubmitterType.GNOSIS_TX_BUILDER) { - submitter.version = await input({ - message: 'Enter the Safe version (default: 1.0)', - default: '1.0', - }); - } - break; - - default: - throw new Error(`Unsupported submitter type: ${type}`); - } + await createStrategyConfig({ + context, + outPath: out, + }); + process.exit(0); + }, +}; - const result: ChainSubmissionStrategy = { - ...defaultStrategy, // if there are changes in ChainSubmissionStrategy, the defaultStrategy may no longer be compatible - [chain]: { - submitter: submitter, - }, - }; +export const read: CommandModuleWithWriteContext<{ + strategy: string; +}> = { + command: 'read', + describe: 'Reads strategy configuration', + builder: { + strategy: { ...strategyCommandOption, demandOption: true }, + }, + handler: async ({ strategy: strategyUrl }) => { + logCommandHeader(`Hyperlane Strategy Read`); - try { - const strategyConfig = ChainSubmissionStrategySchema.parse(result); - logBlue( - `Strategy config is valid, writing to file ${DEFAULT_STRATEGY_CONFIG_PATH}:\n`, - ); - log(indentYamlOrJson(yamlStringify(strategyConfig, null, 2), 4)); + const strategy = await readStrategyConfig(strategyUrl); + const maskedConfig = maskSensitiveData(strategy); + log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); - writeYamlOrJson(DEFAULT_STRATEGY_CONFIG_PATH, strategyConfig); - logGreen('✅ Successfully created new key config.'); - } catch (e) { - errorRed( - `Key config is invalid, please check the submitter configuration.`, - ); - throw e; - } process.exit(0); }, }; - -function isValidPrivateKey(privateKey: string): boolean { - try { - // Attempt to create a Wallet instance with the private key - const wallet = new ethers.Wallet(privateKey); - return wallet.privateKey === privateKey; - } catch (error) { - return false; - } -} diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 48c668993f..548f49e1bf 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -1,16 +1,204 @@ +import { confirm, input, password, select } from '@inquirer/prompts'; +import { Wallet } from 'ethers'; +import { stringify as yamlStringify } from 'yaml'; + import { ChainSubmissionStrategy, ChainSubmissionStrategySchema, + TxSubmitterType, } from '@hyperlane-xyz/sdk'; -import { assert } from '@hyperlane-xyz/utils'; +import { + ProtocolType, + assert, + isAddress, + isPrivateKeyEvm, +} from '@hyperlane-xyz/utils'; -import { readYamlOrJson } from '../utils/files.js'; +import { CommandContext } from '../context/types.js'; +import { errorRed, log, logBlue, logGreen } from '../logger.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; +import { + indentYamlOrJson, + readYamlOrJson, + writeYamlOrJson, +} from '../utils/files.js'; -export async function readDefaultStrategyConfig( +export async function readStrategyConfig( filePath: string, ): Promise { - const config = readYamlOrJson(filePath); - assert(config, `No default strategy config found at ${filePath}`); + log(`Reading file configs in ${filePath}`); + + const strategyConfig = readYamlOrJson(filePath); + + if ( + !strategyConfig || + typeof strategyConfig !== 'object' || + !Object.keys(strategyConfig).length + ) { + errorRed(`No strategy configs found in ${filePath}`); + process.exit(1); + } + + const parseResult = ChainSubmissionStrategySchema.safeParse(strategyConfig); + + if (!parseResult.success) { + errorRed(`Strategy config for ${filePath} is invalid!`); + errorRed(JSON.stringify(parseResult.error.errors)); + process.exit(1); + } + return strategyConfig; +} + +export async function createStrategyConfig({ + context, + outPath, +}: { + context: CommandContext; + outPath: string; +}) { + let strategy; + try { + // the output strategy might contain submitters for other chain we don't want to overwrite + strategy = await readYamlOrJson(outPath); + } catch (e) { + strategy = writeYamlOrJson(outPath, {}, 'yaml'); + } + const chain = await runSingleChainSelectionStep(context.chainMetadata); + const chainProtocol = context.chainMetadata[chain].protocol; + assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); + + if ( + !context.skipConfirmation && + Object.prototype.hasOwnProperty.call(strategy, chain) + ) { + const isConfirmed = await confirm({ + message: `Default strategy for chain ${chain} already exists. Are you sure you want to overwrite existing strategy config?`, + default: false, + }); + + if (!isConfirmed) { + throw Error('Strategy init cancelled'); + } + } + + const type = await select({ + message: 'Enter the type of submitter', + choices: Object.values(TxSubmitterType).map((value) => ({ + name: value, + value: value, + })), + }); + + const submitter: any = { + type: type, + }; + + // Configure submitter based on type + switch (type) { + case TxSubmitterType.JSON_RPC: + submitter.privateKey = await password({ + message: 'Enter your private key', + validate: (pk) => isPrivateKeyEvm(pk), + }); + + submitter.userAddress = await new Wallet( + submitter.privateKey, + ).getAddress(); + + submitter.chain = chain; + break; + + case TxSubmitterType.IMPERSONATED_ACCOUNT: + submitter.userAddress = await input({ + message: 'Enter the user address to impersonate', + validate: (address) => { + try { + return isAddress(address) ? true : 'Invalid Ethereum address'; + } catch { + return 'Invalid Ethereum address'; + } + }, + }); + assert( + submitter.userAddress, + 'User address is required for impersonated account', + ); + break; + + case TxSubmitterType.GNOSIS_SAFE: + case TxSubmitterType.GNOSIS_TX_BUILDER: + submitter.safeAddress = await input({ + message: 'Enter the Safe address', + validate: (address) => { + try { + return isAddress(address) ? true : 'Invalid Safe address'; + } catch { + return 'Invalid Safe address'; + } + }, + }); + + submitter.chain = chain; + + if (type === TxSubmitterType.GNOSIS_TX_BUILDER) { + submitter.version = await input({ + message: 'Enter the Safe version (default: 1.0)', + default: '1.0', + }); + } + break; + + default: + throw new Error(`Unsupported submitter type: ${type}`); + } + + const strategyResult: ChainSubmissionStrategy = { + ...strategy, // if there are changes in ChainSubmissionStrategy, the strategy may no longer be compatible + [chain]: { + submitter: submitter, + }, + }; + + try { + const strategyConfig = ChainSubmissionStrategySchema.parse(strategyResult); + logBlue(`Strategy config is valid, writing to file ${outPath}:\n`); + + // Mask sensitive data before logging + const maskedConfig = maskSensitiveData(strategyConfig); + log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); + + // Write the original unmasked config to file + writeYamlOrJson(outPath, strategyConfig); + logGreen('✅ Successfully created new key config.'); + } catch (e) { + errorRed( + `Key config is invalid, please check the submitter configuration.`, + ); + } +} + +// New utility function to mask sensitive data +export function maskPrivateKey(key: string): string { + if (!key) return key; + const middle = '•'.repeat(key.length); + return `${middle}`; +} + +// Function to recursively mask private keys in an object +export function maskSensitiveData(obj: any): any { + if (!obj) return obj; + + if (typeof obj === 'object') { + const masked = { ...obj }; + for (const [key, value] of Object.entries(masked)) { + if (key === 'privateKey' && typeof value === 'string') { + masked[key] = maskPrivateKey(value); + } else if (typeof value === 'object') { + masked[key] = maskSensitiveData(value); + } + } + return masked; + } - return ChainSubmissionStrategySchema.parse(config); + return obj; } diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 8417bd123d..f6c04d1fb4 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -17,8 +17,7 @@ import { import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; import { isSignCommand } from '../commands/signCommands.js'; -import { readDefaultStrategyConfig } from '../config/strategy.js'; -// import { readDefaultStrategyConfig } from '../config/strategy.js'; +import { readStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -73,7 +72,7 @@ export async function signerMiddleware(argv: Record) { let strategyConfig = {}; try { - strategyConfig = await readDefaultStrategyConfig(argv.strategy); + strategyConfig = await readStrategyConfig(argv.strategy); } catch (error) { strategyConfig = {}; } diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index ac9381abb6..ed1727e513 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -7,15 +7,13 @@ import { import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { readWarpRouteDeployConfig } from '../../../config/warp.js'; +import { logRed } from '../../../logger.js'; import { runMultiChainSelectionStep, runSingleChainSelectionStep, } from '../../../utils/chains.js'; -import { - isFile, - readYamlOrJson, - runFileSelectionStep, -} from '../../../utils/files.js'; +import { isFile, runFileSelectionStep } from '../../../utils/files.js'; import { SubmitterContext } from '../submitter/SubmitterContext.js'; import { ChainHandler } from './types.js'; @@ -110,14 +108,10 @@ export class MultiChainHandler implements ChainHandler { 'warp', ); } else { - console.log(`Using warp route deployment config at ${configPath}`); + logRed(`Using warp route deployment config at ${configPath}`); } - const warpRouteConfig = readYamlOrJson(configPath); - assert( - warpRouteConfig, - `No warp route deploy config found at ${configPath}`, - ); + const warpRouteConfig = await readWarpRouteDeployConfig(configPath); const chains = Object.keys(warpRouteConfig) as ChainName[]; assert( diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 79499bd987..84dcc65ba0 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -7,7 +7,6 @@ import type { ChainMetadata, ChainName, MultiProvider, - WarpRouteDeployConfig, } from '@hyperlane-xyz/sdk'; export interface ContextSettings { @@ -29,7 +28,6 @@ export interface CommandContext { key?: string; signer?: ethers.Signer; chains?: ChainName[]; - warpRouteConfig?: WarpRouteDeployConfig; } export interface WriteCommandContext extends CommandContext { diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index 71ea6cbb65..c03cc761c3 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -139,8 +139,9 @@ export async function prepareDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); - const userAddress = await multiProvider.getSigner(chain).getAddress(); - const currentBalance = await provider.getBalance(userAddress); + const address = + userAddress ?? (await multiProvider.getSigner(chain).getAddress()); + const currentBalance = await provider.getBalance(address); initialBalances[chain] = currentBalance; }), ); @@ -160,8 +161,9 @@ export async function completeDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); - const userAddress = await multiProvider.getSigner(chain).getAddress(); - const currentBalance = await provider.getBalance(userAddress); + const address = + userAddress ?? (await multiProvider.getSigner(chain).getAddress()); + const currentBalance = await provider.getBalance(address); const balanceDelta = initialBalances[chain].sub(currentBalance); if (isDryRun && balanceDelta.lt(0)) break; logPink( diff --git a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts index c589857370..cef774e738 100644 --- a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts +++ b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts @@ -15,6 +15,7 @@ export const EV5GnosisSafeTxBuilderPropsSchema = z.object({ export const EV5JsonRpcTxSubmitterPropsSchema = z.object({ chain: ZChainName, + userAddress: ZHash.optional(), privateKey: ZHash.optional(), }); diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index 01f9fdb107..035d1207e6 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -1,6 +1,6 @@ import { fromBech32, normalizeBech32, toBech32 } from '@cosmjs/encoding'; import { PublicKey } from '@solana/web3.js'; -import { utils as ethersUtils } from 'ethers'; +import { Wallet, utils as ethersUtils } from 'ethers'; import { isNullish } from './typeof.js'; import { Address, HexString, ProtocolType } from './types.js'; @@ -380,3 +380,7 @@ export function ensure0x(hexstr: string) { export function strip0x(hexstr: string) { return hexstr.startsWith('0x') ? hexstr.slice(2) : hexstr; } + +export function isPrivateKeyEvm(privateKey: string): boolean { + return new Wallet(privateKey).privateKey === privateKey; +} diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index c4a8692833..22910e42e1 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -26,6 +26,7 @@ export { isValidAddressCosmos, isValidAddressEvm, isValidAddressSealevel, + isPrivateKeyEvm, isValidTransactionHash, isValidTransactionHashCosmos, isValidTransactionHashEvm, From 188dced1d481212a37c43a502ac06a491fc7b12e Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 14 Nov 2024 14:21:19 +0100 Subject: [PATCH 09/45] feat: MultiChainHandler support to extract chains from WarpCoreConfig file --- typescript/cli/src/commands/config.ts | 2 +- typescript/cli/src/commands/signCommands.ts | 9 +- typescript/cli/src/commands/strategy.ts | 2 +- typescript/cli/src/config/strategy.ts | 45 +++--- typescript/cli/src/context/context.ts | 59 ++++---- ...nCommandHandler.ts => ChainInterceptor.ts} | 12 +- .../strategies/chain/MultiChainHandler.ts | 128 ++++++++++++------ .../strategies/chain/SingleChainHandler.ts | 39 +----- .../cli/src/context/strategies/chain/types.ts | 32 +---- .../strategies/submitter/JsonRpcStrategy.ts | 3 +- .../strategies/submitter/SubmitterContext.ts | 36 ++++- .../strategies/submitter/SubmitterStrategy.ts | 8 +- typescript/cli/src/context/types.ts | 2 + typescript/cli/src/read/warp.ts | 12 +- typescript/cli/src/send/transfer.ts | 10 +- 15 files changed, 219 insertions(+), 180 deletions(-) rename typescript/cli/src/context/strategies/chain/{ChainCommandHandler.ts => ChainInterceptor.ts} (73%) diff --git a/typescript/cli/src/commands/config.ts b/typescript/cli/src/commands/config.ts index acebf77d18..51d0005774 100644 --- a/typescript/cli/src/commands/config.ts +++ b/typescript/cli/src/commands/config.ts @@ -80,7 +80,7 @@ const validateIsmAdvancedCommand: CommandModuleWithContext<{ path: string }> = { const validateStrategyCommand: CommandModuleWithContext<{ path: string }> = { command: 'strategy', - describe: 'Validate a Strategy config file', + describe: 'Validates a Strategy config file', builder: { path: inputFileCommandOption(), }, diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index d80dc9c0f5..f32f6c580a 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,7 +1,14 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'apply']; +export const SIGN_COMMANDS = [ + 'apply', + 'deploy', + 'send', + 'status', + 'submit', + 'read', +]; export function isSignCommand(argv: any): boolean { return ( diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 0dae34292e..1d62a030d5 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -31,7 +31,7 @@ export const init: CommandModuleWithWriteContext<{ out: string; }> = { command: 'init', - describe: 'Initiates default strategy configuration', + describe: 'Creates strategy configuration', builder: { out: outputFileCommandOption(DEFAULT_STRATEGY_CONFIG_PATH), }, diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 548f49e1bf..d477334917 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -26,27 +26,35 @@ import { export async function readStrategyConfig( filePath: string, ): Promise { - log(`Reading file configs in ${filePath}`); - - const strategyConfig = readYamlOrJson(filePath); + try { + log(`Reading file configs in ${filePath}`); + const strategyConfig = readYamlOrJson(filePath); - if ( - !strategyConfig || - typeof strategyConfig !== 'object' || - !Object.keys(strategyConfig).length - ) { - errorRed(`No strategy configs found in ${filePath}`); - process.exit(1); - } + // Check if config exists and is a non-empty object + if (!strategyConfig || typeof strategyConfig !== 'object') { + logBlue( + `No strategy config found in ${filePath}, returning empty config`, + ); + return {}; + } - const parseResult = ChainSubmissionStrategySchema.safeParse(strategyConfig); + // Validate against schema + const parseResult = ChainSubmissionStrategySchema.safeParse(strategyConfig); + if (!parseResult.success) { + errorRed(`Strategy config validation failed for ${filePath}`); + errorRed(JSON.stringify(parseResult.error.errors, null, 2)); + throw new Error('Invalid strategy configuration'); + } - if (!parseResult.success) { - errorRed(`Strategy config for ${filePath} is invalid!`); - errorRed(JSON.stringify(parseResult.error.errors)); - process.exit(1); + return strategyConfig; + } catch (error) { + if (error instanceof Error) { + errorRed(`Error reading strategy config: ${error.message}`); + } else { + errorRed('Unknown error reading strategy config'); + } + throw error; // Re-throw to let caller handle the error } - return strategyConfig; } export async function createStrategyConfig({ @@ -103,7 +111,7 @@ export async function createStrategyConfig({ submitter.userAddress = await new Wallet( submitter.privateKey, - ).getAddress(); + ).getAddress(); // EVM submitter.chain = chain; break; @@ -177,6 +185,7 @@ export async function createStrategyConfig({ } } +// TODO: put in utils // New utility function to mask sensitive data export function maskPrivateKey(key: string): string { if (!key) return key; diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index f6c04d1fb4..d607d3d078 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -12,7 +12,9 @@ import { ChainMap, ChainMetadata, ChainName, + ChainSubmissionStrategy, MultiProvider, + TxSubmitterType, } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; @@ -25,7 +27,8 @@ import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; -import { ChainCommandHandler } from './strategies/chain/ChainCommandHandler.js'; +import { ChainInterceptor } from './strategies/chain/ChainInterceptor.js'; +import { SubmitterContext } from './strategies/submitter/SubmitterContext.js'; import { CommandContext, ContextSettings, @@ -58,41 +61,49 @@ export async function contextMiddleware(argv: Record) { } export async function signerMiddleware(argv: Record) { - const { requiresKey, multiProvider } = argv.context; + const { key, context } = argv; + const { requiresKey, multiProvider } = context; if (!requiresKey) return argv; - // Select the appropriate signing strategy based on the provided hyperlane command - // e.g command `core deploy` uses SingleChainHandler - const chainHandler = ChainCommandHandler.getHandler(argv); - - // Determine the chains that will be used for signing based on the selected strategy - // e.g. SingleChainHandler extracts jsonRpc private key from strategyConfig else prompts user private key input - const chains = await chainHandler.determineChains(argv); - - let strategyConfig = {}; + let strategyConfig: ChainSubmissionStrategy = {}; try { strategyConfig = await readStrategyConfig(argv.strategy); - } catch (error) { + } catch (e) { strategyConfig = {}; } - // Creates a submitter context for the signer, which manages the signing context for the specified chains - // default: TxSubmitterType.JSON_RPC - const signerSubmitterContext = chainHandler.createSubmitterContext( - chains, - strategyConfig, - argv, - ); + /** + * @notice Select the appropriate chain strategy based on the hyperlane command + * @dev e.g command `core deploy` uses SingleChainHandler + */ + const chainStrategy = ChainInterceptor.getStrategy(argv); + + /** + * @notice Determines chains that are used in createSignerContext based on the chain strategy + * @dev e.g. SingleChainHandler extracts chains from CLI or prompts the user to select the chain + * @dev e.g. MultiChainHandler.forOriginDestination() extracts origin/destination from CLI or prompts the user to select origin/destination + */ + const chains = await chainStrategy.determineChains(argv); - // Configure the signers using the selected strategy, multiProvider, and submitter context - // manipulates argv values - await chainHandler.configureSigners( - argv, + /** + * @notice Extracts private keys from strategyConfig else prompts user private key input + */ + + const signerStrategy = new SubmitterContext( + strategyConfig, + chains, + TxSubmitterType.JSON_RPC, multiProvider, - signerSubmitterContext, + key, ); + /** + * @notice Configure the signers using the selected strategy, multiProvider, and signer context + */ + const MultiProviderWithSigners = await signerStrategy.configureSigners(); + argv.multiProvider = MultiProviderWithSigners; + return argv; } diff --git a/typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts b/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts similarity index 73% rename from typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts rename to typescript/cli/src/context/strategies/chain/ChainInterceptor.ts index 595282326b..ba10f5c558 100644 --- a/typescript/cli/src/context/strategies/chain/ChainCommandHandler.ts +++ b/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts @@ -11,21 +11,23 @@ enum CommandType { SEND_MESSAGE = 'send:message', AGENT_KURTOSIS = 'deploy:kurtosis-agents', STATUS = 'status:', + SUBMIT = 'submit:', } -export class ChainCommandHandler { +export class ChainInterceptor { private static strategyMap: Map ChainHandler> = new Map([ [CommandType.CORE_APPLY, () => new SingleChainHandler()], - [CommandType.WARP_DEPLOY, () => MultiChainHandler.forWarpConfig()], + [CommandType.WARP_DEPLOY, () => MultiChainHandler.forWarpRouteConfig()], [CommandType.WARP_SEND, () => MultiChainHandler.forOriginDestination()], - [CommandType.WARP_APPLY, () => MultiChainHandler.forWarpConfig()], - [CommandType.WARP_READ, () => new SingleChainHandler()], + [CommandType.WARP_APPLY, () => MultiChainHandler.forWarpRouteConfig()], + [CommandType.WARP_READ, () => MultiChainHandler.forWarpCoreConfig()], [CommandType.SEND_MESSAGE, () => MultiChainHandler.forOriginDestination()], [CommandType.AGENT_KURTOSIS, () => MultiChainHandler.forAgentKurtosis()], [CommandType.STATUS, () => MultiChainHandler.forOriginDestination()], + [CommandType.SUBMIT, () => MultiChainHandler.forStrategyConfig()], ]); - static getHandler(argv: Record): ChainHandler { + static getStrategy(argv: Record): ChainHandler { const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; const createStrategy = this.strategyMap.get(commandKey) || (() => new SingleChainHandler()); diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index ed1727e513..d11740c76c 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -1,12 +1,8 @@ -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { readStrategyConfig } from '../../../config/strategy.js'; import { readWarpRouteDeployConfig } from '../../../config/warp.js'; import { logRed } from '../../../logger.js'; import { @@ -14,7 +10,7 @@ import { runSingleChainSelectionStep, } from '../../../utils/chains.js'; import { isFile, runFileSelectionStep } from '../../../utils/files.js'; -import { SubmitterContext } from '../submitter/SubmitterContext.js'; +import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; import { ChainHandler } from './types.js'; @@ -22,26 +18,30 @@ enum ChainSelectionMode { ORIGIN_DESTINATION, AGENT_KURTOSIS, WARP_CONFIG, + WARP_READ, + STRATEGY, } export class MultiChainHandler implements ChainHandler { constructor(private mode: ChainSelectionMode) {} async determineChains(argv: Record): Promise { - const { context } = argv; - switch (this.mode) { case ChainSelectionMode.WARP_CONFIG: - return this.determineWarpConfigChains(argv); + return this.determineWarpRouteConfigChains(argv); + case ChainSelectionMode.WARP_READ: + return this.determineWarpCoreConfigChains(argv); case ChainSelectionMode.AGENT_KURTOSIS: - return this.determineAgentChains(argv, context); + return this.determineAgentChains(argv); + case ChainSelectionMode.STRATEGY: + return this.determineStrategyChains(argv); case ChainSelectionMode.ORIGIN_DESTINATION: default: - return this.determineOriginDestinationChains(argv, context); + return this.determineOriginDestinationChains(argv); } } - private async determineWarpConfigChains( + private async determineWarpRouteConfigChains( argv: Record, ): Promise { argv.config = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; @@ -51,21 +51,41 @@ export class MultiChainHandler implements ChainHandler { ); return argv.context.chains; } + private async determineWarpCoreConfigChains( + argv: Record, + ): Promise { + if (argv.symbol || argv.warp) { + const warpCoreConfig = await getWarpCoreConfigOrExit({ + context: argv.context, + warp: argv.warp, + symbol: argv.symbol, + }); + argv.context.warpCoreConfig = warpCoreConfig; + const chains = extractChainValues(warpCoreConfig); + return chains; + } else if (argv.chain) { + return [argv.chain]; + } else { + throw new Error( + `Please specify either a symbol, chain and address or warp file`, + ); + } + } private async determineAgentChains( argv: Record, - context: any, ): Promise { + const { chainMetadata } = argv.context; argv.origin = argv.origin ?? (await runSingleChainSelectionStep( - context.chainMetadata, + chainMetadata, 'Select the origin chain', )); if (!argv.targets) { const selectedRelayChains = await runMultiChainSelectionStep({ - chainMetadata: context.chainMetadata, + chainMetadata: chainMetadata, message: 'Select chains to relay between', requireNumber: 2, }); @@ -77,24 +97,31 @@ export class MultiChainHandler implements ChainHandler { private async determineOriginDestinationChains( argv: Record, - context: any, ): Promise { + const { chainMetadata } = argv.context; + argv.origin = argv.origin ?? (await runSingleChainSelectionStep( - context.chainMetadata, + chainMetadata, 'Select the origin chain', )); argv.destination = argv.destination ?? (await runSingleChainSelectionStep( - context.chainMetadata, + chainMetadata, 'Select the destination chain', )); return [argv.origin, argv.destination]; } + private async determineStrategyChains( + argv: Record, + ): Promise { + const strategy = await readStrategyConfig(argv.strategy); + return extractChainValues(strategy); + } private async getWarpConfigChains( configPath: string, @@ -122,30 +149,6 @@ export class MultiChainHandler implements ChainHandler { return chains; } - createSubmitterContext( - chains: ChainName[], - strategyConfig: ChainSubmissionStrategy, - argv?: Record, - ): SubmitterContext { - return new SubmitterContext( - strategyConfig, - chains, - TxSubmitterType.JSON_RPC, - argv, - ); - } - - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - submitterContext: SubmitterContext, - ): Promise { - const signers = await submitterContext.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.submitterContext = submitterContext; - } - static forOriginDestination(): MultiChainHandler { return new MultiChainHandler(ChainSelectionMode.ORIGIN_DESTINATION); } @@ -154,7 +157,44 @@ export class MultiChainHandler implements ChainHandler { return new MultiChainHandler(ChainSelectionMode.AGENT_KURTOSIS); } - static forWarpConfig(): MultiChainHandler { + static forWarpRouteConfig(): MultiChainHandler { return new MultiChainHandler(ChainSelectionMode.WARP_CONFIG); } + static forWarpCoreConfig(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.WARP_READ); + } + static forStrategyConfig(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.STRATEGY); + } +} + +// TODO: Put in helpers +function extractChainValues(config: Record): string[] { + const chains: string[] = []; + + // Function to recursively search for chain fields + function findChainFields(obj: any) { + // Return if value is null or not an object/array + if (obj === null || typeof obj !== 'object') return; + + // Handle arrays + if (Array.isArray(obj)) { + obj.forEach((item) => findChainFields(item)); + return; + } + + // Check for chain fields + if ('chain' in obj) { + chains.push(obj.chain); + } + if ('chainName' in obj) { + chains.push(obj.chainName); + } + + // Recursively search in all object values + Object.values(obj).forEach((value) => findChainFields(value)); + } + + findChainFields(config); + return chains; } diff --git a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts index 37d6c36c69..491d585f1b 100644 --- a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts @@ -1,12 +1,6 @@ -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { SubmitterContext } from '../submitter/SubmitterContext.js'; import { ChainHandler } from './types.js'; @@ -32,35 +26,4 @@ export class SingleChainHandler implements ChainHandler { return [argv.chain]; // Explicitly return as single-item array } - - /** - * @dev Hardcoded: JSON_RPC as the transaction submitter type - */ - createSubmitterContext( - chains: ChainName[], - strategyConfig: ChainSubmissionStrategy, - argv?: Record, - ): SubmitterContext { - return new SubmitterContext( - strategyConfig, - chains, - TxSubmitterType.JSON_RPC, - argv, - ); - } - - /** - * @notice Sets up signers for the specified chain in the MultiProvider - * @dev Sets up signers for single chain - */ - async configureSigners( - argv: Record, - multiProvider: MultiProvider, - submitterContext: SubmitterContext, - ): Promise { - const signers = await submitterContext.getSigners(); - multiProvider.setSigners(signers); - argv.context.multiProvider = multiProvider; - argv.submitterContext = submitterContext; - } } diff --git a/typescript/cli/src/context/strategies/chain/types.ts b/typescript/cli/src/context/strategies/chain/types.ts index 5b429739c9..f7919152f2 100644 --- a/typescript/cli/src/context/strategies/chain/types.ts +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -1,10 +1,4 @@ -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, -} from '@hyperlane-xyz/sdk'; - -import { SubmitterContext } from '../submitter/SubmitterContext.js'; +import { ChainName } from '@hyperlane-xyz/sdk'; export interface ChainHandler { /** @@ -13,28 +7,4 @@ export interface ChainHandler { * @returns Array of chain names */ determineChains(argv: Record): Promise; - - /** - * Creates a context manager for the selected chains - * @param chains Selected chains - * @param strategyConfig Default strategy configuration - * @returns SubmitterContext instance - */ - createSubmitterContext( - chains: ChainName[], - strategyConfig: ChainSubmissionStrategy, - argv?: Record, - ): SubmitterContext; - - /** - * Configures signers for the multi-provider - * @param argv Command arguments - * @param multiProvider MultiProvider instance - * @param submitterContext SubmitterContext instance - */ - configureSigners( - argv: Record, - multiProvider: MultiProvider, - submitterContext: SubmitterContext, - ): Promise; } diff --git a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts index 66d466e89c..5129fc123c 100644 --- a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts @@ -1,7 +1,6 @@ import { password } from '@inquirer/prompts'; -import { TxSubmitterType } from '@hyperlane-xyz/sdk'; -import { ChainName } from '@hyperlane-xyz/sdk'; +import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts index 9757194121..670ef94d98 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts @@ -1,10 +1,12 @@ -import { Signer } from 'ethers'; +import { Signer, Wallet } from 'ethers'; import { ChainName, ChainSubmissionStrategy, + MultiProvider, TxSubmitterType, } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; import { ENV } from '../../../utils/env.js'; @@ -27,7 +29,8 @@ export class SubmitterContext { strategyConfig: ChainSubmissionStrategy, private chains: ChainName[], submitterType: TxSubmitterType, - private argv?: Record, + private multiProvider: MultiProvider, + private key?: string, ) { this.strategy = SubmitterStrategyFactory.createStrategy( submitterType, @@ -46,7 +49,7 @@ export class SubmitterContext { for (const chain of this.chains) { const privateKey = - this.argv?.key ?? // argv.key overrides strategy private key + this?.key ?? // argv.key overrides strategy private key (await this.strategy.getPrivateKey(chain)) ?? ENV.HYP_KEY; // argv.key and ENV.HYP_KEY for backwards compatibility @@ -64,6 +67,7 @@ export class SubmitterContext { * @return A record mapping chain names to their corresponding Signer objects. */ async getSigners(): Promise> { + this.strategy; const chainKeys = await this.getChainKeys(); return Object.fromEntries( chainKeys.map(({ chainName, privateKey }) => [ @@ -72,4 +76,30 @@ export class SubmitterContext { ]), ); } + + async configureSigners(): Promise { + for (const chain of this.chains) { + const protocol = this.multiProvider.getChainMetadata(chain).protocol; + const signer = await this.getSignerForChain(chain, protocol); + this.multiProvider.setSigner(chain, signer); + } + + return this.multiProvider; + } + + async getSignerForChain( + chain: ChainName, + protocol: ProtocolType, + ): Promise { + const privateKey = + this?.key ?? // argv.key overrides strategy private key + ENV.HYP_KEY ?? // ENV.HYP_KEY overrides strategy/prompt to enter pk + (await this.strategy.getPrivateKey(chain)); + switch (protocol) { + case ProtocolType.Ethereum: + return new Wallet(privateKey); + default: + throw new Error(`Unsupported protocol: ${protocol}`); + } + } } diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts index fa623515ff..6035bc2799 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts @@ -1,11 +1,11 @@ -import { ethers } from 'ethers'; +import { Signer, Wallet } from 'ethers'; import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; import { ChainName } from '@hyperlane-xyz/sdk'; export interface ISubmitterStrategy { getPrivateKey(chain: ChainName): Promise; - getSigner(privateKey: string): ethers.Signer; + getSigner(privateKey: string): Signer; getType(): TxSubmitterType; } @@ -14,8 +14,8 @@ export abstract class BaseSubmitterStrategy implements ISubmitterStrategy { abstract getPrivateKey(chain: ChainName): Promise; - getSigner(privateKey: string): ethers.Signer { - return new ethers.Wallet(privateKey); + getSigner(privateKey: string): Signer { + return new Wallet(privateKey); } abstract getType(): TxSubmitterType; diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 84dcc65ba0..d12e9dea53 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -7,6 +7,7 @@ import type { ChainMetadata, ChainName, MultiProvider, + WarpCoreConfig, } from '@hyperlane-xyz/sdk'; export interface ContextSettings { @@ -28,6 +29,7 @@ export interface CommandContext { key?: string; signer?: ethers.Signer; chains?: ChainName[]; + warpCoreConfig?: WarpCoreConfig; } export interface WriteCommandContext extends CommandContext { diff --git a/typescript/cli/src/read/warp.ts b/typescript/cli/src/read/warp.ts index 9139d890c2..3cd6c19352 100644 --- a/typescript/cli/src/read/warp.ts +++ b/typescript/cli/src/read/warp.ts @@ -34,11 +34,13 @@ export async function runWarpRouteRead({ let addresses: ChainMap; if (symbol || warp) { - const warpCoreConfig = await getWarpCoreConfigOrExit({ - context, - warp, - symbol, - }); + const warpCoreConfig = + context.warpCoreConfig ?? // this case is be handled by MultiChainHandler.forWarpCoreConfig() interceptor + (await getWarpCoreConfigOrExit({ + context, + warp, + symbol, + })); // TODO: merge with XERC20TokenAdapter and WarpRouteReader const xerc20Limits = await Promise.all( diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index 75205a7c57..cd75ffc717 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -92,8 +92,12 @@ async function executeDelivery({ const { multiProvider, registry } = context; const signer = multiProvider.getSigner(origin); + const recipientSigner = multiProvider.getSigner(destination); + + const recipientAddress = await recipientSigner.getAddress(); const signerAddress = await signer.getAddress(); - recipient ||= signerAddress; + + recipient ||= recipientAddress; const chainAddresses = await registry.getAddresses(); @@ -124,7 +128,7 @@ async function executeDelivery({ const errors = await warpCore.validateTransfer({ originTokenAmount: token.amount(amount), destination, - recipient: recipient ?? signerAddress, + recipient, sender: signerAddress, }); if (errors) { @@ -137,7 +141,7 @@ async function executeDelivery({ originTokenAmount: new TokenAmount(amount, token), destination, sender: signerAddress, - recipient: recipient ?? signerAddress, + recipient, }); const txReceipts = []; From 0b92c681af195fd63e7230c291055b67b73ecc90 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 15 Nov 2024 10:46:17 +0100 Subject: [PATCH 10/45] chore: refactoring & adding comments --- typescript/cli/src/commands/config.ts | 4 +-- typescript/cli/src/commands/strategy.ts | 4 +-- typescript/cli/src/config/strategy.ts | 15 +++++++-- typescript/cli/src/context/context.ts | 11 ++----- .../strategies/chain/MultiChainHandler.ts | 8 ++--- .../strategies/submitter/SubmitterContext.ts | 31 +++++++++++++++---- .../submitter/SubmitterStrategyFactory.ts | 2 +- 7 files changed, 49 insertions(+), 26 deletions(-) diff --git a/typescript/cli/src/commands/config.ts b/typescript/cli/src/commands/config.ts index 51d0005774..4a5c6b580a 100644 --- a/typescript/cli/src/commands/config.ts +++ b/typescript/cli/src/commands/config.ts @@ -3,7 +3,7 @@ import { CommandModule } from 'yargs'; import { readChainConfigs } from '../config/chain.js'; import { readIsmConfig } from '../config/ism.js'; import { readMultisigConfig } from '../config/multisig.js'; -import { readStrategyConfig } from '../config/strategy.js'; +import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; import { readWarpRouteDeployConfig } from '../config/warp.js'; import { CommandModuleWithContext } from '../context/types.js'; import { log, logGreen } from '../logger.js'; @@ -85,7 +85,7 @@ const validateStrategyCommand: CommandModuleWithContext<{ path: string }> = { path: inputFileCommandOption(), }, handler: async ({ path }) => { - await readStrategyConfig(path); + await readChainSubmissionStrategyConfig(path); logGreen('Config is valid'); process.exit(0); }, diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 1d62a030d5..6bd83ec8af 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -4,7 +4,7 @@ import { CommandModule } from 'yargs'; import { createStrategyConfig, maskSensitiveData, - readStrategyConfig, + readChainSubmissionStrategyConfig, } from '../config/strategy.js'; import { CommandModuleWithWriteContext } from '../context/types.js'; import { log, logCommandHeader } from '../logger.js'; @@ -57,7 +57,7 @@ export const read: CommandModuleWithWriteContext<{ handler: async ({ strategy: strategyUrl }) => { logCommandHeader(`Hyperlane Strategy Read`); - const strategy = await readStrategyConfig(strategyUrl); + const strategy = await readChainSubmissionStrategyConfig(strategyUrl); const maskedConfig = maskSensitiveData(strategy); log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index d477334917..f47ceba11a 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -19,16 +19,27 @@ import { errorRed, log, logBlue, logGreen } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, + isFile, readYamlOrJson, writeYamlOrJson, } from '../utils/files.js'; -export async function readStrategyConfig( +export async function readChainSubmissionStrategyConfig( filePath: string, ): Promise { try { log(`Reading file configs in ${filePath}`); - const strategyConfig = readYamlOrJson(filePath); + + if (!isFile(filePath.trim())) { + logBlue( + `No strategy config found in ${filePath}, returning empty config`, + ); + return {}; + } + + const strategyConfig = readYamlOrJson( + filePath.trim(), + ); // Check if config exists and is a non-empty object if (!strategyConfig || typeof strategyConfig !== 'object') { diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index d607d3d078..79a7413c07 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -12,14 +12,13 @@ import { ChainMap, ChainMetadata, ChainName, - ChainSubmissionStrategy, MultiProvider, TxSubmitterType, } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; import { isSignCommand } from '../commands/signCommands.js'; -import { readStrategyConfig } from '../config/strategy.js'; +import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -66,12 +65,7 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - let strategyConfig: ChainSubmissionStrategy = {}; - try { - strategyConfig = await readStrategyConfig(argv.strategy); - } catch (e) { - strategyConfig = {}; - } + const strategyConfig = await readChainSubmissionStrategyConfig(argv.strategy); /** * @notice Select the appropriate chain strategy based on the hyperlane command @@ -89,7 +83,6 @@ export async function signerMiddleware(argv: Record) { /** * @notice Extracts private keys from strategyConfig else prompts user private key input */ - const signerStrategy = new SubmitterContext( strategyConfig, chains, diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index d11740c76c..41c513ed54 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -2,7 +2,7 @@ import { ChainName } from '@hyperlane-xyz/sdk'; import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; -import { readStrategyConfig } from '../../../config/strategy.js'; +import { readChainSubmissionStrategyConfig } from '../../../config/strategy.js'; import { readWarpRouteDeployConfig } from '../../../config/warp.js'; import { logRed } from '../../../logger.js'; import { @@ -44,9 +44,9 @@ export class MultiChainHandler implements ChainHandler { private async determineWarpRouteConfigChains( argv: Record, ): Promise { - argv.config = argv.config || DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; + argv.config ||= DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; argv.context.chains = await this.getWarpConfigChains( - argv.config, + argv.config.trim(), argv.skipConfirmation, ); return argv.context.chains; @@ -119,7 +119,7 @@ export class MultiChainHandler implements ChainHandler { private async determineStrategyChains( argv: Record, ): Promise { - const strategy = await readStrategyConfig(argv.strategy); + const strategy = await readChainSubmissionStrategyConfig(argv.strategy); return extractChainValues(strategy); } diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts index 670ef94d98..54b86b2c05 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts @@ -24,6 +24,8 @@ export class SubmitterContext { * @param strategyConfig Configuration for the submitter strategy. * @param chains Array of chain names to manage. * @param submitterType Type of transaction submitter to use. + * @param multiProvider MultiProvider instance for managing multiple chains. + * @param key Optional private key for overriding strategy private key. */ constructor( strategyConfig: ChainSubmissionStrategy, @@ -41,6 +43,7 @@ export class SubmitterContext { /** * @dev Retrieves the private keys for the specified chains. * @return An array of objects containing chain names and their corresponding private keys. + * @notice This function retrieves private keys from the strategy or falls back to the environment variable. */ private async getChainKeys(): Promise< Array<{ chainName: ChainName; privateKey: string }> @@ -77,26 +80,42 @@ export class SubmitterContext { ); } + /** + * @dev Configures signers for all specified chains in the MultiProvider. + * @return The updated MultiProvider instance. + * @notice This function sets the signer for each chain based on its protocol. + */ async configureSigners(): Promise { for (const chain of this.chains) { - const protocol = this.multiProvider.getChainMetadata(chain).protocol; - const signer = await this.getSignerForChain(chain, protocol); + const signer = await this.getSignerForChain(chain); this.multiProvider.setSigner(chain, signer); } return this.multiProvider; } - async getSignerForChain( - chain: ChainName, - protocol: ProtocolType, - ): Promise { + /** + * @dev Retrieves a signer for a specific chain based on its protocol. + * @param chain The name of the chain for which to retrieve the signer. + * @param protocol The protocol type of the chain. + * @return A Promise that resolves to the Signer instance for the specified chain. + * @throws Error if the protocol is unsupported. + */ + async getSignerForChain(chain: ChainName): Promise { + const { protocol } = this.multiProvider.getChainMetadata(chain); + const privateKey = this?.key ?? // argv.key overrides strategy private key ENV.HYP_KEY ?? // ENV.HYP_KEY overrides strategy/prompt to enter pk (await this.strategy.getPrivateKey(chain)); + + // If protocol is starknet, prompt for address input + switch (protocol) { case ProtocolType.Ethereum: + // Example for ZKSync + // if (technicalStack === ChainTechnicalStack.ZkSync) + // return new ZKSyncWallet(privateKey); return new Wallet(privateKey); default: throw new Error(`Unsupported protocol: ${protocol}`); diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts index 4efc173760..87db792f5b 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts +++ b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts @@ -11,7 +11,7 @@ export class SubmitterStrategyFactory { switch (type) { case TxSubmitterType.JSON_RPC: return new JsonRpcStrategy(config); - // TO BE IMPLEMENTED! + // TODO: TO BE IMPLEMENTED! // case TxSubmitterType.STARKNET_JSON_RPC: // return new StarknetJsonRpcStrategy(config); default: From ac6d5c1f2ec1b11fbc00c29dfb99c70a93040671 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 15 Nov 2024 16:18:16 +0100 Subject: [PATCH 11/45] feat: relay command chain resolver strategy & refactoring --- .vscode/launch.json | 16 ----------- typescript/cli/src/commands/options.ts | 5 ++-- typescript/cli/src/context/context.ts | 9 ++++-- .../strategies/chain/ChainInterceptor.ts | 2 ++ .../strategies/chain/MultiChainHandler.ts | 28 +++++++++++++++---- .../BaseMultiChainSigner.ts} | 4 +-- .../JsonRpcSigner.ts} | 11 ++++---- .../MultiChainSignerContext.ts} | 14 +++++----- .../signer/MultiChainSignerFactory.ts | 19 +++++++++++++ .../submitter/SubmitterStrategyFactory.ts | 21 -------------- typescript/cli/src/tests/commands/core.ts | 1 + 11 files changed, 68 insertions(+), 62 deletions(-) delete mode 100644 .vscode/launch.json rename typescript/cli/src/context/strategies/{submitter/SubmitterStrategy.ts => signer/BaseMultiChainSigner.ts} (82%) rename typescript/cli/src/context/strategies/{submitter/JsonRpcStrategy.ts => signer/JsonRpcSigner.ts} (73%) rename typescript/cli/src/context/strategies/{submitter/SubmitterContext.ts => signer/MultiChainSignerContext.ts} (90%) create mode 100644 typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts delete mode 100644 typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 37fcc6042b..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "skipFiles": ["/**"], - "program": "$${workspaceFolder}/**/*.ts", - "outFiles": ["${workspaceFolder}/**/*.js"] - } - ] -} diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index 9b4d1d19e8..baf0fa8472 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -197,9 +197,8 @@ export const transactionsCommandOption: Options = { export const strategyCommandOption: Options = { type: 'string', description: 'The submission strategy input file path.', - alias: 's', - default: DEFAULT_STRATEGY_CONFIG_PATH, - demandOption: true, + alias: ['s', 'strategy'], + demandOption: false, }; export const addressCommandOption = ( diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 79a7413c07..886ef7aca6 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -17,6 +17,7 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; +import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; @@ -27,7 +28,7 @@ import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; import { ChainInterceptor } from './strategies/chain/ChainInterceptor.js'; -import { SubmitterContext } from './strategies/submitter/SubmitterContext.js'; +import { MultiChainSignerContext } from './strategies/signer/MultiChainSignerContext.js'; import { CommandContext, ContextSettings, @@ -65,7 +66,9 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - const strategyConfig = await readChainSubmissionStrategyConfig(argv.strategy); + const strategyConfig = await readChainSubmissionStrategyConfig( + argv.strategy ?? DEFAULT_STRATEGY_CONFIG_PATH, + ); /** * @notice Select the appropriate chain strategy based on the hyperlane command @@ -83,7 +86,7 @@ export async function signerMiddleware(argv: Record) { /** * @notice Extracts private keys from strategyConfig else prompts user private key input */ - const signerStrategy = new SubmitterContext( + const signerStrategy = new MultiChainSignerContext( strategyConfig, chains, TxSubmitterType.JSON_RPC, diff --git a/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts b/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts index ba10f5c558..b46b35b739 100644 --- a/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts +++ b/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts @@ -12,6 +12,7 @@ enum CommandType { AGENT_KURTOSIS = 'deploy:kurtosis-agents', STATUS = 'status:', SUBMIT = 'submit:', + RELAYER = 'relayer:', } export class ChainInterceptor { @@ -25,6 +26,7 @@ export class ChainInterceptor { [CommandType.AGENT_KURTOSIS, () => MultiChainHandler.forAgentKurtosis()], [CommandType.STATUS, () => MultiChainHandler.forOriginDestination()], [CommandType.SUBMIT, () => MultiChainHandler.forStrategyConfig()], + [CommandType.RELAYER, () => MultiChainHandler.forRelayer()], ]); static getStrategy(argv: Record): ChainHandler { diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index 41c513ed54..1cdabc33ee 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -3,13 +3,16 @@ import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; import { readChainSubmissionStrategyConfig } from '../../../config/strategy.js'; -import { readWarpRouteDeployConfig } from '../../../config/warp.js'; import { logRed } from '../../../logger.js'; import { runMultiChainSelectionStep, runSingleChainSelectionStep, } from '../../../utils/chains.js'; -import { isFile, runFileSelectionStep } from '../../../utils/files.js'; +import { + isFile, + readYamlOrJson, + runFileSelectionStep, +} from '../../../utils/files.js'; import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; import { ChainHandler } from './types.js'; @@ -20,6 +23,7 @@ enum ChainSelectionMode { WARP_CONFIG, WARP_READ, STRATEGY, + RELAYER, } export class MultiChainHandler implements ChainHandler { @@ -35,6 +39,8 @@ export class MultiChainHandler implements ChainHandler { return this.determineAgentChains(argv); case ChainSelectionMode.STRATEGY: return this.determineStrategyChains(argv); + case ChainSelectionMode.RELAYER: + return this.determineRelayerChains(argv); case ChainSelectionMode.ORIGIN_DESTINATION: default: return this.determineOriginDestinationChains(argv); @@ -45,7 +51,7 @@ export class MultiChainHandler implements ChainHandler { argv: Record, ): Promise { argv.config ||= DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; - argv.context.chains = await this.getWarpConfigChains( + argv.context.chains = await this.getWarpRouteConfigChains( argv.config.trim(), argv.skipConfirmation, ); @@ -122,8 +128,13 @@ export class MultiChainHandler implements ChainHandler { const strategy = await readChainSubmissionStrategyConfig(argv.strategy); return extractChainValues(strategy); } + private async determineRelayerChains( + argv: Record, + ): Promise { + return argv.chains.split(',').map((item: string) => item.trim()); + } - private async getWarpConfigChains( + private async getWarpRouteConfigChains( configPath: string, skipConfirmation: boolean, ): Promise { @@ -138,7 +149,11 @@ export class MultiChainHandler implements ChainHandler { logRed(`Using warp route deployment config at ${configPath}`); } - const warpRouteConfig = await readWarpRouteDeployConfig(configPath); + // @dev instead of using readWarpRouteDeployConfig, which uses context to get the signer to fill defaults and make file pass zod validation + const warpRouteConfig = (await readYamlOrJson(configPath)) as Record< + string, + any + >; const chains = Object.keys(warpRouteConfig) as ChainName[]; assert( @@ -166,6 +181,9 @@ export class MultiChainHandler implements ChainHandler { static forStrategyConfig(): MultiChainHandler { return new MultiChainHandler(ChainSelectionMode.STRATEGY); } + static forRelayer(): MultiChainHandler { + return new MultiChainHandler(ChainSelectionMode.RELAYER); + } } // TODO: Put in helpers diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts b/typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts similarity index 82% rename from typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts rename to typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts index 6035bc2799..81c10b0e63 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts @@ -3,13 +3,13 @@ import { Signer, Wallet } from 'ethers'; import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; import { ChainName } from '@hyperlane-xyz/sdk'; -export interface ISubmitterStrategy { +export interface IMultiChainSigner { getPrivateKey(chain: ChainName): Promise; getSigner(privateKey: string): Signer; getType(): TxSubmitterType; } -export abstract class BaseSubmitterStrategy implements ISubmitterStrategy { +export abstract class BaseMultiChainSigner implements IMultiChainSigner { constructor(protected config: ChainSubmissionStrategy) {} abstract getPrivateKey(chain: ChainName): Promise; diff --git a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts b/typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts similarity index 73% rename from typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts rename to typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts index 5129fc123c..f8e7f68126 100644 --- a/typescript/cli/src/context/strategies/submitter/JsonRpcStrategy.ts +++ b/typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts @@ -2,21 +2,22 @@ import { password } from '@inquirer/prompts'; import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; -import { BaseSubmitterStrategy } from './SubmitterStrategy.js'; +import { BaseMultiChainSigner } from './BaseMultiChainSigner.js'; -export class JsonRpcStrategy extends BaseSubmitterStrategy { +export class JsonRpcSigner extends BaseMultiChainSigner { async getPrivateKey(chain: ChainName): Promise { const submitter = this.config[chain]?.submitter as { type: TxSubmitterType.JSON_RPC; privateKey?: string; }; - return ( + const privateKey = submitter?.privateKey ?? (await password({ message: `Please enter the private key for chain ${chain}`, - })) - ); + })); + + return privateKey; } getType(): TxSubmitterType { diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts b/typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts similarity index 90% rename from typescript/cli/src/context/strategies/submitter/SubmitterContext.ts rename to typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts index 54b86b2c05..c75eae0b2a 100644 --- a/typescript/cli/src/context/strategies/submitter/SubmitterContext.ts +++ b/typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts @@ -10,15 +10,15 @@ import { ProtocolType } from '@hyperlane-xyz/utils'; import { ENV } from '../../../utils/env.js'; -import { ISubmitterStrategy } from './SubmitterStrategy.js'; -import { SubmitterStrategyFactory } from './SubmitterStrategyFactory.js'; +import { IMultiChainSigner } from './BaseMultiChainSigner.js'; +import { MultiChainSignerFactory } from './MultiChainSignerFactory.js'; /** - * @title SubmitterContext + * @title MultiChainSignerContext * @dev Manages the context for transaction submitters, including retrieving chain keys and signers. */ -export class SubmitterContext { - private strategy: ISubmitterStrategy; +export class MultiChainSignerContext { + private strategy: IMultiChainSigner; /** * @param strategyConfig Configuration for the submitter strategy. @@ -34,7 +34,7 @@ export class SubmitterContext { private multiProvider: MultiProvider, private key?: string, ) { - this.strategy = SubmitterStrategyFactory.createStrategy( + this.strategy = MultiChainSignerFactory.getSignerStrategy( submitterType, strategyConfig, ); @@ -101,7 +101,7 @@ export class SubmitterContext { * @return A Promise that resolves to the Signer instance for the specified chain. * @throws Error if the protocol is unsupported. */ - async getSignerForChain(chain: ChainName): Promise { + async getSignerForChain(chain: ChainName): Promise { const { protocol } = this.multiProvider.getChainMetadata(chain); const privateKey = diff --git a/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts new file mode 100644 index 0000000000..9fc2bc320a --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts @@ -0,0 +1,19 @@ +import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; + +import { IMultiChainSigner } from './BaseMultiChainSigner.js'; +import { JsonRpcSigner } from './JsonRpcSigner.js'; + +export class MultiChainSignerFactory { + static getSignerStrategy( + type: TxSubmitterType, + config: ChainSubmissionStrategy, + ): IMultiChainSigner { + switch (type) { + case TxSubmitterType.JSON_RPC: + return new JsonRpcSigner(config); + // Future works: TO BE IMPLEMENTED! + default: + throw new Error(`Unsupported submitter type: ${type}`); + } + } +} diff --git a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts b/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts deleted file mode 100644 index 87db792f5b..0000000000 --- a/typescript/cli/src/context/strategies/submitter/SubmitterStrategyFactory.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; - -import { JsonRpcStrategy } from './JsonRpcStrategy.js'; -import { ISubmitterStrategy } from './SubmitterStrategy.js'; - -export class SubmitterStrategyFactory { - static createStrategy( - type: TxSubmitterType, - config: ChainSubmissionStrategy, - ): ISubmitterStrategy { - switch (type) { - case TxSubmitterType.JSON_RPC: - return new JsonRpcStrategy(config); - // TODO: TO BE IMPLEMENTED! - // case TxSubmitterType.STARKNET_JSON_RPC: - // return new StarknetJsonRpcStrategy(config); - default: - throw new Error(`Unsupported submitter type: ${type}`); - } - } -} diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index 24c9109744..51e4471693 100644 --- a/typescript/cli/src/tests/commands/core.ts +++ b/typescript/cli/src/tests/commands/core.ts @@ -30,6 +30,7 @@ export async function hyperlaneCoreRead(chain: string, coreOutputPath: string) { --registry ${REGISTRY_PATH} \ --config ${coreOutputPath} \ --chain ${chain} \ + --key ${ANVIL_KEY} \ --verbosity debug \ --yes`; } From 925621c0c6440d840a0f0363e35bf511034ba6cc Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 18 Nov 2024 13:57:55 +0100 Subject: [PATCH 12/45] feat: Signer strategy based on chain's protocol/tech stack --- typescript/cli/src/config/strategy.ts | 8 +- typescript/cli/src/context/context.ts | 26 ++-- .../strategies/chain/MultiChainHandler.ts | 26 ++-- .../strategies/chain/SingleChainHandler.ts | 12 +- .../cli/src/context/strategies/chain/types.ts | 2 +- .../strategies/signer/BaseMultiChainSigner.ts | 22 --- .../signer/BaseMultiProtocolSigner.ts | 27 ++++ .../strategies/signer/JsonRpcSigner.ts | 26 ---- .../signer/MultiChainSignerContext.ts | 124 ----------------- .../signer/MultiChainSignerFactory.ts | 19 --- .../signer/MultiProtocolSignerContext.ts | 128 ++++++++++++++++++ .../signer/MultiProtocolSignerFactory.ts | 79 +++++++++++ 12 files changed, 270 insertions(+), 229 deletions(-) delete mode 100644 typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts create mode 100644 typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts delete mode 100644 typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts delete mode 100644 typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts delete mode 100644 typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts create mode 100644 typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts create mode 100644 typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index f47ceba11a..66eb0c5d0d 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -75,19 +75,21 @@ export async function createStrategyConfig({ context: CommandContext; outPath: string; }) { - let strategy; + let strategy: ChainSubmissionStrategy; try { // the output strategy might contain submitters for other chain we don't want to overwrite - strategy = await readYamlOrJson(outPath); + const strategyObj = await readYamlOrJson(outPath); + strategy = ChainSubmissionStrategySchema.parse(strategyObj); } catch (e) { strategy = writeYamlOrJson(outPath, {}, 'yaml'); } const chain = await runSingleChainSelectionStep(context.chainMetadata); const chainProtocol = context.chainMetadata[chain].protocol; - assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); + assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); // Needs to be compatible with MultiProvider - ethers.Signer if ( !context.skipConfirmation && + strategy && Object.prototype.hasOwnProperty.call(strategy, chain) ) { const isConfirmed = await confirm({ diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 886ef7aca6..2b211583d8 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -13,7 +13,6 @@ import { ChainMetadata, ChainName, MultiProvider, - TxSubmitterType, } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; @@ -28,7 +27,7 @@ import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; import { ChainInterceptor } from './strategies/chain/ChainInterceptor.js'; -import { MultiChainSignerContext } from './strategies/signer/MultiChainSignerContext.js'; +import { MultiProtocolSignerContext } from './strategies/signer/MultiProtocolSignerContext.js'; import { CommandContext, ContextSettings, @@ -71,34 +70,33 @@ export async function signerMiddleware(argv: Record) { ); /** - * @notice Select the appropriate chain strategy based on the hyperlane command - * @dev e.g command `core deploy` uses SingleChainHandler + * @notice Intercepts Hyperlane command to determine chains + * @dev For example, command `core deploy` uses SingleChainHandler */ const chainStrategy = ChainInterceptor.getStrategy(argv); /** - * @notice Determines chains that are used in createSignerContext based on the chain strategy - * @dev e.g. SingleChainHandler extracts chains from CLI or prompts the user to select the chain - * @dev e.g. MultiChainHandler.forOriginDestination() extracts origin/destination from CLI or prompts the user to select origin/destination + * @notice Resolves chains that are used in MultiProtocolSignerContext based on the chain strategy + * @dev For example: + * - SingleChainHandler extracts chains from CLI or prompts the user to select the chain + * - MultiChainHandler.forOriginDestination() extracts origin/destination from CLI or prompts the user to select origin/destination */ - const chains = await chainStrategy.determineChains(argv); + const chains = await chainStrategy.resolveChains(argv); /** - * @notice Extracts private keys from strategyConfig else prompts user private key input + * @notice Extracts signer config - private keys from strategyConfig or prompts user for private key input */ - const signerStrategy = new MultiChainSignerContext( + const multiProtocolSigner = new MultiProtocolSignerContext( strategyConfig, chains, - TxSubmitterType.JSON_RPC, multiProvider, key, ); /** - * @notice Configure the signers using the selected strategy, multiProvider, and signer context + * @notice Attaches signers to MultiProvider and assigns it to argv.multiProvider */ - const MultiProviderWithSigners = await signerStrategy.configureSigners(); - argv.multiProvider = MultiProviderWithSigners; + argv.multiProvider = await multiProtocolSigner.attachSignersToMp(); return argv; } diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index 1cdabc33ee..c839c02c15 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -29,25 +29,25 @@ enum ChainSelectionMode { export class MultiChainHandler implements ChainHandler { constructor(private mode: ChainSelectionMode) {} - async determineChains(argv: Record): Promise { + async resolveChains(argv: Record): Promise { switch (this.mode) { case ChainSelectionMode.WARP_CONFIG: - return this.determineWarpRouteConfigChains(argv); + return this.resolveWarpRouteConfigChains(argv); case ChainSelectionMode.WARP_READ: - return this.determineWarpCoreConfigChains(argv); + return this.resolveWarpCoreConfigChains(argv); case ChainSelectionMode.AGENT_KURTOSIS: - return this.determineAgentChains(argv); + return this.resolveAgentChains(argv); case ChainSelectionMode.STRATEGY: - return this.determineStrategyChains(argv); + return this.resolveStrategyChains(argv); case ChainSelectionMode.RELAYER: - return this.determineRelayerChains(argv); + return this.resolveRelayerChains(argv); case ChainSelectionMode.ORIGIN_DESTINATION: default: - return this.determineOriginDestinationChains(argv); + return this.resolveOriginDestinationChains(argv); } } - private async determineWarpRouteConfigChains( + private async resolveWarpRouteConfigChains( argv: Record, ): Promise { argv.config ||= DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; @@ -57,7 +57,7 @@ export class MultiChainHandler implements ChainHandler { ); return argv.context.chains; } - private async determineWarpCoreConfigChains( + private async resolveWarpCoreConfigChains( argv: Record, ): Promise { if (argv.symbol || argv.warp) { @@ -78,7 +78,7 @@ export class MultiChainHandler implements ChainHandler { } } - private async determineAgentChains( + private async resolveAgentChains( argv: Record, ): Promise { const { chainMetadata } = argv.context; @@ -101,7 +101,7 @@ export class MultiChainHandler implements ChainHandler { return [argv.origin, ...argv.targets]; } - private async determineOriginDestinationChains( + private async resolveOriginDestinationChains( argv: Record, ): Promise { const { chainMetadata } = argv.context; @@ -122,13 +122,13 @@ export class MultiChainHandler implements ChainHandler { return [argv.origin, argv.destination]; } - private async determineStrategyChains( + private async resolveStrategyChains( argv: Record, ): Promise { const strategy = await readChainSubmissionStrategyConfig(argv.strategy); return extractChainValues(strategy); } - private async determineRelayerChains( + private async resolveRelayerChains( argv: Record, ): Promise { return argv.chains.split(',').map((item: string) => item.trim()); diff --git a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts index 491d585f1b..620df06d75 100644 --- a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts @@ -16,13 +16,11 @@ export class SingleChainHandler implements ChainHandler { * @notice Determines the chain to be used for signing operations * @dev Either uses the chain specified in argv or prompts for interactive selection */ - async determineChains(argv: Record): Promise { - argv.chain = - argv.chain || - (await runSingleChainSelectionStep( - argv.context.chainMetadata, - 'Select chain to connect:', - )); + async resolveChains(argv: Record): Promise { + argv.chain ||= await runSingleChainSelectionStep( + argv.context.chainMetadata, + 'Select chain to connect:', + ); return [argv.chain]; // Explicitly return as single-item array } diff --git a/typescript/cli/src/context/strategies/chain/types.ts b/typescript/cli/src/context/strategies/chain/types.ts index f7919152f2..b2055df38c 100644 --- a/typescript/cli/src/context/strategies/chain/types.ts +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -6,5 +6,5 @@ export interface ChainHandler { * @param argv Command arguments * @returns Array of chain names */ - determineChains(argv: Record): Promise; + resolveChains(argv: Record): Promise; } diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts deleted file mode 100644 index 81c10b0e63..0000000000 --- a/typescript/cli/src/context/strategies/signer/BaseMultiChainSigner.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Signer, Wallet } from 'ethers'; - -import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; -import { ChainName } from '@hyperlane-xyz/sdk'; - -export interface IMultiChainSigner { - getPrivateKey(chain: ChainName): Promise; - getSigner(privateKey: string): Signer; - getType(): TxSubmitterType; -} - -export abstract class BaseMultiChainSigner implements IMultiChainSigner { - constructor(protected config: ChainSubmissionStrategy) {} - - abstract getPrivateKey(chain: ChainName): Promise; - - getSigner(privateKey: string): Signer { - return new Wallet(privateKey); - } - - abstract getType(): TxSubmitterType; -} diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts new file mode 100644 index 0000000000..9f87f6eb21 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts @@ -0,0 +1,27 @@ +import { Signer, Wallet } from 'ethers'; + +import { ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; +import { ChainName } from '@hyperlane-xyz/sdk'; + +export interface SignerConfig { + privateKey: string; + address?: string; // For chains like StarkNet that require address + extraParams?: Record; // For any additional chain-specific params +} + +export interface IMultiProtocolSigner { + getSignerConfig(chain: ChainName): Promise | SignerConfig; + getSigner(config: SignerConfig): Signer; +} + +export abstract class BaseMultiProtocolSigner implements IMultiProtocolSigner { + constructor(protected config: ChainSubmissionStrategy) {} + + abstract getSignerConfig( + chain: ChainName, + ): Promise | SignerConfig; + + getSigner(config: SignerConfig): Signer { + return new Wallet(config.privateKey); + } +} diff --git a/typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts b/typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts deleted file mode 100644 index f8e7f68126..0000000000 --- a/typescript/cli/src/context/strategies/signer/JsonRpcSigner.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { password } from '@inquirer/prompts'; - -import { ChainName, TxSubmitterType } from '@hyperlane-xyz/sdk'; - -import { BaseMultiChainSigner } from './BaseMultiChainSigner.js'; - -export class JsonRpcSigner extends BaseMultiChainSigner { - async getPrivateKey(chain: ChainName): Promise { - const submitter = this.config[chain]?.submitter as { - type: TxSubmitterType.JSON_RPC; - privateKey?: string; - }; - - const privateKey = - submitter?.privateKey ?? - (await password({ - message: `Please enter the private key for chain ${chain}`, - })); - - return privateKey; - } - - getType(): TxSubmitterType { - return TxSubmitterType.JSON_RPC; - } -} diff --git a/typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts b/typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts deleted file mode 100644 index c75eae0b2a..0000000000 --- a/typescript/cli/src/context/strategies/signer/MultiChainSignerContext.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Signer, Wallet } from 'ethers'; - -import { - ChainName, - ChainSubmissionStrategy, - MultiProvider, - TxSubmitterType, -} from '@hyperlane-xyz/sdk'; -import { ProtocolType } from '@hyperlane-xyz/utils'; - -import { ENV } from '../../../utils/env.js'; - -import { IMultiChainSigner } from './BaseMultiChainSigner.js'; -import { MultiChainSignerFactory } from './MultiChainSignerFactory.js'; - -/** - * @title MultiChainSignerContext - * @dev Manages the context for transaction submitters, including retrieving chain keys and signers. - */ -export class MultiChainSignerContext { - private strategy: IMultiChainSigner; - - /** - * @param strategyConfig Configuration for the submitter strategy. - * @param chains Array of chain names to manage. - * @param submitterType Type of transaction submitter to use. - * @param multiProvider MultiProvider instance for managing multiple chains. - * @param key Optional private key for overriding strategy private key. - */ - constructor( - strategyConfig: ChainSubmissionStrategy, - private chains: ChainName[], - submitterType: TxSubmitterType, - private multiProvider: MultiProvider, - private key?: string, - ) { - this.strategy = MultiChainSignerFactory.getSignerStrategy( - submitterType, - strategyConfig, - ); - } - - /** - * @dev Retrieves the private keys for the specified chains. - * @return An array of objects containing chain names and their corresponding private keys. - * @notice This function retrieves private keys from the strategy or falls back to the environment variable. - */ - private async getChainKeys(): Promise< - Array<{ chainName: ChainName; privateKey: string }> - > { - const chainKeys = []; - - for (const chain of this.chains) { - const privateKey = - this?.key ?? // argv.key overrides strategy private key - (await this.strategy.getPrivateKey(chain)) ?? - ENV.HYP_KEY; // argv.key and ENV.HYP_KEY for backwards compatibility - - chainKeys.push({ - chainName: chain, - privateKey: privateKey, - }); - } - - return chainKeys; - } - - /** - * @dev Retrieves signers for the specified chains using their private keys. - * @return A record mapping chain names to their corresponding Signer objects. - */ - async getSigners(): Promise> { - this.strategy; - const chainKeys = await this.getChainKeys(); - return Object.fromEntries( - chainKeys.map(({ chainName, privateKey }) => [ - chainName, - this.strategy.getSigner(privateKey), - ]), - ); - } - - /** - * @dev Configures signers for all specified chains in the MultiProvider. - * @return The updated MultiProvider instance. - * @notice This function sets the signer for each chain based on its protocol. - */ - async configureSigners(): Promise { - for (const chain of this.chains) { - const signer = await this.getSignerForChain(chain); - this.multiProvider.setSigner(chain, signer); - } - - return this.multiProvider; - } - - /** - * @dev Retrieves a signer for a specific chain based on its protocol. - * @param chain The name of the chain for which to retrieve the signer. - * @param protocol The protocol type of the chain. - * @return A Promise that resolves to the Signer instance for the specified chain. - * @throws Error if the protocol is unsupported. - */ - async getSignerForChain(chain: ChainName): Promise { - const { protocol } = this.multiProvider.getChainMetadata(chain); - - const privateKey = - this?.key ?? // argv.key overrides strategy private key - ENV.HYP_KEY ?? // ENV.HYP_KEY overrides strategy/prompt to enter pk - (await this.strategy.getPrivateKey(chain)); - - // If protocol is starknet, prompt for address input - - switch (protocol) { - case ProtocolType.Ethereum: - // Example for ZKSync - // if (technicalStack === ChainTechnicalStack.ZkSync) - // return new ZKSyncWallet(privateKey); - return new Wallet(privateKey); - default: - throw new Error(`Unsupported protocol: ${protocol}`); - } - } -} diff --git a/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts deleted file mode 100644 index 9fc2bc320a..0000000000 --- a/typescript/cli/src/context/strategies/signer/MultiChainSignerFactory.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ChainSubmissionStrategy, TxSubmitterType } from '@hyperlane-xyz/sdk'; - -import { IMultiChainSigner } from './BaseMultiChainSigner.js'; -import { JsonRpcSigner } from './JsonRpcSigner.js'; - -export class MultiChainSignerFactory { - static getSignerStrategy( - type: TxSubmitterType, - config: ChainSubmissionStrategy, - ): IMultiChainSigner { - switch (type) { - case TxSubmitterType.JSON_RPC: - return new JsonRpcSigner(config); - // Future works: TO BE IMPLEMENTED! - default: - throw new Error(`Unsupported submitter type: ${type}`); - } - } -} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts new file mode 100644 index 0000000000..311812d2e0 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts @@ -0,0 +1,128 @@ +import { Signer } from 'ethers'; + +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, +} from '@hyperlane-xyz/sdk'; + +import { ENV } from '../../../utils/env.js'; + +import { IMultiProtocolSigner } from './BaseMultiProtocolSigner.js'; +import { MultiProtocolSignerFactory } from './MultiProtocolSignerFactory.js'; + +/** + * @title MultiProtocolSignerContext + * @dev Manages the context for transaction submitters, including retrieving signers config and signers. + */ +export class MultiProtocolSignerContext { + private signerStrategies: Map = new Map(); + + constructor( + strategyConfig: ChainSubmissionStrategy, + private chains: ChainName[], + private multiProvider: MultiProvider, + private key?: string, + ) { + // Initialize chain-specific strategies + for (const chain of chains) { + const strategy = MultiProtocolSignerFactory.getSignerStrategy( + chain, + strategyConfig, + multiProvider, + ); + this.signerStrategies.set(chain, strategy); + } + } + + /** + * @dev Retrieves the signers config for the specified chains. + * @return An array of objects containing chain names and their corresponding signers config. + */ + private async getSignersConfig(): Promise< + Array<{ chain: ChainName; privateKey: string }> + > { + return Promise.all( + this.chains.map((chain) => this.getSignerConfigForChain(chain)), + ); + } + + /** + * @notice This function retrieves private key from the strategy or falls back to the environment variable. + */ + private async getSignerConfigForChain( + chain: ChainName, + ): Promise<{ chain: ChainName; privateKey: string }> { + const signerStrategy = this.signerStrategies.get(chain); + if (!signerStrategy) { + throw new Error(`No signer strategy found for chain ${chain}`); + } + + // Determine private key with clear precedence + let privateKey: string; + if (this.key) { + privateKey = this.key; + } else if (ENV.HYP_KEY) { + privateKey = ENV.HYP_KEY; + } else { + const strategyConfig = await signerStrategy.getSignerConfig(chain); + if (!strategyConfig?.privateKey) { + throw new Error(`No private key found for chain ${chain}`); + } + privateKey = strategyConfig.privateKey; + } + + return { + chain, + privateKey, + }; + } + + /** + * @dev Retrieves a signer for a specific chain based on its protocol. + * @param chain The name of the chain for which to retrieve the signer. + * @return A Promise that resolves to the Signer instance for the specified chain. + * @throws Error if the protocol is unsupported. + */ + async getSigner(chain: ChainName): Promise { + const { privateKey } = await this.getSignerConfigForChain(chain); + + const signerStrategy = this.signerStrategies.get(chain); + if (!signerStrategy) { + throw new Error(`No signer strategy found for chain ${chain}`); + } + return signerStrategy.getSigner({ privateKey }); + } + + /** + * @dev Retrieves signers for the specified chains using their signers config. + * @return A record mapping chain names to their corresponding Signer objects. + */ + async getSigners(): Promise> { + const signerConfigs = await this.getSignersConfig(); + const result: Record = {}; + + for (const { chain, privateKey } of signerConfigs) { + const signerStrategy = this.signerStrategies.get(chain); + if (signerStrategy) { + result[chain] = signerStrategy.getSigner({ privateKey }); + } + } + + return result; + } + + /** + * @dev Configures signers for all specified chains in the MultiProvider. + * @return The updated MultiProvider instance. + * @notice This function sets the signer for each chain based on its protocol. + */ + async attachSignersToMp(): Promise { + for (const chain of this.chains) { + const signer = await this.getSigner(chain); + this.multiProvider.setSigner(chain, signer); + } + + return this.multiProvider; + } +} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts new file mode 100644 index 0000000000..29e48318e7 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -0,0 +1,79 @@ +import { password } from '@inquirer/prompts'; +import { Signer, Wallet } from 'ethers'; + +import { + ChainName, + ChainSubmissionStrategy, + ChainTechnicalStack, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { + BaseMultiProtocolSigner, + IMultiProtocolSigner, + SignerConfig, +} from './BaseMultiProtocolSigner.js'; + +export class MultiProtocolSignerFactory { + static getSignerStrategy( + chain: ChainName, + strategyConfig: ChainSubmissionStrategy, + multiProvider: MultiProvider, + ): IMultiProtocolSigner { + const { protocol, technicalStack } = multiProvider.getChainMetadata(chain); + + switch (protocol) { + case ProtocolType.Ethereum: + if (technicalStack === ChainTechnicalStack.ZkSync) + return new ZKSyncSignerStrategy(strategyConfig); + return new EthereumSignerStrategy(strategyConfig); + default: + throw new Error(`Unsupported protocol: ${protocol}`); + } + } +} + +class EthereumSignerStrategy extends BaseMultiProtocolSigner { + async getSignerConfig(chain: ChainName): Promise { + const submitter = this.config[chain]?.submitter as { + type: TxSubmitterType.JSON_RPC; + privateKey?: string; + }; + + const privateKey = + submitter?.privateKey ?? + (await password({ + message: `Please enter the private key for chain ${chain}`, + })); + + return { privateKey }; + } + + getSigner(config: SignerConfig): Signer { + return new Wallet(config.privateKey); + } +} + +// 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean +class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { + async getSignerConfig(chain: ChainName): Promise { + const submitter = this.config[chain]?.submitter as { + type: TxSubmitterType.JSON_RPC; + privateKey?: string; + }; + + const privateKey = + submitter?.privateKey ?? + (await password({ + message: `Please enter the private key for chain ${chain}`, + })); + + return { privateKey }; + } + + getSigner(config: SignerConfig): Signer { + return new Wallet(config.privateKey); + } +} From a0ea88bfd4b6e37aef54ea7c6d8f42b1b8b381cd Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 18 Nov 2024 14:12:47 +0100 Subject: [PATCH 13/45] chore: minor refactoring --- typescript/cli/src/commands/strategy.ts | 2 +- typescript/cli/src/config/strategy.ts | 30 +-------- .../strategies/chain/MultiChainHandler.ts | 36 +--------- typescript/cli/src/deploy/agent.ts | 2 +- typescript/cli/src/utils/output.ts | 67 +++++++++++++++++++ 5 files changed, 74 insertions(+), 63 deletions(-) diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 6bd83ec8af..63a66b117b 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -3,12 +3,12 @@ import { CommandModule } from 'yargs'; import { createStrategyConfig, - maskSensitiveData, readChainSubmissionStrategyConfig, } from '../config/strategy.js'; import { CommandModuleWithWriteContext } from '../context/types.js'; import { log, logCommandHeader } from '../logger.js'; import { indentYamlOrJson } from '../utils/files.js'; +import { maskSensitiveData } from '../utils/output.js'; import { DEFAULT_STRATEGY_CONFIG_PATH, diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 66eb0c5d0d..c90615a3d0 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -23,6 +23,7 @@ import { readYamlOrJson, writeYamlOrJson, } from '../utils/files.js'; +import { maskSensitiveData } from '../utils/output.js'; export async function readChainSubmissionStrategyConfig( filePath: string, @@ -174,7 +175,7 @@ export async function createStrategyConfig({ } const strategyResult: ChainSubmissionStrategy = { - ...strategy, // if there are changes in ChainSubmissionStrategy, the strategy may no longer be compatible + ...strategy, // if there are changes in ChainSubmissionStrategy, the loaded strategy may no longer be compatible [chain]: { submitter: submitter, }, @@ -197,30 +198,3 @@ export async function createStrategyConfig({ ); } } - -// TODO: put in utils -// New utility function to mask sensitive data -export function maskPrivateKey(key: string): string { - if (!key) return key; - const middle = '•'.repeat(key.length); - return `${middle}`; -} - -// Function to recursively mask private keys in an object -export function maskSensitiveData(obj: any): any { - if (!obj) return obj; - - if (typeof obj === 'object') { - const masked = { ...obj }; - for (const [key, value] of Object.entries(masked)) { - if (key === 'privateKey' && typeof value === 'string') { - masked[key] = maskPrivateKey(value); - } else if (typeof value === 'object') { - masked[key] = maskSensitiveData(value); - } - } - return masked; - } - - return obj; -} diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts index c839c02c15..f9f84715ea 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts @@ -14,6 +14,7 @@ import { runFileSelectionStep, } from '../../../utils/files.js'; import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; +import { extractChainsFromObj } from '../../../utils/output.js'; import { ChainHandler } from './types.js'; @@ -67,7 +68,7 @@ export class MultiChainHandler implements ChainHandler { symbol: argv.symbol, }); argv.context.warpCoreConfig = warpCoreConfig; - const chains = extractChainValues(warpCoreConfig); + const chains = extractChainsFromObj(warpCoreConfig); return chains; } else if (argv.chain) { return [argv.chain]; @@ -126,7 +127,7 @@ export class MultiChainHandler implements ChainHandler { argv: Record, ): Promise { const strategy = await readChainSubmissionStrategyConfig(argv.strategy); - return extractChainValues(strategy); + return extractChainsFromObj(strategy); } private async resolveRelayerChains( argv: Record, @@ -185,34 +186,3 @@ export class MultiChainHandler implements ChainHandler { return new MultiChainHandler(ChainSelectionMode.RELAYER); } } - -// TODO: Put in helpers -function extractChainValues(config: Record): string[] { - const chains: string[] = []; - - // Function to recursively search for chain fields - function findChainFields(obj: any) { - // Return if value is null or not an object/array - if (obj === null || typeof obj !== 'object') return; - - // Handle arrays - if (Array.isArray(obj)) { - obj.forEach((item) => findChainFields(item)); - return; - } - - // Check for chain fields - if ('chain' in obj) { - chains.push(obj.chain); - } - if ('chainName' in obj) { - chains.push(obj.chainName); - } - - // Recursively search in all object values - Object.values(obj).forEach((value) => findChainFields(value)); - } - - findChainFields(config); - return chains; -} diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index 8873062994..180e42a4bd 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -21,7 +21,7 @@ export async function runKurtosisAgentDeploy({ relayChains?: string; agentConfigurationPath?: string; }) { - // TODO: decide what to do with this, since its handled in MultiChainHandler - AGENT_KURTOSIS mode + // Future works: decide what to do with this, since its handled in MultiChainHandler - AGENT_KURTOSIS mode if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, diff --git a/typescript/cli/src/utils/output.ts b/typescript/cli/src/utils/output.ts index 442b8a0906..bee37be859 100644 --- a/typescript/cli/src/utils/output.ts +++ b/typescript/cli/src/utils/output.ts @@ -54,3 +54,70 @@ export function formatYamlViolationsOutput( return highlightedLines.join('\n'); } + +/** + * @notice Masks private key with dots + * @param key Private key to mask + * @return Masked key + */ +export function maskPrivateKey(key: string): string { + if (!key) return key; + const middle = '•'.repeat(key.length); + return `${middle}`; +} + +/** + * @notice Recursively masks sensitive data in objects + * @param obj Object with potential sensitive data + * @return Object with masked sensitive data + */ +export function maskSensitiveData(obj: any): any { + if (!obj) return obj; + + if (typeof obj === 'object') { + const masked = { ...obj }; + for (const [key, value] of Object.entries(masked)) { + if (key === 'privateKey' && typeof value === 'string') { + masked[key] = maskPrivateKey(value); + } else if (typeof value === 'object') { + masked[key] = maskSensitiveData(value); + } + } + return masked; + } + + return obj; +} + +/** + * @notice Extracts chain names from a nested configuration object + * @param config Object to search for chain names + * @return Array of discovered chain names + */ +export function extractChainsFromObj(config: Record): string[] { + const chains: string[] = []; + + // Recursively search for chain/chainName fields + function findChainFields(obj: any) { + if (obj === null || typeof obj !== 'object') return; + + if (Array.isArray(obj)) { + obj.forEach((item) => findChainFields(item)); + return; + } + + if ('chain' in obj) { + chains.push(obj.chain); + } + + if ('chainName' in obj) { + chains.push(obj.chainName); + } + + // Recursively search in all nested values + Object.values(obj).forEach((value) => findChainFields(value)); + } + + findChainFields(config); + return chains; +} From 52efa8179e124bcdcb46b6ff46accf2507634340 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 18 Nov 2024 14:43:01 +0100 Subject: [PATCH 14/45] add: strategy types for submitter --- typescript/cli/src/config/strategy.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index c90615a3d0..a91599542f 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -80,6 +80,7 @@ export async function createStrategyConfig({ try { // the output strategy might contain submitters for other chain we don't want to overwrite const strategyObj = await readYamlOrJson(outPath); + // if there are changes in ChainSubmissionStrategy, the existing strategy may no longer be compatible strategy = ChainSubmissionStrategySchema.parse(strategyObj); } catch (e) { strategy = writeYamlOrJson(outPath, {}, 'yaml'); @@ -103,7 +104,7 @@ export async function createStrategyConfig({ } } - const type = await select({ + const submitterType = await select({ message: 'Enter the type of submitter', choices: Object.values(TxSubmitterType).map((value) => ({ name: value, @@ -111,12 +112,12 @@ export async function createStrategyConfig({ })), }); - const submitter: any = { - type: type, + const submitter: Record = { + type: submitterType, }; - // Configure submitter based on type - switch (type) { + // Configure submitter based on submitterType + switch (submitterType) { case TxSubmitterType.JSON_RPC: submitter.privateKey = await password({ message: 'Enter your private key', @@ -162,7 +163,7 @@ export async function createStrategyConfig({ submitter.chain = chain; - if (type === TxSubmitterType.GNOSIS_TX_BUILDER) { + if (submitterType === TxSubmitterType.GNOSIS_TX_BUILDER) { submitter.version = await input({ message: 'Enter the Safe version (default: 1.0)', default: '1.0', @@ -171,13 +172,13 @@ export async function createStrategyConfig({ break; default: - throw new Error(`Unsupported submitter type: ${type}`); + throw new Error(`Unsupported submitter type: ${submitterType}`); } const strategyResult: ChainSubmissionStrategy = { - ...strategy, // if there are changes in ChainSubmissionStrategy, the loaded strategy may no longer be compatible + ...strategy, [chain]: { - submitter: submitter, + submitter: submitter as ChainSubmissionStrategy[string]['submitter'], }, }; From 12679af3ce419545167352afbde2f0761c8fb167 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 18 Nov 2024 15:34:40 +0100 Subject: [PATCH 15/45] chore: following naming conventions & comments --- typescript/cli/src/context/context.ts | 19 ++------ .../strategies/chain/ChainInterceptor.ts | 38 --------------- .../strategies/chain/ChainResolverFactory.ts | 46 +++++++++++++++++++ ...iChainHandler.ts => MultiChainResolver.ts} | 42 +++++++++++------ ...ChainHandler.ts => SingleChainResolver.ts} | 10 ++-- .../cli/src/context/strategies/chain/types.ts | 2 +- .../signer/MultiProtocolSignerContext.ts | 19 +++----- .../signer/MultiProtocolSignerFactory.ts | 1 + typescript/cli/src/context/types.ts | 3 -- typescript/cli/src/deploy/agent.ts | 2 +- typescript/cli/src/deploy/warp.ts | 12 ++--- typescript/cli/src/send/transfer.ts | 21 ++++++++- 12 files changed, 114 insertions(+), 101 deletions(-) delete mode 100644 typescript/cli/src/context/strategies/chain/ChainInterceptor.ts create mode 100644 typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts rename typescript/cli/src/context/strategies/chain/{MultiChainHandler.ts => MultiChainResolver.ts} (81%) rename typescript/cli/src/context/strategies/chain/{SingleChainHandler.ts => SingleChainResolver.ts} (65%) diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 2b211583d8..e23a656462 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -26,7 +26,7 @@ import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; -import { ChainInterceptor } from './strategies/chain/ChainInterceptor.js'; +import { ChainResolverFactory } from './strategies/chain/ChainResolverFactory.js'; import { MultiProtocolSignerContext } from './strategies/signer/MultiProtocolSignerContext.js'; import { CommandContext, @@ -36,7 +36,6 @@ import { export async function contextMiddleware(argv: Record) { const isDryRun = !isNullish(argv.dryRun); - const requiresKey = isSignCommand(argv); const settings: ContextSettings = { registryUri: argv.registry, @@ -47,12 +46,10 @@ export async function contextMiddleware(argv: Record) { disableProxy: argv.disableProxy, skipConfirmation: argv.yes, }; - if (!isDryRun && settings.fromAddress) throw new Error( "'--from-address' or '-f' should only be used for dry-runs", ); - const context = isDryRun ? await getDryRunContext(settings, argv.dryRun) : await getContext(settings); @@ -70,21 +67,17 @@ export async function signerMiddleware(argv: Record) { ); /** - * @notice Intercepts Hyperlane command to determine chains - * @dev For example, command `core deploy` uses SingleChainHandler + * Intercepts Hyperlane command to determine chains. */ - const chainStrategy = ChainInterceptor.getStrategy(argv); + const chainStrategy = ChainResolverFactory.getStrategy(argv); /** - * @notice Resolves chains that are used in MultiProtocolSignerContext based on the chain strategy - * @dev For example: - * - SingleChainHandler extracts chains from CLI or prompts the user to select the chain - * - MultiChainHandler.forOriginDestination() extracts origin/destination from CLI or prompts the user to select origin/destination + * Resolves chains based on the chain strategy. */ const chains = await chainStrategy.resolveChains(argv); /** - * @notice Extracts signer config - private keys from strategyConfig or prompts user for private key input + * Extracts signer config */ const multiProtocolSigner = new MultiProtocolSignerContext( strategyConfig, @@ -112,7 +105,6 @@ export async function getContext({ requiresKey, skipConfirmation, disableProxy = false, - signers, }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); @@ -124,7 +116,6 @@ export async function getContext({ chainMetadata: multiProvider.metadata, multiProvider, key, - signers, skipConfirmation: !!skipConfirmation, } as CommandContext; } diff --git a/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts b/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts deleted file mode 100644 index b46b35b739..0000000000 --- a/typescript/cli/src/context/strategies/chain/ChainInterceptor.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MultiChainHandler } from './MultiChainHandler.js'; -import { SingleChainHandler } from './SingleChainHandler.js'; -import { ChainHandler } from './types.js'; - -enum CommandType { - CORE_APPLY = 'core:apply', - WARP_DEPLOY = 'warp:deploy', - WARP_SEND = 'warp:send', - WARP_APPLY = 'warp:apply', - WARP_READ = 'warp:read', - SEND_MESSAGE = 'send:message', - AGENT_KURTOSIS = 'deploy:kurtosis-agents', - STATUS = 'status:', - SUBMIT = 'submit:', - RELAYER = 'relayer:', -} - -export class ChainInterceptor { - private static strategyMap: Map ChainHandler> = new Map([ - [CommandType.CORE_APPLY, () => new SingleChainHandler()], - [CommandType.WARP_DEPLOY, () => MultiChainHandler.forWarpRouteConfig()], - [CommandType.WARP_SEND, () => MultiChainHandler.forOriginDestination()], - [CommandType.WARP_APPLY, () => MultiChainHandler.forWarpRouteConfig()], - [CommandType.WARP_READ, () => MultiChainHandler.forWarpCoreConfig()], - [CommandType.SEND_MESSAGE, () => MultiChainHandler.forOriginDestination()], - [CommandType.AGENT_KURTOSIS, () => MultiChainHandler.forAgentKurtosis()], - [CommandType.STATUS, () => MultiChainHandler.forOriginDestination()], - [CommandType.SUBMIT, () => MultiChainHandler.forStrategyConfig()], - [CommandType.RELAYER, () => MultiChainHandler.forRelayer()], - ]); - - static getStrategy(argv: Record): ChainHandler { - const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; - const createStrategy = - this.strategyMap.get(commandKey) || (() => new SingleChainHandler()); - return createStrategy(); - } -} diff --git a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts new file mode 100644 index 0000000000..4b14d77d99 --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts @@ -0,0 +1,46 @@ +import { MultiChainResolver } from './MultiChainResolver.js'; +import { SingleChainResolver } from './SingleChainResolver.js'; +import { ChainResolver } from './types.js'; + +enum CommandType { + CORE_APPLY = 'core:apply', + WARP_DEPLOY = 'warp:deploy', + WARP_SEND = 'warp:send', + WARP_APPLY = 'warp:apply', + WARP_READ = 'warp:read', + SEND_MESSAGE = 'send:message', + AGENT_KURTOSIS = 'deploy:kurtosis-agents', + STATUS = 'status:', + SUBMIT = 'submit:', + RELAYER = 'relayer:', +} + +/** + * @class ChainResolverFactory + * @description Intercepts commands to determine the appropriate chain resolver strategy based on command type. + */ +export class ChainResolverFactory { + private static strategyMap: Map ChainResolver> = new Map([ + [CommandType.CORE_APPLY, () => new SingleChainResolver()], + [CommandType.WARP_DEPLOY, () => MultiChainResolver.forWarpRouteConfig()], + [CommandType.WARP_SEND, () => MultiChainResolver.forOriginDestination()], + [CommandType.WARP_APPLY, () => MultiChainResolver.forWarpRouteConfig()], + [CommandType.WARP_READ, () => MultiChainResolver.forWarpCoreConfig()], + [CommandType.SEND_MESSAGE, () => MultiChainResolver.forOriginDestination()], + [CommandType.AGENT_KURTOSIS, () => MultiChainResolver.forAgentKurtosis()], + [CommandType.STATUS, () => MultiChainResolver.forOriginDestination()], + [CommandType.SUBMIT, () => MultiChainResolver.forStrategyConfig()], + [CommandType.RELAYER, () => MultiChainResolver.forRelayer()], + ]); + + /** + * @param argv - Command line arguments. + * @returns ChainResolver - The appropriate chain resolver strategy based on the command type. + */ + static getStrategy(argv: Record): ChainResolver { + const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; + const createStrategy = + this.strategyMap.get(commandKey) || (() => new SingleChainResolver()); + return createStrategy(); + } +} diff --git a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts similarity index 81% rename from typescript/cli/src/context/strategies/chain/MultiChainHandler.ts rename to typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index f9f84715ea..5d582e80df 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -16,7 +16,7 @@ import { import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; import { extractChainsFromObj } from '../../../utils/output.js'; -import { ChainHandler } from './types.js'; +import { ChainResolver } from './types.js'; enum ChainSelectionMode { ORIGIN_DESTINATION, @@ -27,7 +27,13 @@ enum ChainSelectionMode { RELAYER, } -export class MultiChainHandler implements ChainHandler { +// This class could be broken down into multiple strategies + +/** + * @title MultiChainResolver + * @notice Resolves chains based on the specified selection mode. + */ +export class MultiChainResolver implements ChainResolver { constructor(private mode: ChainSelectionMode) {} async resolveChains(argv: Record): Promise { @@ -58,6 +64,7 @@ export class MultiChainHandler implements ChainHandler { ); return argv.context.chains; } + private async resolveWarpCoreConfigChains( argv: Record, ): Promise { @@ -123,12 +130,14 @@ export class MultiChainHandler implements ChainHandler { return [argv.origin, argv.destination]; } + private async resolveStrategyChains( argv: Record, ): Promise { const strategy = await readChainSubmissionStrategyConfig(argv.strategy); return extractChainsFromObj(strategy); } + private async resolveRelayerChains( argv: Record, ): Promise { @@ -150,7 +159,7 @@ export class MultiChainHandler implements ChainHandler { logRed(`Using warp route deployment config at ${configPath}`); } - // @dev instead of using readWarpRouteDeployConfig, which uses context to get the signer to fill defaults and make file pass zod validation + // Alternative to readWarpRouteDeployConfig that doesn't use context for signer and zod validation const warpRouteConfig = (await readYamlOrJson(configPath)) as Record< string, any @@ -165,24 +174,27 @@ export class MultiChainHandler implements ChainHandler { return chains; } - static forOriginDestination(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.ORIGIN_DESTINATION); + static forAgentKurtosis(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.AGENT_KURTOSIS); } - static forAgentKurtosis(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.AGENT_KURTOSIS); + static forOriginDestination(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.ORIGIN_DESTINATION); } - static forWarpRouteConfig(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.WARP_CONFIG); + static forRelayer(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.RELAYER); } - static forWarpCoreConfig(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.WARP_READ); + + static forStrategyConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.STRATEGY); } - static forStrategyConfig(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.STRATEGY); + + static forWarpRouteConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.WARP_CONFIG); } - static forRelayer(): MultiChainHandler { - return new MultiChainHandler(ChainSelectionMode.RELAYER); + + static forWarpCoreConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.WARP_READ); } } diff --git a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts similarity index 65% rename from typescript/cli/src/context/strategies/chain/SingleChainHandler.ts rename to typescript/cli/src/context/strategies/chain/SingleChainResolver.ts index 620df06d75..dd46cba519 100644 --- a/typescript/cli/src/context/strategies/chain/SingleChainHandler.ts +++ b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts @@ -2,16 +2,14 @@ import { ChainName } from '@hyperlane-xyz/sdk'; import { runSingleChainSelectionStep } from '../../../utils/chains.js'; -import { ChainHandler } from './types.js'; +import { ChainResolver } from './types.js'; /** - * @title SingleChainHandler + * @title SingleChainResolver * @notice Strategy implementation for managing single-chain operations - * @dev This strategy is used by commands that operate on a single blockchain - * It implements the ChainHandler interface and is primarily used for - * operations like 'core:apply' and 'warp:read' + * @dev Primarily used for operations like 'core:apply' and 'warp:read' */ -export class SingleChainHandler implements ChainHandler { +export class SingleChainResolver implements ChainResolver { /** * @notice Determines the chain to be used for signing operations * @dev Either uses the chain specified in argv or prompts for interactive selection diff --git a/typescript/cli/src/context/strategies/chain/types.ts b/typescript/cli/src/context/strategies/chain/types.ts index b2055df38c..ab42c81acd 100644 --- a/typescript/cli/src/context/strategies/chain/types.ts +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -1,6 +1,6 @@ import { ChainName } from '@hyperlane-xyz/sdk'; -export interface ChainHandler { +export interface ChainResolver { /** * Determines the chains to be used for signing * @param argv Command arguments diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts index 311812d2e0..e69017cb87 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts @@ -13,7 +13,7 @@ import { MultiProtocolSignerFactory } from './MultiProtocolSignerFactory.js'; /** * @title MultiProtocolSignerContext - * @dev Manages the context for transaction submitters, including retrieving signers config and signers. + * @dev Context manager for signers across multiple protocols */ export class MultiProtocolSignerContext { private signerStrategies: Map = new Map(); @@ -36,8 +36,7 @@ export class MultiProtocolSignerContext { } /** - * @dev Retrieves the signers config for the specified chains. - * @return An array of objects containing chain names and their corresponding signers config. + * @dev Gets signers config for specified chains */ private async getSignersConfig(): Promise< Array<{ chain: ChainName; privateKey: string }> @@ -48,7 +47,7 @@ export class MultiProtocolSignerContext { } /** - * @notice This function retrieves private key from the strategy or falls back to the environment variable. + * @dev Gets private key from strategy or environment fallback */ private async getSignerConfigForChain( chain: ChainName, @@ -79,10 +78,7 @@ export class MultiProtocolSignerContext { } /** - * @dev Retrieves a signer for a specific chain based on its protocol. - * @param chain The name of the chain for which to retrieve the signer. - * @return A Promise that resolves to the Signer instance for the specified chain. - * @throws Error if the protocol is unsupported. + * @dev Gets protocol-specific signer for a chain */ async getSigner(chain: ChainName): Promise { const { privateKey } = await this.getSignerConfigForChain(chain); @@ -95,8 +91,7 @@ export class MultiProtocolSignerContext { } /** - * @dev Retrieves signers for the specified chains using their signers config. - * @return A record mapping chain names to their corresponding Signer objects. + * @dev Gets signers for all specified chains */ async getSigners(): Promise> { const signerConfigs = await this.getSignersConfig(); @@ -113,9 +108,7 @@ export class MultiProtocolSignerContext { } /** - * @dev Configures signers for all specified chains in the MultiProvider. - * @return The updated MultiProvider instance. - * @notice This function sets the signer for each chain based on its protocol. + * @dev Configures signers for chains in MultiProvider */ async attachSignersToMp(): Promise { for (const chain of this.chains) { diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts index 29e48318e7..5f31a0f074 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -57,6 +57,7 @@ class EthereumSignerStrategy extends BaseMultiProtocolSigner { } // 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean +// TODO: use ZKSync suitable signer class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { async getSignerConfig(chain: ChainName): Promise { const submitter = this.config[chain]?.submitter as { diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index d12e9dea53..eef1ad2bbf 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -5,7 +5,6 @@ import type { IRegistry } from '@hyperlane-xyz/registry'; import type { ChainMap, ChainMetadata, - ChainName, MultiProvider, WarpCoreConfig, } from '@hyperlane-xyz/sdk'; @@ -18,7 +17,6 @@ export interface ContextSettings { requiresKey?: boolean; disableProxy?: boolean; skipConfirmation?: boolean; - signers?: any; } export interface CommandContext { @@ -28,7 +26,6 @@ export interface CommandContext { skipConfirmation: boolean; key?: string; signer?: ethers.Signer; - chains?: ChainName[]; warpCoreConfig?: WarpCoreConfig; } diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index 180e42a4bd..a36955a3f3 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -21,7 +21,7 @@ export async function runKurtosisAgentDeploy({ relayChains?: string; agentConfigurationPath?: string; }) { - // Future works: decide what to do with this, since its handled in MultiChainHandler - AGENT_KURTOSIS mode + // Future works: decide what to do with this, since its handled in MultiChainResolver - AGENT_KURTOSIS mode if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index b5eb04e40d..9e8d7268ee 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -100,12 +100,7 @@ export async function runWarpRouteDeploy({ context: WriteCommandContext; warpRouteDeploymentConfigPath?: string; }) { - const { - skipConfirmation, - chainMetadata, - registry, - chains: contextChains, - } = context; + const { skipConfirmation, chainMetadata, registry } = context; if ( !warpRouteDeploymentConfigPath || @@ -128,14 +123,15 @@ export async function runWarpRouteDeploy({ context, ); - const chains = contextChains!; + const chains = Object.keys(warpRouteConfig); + let apiKeys: ChainMap = {}; if (!skipConfirmation) apiKeys = await requestAndSaveApiKeys(chains, chainMetadata, registry); const deploymentParams = { context, - warpDeployConfig: warpRouteConfig!, + warpDeployConfig: warpRouteConfig, }; await runDeployPlanStep(deploymentParams); diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index cd75ffc717..dc4b8ca96b 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -18,6 +18,7 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { log, logBlue, logGreen, logRed } from '../logger.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; import { runTokenSelectionStep } from '../utils/tokens.js'; @@ -39,14 +40,30 @@ export async function sendTestTransfer({ }: { context: WriteCommandContext; warpCoreConfig: WarpCoreConfig; - origin: ChainName; - destination: ChainName; + origin?: ChainName; // resolved in signerMiddleware + destination?: ChainName; // resolved in signerMiddleware amount: string; recipient?: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { + const { chainMetadata } = context; + + if (!origin) { + origin = await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain', + ); + } + + if (!destination) { + destination = await runSingleChainSelectionStep( + chainMetadata, + 'Select the destination chain', + ); + } + await runPreflightChecksForChains({ context, chains: [origin, destination], From b7d439bb1ad5fe03f08e5f680bdef416424298be Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Tue, 19 Nov 2024 11:36:19 +0100 Subject: [PATCH 16/45] feat: requiresKey options on strategy `read` command --- typescript/cli/src/commands/strategy.ts | 8 +++++++- typescript/cli/src/config/strategy.ts | 5 +++-- typescript/cli/src/context/context.ts | 6 +++--- .../strategies/signer/BaseMultiProtocolSigner.ts | 11 +++-------- .../strategies/signer/MultiProtocolSignerFactory.ts | 3 +-- ...SignerContext.ts => MultiProtocolSignerManager.ts} | 8 ++++---- 6 files changed, 21 insertions(+), 20 deletions(-) rename typescript/cli/src/context/strategies/signer/{MultiProtocolSignerContext.ts => MultiProtocolSignerManager.ts} (95%) diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 63a66b117b..6f85dcb885 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -48,11 +48,17 @@ export const init: CommandModuleWithWriteContext<{ export const read: CommandModuleWithWriteContext<{ strategy: string; + requiresKey: boolean; }> = { command: 'read', describe: 'Reads strategy configuration', builder: { - strategy: { ...strategyCommandOption, demandOption: true }, + strategy: { + ...strategyCommandOption, + demandOption: true, + default: DEFAULT_STRATEGY_CONFIG_PATH, + }, + requiresKey: { demandOption: false, default: false, hidden: true }, }, handler: async ({ strategy: strategyUrl }) => { logCommandHeader(`Hyperlane Strategy Read`); diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index a91599542f..7aac3ff083 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -50,10 +50,11 @@ export async function readChainSubmissionStrategyConfig( return {}; } - // Validate against schema const parseResult = ChainSubmissionStrategySchema.safeParse(strategyConfig); if (!parseResult.success) { - errorRed(`Strategy config validation failed for ${filePath}`); + errorRed( + `Strategy config validation using ChainSubmissionStrategySchema failed for ${filePath}`, + ); errorRed(JSON.stringify(parseResult.error.errors, null, 2)); throw new Error('Invalid strategy configuration'); } diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index e23a656462..3de5f7f0cf 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -27,7 +27,7 @@ import { detectAndConfirmOrPrompt } from '../utils/input.js'; import { getImpersonatedSigner } from '../utils/keys.js'; import { ChainResolverFactory } from './strategies/chain/ChainResolverFactory.js'; -import { MultiProtocolSignerContext } from './strategies/signer/MultiProtocolSignerContext.js'; +import { MultiProtocolSignerManager } from './strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext, ContextSettings, @@ -36,7 +36,7 @@ import { export async function contextMiddleware(argv: Record) { const isDryRun = !isNullish(argv.dryRun); - const requiresKey = isSignCommand(argv); + const requiresKey = argv.requiresKey ?? isSignCommand(argv); const settings: ContextSettings = { registryUri: argv.registry, registryOverrideUri: argv.overrides, @@ -79,7 +79,7 @@ export async function signerMiddleware(argv: Record) { /** * Extracts signer config */ - const multiProtocolSigner = new MultiProtocolSignerContext( + const multiProtocolSigner = new MultiProtocolSignerManager( strategyConfig, chains, multiProvider, diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts index 9f87f6eb21..4aadcdf81f 100644 --- a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts +++ b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts @@ -1,4 +1,4 @@ -import { Signer, Wallet } from 'ethers'; +import { Signer } from 'ethers'; import { ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; import { ChainName } from '@hyperlane-xyz/sdk'; @@ -17,11 +17,6 @@ export interface IMultiProtocolSigner { export abstract class BaseMultiProtocolSigner implements IMultiProtocolSigner { constructor(protected config: ChainSubmissionStrategy) {} - abstract getSignerConfig( - chain: ChainName, - ): Promise | SignerConfig; - - getSigner(config: SignerConfig): Signer { - return new Wallet(config.privateKey); - } + abstract getSignerConfig(chain: ChainName): Promise; + abstract getSigner(config: SignerConfig): Signer; } diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts index 5f31a0f074..030f11b5f4 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -57,11 +57,10 @@ class EthereumSignerStrategy extends BaseMultiProtocolSigner { } // 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean -// TODO: use ZKSync suitable signer +// TODO: import ZKSync signer class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { async getSignerConfig(chain: ChainName): Promise { const submitter = this.config[chain]?.submitter as { - type: TxSubmitterType.JSON_RPC; privateKey?: string; }; diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts similarity index 95% rename from typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts rename to typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index e69017cb87..60fa136827 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerContext.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -12,14 +12,14 @@ import { IMultiProtocolSigner } from './BaseMultiProtocolSigner.js'; import { MultiProtocolSignerFactory } from './MultiProtocolSignerFactory.js'; /** - * @title MultiProtocolSignerContext + * @title MultiProtocolSignerManager * @dev Context manager for signers across multiple protocols */ -export class MultiProtocolSignerContext { +export class MultiProtocolSignerManager { private signerStrategies: Map = new Map(); constructor( - strategyConfig: ChainSubmissionStrategy, + submissionStrategy: ChainSubmissionStrategy, private chains: ChainName[], private multiProvider: MultiProvider, private key?: string, @@ -28,7 +28,7 @@ export class MultiProtocolSignerContext { for (const chain of chains) { const strategy = MultiProtocolSignerFactory.getSignerStrategy( chain, - strategyConfig, + submissionStrategy, multiProvider, ); this.signerStrategies.set(chain, strategy); From 24b9d7a57d72802e8072ef4916ffa54f640f6ae6 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Tue, 19 Nov 2024 11:46:21 +0100 Subject: [PATCH 17/45] chore: revert MessageOptionsArgTypes origin & destination optionality --- typescript/cli/src/commands/send.ts | 4 ++-- typescript/cli/src/send/message.ts | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/typescript/cli/src/commands/send.ts b/typescript/cli/src/commands/send.ts index 27f59a52dc..1167b3b559 100644 --- a/typescript/cli/src/commands/send.ts +++ b/typescript/cli/src/commands/send.ts @@ -46,8 +46,8 @@ export const messageOptions: { [k: string]: Options } = { }; export interface MessageOptionsArgTypes { - origin: string; - destination: string; + origin?: string; + destination?: string; timeout: number; quick: boolean; relay: boolean; diff --git a/typescript/cli/src/send/message.ts b/typescript/cli/src/send/message.ts index 5ece5529f9..430d3b7bcf 100644 --- a/typescript/cli/src/send/message.ts +++ b/typescript/cli/src/send/message.ts @@ -7,6 +7,7 @@ import { MINIMUM_TEST_SEND_GAS } from '../consts.js'; import { CommandContext, WriteCommandContext } from '../context/types.js'; import { runPreflightChecksForChains } from '../deploy/utils.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson } from '../utils/files.js'; import { stubMerkleTreeConfig } from '../utils/relay.js'; @@ -20,13 +21,29 @@ export async function sendTestMessage({ selfRelay, }: { context: WriteCommandContext; - origin: ChainName; - destination: ChainName; + origin?: ChainName; + destination?: ChainName; messageBody: string; timeoutSec: number; skipWaitForDelivery: boolean; selfRelay?: boolean; }) { + const { chainMetadata } = context; + + if (!origin) { + origin = await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain', + ); + } + + if (!destination) { + destination = await runSingleChainSelectionStep( + chainMetadata, + 'Select the destination chain', + ); + } + await runPreflightChecksForChains({ context, chains: [origin, destination], From 60a2ae27ea4d167f45368770f82e05ca6f79d8e8 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 20 Nov 2024 12:33:39 +0100 Subject: [PATCH 18/45] feat: strategy init chain agnostic --- typescript/cli/src/config/strategy.ts | 52 +++++++++++++-------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 7aac3ff083..f2b3311961 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -29,7 +29,7 @@ export async function readChainSubmissionStrategyConfig( filePath: string, ): Promise { try { - log(`Reading file configs in ${filePath}`); + log(`Reading submission strategy in ${filePath}`); if (!isFile(filePath.trim())) { logBlue( @@ -79,16 +79,14 @@ export async function createStrategyConfig({ }) { let strategy: ChainSubmissionStrategy; try { - // the output strategy might contain submitters for other chain we don't want to overwrite const strategyObj = await readYamlOrJson(outPath); - // if there are changes in ChainSubmissionStrategy, the existing strategy may no longer be compatible strategy = ChainSubmissionStrategySchema.parse(strategyObj); } catch (e) { strategy = writeYamlOrJson(outPath, {}, 'yaml'); } + const chain = await runSingleChainSelectionStep(context.chainMetadata); const chainProtocol = context.chainMetadata[chain].protocol; - assert(chainProtocol === ProtocolType.Ethereum, 'Incompatible protocol'); // Needs to be compatible with MultiProvider - ethers.Signer if ( !context.skipConfirmation && @@ -100,34 +98,34 @@ export async function createStrategyConfig({ default: false, }); - if (!isConfirmed) { - throw Error('Strategy init cancelled'); - } + assert(isConfirmed, 'Strategy initialization cancelled by user.'); } - const submitterType = await select({ - message: 'Enter the type of submitter', - choices: Object.values(TxSubmitterType).map((value) => ({ - name: value, - value: value, - })), - }); + const isEthereum = chainProtocol === ProtocolType.Ethereum; + const submitterType = isEthereum + ? await select({ + message: 'Select the submitter type', + choices: Object.values(TxSubmitterType).map((value) => ({ + name: value, + value: value, + })), + }) + : TxSubmitterType.JSON_RPC; // Do other non-evm chains support gnosis and account impersonation? - const submitter: Record = { - type: submitterType, - }; + const submitter: Record = { type: submitterType }; - // Configure submitter based on submitterType switch (submitterType) { case TxSubmitterType.JSON_RPC: submitter.privateKey = await password({ - message: 'Enter your private key', - validate: (pk) => isPrivateKeyEvm(pk), + message: 'Enter the private key for JSON-RPC submission:', + validate: (pk) => (isEthereum ? isPrivateKeyEvm(pk) : true), }); - submitter.userAddress = await new Wallet( - submitter.privateKey, - ).getAddress(); // EVM + submitter.userAddress = isEthereum + ? await new Wallet(submitter.privateKey).getAddress() + : await input({ + message: 'Enter the user address for JSON-RPC submission:', + }); submitter.chain = chain; break; @@ -185,18 +183,16 @@ export async function createStrategyConfig({ try { const strategyConfig = ChainSubmissionStrategySchema.parse(strategyResult); - logBlue(`Strategy config is valid, writing to file ${outPath}:\n`); + logBlue(`Strategy configuration is valid. Writing to file ${outPath}:\n`); - // Mask sensitive data before logging const maskedConfig = maskSensitiveData(strategyConfig); log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); - // Write the original unmasked config to file writeYamlOrJson(outPath, strategyConfig); - logGreen('✅ Successfully created new key config.'); + logGreen('✅ Successfully created a new strategy configuration.'); } catch (e) { errorRed( - `Key config is invalid, please check the submitter configuration.`, + `The strategy configuration is invalid. Please review the submitter settings.`, ); } } From 884db145eb5de13ae38fd92ad553ef54a25d0f10 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 20 Nov 2024 12:42:31 +0100 Subject: [PATCH 19/45] feat: logging private key source --- .../context/strategies/signer/MultiProtocolSignerManager.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index 60fa136827..3e27be20e0 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -6,6 +6,7 @@ import { MultiProvider, } from '@hyperlane-xyz/sdk'; +import { logBlue } from '../../../logger.js'; import { ENV } from '../../../utils/env.js'; import { IMultiProtocolSigner } from './BaseMultiProtocolSigner.js'; @@ -60,14 +61,18 @@ export class MultiProtocolSignerManager { // Determine private key with clear precedence let privateKey: string; if (this.key) { + logBlue('Using private key passed via CLI --key flag'); privateKey = this.key; } else if (ENV.HYP_KEY) { + logBlue('Using private key from .env'); privateKey = ENV.HYP_KEY; } else { const strategyConfig = await signerStrategy.getSignerConfig(chain); if (!strategyConfig?.privateKey) { throw new Error(`No private key found for chain ${chain}`); } + logBlue('Extracting private key from strategy config/user prompt'); + privateKey = strategyConfig.privateKey; } From 2cc7ca4486a209748f4be6ad8a6529aa48c0f9f1 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 20 Nov 2024 16:07:56 +0100 Subject: [PATCH 20/45] chore: MultiProtocolSignerOptions refactor --- typescript/cli/src/context/context.ts | 4 +- .../signer/MultiProtocolSignerManager.ts | 163 ++++++++++-------- 2 files changed, 97 insertions(+), 70 deletions(-) diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 3de5f7f0cf..900752cd2a 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -83,13 +83,13 @@ export async function signerMiddleware(argv: Record) { strategyConfig, chains, multiProvider, - key, + { key }, ); /** * @notice Attaches signers to MultiProvider and assigns it to argv.multiProvider */ - argv.multiProvider = await multiProtocolSigner.attachSignersToMp(); + argv.multiProvider = await multiProtocolSigner.setupMultiProvider(); return argv; } diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index 3e27be20e0..3a8605fe74 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -1,126 +1,153 @@ import { Signer } from 'ethers'; +import { Logger } from 'pino'; import { ChainName, ChainSubmissionStrategy, MultiProvider, } from '@hyperlane-xyz/sdk'; +import { assert, rootLogger } from '@hyperlane-xyz/utils'; -import { logBlue } from '../../../logger.js'; import { ENV } from '../../../utils/env.js'; import { IMultiProtocolSigner } from './BaseMultiProtocolSigner.js'; import { MultiProtocolSignerFactory } from './MultiProtocolSignerFactory.js'; +export interface MultiProtocolSignerOptions { + logger?: Logger; + key?: string; +} + /** * @title MultiProtocolSignerManager * @dev Context manager for signers across multiple protocols */ export class MultiProtocolSignerManager { - private signerStrategies: Map = new Map(); + protected readonly signerStrategies: Map; + protected readonly signers: Map; + public readonly logger: Logger; constructor( - submissionStrategy: ChainSubmissionStrategy, - private chains: ChainName[], - private multiProvider: MultiProvider, - private key?: string, + protected readonly submissionStrategy: ChainSubmissionStrategy, + protected readonly chains: ChainName[], + protected readonly multiProvider: MultiProvider, + protected readonly options: MultiProtocolSignerOptions = {}, ) { - // Initialize chain-specific strategies - for (const chain of chains) { + this.logger = + options?.logger || + rootLogger.child({ + module: 'MultiProtocolSignerManager', + }); + this.signerStrategies = new Map(); + this.signers = new Map(); + this.initializeStrategies(); + } + + /** + * @notice Sets up chain-specific signer strategies + */ + protected initializeStrategies(): void { + for (const chain of this.chains) { const strategy = MultiProtocolSignerFactory.getSignerStrategy( chain, - submissionStrategy, - multiProvider, + this.submissionStrategy, + this.multiProvider, ); this.signerStrategies.set(chain, strategy); } } /** - * @dev Gets signers config for specified chains + * @dev Configures signers for EVM chains in MultiProvider */ - private async getSignersConfig(): Promise< - Array<{ chain: ChainName; privateKey: string }> - > { - return Promise.all( - this.chains.map((chain) => this.getSignerConfigForChain(chain)), - ); - } - - /** - * @dev Gets private key from strategy or environment fallback - */ - private async getSignerConfigForChain( - chain: ChainName, - ): Promise<{ chain: ChainName; privateKey: string }> { - const signerStrategy = this.signerStrategies.get(chain); - if (!signerStrategy) { - throw new Error(`No signer strategy found for chain ${chain}`); - } - - // Determine private key with clear precedence - let privateKey: string; - if (this.key) { - logBlue('Using private key passed via CLI --key flag'); - privateKey = this.key; - } else if (ENV.HYP_KEY) { - logBlue('Using private key from .env'); - privateKey = ENV.HYP_KEY; - } else { - const strategyConfig = await signerStrategy.getSignerConfig(chain); - if (!strategyConfig?.privateKey) { - throw new Error(`No private key found for chain ${chain}`); - } - logBlue('Extracting private key from strategy config/user prompt'); - - privateKey = strategyConfig.privateKey; + async setupMultiProvider(): Promise { + for (const chain of this.chains) { + const signer = await this.initSigner(chain); + this.multiProvider.setSigner(chain, signer); } - return { - chain, - privateKey, - }; + return this.multiProvider; } /** - * @dev Gets protocol-specific signer for a chain + * @notice Creates signer for specific chain */ - async getSigner(chain: ChainName): Promise { - const { privateKey } = await this.getSignerConfigForChain(chain); + async initSigner(chain: ChainName): Promise { + const { privateKey } = await this.resolveConfig(chain); const signerStrategy = this.signerStrategies.get(chain); - if (!signerStrategy) { - throw new Error(`No signer strategy found for chain ${chain}`); - } + assert(signerStrategy, `No signer strategy found for chain ${chain}`); + return signerStrategy.getSigner({ privateKey }); } /** - * @dev Gets signers for all specified chains + * @notice Creates signers for all chains */ - async getSigners(): Promise> { - const signerConfigs = await this.getSignersConfig(); - const result: Record = {}; + async initAllSigners(): Promise { + const signerConfigs = await this.resolveAllConfigs(); for (const { chain, privateKey } of signerConfigs) { const signerStrategy = this.signerStrategies.get(chain); if (signerStrategy) { - result[chain] = signerStrategy.getSigner({ privateKey }); + this.signers.set(chain, signerStrategy.getSigner({ privateKey })); } } - return result; + return this.signers; } /** - * @dev Configures signers for chains in MultiProvider + * @notice Resolves all chain configurations */ - async attachSignersToMp(): Promise { - for (const chain of this.chains) { - const signer = await this.getSigner(chain); - this.multiProvider.setSigner(chain, signer); + private async resolveAllConfigs(): Promise< + Array<{ chain: ChainName; privateKey: string }> + > { + return Promise.all(this.chains.map((chain) => this.resolveConfig(chain))); + } + + /** + * @notice Resolves single chain configuration + */ + private async resolveConfig( + chain: ChainName, + ): Promise<{ chain: ChainName; privateKey: string }> { + const signerStrategy = this.signerStrategies.get(chain); + assert(signerStrategy, `No signer strategy found for chain ${chain}`); + + let privateKey: string; + + if (this.options.key) { + this.logger.info( + `Using private key passed via CLI --key flag for chain ${chain}`, + ); + privateKey = this.options.key; + } else if (ENV.HYP_KEY) { + this.logger.info(`Using private key from .env for chain ${chain}`); + privateKey = ENV.HYP_KEY; + } else { + privateKey = await this.extractPrivateKey(chain, signerStrategy); } - return this.multiProvider; + return { chain, privateKey }; + } + + /** + * @notice Gets private key from strategy + */ + private async extractPrivateKey( + chain: ChainName, + signerStrategy: IMultiProtocolSigner, + ): Promise { + const strategyConfig = await signerStrategy.getSignerConfig(chain); + assert( + strategyConfig.privateKey, + `No private key found for chain ${chain}`, + ); + + this.logger.info( + `Extracting private key from strategy config/user prompt for chain ${chain}`, + ); + return strategyConfig.privateKey; } } From d7326a696f2c58d1bac62766694b60758aa2bb23 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 20 Nov 2024 16:20:44 +0100 Subject: [PATCH 21/45] docs(changeset): Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management --- .changeset/spicy-gifts-hear.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spicy-gifts-hear.md diff --git a/.changeset/spicy-gifts-hear.md b/.changeset/spicy-gifts-hear.md new file mode 100644 index 0000000000..c157be1cfd --- /dev/null +++ b/.changeset/spicy-gifts-hear.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': major +--- + +Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management From a9df9e8b7b71c8bf0e4754e6629dec104eef9283 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 21 Nov 2024 15:12:38 +0100 Subject: [PATCH 22/45] feat: integrate zksync-ethers wallet for ZKSync signer strategy --- typescript/cli/package.json | 3 ++- .../signer/MultiProtocolSignerFactory.ts | 5 ++--- yarn.lock | 14 +++++++++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/typescript/cli/package.json b/typescript/cli/package.json index df2acaeb16..7369dbd74a 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -40,7 +40,8 @@ "eslint-config-prettier": "^9.1.0", "mocha": "^10.2.0", "prettier": "^2.8.8", - "typescript": "5.3.3" + "typescript": "5.3.3", + "zksync-ethers": "^5.10.0" }, "scripts": { "hyperlane": "node ./dist/cli.js", diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts index 030f11b5f4..557e90fc3c 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -1,5 +1,6 @@ import { password } from '@inquirer/prompts'; import { Signer, Wallet } from 'ethers'; +import { Wallet as ZKSyncWallet } from 'zksync-ethers'; import { ChainName, @@ -56,8 +57,6 @@ class EthereumSignerStrategy extends BaseMultiProtocolSigner { } } -// 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean -// TODO: import ZKSync signer class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { async getSignerConfig(chain: ChainName): Promise { const submitter = this.config[chain]?.submitter as { @@ -74,6 +73,6 @@ class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { } getSigner(config: SignerConfig): Signer { - return new Wallet(config.privateKey); + return new ZKSyncWallet(config.privateKey); } } diff --git a/yarn.lock b/yarn.lock index 9ba2eef3e1..a9f8c878a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7852,6 +7852,7 @@ __metadata: typescript: "npm:5.3.3" yaml: "npm:2.4.5" yargs: "npm:^17.7.2" + zksync-ethers: "npm:^5.10.0" zod: "npm:^3.21.2" zod-validation-error: "npm:^3.3.0" zx: "npm:^8.1.4" @@ -19643,7 +19644,7 @@ __metadata: languageName: node linkType: hard -"ethers@npm:5.7.2, ethers@npm:^5.1.0, ethers@npm:^5.3.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": +"ethers@npm:5.7.2, ethers@npm:^5.1.0, ethers@npm:^5.3.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2, ethers@npm:~5.7.0": version: 5.7.2 resolution: "ethers@npm:5.7.2" dependencies: @@ -33425,6 +33426,17 @@ __metadata: languageName: node linkType: hard +"zksync-ethers@npm:^5.10.0": + version: 5.10.0 + resolution: "zksync-ethers@npm:5.10.0" + dependencies: + ethers: "npm:~5.7.0" + peerDependencies: + ethers: ~5.7.0 + checksum: 10/826719e2e40731e1104cf8a0c16c758526de6ca9e907d0483eb5bd80b635f02e3cce012115b75d68976a8dd746d63d4f83d576cc3bddc18a02a49d2bc023347f + languageName: node + linkType: hard + "zksync-web3@npm:^0.14.3": version: 0.14.4 resolution: "zksync-web3@npm:0.14.4" From 65615046412abb8d2aedcf0f9835b863a0f18977 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 21 Nov 2024 18:45:35 +0100 Subject: [PATCH 23/45] refactor: improve signer management in warp route deploy config creation --- typescript/cli/src/config/warp.ts | 31 +++++++++++++++++++++------ typescript/cli/src/context/context.ts | 6 +++--- typescript/cli/src/context/types.ts | 2 ++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index 1174d0156b..5f628a1677 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -21,6 +21,8 @@ import { promiseObjAll, } from '@hyperlane-xyz/utils'; +import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; +import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext } from '../context/types.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; import { runMultiChainSelectionStep } from '../utils/chains.js'; @@ -35,6 +37,7 @@ import { } from '../utils/input.js'; import { createAdvancedIsmConfig } from './ism.js'; +import { readChainSubmissionStrategyConfig } from './strategy.js'; const TYPE_DESCRIPTIONS: Record = { [TokenType.synthetic]: 'A new ERC20 with remote transfer functionality', @@ -122,13 +125,6 @@ export async function createWarpRouteDeployConfig({ }) { logBlue('Creating a new warp route deployment config...'); - const owner = await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), - 'Enter the desired', - 'owner address', - 'signer', - ); - const warpChains = await runMultiChainSelectionStep({ chainMetadata: context.chainMetadata, message: 'Select chains to connect', @@ -138,11 +134,32 @@ export async function createWarpRouteDeployConfig({ requiresConfirmation: !context.skipConfirmation, }); + const strategyConfig = await readChainSubmissionStrategyConfig( + context.strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, + ); + + const multiProtocolSigner = new MultiProtocolSignerManager( + strategyConfig, + warpChains, + context.multiProvider, + { key: context.key }, + ); + + const multiProviderWithSigners = + await multiProtocolSigner.setupMultiProvider(); + const result: WarpRouteDeployConfig = {}; let typeChoices = TYPE_CHOICES; for (const chain of warpChains) { logBlue(`${chain}: Configuring warp route...`); + const owner = await detectAndConfirmOrPrompt( + async () => await multiProviderWithSigners.getSigner(chain).getAddress(), + 'Enter the desired', + 'owner address', + 'signer', + ); + // default to the mailbox from the registry and if not found ask to the user to submit one const chainAddresses = await context.registry.getChainAddresses(chain); diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 900752cd2a..8fa69303bd 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -45,6 +45,7 @@ export async function contextMiddleware(argv: Record) { requiresKey, disableProxy: argv.disableProxy, skipConfirmation: argv.yes, + strategyPath: argv.strategy, }; if (!isDryRun && settings.fromAddress) throw new Error( @@ -57,13 +58,12 @@ export async function contextMiddleware(argv: Record) { } export async function signerMiddleware(argv: Record) { - const { key, context } = argv; - const { requiresKey, multiProvider } = context; + const { key, requiresKey, multiProvider, strategyPath } = argv.context; if (!requiresKey) return argv; const strategyConfig = await readChainSubmissionStrategyConfig( - argv.strategy ?? DEFAULT_STRATEGY_CONFIG_PATH, + strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, ); /** diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index eef1ad2bbf..7837972893 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -17,6 +17,7 @@ export interface ContextSettings { requiresKey?: boolean; disableProxy?: boolean; skipConfirmation?: boolean; + strategyPath?: string; } export interface CommandContext { @@ -27,6 +28,7 @@ export interface CommandContext { key?: string; signer?: ethers.Signer; warpCoreConfig?: WarpCoreConfig; + strategyPath?: string; } export interface WriteCommandContext extends CommandContext { From e532b1ad6f153d5ddd97fccbc3436a72eded8795 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 22 Nov 2024 11:33:11 +0100 Subject: [PATCH 24/45] refactor: improve strategy config handling and type safety & sensitive key masking --- typescript/cli/src/commands/signCommands.ts | 1 - typescript/cli/src/commands/strategy.ts | 2 - typescript/cli/src/config/strategy.ts | 63 +++++++++---------- typescript/cli/src/config/warp.ts | 2 +- typescript/cli/src/context/context.ts | 6 +- .../strategies/chain/MultiChainResolver.ts | 4 +- .../strategies/chain/SingleChainResolver.ts | 4 +- .../cli/src/context/strategies/chain/types.ts | 4 +- typescript/cli/src/deploy/utils.ts | 1 - typescript/cli/src/send/transfer.ts | 1 - typescript/cli/src/tests/commands/core.ts | 1 - typescript/cli/src/utils/balances.ts | 1 - typescript/cli/src/utils/output.ts | 15 ++++- typescript/utils/src/addresses.ts | 6 +- 14 files changed, 59 insertions(+), 52 deletions(-) diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 07504a8b2c..58afa1c04f 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -8,7 +8,6 @@ export const SIGN_COMMANDS = [ 'status', 'submit', 'relayer', - 'read', ]; export function isSignCommand(argv: any): boolean { diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts index 6f85dcb885..414a3d48ee 100644 --- a/typescript/cli/src/commands/strategy.ts +++ b/typescript/cli/src/commands/strategy.ts @@ -48,7 +48,6 @@ export const init: CommandModuleWithWriteContext<{ export const read: CommandModuleWithWriteContext<{ strategy: string; - requiresKey: boolean; }> = { command: 'read', describe: 'Reads strategy configuration', @@ -58,7 +57,6 @@ export const read: CommandModuleWithWriteContext<{ demandOption: true, default: DEFAULT_STRATEGY_CONFIG_PATH, }, - requiresKey: { demandOption: false, default: false, hidden: true }, }, handler: async ({ strategy: strategyUrl }) => { logCommandHeader(`Hyperlane Strategy Read`); diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index f2b3311961..ce9fd9b41d 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -10,12 +10,13 @@ import { import { ProtocolType, assert, + errorToString, isAddress, isPrivateKeyEvm, } from '@hyperlane-xyz/utils'; import { CommandContext } from '../context/types.js'; -import { errorRed, log, logBlue, logGreen } from '../logger.js'; +import { errorRed, log, logBlue, logGreen, logRed } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { indentYamlOrJson, @@ -25,48 +26,44 @@ import { } from '../utils/files.js'; import { maskSensitiveData } from '../utils/output.js'; +/** + * Reads and validates a chain submission strategy configuration from a file + */ export async function readChainSubmissionStrategyConfig( filePath: string, ): Promise { + log(`Reading submission strategy in ${filePath}`); try { - log(`Reading submission strategy in ${filePath}`); + const strategyConfig = readYamlOrJson(filePath); - if (!isFile(filePath.trim())) { - logBlue( - `No strategy config found in ${filePath}, returning empty config`, - ); - return {}; - } + const parseResult = ChainSubmissionStrategySchema.parse(strategyConfig); - const strategyConfig = readYamlOrJson( - filePath.trim(), - ); + return parseResult; + } catch (error) { + logRed(`⛔️ Error reading strategy config:`, errorToString(error)); + throw error; // Re-throw to let caller handle the error + } +} - // Check if config exists and is a non-empty object - if (!strategyConfig || typeof strategyConfig !== 'object') { - logBlue( - `No strategy config found in ${filePath}, returning empty config`, - ); +/** + * Safely reads chain submission strategy config, returns empty object if any errors occur + */ +export async function safeReadChainSubmissionStrategyConfig( + filePath: string, +): Promise { + try { + const trimmedFilePath = filePath.trim(); + if (!isFile(trimmedFilePath)) { + logBlue(`File ${trimmedFilePath} does not exist, returning empty config`); return {}; } - - const parseResult = ChainSubmissionStrategySchema.safeParse(strategyConfig); - if (!parseResult.success) { - errorRed( - `Strategy config validation using ChainSubmissionStrategySchema failed for ${filePath}`, - ); - errorRed(JSON.stringify(parseResult.error.errors, null, 2)); - throw new Error('Invalid strategy configuration'); - } - - return strategyConfig; + return await readChainSubmissionStrategyConfig(trimmedFilePath); } catch (error) { - if (error instanceof Error) { - errorRed(`Error reading strategy config: ${error.message}`); - } else { - errorRed('Unknown error reading strategy config'); - } - throw error; // Re-throw to let caller handle the error + logRed( + `Failed to read strategy config, defaulting to empty config:`, + errorToString(error), + ); + return {}; } } diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index 5f628a1677..b75058b4f2 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -154,7 +154,7 @@ export async function createWarpRouteDeployConfig({ logBlue(`${chain}: Configuring warp route...`); const owner = await detectAndConfirmOrPrompt( - async () => await multiProviderWithSigners.getSigner(chain).getAddress(), + async () => multiProviderWithSigners.getSigner(chain).getAddress(), 'Enter the desired', 'owner address', 'signer', diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 8fa69303bd..f679b69be0 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -18,7 +18,7 @@ import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; -import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; +import { safeReadChainSubmissionStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; @@ -36,7 +36,7 @@ import { export async function contextMiddleware(argv: Record) { const isDryRun = !isNullish(argv.dryRun); - const requiresKey = argv.requiresKey ?? isSignCommand(argv); + const requiresKey = isSignCommand(argv); const settings: ContextSettings = { registryUri: argv.registry, registryOverrideUri: argv.overrides, @@ -62,7 +62,7 @@ export async function signerMiddleware(argv: Record) { if (!requiresKey) return argv; - const strategyConfig = await readChainSubmissionStrategyConfig( + const strategyConfig = await safeReadChainSubmissionStrategyConfig( strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, ); diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index 5d582e80df..87e74752f3 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -1,4 +1,4 @@ -import { ChainName } from '@hyperlane-xyz/sdk'; +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; @@ -36,7 +36,7 @@ enum ChainSelectionMode { export class MultiChainResolver implements ChainResolver { constructor(private mode: ChainSelectionMode) {} - async resolveChains(argv: Record): Promise { + async resolveChains(argv: ChainMap): Promise { switch (this.mode) { case ChainSelectionMode.WARP_CONFIG: return this.resolveWarpRouteConfigChains(argv); diff --git a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts index dd46cba519..8dddaf3c4a 100644 --- a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts @@ -1,4 +1,4 @@ -import { ChainName } from '@hyperlane-xyz/sdk'; +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; import { runSingleChainSelectionStep } from '../../../utils/chains.js'; @@ -14,7 +14,7 @@ export class SingleChainResolver implements ChainResolver { * @notice Determines the chain to be used for signing operations * @dev Either uses the chain specified in argv or prompts for interactive selection */ - async resolveChains(argv: Record): Promise { + async resolveChains(argv: ChainMap): Promise { argv.chain ||= await runSingleChainSelectionStep( argv.context.chainMetadata, 'Select chain to connect:', diff --git a/typescript/cli/src/context/strategies/chain/types.ts b/typescript/cli/src/context/strategies/chain/types.ts index ab42c81acd..9318bed8c2 100644 --- a/typescript/cli/src/context/strategies/chain/types.ts +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -1,4 +1,4 @@ -import { ChainName } from '@hyperlane-xyz/sdk'; +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; export interface ChainResolver { /** @@ -6,5 +6,5 @@ export interface ChainResolver { * @param argv Command arguments * @returns Array of chain names */ - resolveChains(argv: Record): Promise; + resolveChains(argv: ChainMap): Promise; } diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index c03cc761c3..e5dc8e0857 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -57,7 +57,6 @@ export async function runPreflightChecksForChains({ await nativeBalancesAreSufficient( multiProvider, - null, chainsToGasCheck ?? chains, minGas, ); diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index dc4b8ca96b..2929b09c6e 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -141,7 +141,6 @@ async function executeDelivery({ token = warpCore.findToken(origin, routerAddress)!; } - // const senderAddress = await multiProvider.getSigner(origin).getAddress(); const errors = await warpCore.validateTransfer({ originTokenAmount: token.amount(amount), destination, diff --git a/typescript/cli/src/tests/commands/core.ts b/typescript/cli/src/tests/commands/core.ts index 51e4471693..24c9109744 100644 --- a/typescript/cli/src/tests/commands/core.ts +++ b/typescript/cli/src/tests/commands/core.ts @@ -30,7 +30,6 @@ export async function hyperlaneCoreRead(chain: string, coreOutputPath: string) { --registry ${REGISTRY_PATH} \ --config ${coreOutputPath} \ --chain ${chain} \ - --key ${ANVIL_KEY} \ --verbosity debug \ --yes`; } diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index ef497e6261..10df193b9c 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -7,7 +7,6 @@ import { logGreen, logRed } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, - signer: ethers.Signer | null, chains: ChainName[], minGas: string, ) { diff --git a/typescript/cli/src/utils/output.ts b/typescript/cli/src/utils/output.ts index bee37be859..a9f512504d 100644 --- a/typescript/cli/src/utils/output.ts +++ b/typescript/cli/src/utils/output.ts @@ -66,6 +66,19 @@ export function maskPrivateKey(key: string): string { return `${middle}`; } +const SENSITIVE_PATTERNS = [ + 'privatekey', + 'key', + 'secret', + 'secretkey', + 'password', +]; + +const isSensitiveKey = (key: string) => { + const lowerKey = key.toLowerCase(); + return SENSITIVE_PATTERNS.some((pattern) => lowerKey.includes(pattern)); +}; + /** * @notice Recursively masks sensitive data in objects * @param obj Object with potential sensitive data @@ -77,7 +90,7 @@ export function maskSensitiveData(obj: any): any { if (typeof obj === 'object') { const masked = { ...obj }; for (const [key, value] of Object.entries(masked)) { - if (key === 'privateKey' && typeof value === 'string') { + if (isSensitiveKey(key) && typeof value === 'string') { masked[key] = maskPrivateKey(value); } else if (typeof value === 'object') { masked[key] = maskSensitiveData(value); diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index 035d1207e6..b43d22d96e 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -382,5 +382,9 @@ export function strip0x(hexstr: string) { } export function isPrivateKeyEvm(privateKey: string): boolean { - return new Wallet(privateKey).privateKey === privateKey; + try { + return new Wallet(privateKey).privateKey === privateKey; + } catch (e) { + throw new Error('Provided Private Key is not EVM compatible!'); + } } From afb3b21e5dcd85deca902f108ce0506d10a8097b Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 22 Nov 2024 11:33:39 +0100 Subject: [PATCH 25/45] refactor: sensitive key function name --- typescript/cli/src/utils/output.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/typescript/cli/src/utils/output.ts b/typescript/cli/src/utils/output.ts index a9f512504d..bcb794c680 100644 --- a/typescript/cli/src/utils/output.ts +++ b/typescript/cli/src/utils/output.ts @@ -56,11 +56,11 @@ export function formatYamlViolationsOutput( } /** - * @notice Masks private key with dots - * @param key Private key to mask + * @notice Masks sensitive key with dots + * @param key Sensitive key to mask * @return Masked key */ -export function maskPrivateKey(key: string): string { +export function maskSensitiveKey(key: string): string { if (!key) return key; const middle = '•'.repeat(key.length); return `${middle}`; @@ -91,7 +91,7 @@ export function maskSensitiveData(obj: any): any { const masked = { ...obj }; for (const [key, value] of Object.entries(masked)) { if (isSensitiveKey(key) && typeof value === 'string') { - masked[key] = maskPrivateKey(value); + masked[key] = maskSensitiveKey(value); } else if (typeof value === 'object') { masked[key] = maskSensitiveData(value); } From fc1188a2f61e06d5ec64921948e7fe5818a9e5f3 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 22 Nov 2024 14:21:00 +0100 Subject: [PATCH 26/45] docs(changeset): Added `isPrivateKeyEvm` function for validating EVM private keys --- .changeset/chilly-balloons-rule.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chilly-balloons-rule.md diff --git a/.changeset/chilly-balloons-rule.md b/.changeset/chilly-balloons-rule.md new file mode 100644 index 0000000000..b339b75699 --- /dev/null +++ b/.changeset/chilly-balloons-rule.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/utils': minor +--- + +Added `isPrivateKeyEvm` function for validating EVM private keys From 366aab58c03f01112f5bdaafe45b851d1e2ee4be Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 22 Nov 2024 16:05:58 +0100 Subject: [PATCH 27/45] refactor: simplify address validation and reorganize chain utils --- typescript/cli/src/config/strategy.ts | 19 +++-------- typescript/cli/src/config/warp.ts | 3 +- typescript/cli/src/context/context.ts | 3 +- .../strategies/chain/ChainResolverFactory.ts | 2 -- .../strategies/chain/MultiChainResolver.ts | 2 +- .../signer/BaseMultiProtocolSigner.ts | 3 +- .../signer/MultiProtocolSignerManager.ts | 2 +- typescript/cli/src/utils/chains.ts | 33 +++++++++++++++++++ typescript/cli/src/utils/output.ts | 33 ------------------- 9 files changed, 44 insertions(+), 56 deletions(-) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index ce9fd9b41d..d9cee7101d 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -130,13 +130,8 @@ export async function createStrategyConfig({ case TxSubmitterType.IMPERSONATED_ACCOUNT: submitter.userAddress = await input({ message: 'Enter the user address to impersonate', - validate: (address) => { - try { - return isAddress(address) ? true : 'Invalid Ethereum address'; - } catch { - return 'Invalid Ethereum address'; - } - }, + validate: (address) => + isAddress(address) ? true : 'Invalid Ethereum address', }); assert( submitter.userAddress, @@ -148,13 +143,8 @@ export async function createStrategyConfig({ case TxSubmitterType.GNOSIS_TX_BUILDER: submitter.safeAddress = await input({ message: 'Enter the Safe address', - validate: (address) => { - try { - return isAddress(address) ? true : 'Invalid Safe address'; - } catch { - return 'Invalid Safe address'; - } - }, + validate: (address) => + isAddress(address) ? true : 'Invalid Safe address', }); submitter.chain = chain; @@ -188,6 +178,7 @@ export async function createStrategyConfig({ writeYamlOrJson(outPath, strategyConfig); logGreen('✅ Successfully created a new strategy configuration.'); } catch (e) { + // don't log error since it may contain sensitive data errorRed( `The strategy configuration is invalid. Please review the submitter settings.`, ); diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index b75058b4f2..a2cd19d57c 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -145,8 +145,7 @@ export async function createWarpRouteDeployConfig({ { key: context.key }, ); - const multiProviderWithSigners = - await multiProtocolSigner.setupMultiProvider(); + const multiProviderWithSigners = await multiProtocolSigner.getMultiProvider(); const result: WarpRouteDeployConfig = {}; let typeChoices = TYPE_CHOICES; diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index f679b69be0..6f46be3061 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -89,7 +89,8 @@ export async function signerMiddleware(argv: Record) { /** * @notice Attaches signers to MultiProvider and assigns it to argv.multiProvider */ - argv.multiProvider = await multiProtocolSigner.setupMultiProvider(); + argv.multiProvider = await multiProtocolSigner.getMultiProvider(); + argv.multiProtocolSigner = multiProtocolSigner; return argv; } diff --git a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts index 4b14d77d99..24260c1982 100644 --- a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts +++ b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts @@ -3,7 +3,6 @@ import { SingleChainResolver } from './SingleChainResolver.js'; import { ChainResolver } from './types.js'; enum CommandType { - CORE_APPLY = 'core:apply', WARP_DEPLOY = 'warp:deploy', WARP_SEND = 'warp:send', WARP_APPLY = 'warp:apply', @@ -21,7 +20,6 @@ enum CommandType { */ export class ChainResolverFactory { private static strategyMap: Map ChainResolver> = new Map([ - [CommandType.CORE_APPLY, () => new SingleChainResolver()], [CommandType.WARP_DEPLOY, () => MultiChainResolver.forWarpRouteConfig()], [CommandType.WARP_SEND, () => MultiChainResolver.forOriginDestination()], [CommandType.WARP_APPLY, () => MultiChainResolver.forWarpRouteConfig()], diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index 87e74752f3..ec0d6e3e47 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -5,6 +5,7 @@ import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/opt import { readChainSubmissionStrategyConfig } from '../../../config/strategy.js'; import { logRed } from '../../../logger.js'; import { + extractChainsFromObj, runMultiChainSelectionStep, runSingleChainSelectionStep, } from '../../../utils/chains.js'; @@ -14,7 +15,6 @@ import { runFileSelectionStep, } from '../../../utils/files.js'; import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; -import { extractChainsFromObj } from '../../../utils/output.js'; import { ChainResolver } from './types.js'; diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts index 4aadcdf81f..a48d1ef89f 100644 --- a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts +++ b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts @@ -1,7 +1,6 @@ import { Signer } from 'ethers'; -import { ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; -import { ChainName } from '@hyperlane-xyz/sdk'; +import { ChainName, ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; export interface SignerConfig { privateKey: string; diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts index 3a8605fe74..12f9c0f819 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -60,7 +60,7 @@ export class MultiProtocolSignerManager { /** * @dev Configures signers for EVM chains in MultiProvider */ - async setupMultiProvider(): Promise { + async getMultiProvider(): Promise { for (const chain of this.chains) { const signer = await this.initSigner(chain); this.multiProvider.setSigner(chain, signer); diff --git a/typescript/cli/src/utils/chains.ts b/typescript/cli/src/utils/chains.ts index add11203d0..7e2eaccd0a 100644 --- a/typescript/cli/src/utils/chains.ts +++ b/typescript/cli/src/utils/chains.ts @@ -171,3 +171,36 @@ function handleNewChain(chainNames: string[]) { process.exit(0); } } + +/** + * @notice Extracts chain names from a nested configuration object + * @param config Object to search for chain names + * @return Array of discovered chain names + */ +export function extractChainsFromObj(config: Record): string[] { + const chains: string[] = []; + + // Recursively search for chain/chainName fields + function findChainFields(obj: any) { + if (obj === null || typeof obj !== 'object') return; + + if (Array.isArray(obj)) { + obj.forEach((item) => findChainFields(item)); + return; + } + + if ('chain' in obj) { + chains.push(obj.chain); + } + + if ('chainName' in obj) { + chains.push(obj.chainName); + } + + // Recursively search in all nested values + Object.values(obj).forEach((value) => findChainFields(value)); + } + + findChainFields(config); + return chains; +} diff --git a/typescript/cli/src/utils/output.ts b/typescript/cli/src/utils/output.ts index bcb794c680..2e1acfdf41 100644 --- a/typescript/cli/src/utils/output.ts +++ b/typescript/cli/src/utils/output.ts @@ -101,36 +101,3 @@ export function maskSensitiveData(obj: any): any { return obj; } - -/** - * @notice Extracts chain names from a nested configuration object - * @param config Object to search for chain names - * @return Array of discovered chain names - */ -export function extractChainsFromObj(config: Record): string[] { - const chains: string[] = []; - - // Recursively search for chain/chainName fields - function findChainFields(obj: any) { - if (obj === null || typeof obj !== 'object') return; - - if (Array.isArray(obj)) { - obj.forEach((item) => findChainFields(item)); - return; - } - - if ('chain' in obj) { - chains.push(obj.chain); - } - - if ('chainName' in obj) { - chains.push(obj.chainName); - } - - // Recursively search in all nested values - Object.values(obj).forEach((value) => findChainFields(value)); - } - - findChainFields(config); - return chains; -} From 0b793c7e89ce5dec75629246803b4a50607a03fb Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 22 Nov 2024 16:13:46 +0100 Subject: [PATCH 28/45] chore: change cli changeset to minor --- .changeset/spicy-gifts-hear.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/spicy-gifts-hear.md b/.changeset/spicy-gifts-hear.md index c157be1cfd..37d4efa28d 100644 --- a/.changeset/spicy-gifts-hear.md +++ b/.changeset/spicy-gifts-hear.md @@ -1,5 +1,5 @@ --- -'@hyperlane-xyz/cli': major +'@hyperlane-xyz/cli': minor --- Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management From 24b0c553d68ae04700b5d0050e66ce619b4c797a Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 25 Nov 2024 10:46:42 +0100 Subject: [PATCH 29/45] refactor: update SignerConfig address type to use Address from hyperlane-utils --- .../src/context/strategies/signer/BaseMultiProtocolSigner.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts index a48d1ef89f..b91242b42d 100644 --- a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts +++ b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts @@ -1,10 +1,11 @@ import { Signer } from 'ethers'; import { ChainName, ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; export interface SignerConfig { privateKey: string; - address?: string; // For chains like StarkNet that require address + address?: Address; // For chains like StarkNet that require address extraParams?: Record; // For any additional chain-specific params } From 2076ef6b31ee50bf7d7a77cfe4761d47c5fd636d Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 25 Nov 2024 11:31:28 +0100 Subject: [PATCH 30/45] refactor: move CommandType enum to signCommands.ts --- typescript/cli/src/commands/signCommands.ts | 12 ++++++++++++ .../strategies/chain/ChainResolverFactory.ts | 14 ++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 58afa1c04f..6bd617302b 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -16,3 +16,15 @@ export function isSignCommand(argv: any): boolean { (argv._.length > 1 && SIGN_COMMANDS.includes(argv._[1])) ); } + +export enum CommandType { + WARP_DEPLOY = 'warp:deploy', + WARP_SEND = 'warp:send', + WARP_APPLY = 'warp:apply', + WARP_READ = 'warp:read', + SEND_MESSAGE = 'send:message', + AGENT_KURTOSIS = 'deploy:kurtosis-agents', + STATUS = 'status:', + SUBMIT = 'submit:', + RELAYER = 'relayer:', +} diff --git a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts index 24260c1982..eb9fa135aa 100644 --- a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts +++ b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts @@ -1,19 +1,9 @@ +import { CommandType } from '../../../commands/signCommands.js'; + import { MultiChainResolver } from './MultiChainResolver.js'; import { SingleChainResolver } from './SingleChainResolver.js'; import { ChainResolver } from './types.js'; -enum CommandType { - WARP_DEPLOY = 'warp:deploy', - WARP_SEND = 'warp:send', - WARP_APPLY = 'warp:apply', - WARP_READ = 'warp:read', - SEND_MESSAGE = 'send:message', - AGENT_KURTOSIS = 'deploy:kurtosis-agents', - STATUS = 'status:', - SUBMIT = 'submit:', - RELAYER = 'relayer:', -} - /** * @class ChainResolverFactory * @description Intercepts commands to determine the appropriate chain resolver strategy based on command type. From e61baff3fc3d9235a99b3b4d3a443a316bfc2b07 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Mon, 25 Nov 2024 17:53:54 +0100 Subject: [PATCH 31/45] fix: passed key used for setting signer --- typescript/cli/src/context/context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 6f46be3061..0d1084fcc6 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -60,7 +60,7 @@ export async function contextMiddleware(argv: Record) { export async function signerMiddleware(argv: Record) { const { key, requiresKey, multiProvider, strategyPath } = argv.context; - if (!requiresKey) return argv; + if (!requiresKey && !key) return argv; const strategyConfig = await safeReadChainSubmissionStrategyConfig( strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, From 2d08d1ec6576370fe8885562b8c89c9da89381ec Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:19:51 +0330 Subject: [PATCH 32/45] Merge remote-tracking branch 'origin/main' into feat/key-command --- .changeset/bright-students-exist.md | 5 + .changeset/empty-dodos-clap.md | 6 + .changeset/funny-elephants-pretend.md | 5 - .changeset/mighty-panthers-play.md | 5 - .changeset/nice-elephants-heal.md | 5 - .changeset/odd-frogs-move.md | 5 - .changeset/polite-kings-warn.md | 5 - .changeset/rare-llamas-float.md | 7 - .changeset/real-phones-bake.md | 7 - .changeset/shaggy-countries-kick.md | 5 - .changeset/spotty-pumpkins-buy.md | 5 + .changeset/strange-poems-build.md | 6 - .changeset/yellow-baboons-kneel.md | 5 + .codespell/ignore.txt | 1 + .eslintignore | 4 - .eslintrc | 65 - .github/workflows/test.yml | 36 +- .registryrc | 2 +- .syncpackrc | 3 + eslint.config.mjs | 115 + package.json | 13 +- rust/main/Cargo.lock | 53 +- rust/main/Cargo.toml | 36 +- rust/main/agents/relayer/src/relayer.rs | 3 + rust/main/agents/scraper/src/agent.rs | 3 + rust/main/agents/validator/src/validator.rs | 1 + .../hyperlane-sealevel/src/interchain_gas.rs | 46 +- .../chains/hyperlane-sealevel/src/mailbox.rs | 82 +- .../hyperlane-sealevel/src/rpc/client.rs | 7 +- .../src/rpc/client/tests.rs | 14 + rust/main/config/mainnet_config.json | 406 +- rust/main/hyperlane-base/src/settings/base.rs | 15 +- .../hyperlane-base/src/settings/chains.rs | 72 +- .../hyperlane-base/src/settings/signers.rs | 7 +- rust/rust-toolchain | 3 - rust/sealevel/Cargo.lock | 121 +- rust/sealevel/Cargo.toml | 35 +- rust/sealevel/client/src/cmd_utils.rs | 21 +- rust/sealevel/client/src/core.rs | 22 +- .../apxETH-eclipse-ethereum/program-ids.json | 10 + .../apxETH-eclipse-ethereum/token-config.json | 17 + .../ezSOL-eclipse-solana/program-ids.json | 10 + .../ezSOL-eclipse-solana/token-config.json | 17 + rust/sealevel/libraries/test-utils/src/igp.rs | 2 +- rust/sealevel/rust-toolchain | 2 +- solidity/CHANGELOG.md | 7 + solidity/contracts/PackageVersioned.sol | 2 +- solidity/package.json | 8 +- typescript/ccip-server/.eslintrc | 6 - typescript/ccip-server/CHANGELOG.md | 2 + typescript/ccip-server/eslint.config.mjs | 17 + typescript/ccip-server/package.json | 11 +- typescript/ccip-server/src/server.ts | 14 +- .../src/services/LightClientService.ts | 4 +- .../ccip-server/src/services/ProofsService.ts | 8 +- typescript/ccip-server/tsconfig.json | 9 + typescript/cli/.eslintignore | 2 - typescript/cli/.eslintrc | 6 - typescript/cli/.mocharc-e2e.json | 1 - typescript/cli/CHANGELOG.md | 18 + typescript/cli/eslint.config.mjs | 20 + typescript/cli/package.json | 23 +- typescript/cli/scripts/run-e2e-test.sh | 7 +- typescript/cli/src/avs/check.ts | 2 +- typescript/cli/src/check/warp.ts | 1 - typescript/cli/src/commands/relayer.ts | 2 +- typescript/cli/src/commands/warp.ts | 2 +- typescript/cli/src/config/agent.ts | 2 +- typescript/cli/src/config/submit.ts | 9 +- typescript/cli/src/deploy/core.ts | 2 +- typescript/cli/src/deploy/dry-run.ts | 3 +- typescript/cli/src/deploy/utils.ts | 4 - typescript/cli/src/deploy/warp.ts | 32 +- typescript/cli/src/read/warp.ts | 2 +- typescript/cli/src/status/message.ts | 2 +- typescript/cli/src/utils/balances.ts | 8 +- typescript/cli/src/utils/env.ts | 2 +- typescript/cli/src/utils/files.ts | 6 +- typescript/cli/src/utils/input.ts | 50 +- typescript/cli/src/utils/warp.ts | 35 + .../cli/src/validator/preFlightCheck.ts | 4 +- typescript/cli/src/version.ts | 2 +- typescript/github-proxy/CHANGELOG.md | 2 + typescript/github-proxy/package.json | 4 +- typescript/helloworld/.eslintignore | 5 - typescript/helloworld/.eslintrc | 39 - typescript/helloworld/CHANGELOG.md | 13 + typescript/helloworld/eslint.config.mjs | 17 + typescript/helloworld/package.json | 23 +- typescript/infra/CHANGELOG.md | 19 + .../config/environments/mainnet3/agent.ts | 50 +- .../mainnet3/aw-validators/hyperlane.json | 18 + .../mainnet3/core/verification.json | 420 + .../config/environments/mainnet3/funding.ts | 9 +- .../environments/mainnet3/gasPrices.json | 64 +- .../mainnet3/ism/verification.json | 516 + .../middleware/accounts/verification.json | 126 + .../misc-artifacts/aave-sender-addresses.json | 38 + .../merkly-erc20-addresses.json | 0 .../merkly-eth-addresses.json | 0 .../merkly-nft-addresses.json | 0 .../velo-message-module-addresses.json | 14 + .../velo-token-bridge-addresses.json | 14 + .../mainnet3/supportedChainNames.ts | 6 + .../environments/mainnet3/tokenPrices.json | 174 +- .../environments/mainnet3/validators.ts | 62 + .../getAncient8EthereumUSDCWarpConfig.ts | 16 +- ...bitrumEthereumZircuitAmphrETHWarpConfig.ts | 27 +- .../getArbitrumNeutronEclipWarpConfig.ts | 20 +- .../getArbitrumNeutronTiaWarpConfig.ts | 14 +- .../getEclipseEthereumApxETHWarpConfig.ts | 46 + .../getEclipseEthereumSolanaUSDCWarpConfig.ts | 3 +- .../getEclipseEthereumSolanaUSDTWarpConfig.ts | 15 +- .../getEclipseEthereumTETHWarpConfig.ts | 4 +- .../getEclipseEthereumWBTCWarpConfig.ts | 15 +- .../getEclipseEthereumWeETHsWarpConfig.ts | 28 +- .../getEclipseStrideSTTIAWarpConfig.ts | 16 +- .../getEclipseStrideTIAWarpConfig.ts | 16 +- .../getEthereumBscLumiaLUMIAWarpConfig.ts | 51 +- .../getEthereumFlowCbBTCWarpConfig.ts | 47 + .../getEthereumInevmUSDCWarpConfig.ts | 12 +- .../getEthereumInevmUSDTWarpConfig.ts | 12 +- .../getEthereumSeiFastUSDWarpConfig.ts | 22 +- .../getEthereumVictionETHWarpConfig.ts | 9 +- .../getEthereumVictionUSDCWarpConfig.ts | 12 +- .../getEthereumVictionUSDTWarpConfig.ts | 12 +- .../getInevmInjectiveINJWarpConfig.ts | 11 +- .../getMantapacificNeutronTiaWarpConfig.ts | 8 +- .../environments/mainnet3/warp/consts.ts | 2 + .../environments/mainnet3/warp/warpIds.ts | 4 + typescript/infra/config/warp.ts | 44 +- .../helm/warp-routes/templates/_helpers.tpl | 2 +- typescript/infra/package.json | 28 +- typescript/infra/scripts/agent-utils.ts | 41 +- typescript/infra/scripts/agents/utils.ts | 10 +- typescript/infra/scripts/check/check-utils.ts | 7 +- .../infra/scripts/check/check-warp-deploy.ts | 7 + .../funding/fund-keys-from-deployer.ts | 6 +- .../infra/scripts/{ => keys}/create-keys.ts | 5 +- .../infra/scripts/{ => keys}/delete-keys.ts | 5 +- .../scripts/{ => keys}/get-key-addresses.ts | 7 +- typescript/infra/scripts/keys/get-key.ts | 38 + .../infra/scripts/{ => keys}/get-owner-ica.ts | 9 +- .../infra/scripts/{ => keys}/rotate-key.ts | 2 +- .../infra/scripts/{ => keys}/update-key.ts | 2 +- .../infra/scripts/safes/get-pending-txs.ts | 202 + typescript/infra/scripts/safes/parse-txs.ts | 68 + .../warp-routes/deploy-warp-monitor.ts | 17 +- .../warp-routes/generate-warp-config.ts | 2 +- .../scripts/warp-routes/monitor/metrics.ts | 22 +- .../monitor/monitor-warp-route-balances.ts | 17 +- typescript/infra/src/config/agent/relayer.ts | 12 + typescript/infra/src/config/environment.ts | 10 + typescript/infra/src/config/warp.ts | 15 +- .../infra/src/tx/govern-transaction-reader.ts | 531 + typescript/infra/src/utils/safe.ts | 81 +- typescript/infra/src/warp/helm.ts | 2 +- typescript/infra/test/warpIds.test.ts | 6 +- typescript/sdk/.eslintrc | 7 - typescript/sdk/CHANGELOG.md | 17 + typescript/sdk/eslint.config.mjs | 25 + typescript/sdk/package.json | 27 +- typescript/sdk/src/consts/.eslintrc | 5 - typescript/sdk/src/consts/multisigIsm.ts | 30 + .../sdk/src/consts/multisigIsmVerifyCosts.ts | 1 - .../sdk/src/core/CoreDeployer.hardhat-test.ts | 4 +- typescript/sdk/src/core/EvmCoreModule.ts | 5 +- typescript/sdk/src/core/HyperlaneRelayer.ts | 8 +- typescript/sdk/src/core/schemas.ts | 4 +- .../sdk/src/deploy/HyperlaneDeployer.ts | 2 +- typescript/sdk/src/deploy/verify/.eslintrc | 5 - .../sdk/src/deploy/verify/ContractVerifier.ts | 2 +- .../sdk/src/gas/adapters/serialization.ts | 1 - typescript/sdk/src/gas/types.ts | 2 +- .../src/hook/EvmHookModule.hardhat-test.ts | 1 - typescript/sdk/src/hook/EvmHookModule.ts | 2 +- typescript/sdk/src/hook/EvmHookReader.test.ts | 1 - typescript/sdk/src/hook/EvmHookReader.ts | 4 +- typescript/sdk/src/hook/schemas.ts | 96 - typescript/sdk/src/hook/types.ts | 97 +- typescript/sdk/src/index.ts | 15 +- .../sdk/src/ism/EvmIsmModule.hardhat-test.ts | 1 - typescript/sdk/src/ism/EvmIsmModule.ts | 2 +- typescript/sdk/src/ism/EvmIsmReader.ts | 8 +- typescript/sdk/src/ism/HyperlaneIsmFactory.ts | 2 +- .../sdk/src/ism/metadata/aggregation.ts | 7 +- .../ism/metadata/arbL2ToL1.hardhat-test.ts | 10 +- typescript/sdk/src/ism/metadata/arbL2ToL1.ts | 2 +- .../src/ism/metadata/builder.hardhat-test.ts | 6 +- typescript/sdk/src/ism/metadata/builder.ts | 86 +- typescript/sdk/src/ism/metadata/decode.ts | 41 + typescript/sdk/src/ism/metadata/multisig.ts | 2 +- typescript/sdk/src/ism/metadata/null.ts | 2 +- typescript/sdk/src/ism/metadata/routing.ts | 9 +- typescript/sdk/src/ism/metadata/types.ts | 32 + typescript/sdk/src/ism/schemas.ts | 103 - .../ism/{schemas.test.ts => types.test.ts} | 3 +- typescript/sdk/src/ism/types.ts | 110 +- typescript/sdk/src/ism/utils.ts | 2 +- .../src/metadata/chainMetadataConversion.ts | 98 + .../src/middleware/liquidity-layer/.eslintrc | 5 - .../liquidity-layer/LiquidityLayerApp.ts | 27 +- .../providers/SmartProvider/SmartProvider.ts | 4 +- .../submitter/builder/TxSubmitterBuilder.ts | 3 +- typescript/sdk/src/router/schemas.ts | 45 - typescript/sdk/src/router/types.ts | 49 +- .../token/EvmERC20WarpModule.hardhat-test.ts | 19 +- .../sdk/src/token/EvmERC20WarpModule.ts | 85 +- .../sdk/src/token/EvmERC20WarpRouteReader.ts | 2 +- typescript/sdk/src/token/Token.ts | 6 +- .../adapters/CosmWasmTokenAdapter.test.ts | 2 - .../sdk/src/token/adapters/EvmTokenAdapter.ts | 19 +- typescript/sdk/src/token/checker.ts | 2 +- typescript/sdk/src/token/deploy.ts | 1 - typescript/sdk/src/token/schemas.ts | 2 +- typescript/sdk/src/utils/.eslintrc | 5 - typescript/sdk/src/utils/gnosisSafe.js | 2 +- typescript/sdk/src/utils/ism.ts | 2 +- typescript/sdk/src/utils/logUtils.ts | 2 +- .../sdk/src/utils/sealevelSerialization.ts | 1 - typescript/sdk/src/utils/viem.ts | 29 - typescript/utils/CHANGELOG.md | 6 + typescript/utils/eslint.config.mjs | 3 + typescript/utils/package.json | 12 +- typescript/utils/src/addresses.ts | 12 +- typescript/utils/src/amount.ts | 2 +- typescript/utils/src/base64.ts | 4 +- typescript/utils/src/big-numbers.ts | 4 +- typescript/utils/src/env.ts | 2 +- typescript/utils/src/index.ts | 2 + typescript/utils/src/strings.ts | 4 + typescript/utils/src/url.ts | 4 +- typescript/widgets/.eslintignore | 6 - typescript/widgets/.eslintrc | 16 - typescript/widgets/.storybook/main.ts | 5 + typescript/widgets/CHANGELOG.md | 25 + typescript/widgets/eslint.config.mjs | 40 + typescript/widgets/mg.eslint.config.mjs | 38 + typescript/widgets/package.json | 39 +- .../widgets/src/chains/ChainAddMenu.tsx | 5 +- .../widgets/src/chains/ChainDetailsMenu.tsx | 2 +- typescript/widgets/src/chains/ChainLogo.tsx | 5 +- .../widgets/src/chains/ChainSearchMenu.tsx | 14 +- typescript/widgets/src/components/Button.tsx | 2 +- .../widgets/src/components/ErrorBoundary.tsx | 3 +- .../widgets/src/components/IconButton.tsx | 2 +- .../widgets/src/components/LinkButton.tsx | 2 +- .../widgets/src/components/SearchMenu.tsx | 11 +- .../widgets/src/components/TextInput.tsx | 4 +- typescript/widgets/src/icons/Web.tsx | 4 +- typescript/widgets/src/index.ts | 66 +- .../widgets/src/layout/DropdownMenu.tsx | 2 +- typescript/widgets/src/layout/Modal.tsx | 2 +- typescript/widgets/src/layout/Popover.tsx | 2 +- typescript/widgets/src/logger.ts | 3 + typescript/widgets/src/logos/Cosmos.tsx | 40 + typescript/widgets/src/logos/Ethereum.tsx | 27 + typescript/widgets/src/logos/Solana.tsx | 63 + .../widgets/src/logos/WalletConnect.tsx | 33 + typescript/widgets/src/logos/protocols.ts | 16 + typescript/widgets/src/messages/useMessage.ts | 11 +- .../widgets/src/messages/useMessageStage.ts | 15 +- .../MultiProtocolWalletModal.stories.tsx | 124 + typescript/widgets/src/utils/clipboard.ts | 6 +- typescript/widgets/src/utils/explorers.ts | 6 +- .../src/utils/useChainConnectionTest.ts | 2 +- .../src/walletIntegrations/AccountList.tsx | 143 + .../ConnectWalletButton.tsx | 115 + .../MultiProtocolWalletModal.tsx | 86 + .../src/walletIntegrations/WalletLogo.tsx | 24 + .../widgets/src/walletIntegrations/cosmos.ts | 208 + .../src/walletIntegrations/ethereum.ts | 169 + .../src/walletIntegrations/multiProtocol.tsx | 256 + .../widgets/src/walletIntegrations/solana.ts | 138 + .../widgets/src/walletIntegrations/types.ts | 48 + .../widgets/src/walletIntegrations/utils.ts | 56 + typescript/widgets/tailwind.config.cjs | 1 + yarn.lock | 8625 +++++++++++++---- 278 files changed, 13111 insertions(+), 3556 deletions(-) create mode 100644 .changeset/bright-students-exist.md create mode 100644 .changeset/empty-dodos-clap.md delete mode 100644 .changeset/funny-elephants-pretend.md delete mode 100644 .changeset/mighty-panthers-play.md delete mode 100644 .changeset/nice-elephants-heal.md delete mode 100644 .changeset/odd-frogs-move.md delete mode 100644 .changeset/polite-kings-warn.md delete mode 100644 .changeset/rare-llamas-float.md delete mode 100644 .changeset/real-phones-bake.md delete mode 100644 .changeset/shaggy-countries-kick.md create mode 100644 .changeset/spotty-pumpkins-buy.md delete mode 100644 .changeset/strange-poems-build.md create mode 100644 .changeset/yellow-baboons-kneel.md delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 .syncpackrc create mode 100644 eslint.config.mjs create mode 100644 rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs delete mode 100644 rust/rust-toolchain create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json delete mode 100644 typescript/ccip-server/.eslintrc create mode 100644 typescript/ccip-server/eslint.config.mjs create mode 100644 typescript/ccip-server/tsconfig.json delete mode 100644 typescript/cli/.eslintignore delete mode 100644 typescript/cli/.eslintrc create mode 100644 typescript/cli/eslint.config.mjs create mode 100644 typescript/cli/src/utils/warp.ts delete mode 100644 typescript/helloworld/.eslintignore delete mode 100644 typescript/helloworld/.eslintrc create mode 100644 typescript/helloworld/eslint.config.mjs create mode 100644 typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json rename typescript/infra/config/environments/mainnet3/{warp/artifacts => misc-artifacts}/merkly-erc20-addresses.json (100%) rename typescript/infra/config/environments/mainnet3/{warp/artifacts => misc-artifacts}/merkly-eth-addresses.json (100%) rename typescript/infra/config/environments/mainnet3/{warp/artifacts => misc-artifacts}/merkly-nft-addresses.json (100%) create mode 100644 typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json create mode 100644 typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/consts.ts rename typescript/infra/scripts/{ => keys}/create-keys.ts (61%) rename typescript/infra/scripts/{ => keys}/delete-keys.ts (58%) rename typescript/infra/scripts/{ => keys}/get-key-addresses.ts (80%) create mode 100644 typescript/infra/scripts/keys/get-key.ts rename typescript/infra/scripts/{ => keys}/get-owner-ica.ts (92%) rename typescript/infra/scripts/{ => keys}/rotate-key.ts (97%) rename typescript/infra/scripts/{ => keys}/update-key.ts (97%) create mode 100644 typescript/infra/scripts/safes/get-pending-txs.ts create mode 100644 typescript/infra/scripts/safes/parse-txs.ts create mode 100644 typescript/infra/src/tx/govern-transaction-reader.ts delete mode 100644 typescript/sdk/.eslintrc create mode 100644 typescript/sdk/eslint.config.mjs delete mode 100644 typescript/sdk/src/consts/.eslintrc delete mode 100644 typescript/sdk/src/deploy/verify/.eslintrc delete mode 100644 typescript/sdk/src/hook/schemas.ts create mode 100644 typescript/sdk/src/ism/metadata/decode.ts create mode 100644 typescript/sdk/src/ism/metadata/types.ts delete mode 100644 typescript/sdk/src/ism/schemas.ts rename typescript/sdk/src/ism/{schemas.test.ts => types.test.ts} (85%) create mode 100644 typescript/sdk/src/metadata/chainMetadataConversion.ts delete mode 100644 typescript/sdk/src/middleware/liquidity-layer/.eslintrc delete mode 100644 typescript/sdk/src/router/schemas.ts delete mode 100644 typescript/sdk/src/utils/.eslintrc delete mode 100644 typescript/sdk/src/utils/viem.ts create mode 100644 typescript/utils/eslint.config.mjs delete mode 100644 typescript/widgets/.eslintignore delete mode 100644 typescript/widgets/.eslintrc create mode 100644 typescript/widgets/eslint.config.mjs create mode 100644 typescript/widgets/mg.eslint.config.mjs create mode 100644 typescript/widgets/src/logger.ts create mode 100644 typescript/widgets/src/logos/Cosmos.tsx create mode 100644 typescript/widgets/src/logos/Ethereum.tsx create mode 100644 typescript/widgets/src/logos/Solana.tsx create mode 100644 typescript/widgets/src/logos/WalletConnect.tsx create mode 100644 typescript/widgets/src/logos/protocols.ts create mode 100644 typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx create mode 100644 typescript/widgets/src/walletIntegrations/AccountList.tsx create mode 100644 typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx create mode 100644 typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx create mode 100644 typescript/widgets/src/walletIntegrations/WalletLogo.tsx create mode 100644 typescript/widgets/src/walletIntegrations/cosmos.ts create mode 100644 typescript/widgets/src/walletIntegrations/ethereum.ts create mode 100644 typescript/widgets/src/walletIntegrations/multiProtocol.tsx create mode 100644 typescript/widgets/src/walletIntegrations/solana.ts create mode 100644 typescript/widgets/src/walletIntegrations/types.ts create mode 100644 typescript/widgets/src/walletIntegrations/utils.ts diff --git a/.changeset/bright-students-exist.md b/.changeset/bright-students-exist.md new file mode 100644 index 0000000000..84833ecaea --- /dev/null +++ b/.changeset/bright-students-exist.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Support using the CLI to deploy warp routes that involve foreign deployments diff --git a/.changeset/empty-dodos-clap.md b/.changeset/empty-dodos-clap.md new file mode 100644 index 0000000000..cd2826f718 --- /dev/null +++ b/.changeset/empty-dodos-clap.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/cli': minor +'@hyperlane-xyz/sdk': minor +--- + +Remove ismFactoryAddresses from warpConfig diff --git a/.changeset/funny-elephants-pretend.md b/.changeset/funny-elephants-pretend.md deleted file mode 100644 index 9de7ff40be..0000000000 --- a/.changeset/funny-elephants-pretend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Updated Fraxtal set to include Superlane validators, updated Flow set diff --git a/.changeset/mighty-panthers-play.md b/.changeset/mighty-panthers-play.md deleted file mode 100644 index ef054787bf..0000000000 --- a/.changeset/mighty-panthers-play.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Enroll new validators for alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet, flame, prom, inevm. diff --git a/.changeset/nice-elephants-heal.md b/.changeset/nice-elephants-heal.md deleted file mode 100644 index d186955c49..0000000000 --- a/.changeset/nice-elephants-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': minor ---- - -Add an isRelativeUrl function diff --git a/.changeset/odd-frogs-move.md b/.changeset/odd-frogs-move.md deleted file mode 100644 index d99e99107b..0000000000 --- a/.changeset/odd-frogs-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Added helpers to Token and token adapters to get bridged supply of tokens" diff --git a/.changeset/polite-kings-warn.md b/.changeset/polite-kings-warn.md deleted file mode 100644 index 0a32d1ca16..0000000000 --- a/.changeset/polite-kings-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Add a validateZodResult util function diff --git a/.changeset/rare-llamas-float.md b/.changeset/rare-llamas-float.md deleted file mode 100644 index 337cdd5ebc..0000000000 --- a/.changeset/rare-llamas-float.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/widgets': minor ---- - -New Icons -Updated modal with new props -Updated storybook for modal and icon list diff --git a/.changeset/real-phones-bake.md b/.changeset/real-phones-bake.md deleted file mode 100644 index 589c4e012f..0000000000 --- a/.changeset/real-phones-bake.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/infra': minor -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Implements persistent relayer for use in CLI diff --git a/.changeset/shaggy-countries-kick.md b/.changeset/shaggy-countries-kick.md deleted file mode 100644 index 3d9a740629..0000000000 --- a/.changeset/shaggy-countries-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/widgets': minor ---- - -Add various utility hooks: useIsSsr, useTimeout, useDebounce, useInterval diff --git a/.changeset/spotty-pumpkins-buy.md b/.changeset/spotty-pumpkins-buy.md new file mode 100644 index 0000000000..2d8f0fcb3a --- /dev/null +++ b/.changeset/spotty-pumpkins-buy.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/utils': minor +--- + +Add toUpperCamelCase and deepFind functionss diff --git a/.changeset/strange-poems-build.md b/.changeset/strange-poems-build.md deleted file mode 100644 index ffb1f8f238..0000000000 --- a/.changeset/strange-poems-build.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/widgets': minor ---- - -Props and style update: IconButton and Tooltip -New Icons: XCircleIcon and SwapIcon diff --git a/.changeset/yellow-baboons-kneel.md b/.changeset/yellow-baboons-kneel.md new file mode 100644 index 0000000000..7a7ab64578 --- /dev/null +++ b/.changeset/yellow-baboons-kneel.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Add decodeIsmMetadata function diff --git a/.codespell/ignore.txt b/.codespell/ignore.txt index 85cd6f56a9..ec0437cb91 100644 --- a/.codespell/ignore.txt +++ b/.codespell/ignore.txt @@ -5,3 +5,4 @@ receivedFrom ser readded re-use +superseed diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 4d284e827e..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -dist -coverage -*.cts \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index a23e3c2f93..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,65 +0,0 @@ -{ - "env": { - "node": true, - "browser": true, - "es2021": true - }, - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint","jest"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "no-console": ["error"], - "no-eval": ["error"], - "no-extra-boolean-cast": ["error"], - "no-ex-assign": ["error"], - "no-constant-condition": ["off"], - "no-return-await": ["error"], - "no-restricted-imports": ["error", { - "name": "console", - "message": "Please use a logger and/or the utils' package assert" - }, { - "name": "fs", - "message": "Avoid use of node-specific libraries" - }], - "guard-for-in": ["error"], - "@typescript-eslint/ban-ts-comment": ["off"], - "@typescript-eslint/explicit-module-boundary-types": ["off"], - "@typescript-eslint/no-explicit-any": ["off"], - "@typescript-eslint/no-floating-promises": ["error"], - "@typescript-eslint/no-non-null-assertion": ["off"], - "@typescript-eslint/no-require-imports": ["warn"], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - "@typescript-eslint/ban-types": [ - "error", - { - "types": { - // Unban the {} type which is a useful shorthand for non-nullish value - "{}": false - }, - "extendDefaults": true - } - ], - "jest/no-disabled-tests": "warn", - "jest/no-focused-tests": "error", - "jest/no-identical-title": "error", - "jest/prefer-to-have-length": "warn", - "jest/valid-expect": "error" - } -} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b780d6585d..664f93612a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,6 +54,10 @@ jobs: exit 1 fi + # Check for mismatched dep versions across the monorepo + - name: syncpack + run: yarn syncpack list-mismatches + lint-prettier: runs-on: ubuntu-latest needs: [yarn-install] @@ -72,6 +76,12 @@ jobs: .yarn key: ${{ runner.os }}-yarn-4.5.1-cache-${{ hashFiles('./yarn.lock') }} fail-on-cache-miss: true + + # Build required before linting or the intra-monorepo package cycle checking won't work + - name: yarn-build + uses: ./.github/actions/yarn-build-with-cache + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: lint run: yarn lint @@ -109,9 +119,18 @@ jobs: - name: Unit Tests run: yarn test:ci - cli-e2e: + cli-e2e-matrix: runs-on: ubuntu-latest needs: [yarn-install] + strategy: + fail-fast: false + matrix: + test: + - core + - relay + - warp-read + - warp-apply + - warp-deploy steps: - uses: actions/checkout@v4 with: @@ -130,8 +149,21 @@ jobs: - name: Checkout registry uses: ./.github/actions/checkout-registry - - name: CLI e2e tests + - name: CLI e2e tests (${{ matrix.test }}) run: yarn --cwd typescript/cli test:e2e + env: + CLI_E2E_TEST: ${{ matrix.test }} + + cli-e2e: + runs-on: ubuntu-latest + needs: cli-e2e-matrix + if: always() + steps: + - name: Check cli-e2e matrix status + if: ${{ needs.cli-e2e-matrix.result != 'success' }} + run: | + echo "CLI E2E tests failed" + exit 1 agent-configs: runs-on: ubuntu-latest diff --git a/.registryrc b/.registryrc index 9f4316497a..01f6449ff0 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -3e366eae1d49da4270695b157d7af00bb761156a +385b83950adba6f033be836b627bab7d89aae38d diff --git a/.syncpackrc b/.syncpackrc new file mode 100644 index 0000000000..7c4fd6c9d4 --- /dev/null +++ b/.syncpackrc @@ -0,0 +1,3 @@ +{ + "dependencyTypes": ["prod", "dev"] +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..3be951d450 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,115 @@ +import { FlatCompat } from '@eslint/eslintrc'; +import js from '@eslint/js'; +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import importPlugin from 'eslint-plugin-import'; +import jest from 'eslint-plugin-jest'; +import globals from 'globals'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +export const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + { + ignores: [ + '**/node_modules', + '**/dist', + '**/coverage', + '**/*.cjs', + '**/*.cts', + '**/*.mjs', + 'jest.config.js', + ], + }, + ...compat.extends( + 'eslint:recommended', + 'plugin:import/recommended', + 'plugin:import/typescript', + 'plugin:@typescript-eslint/recommended', + 'prettier', + ), + { + plugins: { + import: importPlugin, + '@typescript-eslint': typescriptEslint, + jest, + }, + + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, + + parser: tsParser, + ecmaVersion: 12, + sourceType: 'module', + + parserOptions: { + project: './tsconfig.json', + }, + }, + + settings: { + 'import/resolver': { + typescript: true, + node: true, + }, + }, + + rules: { + 'guard-for-in': ['error'], + 'import/no-cycle': ['error'], + 'import/no-self-import': ['error'], + 'import/no-named-as-default-member': ['off'], + 'no-console': ['error'], + 'no-eval': ['error'], + 'no-extra-boolean-cast': ['error'], + 'no-ex-assign': ['error'], + 'no-constant-condition': ['off'], + 'no-return-await': ['error'], + + 'no-restricted-imports': [ + 'error', + { + name: 'console', + message: 'Please use a logger and/or the utils package assert', + }, + { + name: 'fs', + message: 'Avoid use of node-specific libraries', + }, + ], + + '@typescript-eslint/ban-ts-comment': ['off'], + '@typescript-eslint/explicit-module-boundary-types': ['off'], + '@typescript-eslint/no-explicit-any': ['off'], + '@typescript-eslint/no-floating-promises': ['error'], + '@typescript-eslint/no-non-null-assertion': ['off'], + '@typescript-eslint/no-require-imports': ['warn'], + '@typescript-eslint/no-unused-expressions': ['off'], + '@typescript-eslint/no-empty-object-type': ['off'], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + + 'jest/no-disabled-tests': 'warn', + 'jest/no-focused-tests': 'error', + 'jest/no-identical-title': 'error', + 'jest/prefer-to-have-length': 'warn', + 'jest/valid-expect': 'error', + }, + }, +]; diff --git a/package.json b/package.json index 2a2400e965..92d5b4b5d2 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,20 @@ "description": "A yarn workspace of core Hyperlane packages", "version": "0.0.0", "devDependencies": { + "@eslint/js": "^9.15.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", - "eslint": "^8.57.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.2.0", "husky": "^8.0.0", "lint-staged": "^12.4.3", "prettier": "^2.8.8", - "tsx": "^4.7.1" + "syncpack": "^13.0.0", + "tsx": "^4.19.1" }, "dependencies": { "@changesets/cli": "^2.26.2" @@ -41,6 +45,7 @@ "async": "^2.6.4", "fetch-ponyfill": "^7.1", "flat": "^5.0.2", + "globals": "^14.0.0", "lodash": "^4.17.21", "recursive-readdir": "^2.2.3", "underscore": "^1.13", diff --git a/rust/main/Cargo.lock b/rust/main/Cargo.lock index 6dfcb67cee..28f0f74c2c 100644 --- a/rust/main/Cargo.lock +++ b/rust/main/Cargo.lock @@ -2564,7 +2564,8 @@ dependencies = [ [[package]] name = "ed25519-dalek" version = "1.0.1" -source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek 3.2.2", "ed25519 1.5.3", @@ -8353,7 +8354,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -8377,7 +8378,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "bytemuck", @@ -8397,7 +8398,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "chrono", "clap 2.34.0", @@ -8414,7 +8415,7 @@ dependencies = [ [[package]] name = "solana-cli-config" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "dirs-next", "lazy_static", @@ -8429,7 +8430,7 @@ dependencies = [ [[package]] name = "solana-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "async-mutex", "async-trait", @@ -8482,7 +8483,7 @@ dependencies = [ [[package]] name = "solana-config-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "chrono", @@ -8495,7 +8496,7 @@ dependencies = [ [[package]] name = "solana-faucet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -8518,7 +8519,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash 0.7.8", "blake3", @@ -8551,7 +8552,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -8562,7 +8563,7 @@ dependencies = [ [[package]] name = "solana-logger" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "env_logger", "lazy_static", @@ -8572,7 +8573,7 @@ dependencies = [ [[package]] name = "solana-measure" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "solana-sdk", @@ -8581,7 +8582,7 @@ dependencies = [ [[package]] name = "solana-metrics" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "gethostname", @@ -8594,7 +8595,7 @@ dependencies = [ [[package]] name = "solana-net-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "clap 3.2.25", @@ -8615,7 +8616,7 @@ dependencies = [ [[package]] name = "solana-perf" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash 0.7.8", "bincode", @@ -8641,7 +8642,7 @@ dependencies = [ [[package]] name = "solana-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -8689,7 +8690,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -8715,7 +8716,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "lazy_static", "num_cpus", @@ -8724,7 +8725,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "console", "dialoguer", @@ -8742,7 +8743,7 @@ dependencies = [ [[package]] name = "solana-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "base64 0.13.1", @@ -8792,7 +8793,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bs58 0.4.0", "proc-macro2 1.0.86", @@ -8804,7 +8805,7 @@ dependencies = [ [[package]] name = "solana-streamer" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "futures-util", @@ -8832,7 +8833,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -8860,7 +8861,7 @@ dependencies = [ [[package]] name = "solana-version" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "rustc_version", @@ -8875,7 +8876,7 @@ dependencies = [ [[package]] name = "solana-vote-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -8895,7 +8896,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "aes-gcm-siv", "arrayref", diff --git a/rust/main/Cargo.toml b/rust/main/Cargo.toml index e9192b7f0f..0059867e13 100644 --- a/rust/main/Cargo.toml +++ b/rust/main/Cargo.toml @@ -126,24 +126,9 @@ sha2 = { version = "0.10.6", default-features = false } sha256 = "1.1.4" sha3 = "0.10" solana-account-decoder = "=1.14.13" -solana-banks-client = "=1.14.13" -solana-banks-interface = "=1.14.13" -solana-banks-server = "=1.14.13" -solana-clap-utils = "=1.14.13" -solana-cli-config = "=1.14.13" solana-client = "=1.14.13" -solana-program = "=1.14.13" -solana-program-test = "=1.14.13" solana-sdk = "=1.14.13" solana-transaction-status = "=1.14.13" -solana-zk-token-sdk = "=1.14.13" -spl-associated-token-account = { version = "=1.1.2", features = [ - "no-entrypoint", -] } -spl-noop = { version = "=0.1.3", features = ["no-entrypoint"] } -spl-token = { version = "=3.5.0", features = ["no-entrypoint"] } -spl-token-2022 = { version = "=0.5.0", features = ["no-entrypoint"] } -spl-type-length-value = "=0.1.0" static_assertions = "1.1" strum = "0.26.2" strum_macros = "0.26.2" @@ -239,11 +224,6 @@ branch = "v3.2.2-relax-zeroize" git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" version = "3.2.2" -[patch.crates-io.ed25519-dalek] -branch = "main" -git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" -version = "1.0.1" - [patch.crates-io.primitive-types] branch = "hyperlane" git = "https://github.com/hyperlane-xyz/parity-common.git" @@ -256,42 +236,42 @@ version = "=0.5.2" [patch.crates-io.solana-account-decoder] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-clap-utils] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-cli-config] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-transaction-status] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-zk-token-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.spl-associated-token-account] diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 1ac619792c..6bd1a63a8d 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -152,6 +152,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -166,6 +167,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -180,6 +182,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() diff --git a/rust/main/agents/scraper/src/agent.rs b/rust/main/agents/scraper/src/agent.rs index 97f6bd3db1..443d1c7fac 100644 --- a/rust/main/agents/scraper/src/agent.rs +++ b/rust/main/agents/scraper/src/agent.rs @@ -198,6 +198,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), store.into(), + true, ) .await .unwrap(); @@ -229,6 +230,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), Arc::new(store.clone()) as _, + true, ) .await .unwrap(); @@ -261,6 +263,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), Arc::new(store.clone()), + true, ) .await .unwrap(); diff --git a/rust/main/agents/validator/src/validator.rs b/rust/main/agents/validator/src/validator.rs index 2d09bd93ff..f7a8b43f59 100644 --- a/rust/main/agents/validator/src/validator.rs +++ b/rust/main/agents/validator/src/validator.rs @@ -109,6 +109,7 @@ impl BaseAgent for Validator { &metrics, &contract_sync_metrics, msg_db.clone().into(), + false, ) .await?; diff --git a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs index e415e9bc76..4d5e819de3 100644 --- a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs @@ -91,7 +91,8 @@ impl InterchainGasPaymaster for SealevelInterchainGasPaymaster {} pub struct SealevelInterchainGasPaymasterIndexer { rpc_client: SealevelRpcClient, igp: SealevelInterchainGasPaymaster, - _log_meta_composer: LogMetaComposer, + log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } /// IGP payment data on Sealevel @@ -107,6 +108,7 @@ impl SealevelInterchainGasPaymasterIndexer { pub async fn new( conf: &ConnectionConf, igp_account_locator: ContractLocator<'_>, + advanced_log_meta: bool, ) -> ChainResult { // Set the `processed` commitment at rpc level let rpc_client = SealevelRpcClient::new(conf.url.to_string()); @@ -122,7 +124,8 @@ impl SealevelInterchainGasPaymasterIndexer { Ok(Self { rpc_client, igp, - _log_meta_composer: log_meta_composer, + log_meta_composer, + advanced_log_meta, }) } @@ -168,23 +171,24 @@ impl SealevelInterchainGasPaymasterIndexer { gas_amount: gas_payment_account.gas_amount.into(), }; - // let log_meta = self - // .interchain_payment_log_meta( - // U256::from(sequence_number), - // &valid_payment_pda_pubkey, - // &gas_payment_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.igp.program_id.to_bytes().into(), - block_number: gas_payment_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: sequence_number.into(), + let log_meta = if self.advanced_log_meta { + self.interchain_payment_log_meta( + U256::from(sequence_number), + &valid_payment_pda_pubkey, + &gas_payment_account.slot, + ) + .await? + } else { + LogMeta { + address: self.igp.program_id.to_bytes().into(), + block_number: gas_payment_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: sequence_number.into(), + } }; Ok(SealevelGasPayment::new( @@ -212,7 +216,7 @@ impl SealevelInterchainGasPaymasterIndexer { Ok(expected_pubkey) } - async fn _interchain_payment_log_meta( + async fn interchain_payment_log_meta( &self, log_index: U256, payment_pda_pubkey: &Pubkey, @@ -220,7 +224,7 @@ impl SealevelInterchainGasPaymasterIndexer { ) -> ChainResult { let block = self.rpc_client.get_block(*payment_pda_slot).await?; - self._log_meta_composer + self.log_meta_composer .log_meta(block, log_index, payment_pda_pubkey, payment_pda_slot) .map_err(Into::::into) } diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index d376801fe0..cc88da72f0 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -648,10 +648,15 @@ pub struct SealevelMailboxIndexer { program_id: Pubkey, dispatch_message_log_meta_composer: LogMetaComposer, delivery_message_log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } impl SealevelMailboxIndexer { - pub fn new(conf: &ConnectionConf, locator: ContractLocator) -> ChainResult { + pub fn new( + conf: &ConnectionConf, + locator: ContractLocator, + advanced_log_meta: bool, + ) -> ChainResult { let program_id = Pubkey::from(<[u8; 32]>::from(locator.address)); let mailbox = SealevelMailbox::new(conf, locator, None)?; @@ -672,6 +677,7 @@ impl SealevelMailboxIndexer { mailbox, dispatch_message_log_meta_composer, delivery_message_log_meta_composer, + advanced_log_meta, }) } @@ -712,23 +718,24 @@ impl SealevelMailboxIndexer { let hyperlane_message = HyperlaneMessage::read_from(&mut &dispatched_message_account.encoded_message[..])?; - // let log_meta = self - // .dispatch_message_log_meta( - // U256::from(nonce), - // &valid_message_storage_pda_pubkey, - // &dispatched_message_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.program_id.to_bytes().into(), - block_number: dispatched_message_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: U256::zero(), + let log_meta = if self.advanced_log_meta { + self.dispatch_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &dispatched_message_account.slot, + ) + .await? + } else { + LogMeta { + address: self.program_id.to_bytes().into(), + block_number: dispatched_message_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: U256::zero(), + } }; Ok((hyperlane_message.into(), log_meta)) @@ -748,7 +755,7 @@ impl SealevelMailboxIndexer { Ok(expected_pubkey) } - async fn _dispatch_message_log_meta( + async fn dispatch_message_log_meta( &self, log_index: U256, message_storage_pda_pubkey: &Pubkey, @@ -805,23 +812,24 @@ impl SealevelMailboxIndexer { .into_inner(); let message_id = delivered_message_account.message_id; - // let log_meta = self - // .delivered_message_log_meta( - // U256::from(nonce), - // &valid_message_storage_pda_pubkey, - // &delivered_message_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.program_id.to_bytes().into(), - block_number: delivered_message_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: U256::zero(), + let log_meta = if self.advanced_log_meta { + self.delivered_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &delivered_message_account.slot, + ) + .await? + } else { + LogMeta { + address: self.program_id.to_bytes().into(), + block_number: delivered_message_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: U256::zero(), + } }; Ok((message_id.into(), log_meta)) @@ -839,7 +847,7 @@ impl SealevelMailboxIndexer { Ok(expected_pubkey) } - async fn _delivered_message_log_meta( + async fn delivered_message_log_meta( &self, log_index: U256, message_storage_pda_pubkey: &Pubkey, diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs index 6186bf31ee..4d557c0d16 100644 --- a/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client.rs @@ -112,14 +112,14 @@ impl SealevelRpcClient { Ok(balance.into()) } - pub async fn get_block(&self, height: u64) -> ChainResult { + pub async fn get_block(&self, slot: u64) -> ChainResult { let config = RpcBlockConfig { commitment: Some(CommitmentConfig::finalized()), max_supported_transaction_version: Some(0), ..Default::default() }; self.0 - .get_block_with_config(height, config) + .get_block_with_config(slot, config) .await .map_err(HyperlaneSealevelError::ClientError) .map_err(Into::into) @@ -273,3 +273,6 @@ impl std::fmt::Debug for SealevelRpcClient { f.write_str("RpcClient { ... }") } } + +#[cfg(test)] +mod tests; diff --git a/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs b/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs new file mode 100644 index 0000000000..81859559c2 --- /dev/null +++ b/rust/main/chains/hyperlane-sealevel/src/rpc/client/tests.rs @@ -0,0 +1,14 @@ +use crate::SealevelRpcClient; + +//#[tokio::test] +async fn _test_get_block() { + // given + let client = SealevelRpcClient::new("".to_string()); + + // when + let slot = 301337842; // block which requires latest version of solana-client + let result = client.get_block(slot).await; + + // then + assert!(result.is_ok()); +} diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index f0ea1a9ddd..284abb8233 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -1231,7 +1231,7 @@ "bech32Prefix": "inj", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/injective", + "apiUrl": "https://apis.mintscan.io/v1/injective", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/injective" @@ -1839,7 +1839,7 @@ "aggregationHook": "0xF6C1769d5390Be0f77080eF7791fBbA7eF4D5659", "blockExplorers": [ { - "apiUrl": "https://explorer.mintchain.io/api/eth-rpc", + "apiUrl": "https://explorer.mintchain.io/api", "family": "blockscout", "name": "Mint Explorer", "url": "https://explorer.mintchain.io" @@ -2042,7 +2042,7 @@ "bech32Prefix": "neutron", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/neutron", + "apiUrl": "https://apis.mintscan.io/v1/neutron", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/neutron" @@ -2180,7 +2180,7 @@ "bech32Prefix": "osmo", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/osmosis", + "apiUrl": "https://apis.mintscan.io/v1/osmosis", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/osmosis" @@ -4111,7 +4111,7 @@ "bech32Prefix": "stride", "blockExplorers": [ { - "apiUrl": "https://www.mintscan.io/stride", + "apiUrl": "https://apis.mintscan.io/v1/stride", "family": "other", "name": "Mintscan", "url": "https://www.mintscan.io/stride" @@ -5731,6 +5731,402 @@ "testRecipient": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "timelockController": "0x0000000000000000000000000000000000000000", "validatorAnnounce": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496" + }, + "boba": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/288/etherscan/api", + "family": "routescan", + "name": "bobascan", + "url": "https://bobascan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 288, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Boba Mainnet", + "domainId": 288, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "boba", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.boba.network" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x9c582a96B7350eEd313560Aeb9aBDff047aeaD36", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 10598389 + } + }, + "duckchain": { + "blockExplorers": [ + { + "apiUrl": "https://scan.duckchain.io/api", + "family": "blockscout", + "name": "DuckChain Explorer", + "url": "https://scan.duckchain.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 5545, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "DuckChain", + "domainId": 5545, + "gasCurrencyCoinGeckoId": "the-open-network", + "index": { + "from": 1149918 + }, + "name": "duckchain", + "nativeToken": { + "decimals": 18, + "name": "Toncoin", + "symbol": "TON" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.duckchain.io" + }, + { + "http": "https://rpc-hk.duckchain.io" + } + ], + "technicalStack": "arbitrumnitro", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x739800B825916456b55CF832A535eE253bC1f358", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e" + }, + "superseed": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.superseed.xyz/api", + "family": "blockscout", + "name": "Superseed Explorer", + "url": "https://explorer.superseed.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 5330, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superseed", + "domainId": 5330, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "superseed", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.superseed.xyz" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x9bdafD7aEd501B30f72b24Ce85d423eB77f51ba0", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 3010957 + } + }, + "unichain": { + "blockExplorers": [ + { + "apiUrl": "https://unichain.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Explorer", + "url": "https://unichain.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 130, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain", + "domainId": 130, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "unichain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.unichain.org" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0xce5718713f019b71F7d37058cD75d12e01dE2611", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 1453239 + } + }, + "vana": { + "blockExplorers": [ + { + "apiUrl": "https://vanascan.io/api/eth-rpc", + "family": "blockscout", + "name": "Vana Explorer", + "url": "https://vanascan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 1480, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Vana", + "domainId": 1480, + "gasCurrencyCoinGeckoId": "vana", + "name": "vana", + "nativeToken": { + "decimals": 18, + "name": "Vana", + "symbol": "VANA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.vana.org" + } + ], + "technicalStack": "other", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0xce5718713f019b71F7d37058cD75d12e01dE2611", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 629917 + } + }, + "bsquared": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.bsquared.network/api", + "family": "etherscan", + "name": "B² Network Explorer", + "url": "https://explorer.bsquared.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 223, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "B² Network", + "domainId": 223, + "gasCurrencyCoinGeckoId": "bitcoin", + "name": "bsquared", + "nativeToken": { + "decimals": 18, + "name": "Bitcoin", + "symbol": "BTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.bsquared.network" + }, + { + "http": "https://rpc.ankr.com/b2" + }, + { + "http": "https://mainnet.b2-rpc.com" + }, + { + "http": "https://b2-mainnet.alt.technology" + } + ], + "technicalStack": "other", + "aggregationHook": "0x03D610d916D5D274e4A31c026fd6884281A35d9C", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", + "interchainAccountIsm": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainAccountRouter": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", + "interchainGasPaymaster": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", + "interchainSecurityModule": "0x7dBb82188F553161d4B4ac3a2362Bff3a57e21D2", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "pausableHook": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "pausableIsm": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "protocolFee": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x7dBb82188F553161d4B4ac3a2362Bff3a57e21D2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", + "testRecipient": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "index": { + "from": 9687363 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/rust/main/hyperlane-base/src/settings/base.rs b/rust/main/hyperlane-base/src/settings/base.rs index 0320e4eb71..e32771b0e2 100644 --- a/rust/main/hyperlane-base/src/settings/base.rs +++ b/rust/main/hyperlane-base/src/settings/base.rs @@ -151,13 +151,14 @@ impl Settings { build_contract_fns!(build_validator_announce, build_validator_announces -> dyn ValidatorAnnounce); build_contract_fns!(build_provider, build_providers -> dyn HyperlaneProvider); - /// Build a contract sync for type `T` using log store `D` + /// Build a contract sync for type `T` using log store `S` pub async fn sequenced_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, @@ -166,7 +167,8 @@ impl Settings { { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), store.clone() as SequenceAwareLogStore<_>, @@ -175,13 +177,14 @@ impl Settings { ))) } - /// Build a contract sync for type `T` using log store `D` + /// Build a contract sync for type `T` using log store `S` pub async fn watermark_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, @@ -190,7 +193,8 @@ impl Settings { { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), store.clone() as WatermarkLogStore<_>, @@ -208,6 +212,7 @@ impl Settings { metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, stores: HashMap>, + advanced_log_meta: bool, ) -> Result>>> where T: Indexable + Debug + Send + Sync + Clone + Eq + Hash + 'static, @@ -227,6 +232,7 @@ impl Settings { metrics, sync_metrics, stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, @@ -236,6 +242,7 @@ impl Settings { metrics, sync_metrics, stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, diff --git a/rust/main/hyperlane-base/src/settings/chains.rs b/rust/main/hyperlane-base/src/settings/chains.rs index 0e08b2d156..33600418bb 100644 --- a/rust/main/hyperlane-base/src/settings/chains.rs +++ b/rust/main/hyperlane-base/src/settings/chains.rs @@ -33,7 +33,11 @@ use super::ChainSigner; #[async_trait] pub trait TryFromWithMetrics: Sized { /// Try to convert the chain configuration into the type - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result; + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result; } /// A chain setup is a domain ID, an address on that chain (where the mailbox is @@ -72,22 +76,38 @@ pub type MerkleTreeHookIndexer = Arc for MessageIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_message_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_message_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for DeliveryIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_delivery_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_delivery_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for IgpIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_interchain_gas_payment_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_interchain_gas_payment_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -95,8 +115,12 @@ impl TryFromWithMetrics for IgpIndexer { #[async_trait] impl TryFromWithMetrics for MerkleTreeHookIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_merkle_tree_hook_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_merkle_tree_hook_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -266,6 +290,7 @@ impl ChainConf { pub async fn build_message_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -284,7 +309,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -306,6 +335,7 @@ impl ChainConf { pub async fn build_delivery_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -324,7 +354,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -385,6 +419,7 @@ impl ChainConf { pub async fn build_interchain_gas_payment_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building IGP indexer"; let locator = self.locator(self.addresses.interchain_gas_paymaster); @@ -407,7 +442,12 @@ impl ChainConf { ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new( - h_sealevel::SealevelInterchainGasPaymasterIndexer::new(conf, locator).await?, + h_sealevel::SealevelInterchainGasPaymasterIndexer::new( + conf, + locator, + advanced_log_meta, + ) + .await?, ); Ok(indexer as Box>) } @@ -428,6 +468,7 @@ impl ChainConf { pub async fn build_merkle_tree_hook_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building merkle tree hook indexer"; let locator = self.locator(self.addresses.merkle_tree_hook); @@ -446,8 +487,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let mailbox_indexer = - Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let mailbox_indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); let indexer = Box::new(h_sealevel::SealevelMerkleTreeHookIndexer::new( *mailbox_indexer, )); diff --git a/rust/main/hyperlane-base/src/settings/signers.rs b/rust/main/hyperlane-base/src/settings/signers.rs index 459a6337be..4233a5c692 100644 --- a/rust/main/hyperlane-base/src/settings/signers.rs +++ b/rust/main/hyperlane-base/src/settings/signers.rs @@ -126,10 +126,9 @@ impl BuildableWithSignerConf for Keypair { if let SignerConf::HexKey { key } = conf { let secret = SecretKey::from_bytes(key.as_bytes()) .context("Invalid sealevel ed25519 secret key")?; - Ok( - Keypair::from_bytes(&ed25519_dalek::Keypair::from(secret).to_bytes()) - .context("Unable to create Keypair")?, - ) + let public = ed25519_dalek::PublicKey::from(&secret); + let dalek = ed25519_dalek::Keypair { secret, public }; + Ok(Keypair::from_bytes(&dalek.to_bytes()).context("Unable to create Keypair")?) } else { bail!(format!("{conf:?} key is not supported by sealevel")); } diff --git a/rust/rust-toolchain b/rust/rust-toolchain deleted file mode 100644 index 83e24cc566..0000000000 --- a/rust/rust-toolchain +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "1.72.1" -profile = "default" diff --git a/rust/sealevel/Cargo.lock b/rust/sealevel/Cargo.lock index 81beeb35b3..7462ad6c98 100644 --- a/rust/sealevel/Cargo.lock +++ b/rust/sealevel/Cargo.lock @@ -743,9 +743,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -1254,6 +1254,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.37", + "syn 2.0.77", +] + [[package]] name = "dialoguer" version = "0.10.4" @@ -1405,7 +1425,8 @@ dependencies = [ [[package]] name = "ed25519-dalek" version = "1.0.1" -source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek", "ed25519", @@ -2385,7 +2406,7 @@ dependencies = [ "bytes", "convert_case 0.6.0", "derive-new", - "derive_more", + "derive_more 0.99.17", "eyre", "fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "getrandom 0.2.15", @@ -4538,26 +4559,26 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" dependencies = [ "cfg-if", - "derive_more", + "derive_more 1.0.0", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2 1.0.86", "quote 1.0.37", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] @@ -4903,7 +4924,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -4927,7 +4948,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "bytemuck", @@ -4947,7 +4968,7 @@ dependencies = [ [[package]] name = "solana-banks-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "borsh", "futures", @@ -4963,7 +4984,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "serde", "solana-sdk", @@ -4973,7 +4994,7 @@ dependencies = [ [[package]] name = "solana-banks-server" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "crossbeam-channel", @@ -4992,7 +5013,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -5010,7 +5031,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "memmap2", @@ -5024,7 +5045,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "chrono", "clap 2.34.0", @@ -5041,7 +5062,7 @@ dependencies = [ [[package]] name = "solana-cli-config" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "dirs-next", "lazy_static", @@ -5056,7 +5077,7 @@ dependencies = [ [[package]] name = "solana-client" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "async-mutex", "async-trait", @@ -5109,7 +5130,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5118,7 +5139,7 @@ dependencies = [ [[package]] name = "solana-config-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "chrono", @@ -5131,7 +5152,7 @@ dependencies = [ [[package]] name = "solana-faucet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "byteorder", @@ -5154,7 +5175,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash", "blake3", @@ -5187,7 +5208,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "proc-macro2 1.0.86", "quote 1.0.37", @@ -5198,7 +5219,7 @@ dependencies = [ [[package]] name = "solana-logger" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "env_logger 0.9.3", "lazy_static", @@ -5208,7 +5229,7 @@ dependencies = [ [[package]] name = "solana-measure" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "solana-sdk", @@ -5217,7 +5238,7 @@ dependencies = [ [[package]] name = "solana-metrics" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "gethostname", @@ -5230,7 +5251,7 @@ dependencies = [ [[package]] name = "solana-net-utils" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "clap 3.2.25", @@ -5251,7 +5272,7 @@ dependencies = [ [[package]] name = "solana-perf" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "ahash", "bincode", @@ -5277,7 +5298,7 @@ dependencies = [ [[package]] name = "solana-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -5325,7 +5346,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "base64 0.13.1", "bincode", @@ -5351,7 +5372,7 @@ dependencies = [ [[package]] name = "solana-program-test" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "async-trait", @@ -5375,7 +5396,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "lazy_static", "num_cpus", @@ -5384,7 +5405,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "console", "dialoguer", @@ -5402,7 +5423,7 @@ dependencies = [ [[package]] name = "solana-runtime" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "arrayref", "bincode", @@ -5462,7 +5483,7 @@ dependencies = [ [[package]] name = "solana-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "assert_matches", "base64 0.13.1", @@ -5512,7 +5533,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bs58 0.4.0", "proc-macro2 1.0.86", @@ -5524,7 +5545,7 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "log", @@ -5538,7 +5559,7 @@ dependencies = [ [[package]] name = "solana-stake-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -5560,7 +5581,7 @@ dependencies = [ [[package]] name = "solana-streamer" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "crossbeam-channel", "futures-util", @@ -5588,7 +5609,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "Inflector", "base64 0.13.1", @@ -5616,7 +5637,7 @@ dependencies = [ [[package]] name = "solana-version" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "log", "rustc_version", @@ -5631,7 +5652,7 @@ dependencies = [ [[package]] name = "solana-vote-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bincode", "log", @@ -5651,7 +5672,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "bytemuck", "getrandom 0.1.16", @@ -5665,7 +5686,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" version = "1.14.13" -source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" +source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2024-11-20#913db71a07f967f4c5c7e7f747cb48517cdbf09e" dependencies = [ "aes-gcm-siv", "arrayref", @@ -6304,9 +6325,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.5.0", "toml_datetime", @@ -6943,9 +6964,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] diff --git a/rust/sealevel/Cargo.toml b/rust/sealevel/Cargo.toml index 5887dc8d17..145b9bfcc2 100644 --- a/rust/sealevel/Cargo.toml +++ b/rust/sealevel/Cargo.toml @@ -256,11 +256,6 @@ branch = "v3.2.2-relax-zeroize" git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" version = "3.2.2" -[patch.crates-io.ed25519-dalek] -branch = "main" -git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" -version = "1.0.1" - [patch.crates-io.primitive-types] branch = "hyperlane" git = "https://github.com/hyperlane-xyz/parity-common.git" @@ -273,62 +268,52 @@ version = "=0.5.2" [patch.crates-io.solana-account-decoder] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-banks-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" -version = "=1.14.13" - -[patch.crates-io.solana-banks-interface] -git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" -version = "=1.14.13" - -[patch.crates-io.solana-banks-server] -git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-clap-utils] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-cli-config] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-client] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-program-test] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-transaction-status] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.solana-zk-token-sdk] git = "https://github.com/hyperlane-xyz/solana.git" -tag = "hyperlane-1.14.13-2023-07-04" +tag = "hyperlane-1.14.13-2024-11-20" version = "=1.14.13" [patch.crates-io.spl-associated-token-account] diff --git a/rust/sealevel/client/src/cmd_utils.rs b/rust/sealevel/client/src/cmd_utils.rs index e0cd3ff686..f387d3c4fd 100644 --- a/rust/sealevel/client/src/cmd_utils.rs +++ b/rust/sealevel/client/src/cmd_utils.rs @@ -17,6 +17,23 @@ use solana_sdk::{ const SOLANA_DOMAIN: u32 = 1399811149; +pub(crate) fn get_compute_unit_price_micro_lamports_for_id(domain: u32) -> u64 { + get_compute_unit_price(domain == SOLANA_DOMAIN) +} + +pub(crate) fn get_compute_unit_price_micro_lamports_for_chain_name(chain_name: &str) -> u64 { + get_compute_unit_price(chain_name == "solanamainnet") +} + +fn get_compute_unit_price(is_solanamainnet: bool) -> u64 { + if is_solanamainnet { + // Generally taking a low/medium value from https://www.quicknode.com/gas-tracker/solana + 500_000 + } else { + 0 + } +} + pub(crate) fn account_exists(client: &RpcClient, account: &Pubkey) -> Result { // Using `get_account_with_commitment` instead of `get_account` so we get Ok(None) when the account // doesn't exist, rather than an error @@ -73,9 +90,9 @@ pub(crate) fn deploy_program( program_keypair_path, ]; + let compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain).to_string(); if local_domain.eq(&SOLANA_DOMAIN) { - // May need tweaking depending on gas prices / available balance - command.append(&mut vec!["--with-compute-unit-price", "550000"]); + command.extend(vec!["--with-compute-unit-price", &compute_unit_price]); } build_cmd(command.as_slice(), None, None); diff --git a/rust/sealevel/client/src/core.rs b/rust/sealevel/client/src/core.rs index 44cf9cb529..e3abedf035 100644 --- a/rust/sealevel/client/src/core.rs +++ b/rust/sealevel/client/src/core.rs @@ -9,26 +9,21 @@ use solana_sdk::{compute_budget, compute_budget::ComputeBudgetInstruction}; use std::collections::HashMap; use std::{fs::File, path::Path}; +use crate::cmd_utils::get_compute_unit_price_micro_lamports_for_chain_name; +use crate::ONE_SOL_IN_LAMPORTS; use crate::{ artifacts::{read_json, write_json}, cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, multisig_ism::deploy_multisig_ism_message_id, Context, CoreCmd, CoreDeploy, CoreSubCmd, }; -use crate::{DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT, ONE_SOL_IN_LAMPORTS}; use hyperlane_core::H256; use hyperlane_sealevel_igp::accounts::{SOL_DECIMALS, TOKEN_EXCHANGE_RATE_SCALE}; pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { if chain_name.eq("solanamainnet") { + let compute_unit_price = get_compute_unit_price_micro_lamports_for_chain_name(chain_name); let mut initial_instructions = ctx.initial_instructions.borrow_mut(); - const PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX: u64 = 50_000_000; - const MICRO_LAMPORT_FEE_PER_LIMIT: u64 = - // Convert to micro-lamports - (PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX * 1_000_000) - // Divide by the max compute units - / DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT as u64; - for i in initial_instructions.iter_mut() { if i.instruction.program_id != compute_budget::id() { continue; @@ -41,9 +36,8 @@ pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { ComputeBudgetInstruction::SetComputeUnitPrice { .. } ) { // The compute unit price has already been set, so we override it and return early - i.instruction = ComputeBudgetInstruction::set_compute_unit_price( - MICRO_LAMPORT_FEE_PER_LIMIT, - ); + i.instruction = + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); return; } } @@ -51,10 +45,10 @@ pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { initial_instructions.push( ( - ComputeBudgetInstruction::set_compute_unit_price(MICRO_LAMPORT_FEE_PER_LIMIT), + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price), Some(format!( - "Set compute unit price to {}", - MICRO_LAMPORT_FEE_PER_LIMIT + "Set compute unit price to {} micro-lamports", + compute_unit_price )), ) .into(), diff --git a/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json new file mode 100644 index 0000000000..683a275abb --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json @@ -0,0 +1,10 @@ +{ + "eclipsemainnet": { + "hex": "0x82f7445ccda6396092998c8f841f0d4eb63cca29ba23cfd2609d283f3ee9d13f", + "base58": "9pEgj7m2VkwLtJHPtTw5d8vbB7kfjzcXXCRgdwruW7C2" + }, + "ethereum": { + "hex": "0x000000000000000000000000d34fe1685c28a68bb4b8faaadcb2769962ae737c", + "base58": "1111111111113wkPRLXCJuj9539UEURsN3qhoaYb" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json new file mode 100644 index 0000000000..1634a20d35 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json @@ -0,0 +1,17 @@ +{ + "eclipsemainnet": { + "type": "synthetic", + "decimals": 9, + "remoteDecimals": 18, + "name": "Autocompounding Pirex Ether", + "symbol": "apxETH", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/ae7df1bc00af19f8ba692c14e4df3acdbf30497d/deployments/warp_routes/APXETH/metadata.json", + "interchainGasPaymaster": "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + }, + "ethereum": { + "type": "collateral", + "decimals": 18, + "token": "0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6", + "foreignDeployment": "0xd34FE1685c28A68Bb4B8fAaadCb2769962AE737c" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json new file mode 100644 index 0000000000..5a914d4f2c --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json @@ -0,0 +1,10 @@ +{ + "eclipsemainnet": { + "hex": "0xb06d58417c929a624e9b689e604e6d60ca652168ee76b9a290bd5b974b22b306", + "base58": "CshTfxXWMvnRAwBTCjQ4577bkP5po5ZuNG1QTuQxA5Au" + }, + "solanamainnet": { + "hex": "0x08bb318b88b38cc6f450b185e51a9c42402dc9d36fa6741c19c2aa62464a5eb3", + "base58": "b5pMgizA9vrGRt3hVqnU7vUVGBQUnLpwPzcJhG1ucyQ" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json new file mode 100644 index 0000000000..eef5c8349b --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json @@ -0,0 +1,17 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 9, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "token": "ezSoL6fY1PVdJcJsUpe5CM3xkfmy3zoVCABybm5WtiC", + "splTokenProgram": "token" + }, + "eclipsemainnet": { + "type": "synthetic", + "decimals": 9, + "name": "Renzo Restaked SOL", + "symbol": "ezSOL", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/ae7df1bc00af19f8ba692c14e4df3acdbf30497d/deployments/warp_routes/EZSOL/metadata.json", + "interchainGasPaymaster": "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + } +} diff --git a/rust/sealevel/libraries/test-utils/src/igp.rs b/rust/sealevel/libraries/test-utils/src/igp.rs index 70e5100067..3ff20da1b3 100644 --- a/rust/sealevel/libraries/test-utils/src/igp.rs +++ b/rust/sealevel/libraries/test-utils/src/igp.rs @@ -49,7 +49,7 @@ pub async fn initialize_igp_accounts( GasOracle::RemoteGasData(RemoteGasData { token_exchange_rate: TOKEN_EXCHANGE_RATE_SCALE, gas_price: 1u128, - /// The number of decimals for the remote token. + // The number of decimals for the remote token. token_decimals: SOL_DECIMALS, }), None, diff --git a/rust/sealevel/rust-toolchain b/rust/sealevel/rust-toolchain index 83e24cc566..1c8cfba9f5 100644 --- a/rust/sealevel/rust-toolchain +++ b/rust/sealevel/rust-toolchain @@ -1,3 +1,3 @@ [toolchain] -channel = "1.72.1" +channel = "1.75.0" profile = "default" diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 6edb35de62..0ba5c201ec 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,12 @@ # @hyperlane-xyz/core +## 5.8.1 + +### Patch Changes + +- Updated dependencies [0e285a443] + - @hyperlane-xyz/utils@7.1.0 + ## 5.8.0 ### Minor Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index 3bd056b570..476985336d 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "5.8.0"; + string public constant PACKAGE_VERSION = "5.8.1"; } diff --git a/solidity/package.json b/solidity/package.json index bcdc8cb4f9..d56a148a32 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,14 +1,14 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "5.8.0", + "version": "5.8.1", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "7.0.0", + "@hyperlane-xyz/utils": "7.1.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^v4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "fx-portal": "^1.0.3" }, "devDependencies": { @@ -19,7 +19,7 @@ "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/node": "^18.14.5", - "chai": "4.5.0", + "chai": "^4.5.0", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "hardhat": "^2.22.2", diff --git a/typescript/ccip-server/.eslintrc b/typescript/ccip-server/.eslintrc deleted file mode 100644 index 05936cd4e4..0000000000 --- a/typescript/ccip-server/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } - } - \ No newline at end of file diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index a6a35b3683..5bfabb5d48 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 7.1.0 + ## 7.0.0 ## 6.0.0 diff --git a/typescript/ccip-server/eslint.config.mjs b/typescript/ccip-server/eslint.config.mjs new file mode 100644 index 0000000000..17cd27a740 --- /dev/null +++ b/typescript/ccip-server/eslint.config.mjs @@ -0,0 +1,17 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + }, + { + rules: { + 'no-console': ['off'], + 'no-restricted-imports': ['off'], + }, + }, + { + ignores: ['**/__mocks__/*','**/tests/*',] + } +]; diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index d93fca2c6a..58e7a3e552 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "7.0.0", + "version": "7.1.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", @@ -12,27 +12,30 @@ "node": ">=16" }, "scripts": { + "build": "tsc -p tsconfig.json", "start": "tsx src/server.ts", "dev": "nodemon src/server.ts", "test": "jest", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src/* ./tests/" }, "author": "brolee", "license": "Apache-2.0", "devDependencies": { "@jest/globals": "^29.7.0", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", + "eslint": "^9.15.0", "jest": "^29.7.0", "nodemon": "^3.0.3", "prettier": "^2.8.8", "ts-jest": "^29.1.2", "ts-node": "^10.8.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3" }, "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", "dotenv-flow": "^4.1.0", - "ethers": "5.7.2" + "ethers": "^5.7.2" } } diff --git a/typescript/ccip-server/src/server.ts b/typescript/ccip-server/src/server.ts index 0f69c499f4..4151b98644 100644 --- a/typescript/ccip-server/src/server.ts +++ b/typescript/ccip-server/src/server.ts @@ -6,12 +6,14 @@ import { ProofsService } from './services/ProofsService'; // Initialize Services const proofsService = new ProofsService( - config.LIGHT_CLIENT_ADDR, - config.RPC_ADDRESS, - config.STEP_FN_ID, - config.CHAIN_ID, - config.SUCCINCT_PLATFORM_URL, - config.SUCCINCT_API_KEY, + { + lightClientAddress: config.LIGHT_CLIENT_ADDR, + stepFunctionId: config.STEP_FN_ID, + platformUrl: config.SUCCINCT_PLATFORM_URL, + apiKey: config.SUCCINCT_API_KEY, + }, + { url: config.RPC_ADDRESS, chainId: config.CHAIN_ID }, + { url: `${config.SERVER_URL_PREFIX}:${config.SERVER_PORT}` }, ); // Initialize Server and add Service handlers diff --git a/typescript/ccip-server/src/services/LightClientService.ts b/typescript/ccip-server/src/services/LightClientService.ts index f3aae5b097..4511229669 100644 --- a/typescript/ccip-server/src/services/LightClientService.ts +++ b/typescript/ccip-server/src/services/LightClientService.ts @@ -27,8 +27,8 @@ class LightClientService { * @param slot * @returns */ - async getSyncCommitteePoseidons(slot: bigint): Promise { - return await this.lightClientContract.syncCommitteePoseidons( + getSyncCommitteePoseidons(slot: bigint): Promise { + return this.lightClientContract.syncCommitteePoseidons( this.getSyncCommitteePeriod(slot), ); } diff --git a/typescript/ccip-server/src/services/ProofsService.ts b/typescript/ccip-server/src/services/ProofsService.ts index 1d05e7a3f7..5db40c5648 100644 --- a/typescript/ccip-server/src/services/ProofsService.ts +++ b/typescript/ccip-server/src/services/ProofsService.ts @@ -4,8 +4,7 @@ import { TelepathyCcipReadIsmAbi } from '../abis/TelepathyCcipReadIsmAbi'; import { HyperlaneService } from './HyperlaneService'; import { LightClientService, SuccinctConfig } from './LightClientService'; -import { RPCService } from './RPCService'; -import { ProofResult } from './RPCService'; +import { ProofResult, RPCService } from './RPCService'; import { ProofStatus } from './common/ProofStatusEnum'; type RPCConfig = { @@ -100,10 +99,7 @@ class ProofsService { ); const slot = await this.lightClientService.calculateSlot(BigInt(timestamp)); const syncCommitteePoseidon = ''; // TODO get from LC - return await this.lightClientService.requestProof( - syncCommitteePoseidon, - slot, - ); + return this.lightClientService.requestProof(syncCommitteePoseidon, slot); } /** diff --git a/typescript/ccip-server/tsconfig.json b/typescript/ccip-server/tsconfig.json new file mode 100644 index 0000000000..793d16b8e4 --- /dev/null +++ b/typescript/ccip-server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "./dist/", + "rootDir": "./src" + }, + "exclude": ["./node_modules/", "./dist/"], + "include": ["./src/*.ts"] +} diff --git a/typescript/cli/.eslintignore b/typescript/cli/.eslintignore deleted file mode 100644 index 76add878f8..0000000000 --- a/typescript/cli/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist \ No newline at end of file diff --git a/typescript/cli/.eslintrc b/typescript/cli/.eslintrc deleted file mode 100644 index 4d2a6fe74f..0000000000 --- a/typescript/cli/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - "no-console": ["off"], - "no-restricted-imports": ["off"] - } -} diff --git a/typescript/cli/.mocharc-e2e.json b/typescript/cli/.mocharc-e2e.json index ecabac62f3..0f8803e7ad 100644 --- a/typescript/cli/.mocharc-e2e.json +++ b/typescript/cli/.mocharc-e2e.json @@ -1,6 +1,5 @@ { "extensions": ["ts"], - "spec": ["src/**/*.e2e-test.ts"], "node-option": [ "experimental-specifier-resolution=node", "loader=ts-node/esm" diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index 3dd7232495..9e82984e47 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,23 @@ # @hyperlane-xyz/cli +## 7.1.0 + +### Minor Changes + +- 5db46bd31: Implements persistent relayer for use in CLI + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + ## 7.0.0 ### Minor Changes diff --git a/typescript/cli/eslint.config.mjs b/typescript/cli/eslint.config.mjs new file mode 100644 index 0000000000..30f5895c6a --- /dev/null +++ b/typescript/cli/eslint.config.mjs @@ -0,0 +1,20 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts', './cli.ts', './env.ts'], + }, + { + rules: { + 'no-console': ['off'], + 'no-restricted-imports': ['off'], + }, + }, + { + ignores: ['./src/tests/**/*.ts'], + rules: { + 'import/no-cycle': ['off'], + }, + }, +]; diff --git a/typescript/cli/package.json b/typescript/cli/package.json index df2acaeb16..5b6765de31 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,16 +1,16 @@ { "name": "@hyperlane-xyz/cli", - "version": "7.0.0", + "version": "7.1.0", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", - "@hyperlane-xyz/registry": "4.7.0", - "@hyperlane-xyz/sdk": "7.0.0", - "@hyperlane-xyz/utils": "7.0.0", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", - "@inquirer/prompts": "^3.0.0", + "@inquirer/prompts": "3.3.2", "ansi-escapes": "^7.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", @@ -18,7 +18,7 @@ "ethers": "^5.7.2", "latest-version": "^8.0.0", "terminal-link": "^3.0.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "yaml": "2.4.5", "yargs": "^17.7.2", "zod": "^3.21.2", @@ -26,18 +26,21 @@ "zx": "^8.1.4" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/chai-as-promised": "^8", "@types/mocha": "^10.0.1", "@types/node": "^18.14.5", "@types/yargs": "^17.0.24", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "chai": "^4.5.0", "chai-as-promised": "^8.0.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "mocha": "^10.2.0", "prettier": "^2.8.8", "typescript": "5.3.3" @@ -47,7 +50,7 @@ "build": "yarn version:update && tsc", "dev": "yarn version:update && tsc --watch", "clean": "rm -rf ./dist", - "lint": "eslint . --ext .ts", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src ./examples", "test:ci": "yarn mocha --config .mocharc.json", "test:e2e": "./scripts/run-e2e-test.sh", diff --git a/typescript/cli/scripts/run-e2e-test.sh b/typescript/cli/scripts/run-e2e-test.sh index bfa89a0b31..c98fc9158f 100755 --- a/typescript/cli/scripts/run-e2e-test.sh +++ b/typescript/cli/scripts/run-e2e-test.sh @@ -16,7 +16,12 @@ anvil --chain-id 31338 -p 8555 --state /tmp/anvil2/state --gas-price 1 > /dev/nu anvil --chain-id 31347 -p 8600 --state /tmp/anvil3/state --gas-price 1 > /dev/null & echo "Running E2E tests" -yarn mocha --config .mocharc-e2e.json +if [ -n "${CLI_E2E_TEST}" ]; then + echo "Running only ${CLI_E2E_TEST} test" + yarn mocha --config .mocharc-e2e.json "src/**/${CLI_E2E_TEST}.e2e-test.ts" +else + yarn mocha --config .mocharc-e2e.json "src/**/*.e2e-test.ts" +fi cleanup diff --git a/typescript/cli/src/avs/check.ts b/typescript/cli/src/avs/check.ts index 6730463e62..27055c6848 100644 --- a/typescript/cli/src/avs/check.ts +++ b/typescript/cli/src/avs/check.ts @@ -429,7 +429,7 @@ const getEcdsaStakeRegistryAddress = ( ): Address | undefined => { try { return avsAddresses[chain]['ecdsaStakeRegistry']; - } catch (err) { + } catch { topLevelErrors.push( `❗️ EcdsaStakeRegistry address not found for ${chain}`, ); diff --git a/typescript/cli/src/check/warp.ts b/typescript/cli/src/check/warp.ts index a31fac62e4..f0d147a468 100644 --- a/typescript/cli/src/check/warp.ts +++ b/typescript/cli/src/check/warp.ts @@ -4,7 +4,6 @@ import { WarpRouteDeployConfig, normalizeConfig } from '@hyperlane-xyz/sdk'; import { ObjectDiff, diffObjMerge } from '@hyperlane-xyz/utils'; import { log, logGreen } from '../logger.js'; -import '../utils/output.js'; import { formatYamlViolationsOutput } from '../utils/output.js'; export async function runWarpRouteCheck({ diff --git a/typescript/cli/src/commands/relayer.ts b/typescript/cli/src/commands/relayer.ts index 0d7672e734..c07a4d4120 100644 --- a/typescript/cli/src/commands/relayer.ts +++ b/typescript/cli/src/commands/relayer.ts @@ -9,7 +9,7 @@ import { Address } from '@hyperlane-xyz/utils'; import { CommandModuleWithContext } from '../context/types.js'; import { log } from '../logger.js'; import { tryReadJson, writeJson } from '../utils/files.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; import { agentTargetsCommandOption, diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index c2f4916b01..3cd99fe6a0 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -23,8 +23,8 @@ import { removeEndingSlash, writeYamlOrJson, } from '../utils/files.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; import { selectRegistryWarpRoute } from '../utils/tokens.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; import { runVerifyWarpRoute } from '../verify/warp.js'; import { diff --git a/typescript/cli/src/config/agent.ts b/typescript/cli/src/config/agent.ts index 05fa165596..a176a6f040 100644 --- a/typescript/cli/src/config/agent.ts +++ b/typescript/cli/src/config/agent.ts @@ -99,7 +99,7 @@ async function getStartBlocks( try { const deployedBlock = await mailbox.deployedBlock(); return deployedBlock.toNumber(); - } catch (err) { + } catch { errorRed( `❌ Failed to get deployed block to set an index for ${chain}, this is potentially an issue with rpc provider or a misconfiguration`, ); diff --git a/typescript/cli/src/config/submit.ts b/typescript/cli/src/config/submit.ts index 3b7e3c59e7..6ce067a8a0 100644 --- a/typescript/cli/src/config/submit.ts +++ b/typescript/cli/src/config/submit.ts @@ -3,9 +3,8 @@ import { stringify as yamlStringify } from 'yaml'; import { AnnotatedEV5Transaction, SubmissionStrategy, - getChainIdFromTxs, } from '@hyperlane-xyz/sdk'; -import { assert, errorToString } from '@hyperlane-xyz/utils'; +import { ProtocolType, assert, errorToString } from '@hyperlane-xyz/utils'; import { WriteCommandContext } from '../context/types.js'; import { logGray, logRed } from '../logger.js'; @@ -27,17 +26,15 @@ export async function runSubmit({ receiptsFilepath: string; submissionStrategy: SubmissionStrategy; }) { - const { chainMetadata, multiProvider } = context; + const { multiProvider } = context; assert( submissionStrategy, 'Submission strategy required to submit transactions.\nPlease create a submission strategy. See examples in cli/examples/submit/strategy/*.', ); const transactions = getTransactions(transactionsFilepath); - const chainId = getChainIdFromTxs(transactions); - const protocol = chainMetadata[chainId].protocol; - const submitterBuilder = await getSubmitterBuilder({ + const submitterBuilder = await getSubmitterBuilder({ submissionStrategy, multiProvider, }); diff --git a/typescript/cli/src/deploy/core.ts b/typescript/cli/src/deploy/core.ts index e8175e1483..afd586646a 100644 --- a/typescript/cli/src/deploy/core.ts +++ b/typescript/cli/src/deploy/core.ts @@ -1,12 +1,12 @@ import { stringify as yamlStringify } from 'yaml'; import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; -import { DeployedCoreAddresses } from '@hyperlane-xyz/sdk'; import { ChainMap, ChainName, ContractVerifier, CoreConfig, + DeployedCoreAddresses, EvmCoreModule, ExplorerLicenseType, } from '@hyperlane-xyz/sdk'; diff --git a/typescript/cli/src/deploy/dry-run.ts b/typescript/cli/src/deploy/dry-run.ts index f821dc179f..fa0c309725 100644 --- a/typescript/cli/src/deploy/dry-run.ts +++ b/typescript/cli/src/deploy/dry-run.ts @@ -5,12 +5,11 @@ import { resetFork, setFork, } from '@hyperlane-xyz/sdk'; +import { toUpperCamelCase } from '@hyperlane-xyz/utils'; import { logGray, logGreen, warnYellow } from '../logger.js'; import { ENV } from '../utils/env.js'; -import { toUpperCamelCase } from './utils.js'; - /** * Forks a provided network onto MultiProvider * @param multiProvider the MultiProvider to be prepared diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index e5dc8e0857..f5ac01a175 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -177,10 +177,6 @@ export async function completeDeploy( if (isDryRun) await completeDryRun(command); } -export function toUpperCamelCase(string: string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} - function transformChainMetadataForDisplay(chainMetadata: ChainMetadata) { return { Name: chainMetadata.name, diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 9e8d7268ee..a7827b5dca 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -136,13 +136,18 @@ export async function runWarpRouteDeploy({ await runDeployPlanStep(deploymentParams); + // Some of the below functions throw if passed non-EVM chains + const ethereumChains = chains.filter( + (chain) => chainMetadata[chain].protocol === ProtocolType.Ethereum, + ); + await runPreflightChecksForChains({ context, - chains, + chains: ethereumChains, minGas: MINIMUM_WARP_DEPLOY_GAS, }); - const initialBalances = await prepareDeploy(context, null, chains); + const initialBalances = await prepareDeploy(context, null, ethereumChains); const deployedContracts = await executeDeploy(deploymentParams, apiKeys); @@ -153,7 +158,7 @@ export async function runWarpRouteDeploy({ await writeDeploymentArtifacts(warpCoreConfig, context); - await completeDeploy(context, 'warp', initialBalances, null, chains!); + await completeDeploy(context, 'warp', initialBalances, null, ethereumChains!); } async function runDeployPlanStep({ context, warpDeployConfig }: DeployParams) { @@ -532,7 +537,8 @@ async function updateExistingWarpRoute( ) { logBlue('Updating deployed Warp Routes'); const { multiProvider, registry } = params.context; - const addresses = await registry.getAddresses(); + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const contractVerifier = new ContractVerifier( multiProvider, apiKeys, @@ -551,15 +557,13 @@ async function updateExistingWarpRoute( `Missing artifacts for ${chain}. Probably new deployment. Skipping update...`, ); - config.ismFactoryAddresses = addresses[ - chain - ] as ProxyFactoryFactoriesAddresses; const evmERC20WarpModule = new EvmERC20WarpModule( multiProvider, { config, chain, addresses: { + ...registryAddresses[chain], deployedTokenRoute: deployedConfig.addressOrDenom!, }, }, @@ -644,7 +648,9 @@ async function enrollRemoteRouters( deployedContractsMap: HyperlaneContractsMap, ): Promise { logBlue(`Enrolling deployed routers with each other...`); - const { multiProvider } = params.context; + const { multiProvider, registry } = params.context; + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const deployedRoutersAddresses: ChainMap
= objMap( deployedContractsMap, (_, contracts) => getRouter(contracts).address, @@ -672,7 +678,10 @@ async function enrollRemoteRouters( const evmERC20WarpModule = new EvmERC20WarpModule(multiProvider, { config: mutatedWarpRouteConfig, chain, - addresses: { deployedTokenRoute: router.address }, + addresses: { + ...registryAddresses[chain], + deployedTokenRoute: router.address, + }, }); const otherChains = multiProvider @@ -935,7 +944,7 @@ async function getWarpApplySubmitter({ context: WriteCommandContext; strategyUrl?: string; }): Promise> { - const { chainMetadata, multiProvider } = context; + const { multiProvider } = context; const submissionStrategy: SubmissionStrategy = strategyUrl ? readChainSubmissionStrategy(strategyUrl)[chain] @@ -946,8 +955,7 @@ async function getWarpApplySubmitter({ }, }; - const protocol = chainMetadata[chain].protocol; - return getSubmitterBuilder({ + return getSubmitterBuilder({ submissionStrategy, multiProvider, }); diff --git a/typescript/cli/src/read/warp.ts b/typescript/cli/src/read/warp.ts index 3cd6c19352..169593c5e9 100644 --- a/typescript/cli/src/read/warp.ts +++ b/typescript/cli/src/read/warp.ts @@ -15,7 +15,7 @@ import { isAddressEvm, objMap, promiseObjAll } from '@hyperlane-xyz/utils'; import { CommandContext } from '../context/types.js'; import { logGray, logRed, logTable } from '../logger.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; export async function runWarpRouteRead({ context, diff --git a/typescript/cli/src/status/message.ts b/typescript/cli/src/status/message.ts index 2c1e9af96c..df3ff1d983 100644 --- a/typescript/cli/src/status/message.ts +++ b/typescript/cli/src/status/message.ts @@ -52,7 +52,7 @@ export async function checkMessageStatus({ } else { try { dispatchedReceipt = await core.getDispatchTx(origin, messageId); - } catch (e) { + } catch { logRed(`Failed to infer dispatch transaction for message ${messageId}`); dispatchTx = await input({ diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index 10df193b9c..2a6e6fcb8a 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -2,8 +2,9 @@ import { confirm } from '@inquirer/prompts'; import { ethers } from 'ethers'; import { ChainName, MultiProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; -import { logGreen, logRed } from '../logger.js'; +import { logGray, logGreen, logRed } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, @@ -12,6 +13,11 @@ export async function nativeBalancesAreSufficient( ) { const sufficientBalances: boolean[] = []; for (const chain of chains) { + // Only Ethereum chains are supported + if (multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + logGray(`Skipping balance check for non-EVM chain: ${chain}`); + continue; + } const address = multiProvider.getSigner(chain).getAddress(); const provider = multiProvider.getProvider(chain); const gasPrice = await provider.getGasPrice(); diff --git a/typescript/cli/src/utils/env.ts b/typescript/cli/src/utils/env.ts index 51ab1ce352..a0a5b232f1 100644 --- a/typescript/cli/src/utils/env.ts +++ b/typescript/cli/src/utils/env.ts @@ -1,4 +1,4 @@ -import z from 'zod'; +import { z } from 'zod'; const envScheme = z.object({ HYP_KEY: z.string().optional(), diff --git a/typescript/cli/src/utils/files.ts b/typescript/cli/src/utils/files.ts index 9c7cb6216e..50f56d1b77 100644 --- a/typescript/cli/src/utils/files.ts +++ b/typescript/cli/src/utils/files.ts @@ -42,7 +42,7 @@ export function isFile(filepath: string) { if (!filepath) return false; try { return fs.existsSync(filepath) && fs.lstatSync(filepath).isFile(); - } catch (error) { + } catch { log(`Error checking for file: ${filepath}`); return false; } @@ -70,7 +70,7 @@ export function readJson(filepath: string): T { export function tryReadJson(filepath: string): T | null { try { return readJson(filepath) as T; - } catch (error) { + } catch { return null; } } @@ -98,7 +98,7 @@ export function readYaml(filepath: string): T { export function tryReadYamlAtPath(filepath: string): T | null { try { return readYaml(filepath); - } catch (error) { + } catch { return null; } } diff --git a/typescript/cli/src/utils/input.ts b/typescript/cli/src/utils/input.ts index 2ccef32db8..eb197c1acd 100644 --- a/typescript/cli/src/utils/input.ts +++ b/typescript/cli/src/utils/input.ts @@ -14,24 +14,18 @@ import { } from '@inquirer/core'; import figures from '@inquirer/figures'; import { KeypressEvent, confirm, input, isSpaceKey } from '@inquirer/prompts'; -import type { PartialDeep } from '@inquirer/type'; +import type { PartialDeep, Prompt } from '@inquirer/type'; import ansiEscapes from 'ansi-escapes'; import chalk from 'chalk'; import { ProxyAdmin__factory } from '@hyperlane-xyz/core'; -import { - ChainName, - DeployedOwnableConfig, - WarpCoreConfig, -} from '@hyperlane-xyz/sdk'; +import { ChainName, DeployedOwnableConfig } from '@hyperlane-xyz/sdk'; import { Address, isAddress, rootLogger } from '@hyperlane-xyz/utils'; -import { readWarpCoreConfig } from '../config/warp.js'; import { CommandContext } from '../context/types.js'; -import { logGray, logRed } from '../logger.js'; +import { logGray } from '../logger.js'; import { indentYamlOrJson } from './files.js'; -import { selectRegistryWarpRoute } from './tokens.js'; export async function detectAndConfirmOrPrompt( detect: () => Promise, @@ -52,8 +46,9 @@ export async function detectAndConfirmOrPrompt( return detectedValue; } } - // eslint-disable-next-line no-empty - } catch (e) {} + } catch { + // Fallback to input prompt + } return input({ message: `${prompt} ${label}:`, default: detectedValue }); } @@ -136,34 +131,6 @@ export async function setProxyAdminConfig( } } -/** - * Gets a {@link WarpCoreConfig} based on the provided path or prompts the user to choose one: - * - if `symbol` is provided the user will have to select one of the available warp routes. - * - if `warp` is provided the config will be read by the provided file path. - * - if none is provided the CLI will exit. - */ -export async function getWarpCoreConfigOrExit({ - context, - symbol, - warp, -}: { - context: CommandContext; - symbol?: string; - warp?: string; -}): Promise { - let warpCoreConfig: WarpCoreConfig; - if (symbol) { - warpCoreConfig = await selectRegistryWarpRoute(context.registry, symbol); - } else if (warp) { - warpCoreConfig = readWarpCoreConfig(warp); - } else { - logRed(`Please specify either a symbol or warp config`); - process.exit(0); - } - - return warpCoreConfig; -} - /** * Searchable checkbox code * @@ -497,7 +464,10 @@ function isDownKey(key: KeypressEvent): boolean { return key.name === 'down'; } -export const searchableCheckBox = createPrompt( +export const searchableCheckBox: Prompt< + any, + SearchableCheckboxConfig +> = createPrompt( ( config: SearchableCheckboxConfig, done: (value: Array) => void, diff --git a/typescript/cli/src/utils/warp.ts b/typescript/cli/src/utils/warp.ts new file mode 100644 index 0000000000..08888628e5 --- /dev/null +++ b/typescript/cli/src/utils/warp.ts @@ -0,0 +1,35 @@ +import { WarpCoreConfig } from '@hyperlane-xyz/sdk'; + +import { readWarpCoreConfig } from '../config/warp.js'; +import { CommandContext } from '../context/types.js'; +import { logRed } from '../logger.js'; + +import { selectRegistryWarpRoute } from './tokens.js'; + +/** + * Gets a {@link WarpCoreConfig} based on the provided path or prompts the user to choose one: + * - if `symbol` is provided the user will have to select one of the available warp routes. + * - if `warp` is provided the config will be read by the provided file path. + * - if none is provided the CLI will exit. + */ +export async function getWarpCoreConfigOrExit({ + context, + symbol, + warp, +}: { + context: CommandContext; + symbol?: string; + warp?: string; +}): Promise { + let warpCoreConfig: WarpCoreConfig; + if (symbol) { + warpCoreConfig = await selectRegistryWarpRoute(context.registry, symbol); + } else if (warp) { + warpCoreConfig = readWarpCoreConfig(warp); + } else { + logRed(`Please specify either a symbol or warp config`); + process.exit(0); + } + + return warpCoreConfig; +} diff --git a/typescript/cli/src/validator/preFlightCheck.ts b/typescript/cli/src/validator/preFlightCheck.ts index ca0c4d8504..ba674b48b9 100644 --- a/typescript/cli/src/validator/preFlightCheck.ts +++ b/typescript/cli/src/validator/preFlightCheck.ts @@ -44,7 +44,7 @@ export const checkValidatorSetup = async ( try { validatorStorageLocations = await validatorAnnounce.getAnnouncedStorageLocations(validatorsArray); - } catch (e) { + } catch { errorSet.add('Failed to read announced storage locations on chain.'); } @@ -64,7 +64,7 @@ export const checkValidatorSetup = async ( let s3Validator: S3Validator; try { s3Validator = await S3Validator.fromStorageLocation(s3StorageLocation); - } catch (e) { + } catch { errorRed( `❌ Failed to fetch storage locations for validator ${validator}, this may be due to the storage location not being an S3 bucket\n\n`, ); diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index 82bc6e87d8..e882c3c6fe 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '7.0.0'; +export const VERSION = '7.1.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index fc84e24464..a522bb6d5c 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 7.1.0 + ## 7.0.0 ## 6.0.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 34ff9cdb52..b6604be0ee 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "7.0.0", + "version": "7.1.0", "private": true, "scripts": { "deploy": "wrangler deploy", @@ -27,7 +27,7 @@ "@cloudflare/vitest-pool-workers": "^0.4.5", "@cloudflare/workers-types": "^4.20240821.1", "@faker-js/faker": "^8.4.1", - "chai": "4.5.0", + "chai": "^4.5.0", "prettier": "^2.8.8", "typescript": "5.3.3", "vitest": "1.4.0", diff --git a/typescript/helloworld/.eslintignore b/typescript/helloworld/.eslintignore deleted file mode 100644 index d461f0fa89..0000000000 --- a/typescript/helloworld/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -dist -coverage -src/types -hardhat.config.ts \ No newline at end of file diff --git a/typescript/helloworld/.eslintrc b/typescript/helloworld/.eslintrc deleted file mode 100644 index 446616f52f..0000000000 --- a/typescript/helloworld/.eslintrc +++ /dev/null @@ -1,39 +0,0 @@ -{ - "env": { - "node": true, - "browser": true, - "es2021": true - }, - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "no-eval": ["error"], - "no-ex-assign": ["error"], - "no-constant-condition": ["off"], - "@typescript-eslint/ban-ts-comment": ["off"], - "@typescript-eslint/explicit-module-boundary-types": ["off"], - "@typescript-eslint/no-explicit-any": ["off"], - "@typescript-eslint/no-floating-promises": ["error"], - "@typescript-eslint/no-non-null-assertion": ["off"], - "@typescript-eslint/no-require-imports": ["warn"], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ] - } -} diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 7b34ab8a5c..fe9c0b3da1 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,18 @@ # @hyperlane-xyz/helloworld +## 7.1.0 + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/core@5.8.1 + ## 7.0.0 ### Patch Changes diff --git a/typescript/helloworld/eslint.config.mjs b/typescript/helloworld/eslint.config.mjs new file mode 100644 index 0000000000..f88d208157 --- /dev/null +++ b/typescript/helloworld/eslint.config.mjs @@ -0,0 +1,17 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + }, + { + ignores: ["**/src/types/*"], + }, + { + ignores: ['./src/scripts'], + rules: { + 'no-console': ['off'], + }, + }, +]; \ No newline at end of file diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 3d3307a672..9647953707 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,26 +1,29 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "7.0.0", + "version": "7.1.0", "dependencies": { - "@hyperlane-xyz/core": "5.8.0", - "@hyperlane-xyz/registry": "4.7.0", - "@hyperlane-xyz/sdk": "7.0.0", + "@hyperlane-xyz/core": "5.8.1", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.1.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@trivago/prettier-plugin-sort-imports": "^4.2.1", "@typechain/ethers-v5": "^11.1.2", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", - "chai": "4.5.0", - "eslint": "^8.57.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", + "chai": "^4.5.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "ethereum-waffle": "^4.0.10", "hardhat": "^2.22.2", "hardhat-gas-reporter": "^1.0.9", @@ -56,7 +59,9 @@ "build": "yarn hardhat-esm compile && tsc", "clean": "yarn hardhat-esm clean && rm -rf dist cache src/types", "coverage": "yarn hardhat-esm coverage", - "lint": "solhint contracts/**/*.sol && eslint . --ext .ts", + "lint": "yarn lint:sol && yarn lint:ts", + "lint:sol": "solhint contracts/**/*.sol", + "lint:ts": "eslint -c ./eslint.config.mjs", "hardhat-esm": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat --config hardhat.config.cts", "prettier": "prettier --write ./contracts ./src", "test": "yarn hardhat-esm test ./src/test/**/*.test.ts", diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index 08389aa78a..d533e66b32 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,24 @@ # @hyperlane-xyz/infra +## 7.1.0 + +### Minor Changes + +- 5db46bd31: Implements persistent relayer for use in CLI + +### Patch Changes + +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + - @hyperlane-xyz/helloworld@7.1.0 + ## 7.0.0 ### Minor Changes diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 8a2ecd7a1f..46ba1a4d7c 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -12,6 +12,7 @@ import { import { MetricAppContext, routerMatchingList, + senderMatchingList, warpRouteMatchingList, } from '../../../src/config/agent/relayer.js'; import { ALL_KEY_ROLES, Role } from '../../../src/roles.js'; @@ -20,14 +21,17 @@ import { getDomainId } from '../../registry.js'; import { environment } from './chains.js'; import { helloWorld } from './helloworld.js'; +import aaveSenderAddresses from './misc-artifacts/aave-sender-addresses.json'; +import merklyEthAddresses from './misc-artifacts/merkly-eth-addresses.json'; +import merklyNftAddresses from './misc-artifacts/merkly-eth-addresses.json'; +import merklyErc20Addresses from './misc-artifacts/merkly-eth-addresses.json'; +import veloMessageModuleAddresses from './misc-artifacts/velo-message-module-addresses.json'; +import veloTokenBridgeAddresses from './misc-artifacts/velo-token-bridge-addresses.json'; import { mainnet3SupportedChainNames, supportedChainNames, } from './supportedChainNames.js'; import { validatorChainConfig } from './validators.js'; -import merklyEthAddresses from './warp/artifacts/merkly-eth-addresses.json'; -import merklyNftAddresses from './warp/artifacts/merkly-eth-addresses.json'; -import merklyErc20Addresses from './warp/artifacts/merkly-eth-addresses.json'; import { WarpRouteIds } from './warp/warpIds.js'; // const releaseCandidateHelloworldMatchingList = routerMatchingList( @@ -60,7 +64,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -68,6 +74,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -120,9 +127,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: false, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -148,7 +158,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -156,6 +168,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -209,9 +222,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -237,7 +253,9 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -245,6 +263,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, // Cannot scrape Sealevel chains eclipsemainnet: false, endurance: true, @@ -299,9 +318,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< // Cannot scrape Sealevel chains solanamainnet: false, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, // Has RPC non-compliance that breaks scraping. viction: false, worldchain: true, @@ -375,6 +397,22 @@ const metricAppContextsGetter = (): MetricAppContext[] => { name: 'merkly_nft', matchingList: routerMatchingList(merklyNftAddresses), }, + { + name: 'velo_message_module', + matchingList: routerMatchingList(veloMessageModuleAddresses), + }, + { + name: 'velo_token_bridge', + matchingList: routerMatchingList(veloTokenBridgeAddresses), + }, + { + // https://github.com/bgd-labs/aave-delivery-infrastructure?tab=readme-ov-file#deployed-addresses + // We match on senders because the sender is always the same and + // well documented, while the recipient may be switched out and is + // more poorly documented. + name: 'aave', + matchingList: senderMatchingList(aaveSenderAddresses), + }, ]; }; @@ -409,7 +447,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '25a927d-20241114-171323', + tag: 'd834d81-20241125-135658', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContextsGetter, @@ -418,7 +456,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'd834d81-20241125-135658', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -428,7 +466,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'd834d81-20241125-135658', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index fddbdc762e..c6946b9722 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -53,6 +53,9 @@ "bob": { "validators": ["0x20f283be1eb0e81e22f51705dcb79883cfdd34aa"] }, + "boba": { + "validators": ["0xebeb92c94ca8408e73aa16fd554cb3a7df075c59"] + }, "bsc": { "validators": [ "0x570af9b7b36568c8877eebba6c6727aa9dab7268", @@ -60,6 +63,9 @@ "0x03047213365800f065356b4a2fe97c3c3a52296a" ] }, + "bsquared": { + "validators": ["0xcadc90933c9fbe843358a4e70e46ad2db78e28aa"] + }, "celo": { "validators": [ "0x63478422679303c3e4fc611b771fa4a707ef7f4a", @@ -85,6 +91,9 @@ "dogechain": { "validators": ["0xe43f742c37858746e6d7e458bc591180d0cba440"] }, + "duckchain": { + "validators": ["0x91d55fe6dac596a6735d96365e21ce4bca21d83c"] + }, "eclipsemainnet": { "validators": ["0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0"] }, @@ -278,6 +287,9 @@ "solanamainnet": { "validators": ["0x28464752829b3ea59a497fca0bdff575c534c3ff"] }, + "superseed": { + "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] + }, "superpositionmainnet": { "validators": ["0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84"] }, @@ -287,6 +299,12 @@ "tangle": { "validators": ["0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b"] }, + "unichain": { + "validators": ["0x9773a382342ebf604a2e5de0a1f462fb499e28b1"] + }, + "vana": { + "validators": ["0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534"] + }, "viction": { "validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"] }, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index 0a9ab38bb5..62ee7d5f81 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -5376,5 +5376,425 @@ "constructorArguments": "00000000000000000000000096d51cc3f7500d501baeb1a2a62bb96fa03532f8", "isProxy": false } + ], + "boba": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000120", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "superseed": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000014d2", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "unichain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000082", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "duckchain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000015a9", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "vana": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000005c8", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "bsquared": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000df", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000bb0ae51bca526cf313b6a95bfab020794af6c394", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x81EbEdfc1220BE33C3B9c5E09c1FCab849a392A6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", + "constructorArguments": "00000000000000000000000081ebedfc1220be33c3b9c5e09c1fcab849a392a60000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x81EbEdfc1220BE33C3B9c5E09c1FCab849a392A6" + }, + { + "name": "ProtocolFee", + "address": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 03803fefa2..95ac6e84f8 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '1ed620c-20241107-052148', + tag: 'd834d81-20241125-135642', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -40,7 +40,9 @@ export const keyFunderConfig: KeyFunderConfig< bitlayer: '0.002', blast: '0.2', bob: '0.2', + boba: '0.05', bsc: '5', + bsquared: '0.002', celo: '3', cheesechain: '50', chilizmainnet: '200', @@ -48,6 +50,7 @@ export const keyFunderConfig: KeyFunderConfig< cyber: '0.05', degenchain: '100', dogechain: '100', + duckchain: '5', endurance: '20', ethereum: '0.5', everclear: '0.05', @@ -96,9 +99,13 @@ export const keyFunderConfig: KeyFunderConfig< snaxchain: '0.05', // ignore non-evm chains stride: '0', + superseed: '0.05', superpositionmainnet: '0.05', taiko: '0.2', tangle: '2', + unichain: '0.05', + // temporarily low until we're able to fund more + vana: '0.001', viction: '3', worldchain: '0.2', xai: '20', diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index e0eb030933..45daad3a3e 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -12,7 +12,7 @@ "decimals": 9 }, "arbitrum": { - "amount": "0.01", + "amount": "0.123544", "decimals": 9 }, "arbitrumnova": { @@ -24,7 +24,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.078", + "amount": "0.24", "decimals": 9 }, "flame": { @@ -36,11 +36,11 @@ "decimals": 9 }, "b3": { - "amount": "0.001000254", + "amount": "0.001000252", "decimals": 9 }, "base": { - "amount": "0.004893247", + "amount": "0.024525952", "decimals": 9 }, "bitlayer": { @@ -48,17 +48,25 @@ "decimals": 9 }, "blast": { - "amount": "0.005018176", + "amount": "0.005892268", "decimals": 9 }, "bob": { "amount": "0.001000252", "decimals": 9 }, + "boba": { + "amount": "0.001000047", + "decimals": 9 + }, "bsc": { "amount": "1.0", "decimals": 9 }, + "bsquared": { + "amount": "0.001000252", + "decimals": 9 + }, "celo": { "amount": "10.0", "decimals": 9 @@ -87,6 +95,10 @@ "amount": "250.0", "decimals": 9 }, + "duckchain": { + "amount": "10.0", + "decimals": 9 + }, "eclipsemainnet": { "amount": "0.0000001", "decimals": 1 @@ -96,7 +108,7 @@ "decimals": 9 }, "ethereum": { - "amount": "15.0", + "amount": "30.088451558", "decimals": 9 }, "everclear": { @@ -124,7 +136,7 @@ "decimals": 9 }, "gnosis": { - "amount": "1.500000007", + "amount": "1.500000008", "decimals": 9 }, "gravity": { @@ -136,7 +148,7 @@ "decimals": 9 }, "immutablezkevmmainnet": { - "amount": "10.000000056", + "amount": "10.00000005", "decimals": 9 }, "inevm": { @@ -156,7 +168,7 @@ "decimals": 9 }, "linea": { - "amount": "0.160485013", + "amount": "0.548523195", "decimals": 9 }, "lisk": { @@ -172,7 +184,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003001158", + "amount": "0.0030005", "decimals": 9 }, "mantle": { @@ -208,7 +220,7 @@ "decimals": 9 }, "morph": { - "amount": "0.002", + "amount": "0.014614332", "decimals": 9 }, "neutron": { @@ -220,7 +232,7 @@ "decimals": 9 }, "optimism": { - "amount": "0.001010111", + "amount": "0.001065045", "decimals": 9 }, "orderly": { @@ -232,11 +244,11 @@ "decimals": 1 }, "polygon": { - "amount": "47.07124319", + "amount": "260.197309239", "decimals": 9 }, "polygonzkevm": { - "amount": "0.146", + "amount": "0.451", "decimals": 9 }, "polynomialfi": { @@ -244,7 +256,7 @@ "decimals": 9 }, "prom": { - "amount": "13.1", + "amount": "75.2", "decimals": 9 }, "proofofplay": { @@ -280,7 +292,7 @@ "decimals": 9 }, "shibarium": { - "amount": "0.542811448", + "amount": "3.89327567", "decimals": 9 }, "snaxchain": { @@ -295,24 +307,36 @@ "amount": "0.005", "decimals": 1 }, + "superseed": { + "amount": "0.001000252", + "decimals": 9 + }, "superpositionmainnet": { "amount": "0.01", "decimals": 9 }, "taiko": { - "amount": "0.1323", + "amount": "0.1243284", "decimals": 9 }, "tangle": { "amount": "1.0", "decimals": 9 }, + "unichain": { + "amount": "0.001000252", + "decimals": 9 + }, + "vana": { + "amount": "0.001000007", + "decimals": 9 + }, "viction": { "amount": "0.25", "decimals": 9 }, "worldchain": { - "amount": "0.00100025", + "amount": "0.00100026", "decimals": 9 }, "xai": { @@ -320,7 +344,7 @@ "decimals": 9 }, "xlayer": { - "amount": "7.04", + "amount": "23.05", "decimals": 9 }, "zeronetwork": { @@ -340,7 +364,7 @@ "decimals": 9 }, "zoramainnet": { - "amount": "0.001000269", + "amount": "0.001000252", "decimals": 9 } } diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 928bceb8b5..6f9366f4e4 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -6916,5 +6916,521 @@ "constructorArguments": "", "isProxy": true } + ], + "superseed": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "unichain": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "duckchain": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "vana": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "boba": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "bsquared": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index b940665f2c..d6349dce98 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -1680,5 +1680,131 @@ "isProxy": true, "expectedimplementation": "0x28846fCb579747E8ddad9E93b55BE51b0A1Bf1f3" } + ], + "superseed": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "boba": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "unichain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "duckchain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "vana": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "bsquared": [ + { + "name": "InterchainAccountIsm", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", + "constructorArguments": "0000000000000000000000007ce76f5f0c469bbb4cd7ea6ebabb54437a0931270000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff26696dcdb6bbfd27e959b847d4f1399d5bcf64000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json new file mode 100644 index 0000000000..21cfa5eccf --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/aave-sender-addresses.json @@ -0,0 +1,38 @@ +{ + "ethereum": { + "sender": "0xEd42a7D8559a463722Ca4beD50E0Cc05a386b0e1" + }, + "polygon": { + "sender": "0xF6B99959F0b5e79E1CC7062E12aF632CEb18eF0d" + }, + "avalanche": { + "sender": "0x27FC7D54C893dA63C0AE6d57e1B2B13A70690928" + }, + "arbitrum": { + "sender": "0xCbFB78a3Eeaa611b826E37c80E4126c8787D29f0" + }, + "optimism": { + "sender": "0x48A9FE90bce5EEd790f3F4Ce192d1C0B351fd4Ca" + }, + "bsc": { + "sender": "0x9d33ee6543C9b2C8c183b8fb58fB089266cffA19" + }, + "base": { + "sender": "0x529467C76f234F2bD359d7ecF7c660A2846b04e2" + }, + "metis": { + "sender": "0x6fDaFb26915ABD6065a1E1501a37Ac438D877f70" + }, + "gnosis": { + "sender": "0x8Dc5310fc9D3D7D1Bb3D1F686899c8F082316c9F" + }, + "scroll": { + "sender": "0x03073D3F4769f6b6604d616238fD6c636C99AD0A" + }, + "polygonzkevm": { + "sender": "0xed7e0874526B9BB9E36C7e9472ed7ed324CEeE3B" + }, + "celo": { + "sender": "0x4A5f4b29C0407E5Feb323305e121f563c7bC4d79" + } +} diff --git a/typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-erc20-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json similarity index 100% rename from typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-erc20-addresses.json rename to typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-erc20-addresses.json diff --git a/typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-eth-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json similarity index 100% rename from typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-eth-addresses.json rename to typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-eth-addresses.json diff --git a/typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-nft-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json similarity index 100% rename from typescript/infra/config/environments/mainnet3/warp/artifacts/merkly-nft-addresses.json rename to typescript/infra/config/environments/mainnet3/misc-artifacts/merkly-nft-addresses.json diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json new file mode 100644 index 0000000000..9e2cc555b6 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-message-module-addresses.json @@ -0,0 +1,14 @@ +{ + "optimism": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "mode": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "lisk": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + }, + "fraxtal": { + "router": "0xF385603a12Be8b7B885222329c581FDD1C30071D" + } +} diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json new file mode 100644 index 0000000000..cd9fe51149 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/velo-token-bridge-addresses.json @@ -0,0 +1,14 @@ +{ + "optimism": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "mode": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "lisk": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + }, + "fraxtal": { + "router": "0xA7287a56C01ac8Baaf8e7B662bDB41b10889C7A6" + } +} diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index dddc793123..f2f609fc23 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -15,7 +15,9 @@ export const mainnet3SupportedChainNames = [ 'bitlayer', 'blast', 'bob', + 'boba', 'bsc', + 'bsquared', 'celo', 'cheesechain', 'chilizmainnet', @@ -23,6 +25,7 @@ export const mainnet3SupportedChainNames = [ 'cyber', 'degenchain', 'dogechain', + 'duckchain', 'eclipsemainnet', 'endurance', 'ethereum', @@ -75,9 +78,12 @@ export const mainnet3SupportedChainNames = [ 'snaxchain', 'solanamainnet', 'stride', + 'superseed', 'superpositionmainnet', 'taiko', 'tangle', + 'unichain', + 'vana', 'viction', 'worldchain', 'xai', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 106c5831fa..ef91796ec2 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,88 +1,94 @@ { - "ancient8": "2901.97", - "alephzeroevmmainnet": "0.352558", - "apechain": "1.021", - "arbitrum": "2901.97", - "arbitrumnova": "2901.97", - "astar": "0.05516", - "astarzkevm": "2901.97", - "flame": "5.14", - "avalanche": "27.43", - "b3": "2901.97", - "base": "2901.97", - "bitlayer": "75858", - "blast": "2901.97", - "bob": "2901.97", - "bsc": "596.14", - "celo": "0.63787", - "cheesechain": "0.00211859", - "chilizmainnet": "0.061174", - "coredao": "0.886582", - "cyber": "2901.97", - "degenchain": "0.00776785", - "dogechain": "0.197113", - "eclipsemainnet": "2901.97", - "endurance": "2.02", - "ethereum": "2901.97", - "everclear": "2901.97", - "fantom": "0.708456", - "flare": "0.01303515", - "flowmainnet": "0.5289", - "fraxtal": "2892.2", - "fusemainnet": "0.02930522", - "gnosis": "1.001", - "gravity": "0.02864739", - "harmony": "0.01246587", - "immutablezkevmmainnet": "1.18", - "inevm": "21.99", - "injective": "21.99", - "kaia": "0.121813", - "kroma": "2901.97", - "linea": "2901.97", - "lisk": "2901.97", - "lukso": "1.48", - "lumia": "1.059", - "mantapacific": "2901.97", - "mantle": "0.651888", - "merlin": "75853", - "metal": "2901.97", - "metis": "44.6", - "mint": "2901.97", - "mode": "2901.97", - "molten": "0.25598", - "moonbeam": "0.169922", - "morph": "2901.97", - "neutron": "0.374494", - "oortmainnet": "0.092246", - "optimism": "2901.97", - "orderly": "2901.97", - "osmosis": "0.43997", - "polygon": "0.343626", - "polygonzkevm": "2901.97", - "polynomialfi": "2901.97", - "prom": "5.38", - "proofofplay": "2901.97", - "rarichain": "2901.97", + "ancient8": "3339.7", + "alephzeroevmmainnet": "0.323087", + "apechain": "1.15", + "arbitrum": "3339.7", + "arbitrumnova": "3339.7", + "astar": "0.065841", + "astarzkevm": "3339.7", + "flame": "5.32", + "avalanche": "35.04", + "b3": "3339.7", + "base": "3339.7", + "bitlayer": "97008", + "blast": "3339.7", + "bob": "3339.7", + "boba": "3339.7", + "bsc": "622.77", + "bsquared": "98146", + "celo": "0.69886", + "cheesechain": "0.00180143", + "chilizmainnet": "0.074224", + "coredao": "0.954893", + "cyber": "3339.7", + "degenchain": "0.02076785", + "dogechain": "0.386856", + "duckchain": "5.5", + "eclipsemainnet": "3339.7", + "endurance": "2.34", + "ethereum": "3339.7", + "everclear": "3339.7", + "fantom": "0.718323", + "flare": "0.01997817", + "flowmainnet": "0.699342", + "fraxtal": "3330.82", + "fusemainnet": "0.03172781", + "gnosis": "0.995976", + "gravity": "0.03027443", + "harmony": "0.01537487", + "immutablezkevmmainnet": "1.35", + "inevm": "24.39", + "injective": "24.39", + "kaia": "0.148169", + "kroma": "3339.7", + "linea": "3339.7", + "lisk": "3339.7", + "lukso": "1.28", + "lumia": "1.27", + "mantapacific": "3339.7", + "mantle": "0.797424", + "merlin": "97247", + "metal": "3339.7", + "metis": "49.54", + "mint": "3339.7", + "mode": "3339.7", + "molten": "0.255266", + "moonbeam": "0.216341", + "morph": "3339.7", + "neutron": "0.440864", + "oortmainnet": "0.084942", + "optimism": "3339.7", + "orderly": "3339.7", + "osmosis": "0.543778", + "polygon": "0.449905", + "polygonzkevm": "3339.7", + "polynomialfi": "3339.7", + "prom": "5.54", + "proofofplay": "3339.7", + "rarichain": "3339.7", "real": "1", - "redstone": "2901.97", - "rootstockmainnet": "75541", - "sanko": "53.25", - "scroll": "2901.97", - "sei": "0.404683", - "shibarium": "0.407901", - "snaxchain": "2901.97", - "solanamainnet": "199.51", - "stride": "0.583853", - "superpositionmainnet": "2901.97", - "taiko": "2901.97", + "redstone": "3339.7", + "rootstockmainnet": "97164", + "sanko": "48.68", + "scroll": "3339.7", + "sei": "0.488479", + "shibarium": "0.512057", + "snaxchain": "3339.7", + "solanamainnet": "244.09", + "stride": "0.613675", + "superseed": "3339.7", + "superpositionmainnet": "3339.7", + "taiko": "3339.7", "tangle": "1", - "viction": "0.340844", - "worldchain": "2901.97", - "xai": "0.2107", - "xlayer": "40.21", - "zeronetwork": "2901.97", - "zetachain": "0.680925", - "zircuit": "2901.97", - "zksync": "2901.97", - "zoramainnet": "2901.97" + "unichain": "3339.7", + "vana": "1", + "viction": "0.399341", + "worldchain": "3339.7", + "xai": "0.241575", + "xlayer": "45.13", + "zeronetwork": "3339.7", + "zetachain": "0.66842", + "zircuit": "3339.7", + "zksync": "3339.7", + "zoramainnet": "3339.7" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 05673abf09..beb35ee7fe 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1140,5 +1140,67 @@ export const validatorChainConfig = ( 'prom', ), }, + + boba: { + interval: 5, + reorgPeriod: getReorgPeriod('boba'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + 'boba', + ), + }, + duckchain: { + interval: 5, + reorgPeriod: getReorgPeriod('duckchain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + 'duckchain', + ), + }, + superseed: { + interval: 5, + reorgPeriod: getReorgPeriod('superseed'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + 'superseed', + ), + }, + unichain: { + interval: 5, + reorgPeriod: getReorgPeriod('unichain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + 'unichain', + ), + }, + vana: { + interval: 5, + reorgPeriod: getReorgPeriod('vana'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + 'vana', + ), + }, + + bsquared: { + interval: 5, + reorgPeriod: getReorgPeriod('bsquared'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xcadc90933c9fbe843358a4e70e46ad2db78e28aa'], + }, + 'bsquared', + ), + }, }; }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts index 939bcc1ab2..58f60211dc 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.ts @@ -2,17 +2,21 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getAncient8EthereumUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -22,6 +26,7 @@ export const getAncient8EthereumUSDCWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, interchainSecurityModule: ismConfig, @@ -31,12 +36,9 @@ export const getAncient8EthereumUSDCWarpConfig = async ( hook: '0x19b2cF952b70b217c90FC408714Fbc1acD29A6A8', }; - // @ts-ignore - The types as they stand require a synthetic to specify - // TokenMetadata, but in practice these are actually inferred from a - // collateral config. To avoid needing to specify the TokenMetadata, just - // ts-ignore for synthetic tokens. const ancient8: TokenRouterConfig = { ...routerConfig.ancient8, + ...abacusWorksEnvOwnerConfig.ancient8, type: TokenType.synthetic, // Uses the default ISM interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts index 1b81e81103..9633354b56 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.ts @@ -2,49 +2,46 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +// MEV Capital const arbitrumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9'; const ethereumOwner = '0x008615770B588633265cB01Abd19740fAe67d0B9'; const zircuitOwner = '0xD0673e7F3FB4037CA79F53d2d311D0e017d39963'; export const getArbitrumEthereumZircuitAmphrETHWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...getOwnerConfigForAddress(arbitrumOwner), type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, - owner: arbitrumOwner, - ownerOverrides: { - proxyAdmin: arbitrumOwner, - }, }; const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), type: TokenType.collateral, token: tokens.ethereum.amphrETH, - owner: ethereumOwner, interchainSecurityModule: ethers.constants.AddressZero, - ownerOverrides: { - proxyAdmin: ethereumOwner, - }, }; const zircuit: TokenRouterConfig = { ...routerConfig.zircuit, + ...getOwnerConfigForAddress(zircuitOwner), type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, - owner: zircuitOwner, - ownerOverrides: { - proxyAdmin: zircuitOwner, - }, }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts index daebd6c026..2dae8e447b 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.ts @@ -1,23 +1,36 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + +// Eclipse Fi team +const arbitrumOwner = '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8'; +const neutronOwner = + 'neutron1aud8lty0wwmyc86ugkzqrusnrku0ckm0ym62v4ve0jjjyepjjg6spssrwj'; + export const getArbitrumNeutronEclipWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '6b04c49fcfd98bc4ea9c05cd5790462a39537c00028333474aebe6ddf20b73a3'; - // @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig const neutron: TokenRouterConfig = { + ...routerConfig.neutron, + ...getOwnerConfigForAddress(neutronOwner), + type: TokenType.collateral, + token: 'factory/neutron10sr06r3qkhn7xzpw3339wuj77hu06mzna6uht0/eclip', foreignDeployment: neutronRouter, }; const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...getOwnerConfigForAddress(arbitrumOwner), type: TokenType.synthetic, name: 'Eclipse Fi', symbol: 'ECLIP', @@ -25,7 +38,6 @@ export const getArbitrumNeutronEclipWarpConfig = async ( totalSupply: 0, gas: 600_000, interchainSecurityModule: '0x676151bFB8D29690a359F99AE764860595504689', // This has diverged from the default ism on neutron, we cannot change as it is owned by the Eclip team - owner: '0xfF07222cb0AC905304d6586Aabf13f497C07F0C8', // Eclip team }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts index ce601ffc16..66a6d9e116 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.ts @@ -1,23 +1,31 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getArbitrumNeutronTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '910926c4cf95d107237a9cf0b3305fe9c81351ebcba3d218ceb0e4935d92ceac'; - // @ts-ignore - foreignDeployment configs dont conform to the TokenRouterConfig const neutron: TokenRouterConfig = { + ...routerConfig.neutron, + ...abacusWorksEnvOwnerConfig.neutron, + type: TokenType.collateral, + token: + 'ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7', foreignDeployment: neutronRouter, }; const arbitrum: TokenRouterConfig = { ...routerConfig.arbitrum, + ...abacusWorksEnvOwnerConfig.arbitrum, type: TokenType.synthetic, name: 'TIA', symbol: 'TIA.n', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts new file mode 100644 index 0000000000..517836b52c --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts @@ -0,0 +1,46 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + OwnableConfig, + TokenRouterConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { DEPLOYER } from '../../owners.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +const ethereumOwner = DEPLOYER; +const eclipseOwner = '9bRSUPjfS3xS6n5EfkJzHFTRDa4AHLda8BU2pP4HoWnf'; + +export async function getEclipseEthereumApxEthWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { + const eclipsemainnet: TokenRouterConfig = { + ...routerConfig.eclipsemainnet, + ...getOwnerConfigForAddress(eclipseOwner), + type: TokenType.synthetic, + foreignDeployment: '9pEgj7m2VkwLtJHPtTw5d8vbB7kfjzcXXCRgdwruW7C2', + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + let ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), + type: TokenType.collateral, + token: tokens.ethereum.apxETH, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + eclipsemainnet, + ethereum, + }; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts index 078c90776e..eaaf5749c6 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts @@ -8,6 +8,7 @@ import { } from '@hyperlane-xyz/sdk'; import { tokens } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumSolanaUSDCWarpConfig = async ( routerConfig: ChainMap, @@ -16,7 +17,7 @@ export const getEclipseEthereumSolanaUSDCWarpConfig = async ( ...routerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'D6k6T3G74ij6atCtBiWBs5TbFa1hFVcrFUSGZHuV7q3Z', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const ethereum: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts index 781b3caa98..bbabe4f5dc 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts @@ -2,25 +2,32 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumSolanaUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: '5g5ujyYUNvdydwyDVCpZwPpgYRqH5RYJRi156cxyE3me', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts index db149da15c..ca6138df1d 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts @@ -7,6 +7,8 @@ import { TokenType, } from '@hyperlane-xyz/sdk'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + export const getEthereumEclipseTETHWarpConfig = async ( routerConfig: ChainMap, ): Promise> => { @@ -14,7 +16,7 @@ export const getEthereumEclipseTETHWarpConfig = async ( ...routerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'BJa3fPvvjKx8gRCWunoSrWBbsmieub37gsGpjp4BfTfW', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const ethereum: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts index 03bdd55b7d..0b1fd23431 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts @@ -2,26 +2,33 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumWBTCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'A7EGCDYFw5R7Jfm6cYtKvY8dmkrYMgwRCJFkyQwpHTYu', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.WBTC, interchainSecurityModule: ethers.constants.AddressZero, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts index 34da322ad7..7df68ccbac 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts @@ -2,35 +2,47 @@ import { ethers } from 'ethers'; import { ChainMap, + OwnableConfig, RouterConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; -import { DEPLOYER } from '../../owners.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +// Safe owned by Veda +const ethereumOwner = '0xCEA8039076E35a825854c5C2f85659430b06ec96'; +// Vault owned by Veda +const eclipseOwner = '4Cj1s2ipALjJk9foQV4oDaZYCZwSsVkAShQL1KFVJG9b'; -export const getEclipseEthereumWeEthsWarpConfig = async ( - routerConfig: ChainMap, -): Promise> => { +export async function getEclipseEthereumWeEthsWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...getOwnerConfigForAddress(eclipseOwner), type: TokenType.synthetic, foreignDeployment: '7Zx4wU1QAw98MfvnPFqRh1oyumek7G5VAX6TKB3U1tcn', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; let ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), type: TokenType.collateral, token: tokens.ethereum.weETHs, interchainSecurityModule: ethers.constants.AddressZero, - owner: DEPLOYER, }; return { eclipsemainnet, ethereum, }; -}; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts index 4d8db22a7b..158e6e367f 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts @@ -1,22 +1,32 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +// Stride team +const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; + export const getEclipseStrideTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'BpXHAiktwjx7fN6M9ST9wr6qKAsH27wZFhdHEhReJsR6', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const stride: TokenRouterConfig = { ...routerConfig.stride, + ...getOwnerConfigForAddress(strideOwner), type: TokenType.collateral, foreignDeployment: 'stride1pvtesu3ve7qn7ctll2x495mrqf2ysp6fws68grvcu6f7n2ajghgsh2jdj6', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts index 9d5bdf5786..9364026599 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts @@ -1,22 +1,32 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +// Stride team +const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; + export const getEclipseStrideStTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const eclipsemainnet: TokenRouterConfig = { ...routerConfig.eclipsemainnet, + ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'tKUHyJ5NxhnwU94JUmzh1ekukDcHHX8mZF6fqxbMwX6', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const stride: TokenRouterConfig = { ...routerConfig.stride, + ...getOwnerConfigForAddress(strideOwner), type: TokenType.collateral, foreignDeployment: 'stride134axwdlam929m3mar3wv95nvkyep7mr87ravkqcpf8dfe3v0pjlqwrw6ee', diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts index 3ce50742a9..1afa97f4f9 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.ts @@ -1,59 +1,50 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { objMap } from '@hyperlane-xyz/utils'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; // Lumia Team const owner = '0x8bBA07Ddc72455b55530C17e6f6223EF6E156863'; - -const ownerConfig = { - owner, - // The proxyAdmins are warp-route specific - ownerOverrides: { - proxyAdmin: owner, - }, -}; +const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumBscLUMIAWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { - const ethereum = { + const ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...ownerConfig, type: TokenType.collateral, token: '0xD9343a049D5DBd89CD19DC6BcA8c48fB3a0a42a7', - ownerOverrides: { - proxyAdmin: owner, - }, }; - const bsc = { + const bsc: TokenRouterConfig = { + ...routerConfig.bsc, + ...ownerConfig, type: TokenType.synthetic, - ownerOverrides: { - proxyAdmin: owner, - }, }; - const lumia = { + const lumia: TokenRouterConfig = { + ...routerConfig.lumia, + ...ownerConfig, type: TokenType.native, // As this has been removed from the registry in https://github.com/hyperlane-xyz/hyperlane-registry/pull/348, // we must specify this explicitly. mailbox: '0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7', - proxyAdmin: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D', + proxyAdmin: { + owner: owner, + address: '0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D', + }, }; - const configMap = { + return { ethereum, bsc, lumia, }; - - const merged = objMap(configMap, (chain, config) => ({ - ...routerConfig[chain], - ...config, - ...ownerConfig, - })); - - return merged as ChainMap; }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts new file mode 100644 index 0000000000..3c33919e1c --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts @@ -0,0 +1,47 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + OwnableConfig, + TokenRouterConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; + +// Flow team Safe +const ethereumOwner = '0x58C3FB862a4F5f038C24F8506BE378e9415c5B6C'; +const ethereumOwnerConfig = getOwnerConfigForAddress(ethereumOwner); + +// Flow team Safe +const flowOwner = '0xa507DFccA02727B46cBdC600C57E89b2b55E5330'; +const flowOwnerConfig = getOwnerConfigForAddress(flowOwner); + +export const getEthereumFlowCbBTCWarpConfig = async ( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> => { + const ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...ethereumOwnerConfig, + type: TokenType.collateral, + token: tokens.ethereum.cbBTC, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + const flowmainnet: TokenRouterConfig = { + ...routerConfig.flowmainnet, + ...flowOwnerConfig, + type: TokenType.synthetic, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + ethereum, + flowmainnet, + }; +}; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts index aa4b19054f..cb5ba7ada2 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumInevmUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future @@ -21,6 +26,7 @@ export const getEthereumInevmUSDCWarpConfig = async ( const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts index abe8fd14c5..b861444f1f 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.ts @@ -2,18 +2,23 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumInevmUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, hook: '0xb87AC8EA4533AE017604E44470F7c1E550AC6F10', // aggregation of IGP and Merkle, arbitrary config not supported for now, TODO: may want to move to zero address in future @@ -21,6 +26,7 @@ export const getEthereumInevmUSDTWarpConfig = async ( const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts index 5bd4938d20..1eb7f4a58c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.ts @@ -2,42 +2,42 @@ import { ethers } from 'ethers'; import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; // Elixir const owner = '0x00000000F51340906F767C6999Fe512b1275955C'; +const ownerConfig = getOwnerConfigForAddress(owner); export const getEthereumSeiFastUSDWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const sei: TokenRouterConfig = { ...routerConfig.viction, + ...ownerConfig, type: TokenType.XERC20, name: 'fastUSD', symbol: 'fastUSD', decimals: 18, token: tokens.sei.fastUSD, interchainSecurityModule: ethers.constants.AddressZero, - owner, - ownerOverrides: { - proxyAdmin: owner, - }, }; const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...ownerConfig, type: TokenType.collateral, token: tokens.ethereum.deUSD, - owner, interchainSecurityModule: ethers.constants.AddressZero, - ownerOverrides: { - proxyAdmin: owner, - }, }; return { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts index 975483bc5a..a932b181b2 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionETHWarpConfig.ts @@ -1,14 +1,17 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getEthereumVictionETHWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -18,6 +21,7 @@ export const getEthereumVictionETHWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'ETH', symbol: 'ETH', @@ -28,6 +32,7 @@ export const getEthereumVictionETHWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.native, gas: 65_000, interchainSecurityModule: ismConfig, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts index ae8ed54946..c046753c91 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDCWarpConfig.ts @@ -1,16 +1,20 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumVictionUSDCWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { // commit that the config was copied from https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3067/commits/7ed5b460034ea5e140c6ff86bcd6baf6ebb824c4#diff-fab5dd1a27c76e4310699c57ccf92ab6274ef0acf17e079b17270cedf4057775R109 const ismConfig = buildAggregationIsmConfigs( @@ -21,6 +25,7 @@ export const getEthereumVictionUSDCWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'USDC', symbol: 'USDC', @@ -31,6 +36,7 @@ export const getEthereumVictionUSDCWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDC, gas: 65_000, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts index 85abe405d5..5835f96322 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumVictionUSDTWarpConfig.ts @@ -1,16 +1,20 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, defaultMultisigConfigs, } from '@hyperlane-xyz/sdk'; -import { tokens } from '../../../../../src/config/warp.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; export const getEthereumVictionUSDTWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const ismConfig = buildAggregationIsmConfigs( 'ethereum', @@ -20,6 +24,7 @@ export const getEthereumVictionUSDTWarpConfig = async ( const viction: TokenRouterConfig = { ...routerConfig.viction, + ...abacusWorksEnvOwnerConfig.viction, type: TokenType.synthetic, name: 'USDT', symbol: 'USDT', @@ -30,6 +35,7 @@ export const getEthereumVictionUSDTWarpConfig = async ( const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, + ...abacusWorksEnvOwnerConfig.ethereum, type: TokenType.collateral, token: tokens.ethereum.USDT, gas: 65_000, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts index 438fe23e94..fd1b5c2b1a 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getInevmInjectiveINJWarpConfig.ts @@ -1,23 +1,28 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getInevmInjectiveINJWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const injectiveRouter = 'inj1mv9tjvkaw7x8w8y9vds8pkfq46g2vcfkjehc6k'; - // @ts-ignore - foreignDeployment configs don't conform to the TokenRouterConfig const injective: TokenRouterConfig = { + ...routerConfig.injective, + ...abacusWorksEnvOwnerConfig.injective, type: TokenType.native, foreignDeployment: injectiveRouter, }; const inevm: TokenRouterConfig = { ...routerConfig.inevm, + ...abacusWorksEnvOwnerConfig.inevm, type: TokenType.native, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts index e157552e62..a603ec139c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getMantapacificNeutronTiaWarpConfig.ts @@ -1,12 +1,15 @@ import { ChainMap, - RouterConfig, + OwnableConfig, TokenRouterConfig, TokenType, } from '@hyperlane-xyz/sdk'; +import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; + export const getMantapacificNeutronTiaWarpConfig = async ( - routerConfig: ChainMap, + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ): Promise> => { const neutronRouter = '0xc5fc6899019cb4a7649981d89eb7b1a0929d0a85b2d41802f3315129ad4b581a'; @@ -18,6 +21,7 @@ export const getMantapacificNeutronTiaWarpConfig = async ( const mantapacific: TokenRouterConfig = { ...routerConfig.mantapacific, + ...abacusWorksEnvOwnerConfig.mantapacific, type: TokenType.synthetic, name: 'TIA', symbol: 'TIA', diff --git a/typescript/infra/config/environments/mainnet3/warp/consts.ts b/typescript/infra/config/environments/mainnet3/warp/consts.ts new file mode 100644 index 0000000000..f201c1784e --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/consts.ts @@ -0,0 +1,2 @@ +// The amount of gas to pay for when performing a transferRemote to a Sealevel chain. +export const SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT = 300_000; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index a68ed19c8f..679d531319 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -1,19 +1,23 @@ export enum WarpRouteIds { Ancient8EthereumUSDC = 'USDC/ancient8-ethereum', ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH = 'EZETH/arbitrum-base-blast-bsc-ethereum-fraxtal-linea-mode-optimism-sei-taiko-zircuit', + ArbitrumBaseEnduranceUSDC = 'USDC/arbitrum-base-endurance', ArbitrumEthereumZircuitAMPHRETH = 'AMPHRETH/arbitrum-ethereum-zircuit', ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', + EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumTETH = 'tETH/eclipsemainnet-ethereum', EclipseEthereumWBTC = 'WBTC/eclipsemainnet-ethereum', EclipseEthereumWeETHs = 'weETHs/eclipsemainnet-ethereum', + EclipseSolanaEzSOL = 'EZSOL/eclipsemainnet-solanamainnet', EclipseSolanaORCA = 'ORCA/eclipsemainnet-solanamainnet', EclipseSolanaSOL = 'SOL/eclipsemainnet-solanamainnet', EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet', EclipseStrideSTTIA = 'stTIA/eclipsemainnet-stride', EclipseStrideTIA = 'TIA/eclipsemainnet-stride', + EthereumFlowCbBTC = 'CBBTC/ethereum-flowmainnet', EthereumInevmUSDC = 'USDC/ethereum-inevm', EthereumInevmUSDT = 'USDT/ethereum-inevm', EthereumSeiFastUSD = 'FASTUSD/ethereum-sei', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 3a9bf87e0b..a32dc4228b 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -1,26 +1,29 @@ import { ChainMap, MultiProvider, - RouterConfig, + OwnableConfig, TokenRouterConfig, } from '@hyperlane-xyz/sdk'; +import { objMap } from '@hyperlane-xyz/utils'; -import { getHyperlaneCore } from '../scripts/core-utils.js'; import { EnvironmentConfig, getRouterConfigsForAllVms, } from '../src/config/environment.js'; +import { RouterConfigWithoutOwner } from '../src/config/warp.js'; import { getAncient8EthereumUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getAncient8EthereumUSDCWarpConfig.js'; import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; import { getArbitrumNeutronEclipWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.js'; import { getArbitrumNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.js'; +import { getEclipseEthereumApxEthWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.js'; import { getEclipseEthereumSolanaUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.js'; import { getEclipseEthereumWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.js'; import { getEclipseEthereumWeEthsWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.js'; import { getEclipseStrideTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.js'; import { getEclipseStrideStTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.js'; import { getEthereumBscLUMIAWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumBscLumiaLUMIAWarpConfig.js'; +import { getEthereumFlowCbBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.js'; import { getEthereumInevmUSDCWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDCWarpConfig.js'; import { getEthereumInevmUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumInevmUSDTWarpConfig.js'; import { getEthereumSeiFastUSDWarpConfig } from './environments/mainnet3/warp/configGetters/getEthereumSeiFastUSDWarpConfig.js'; @@ -33,16 +36,12 @@ import { getRenzoEZETHWarpConfig } from './environments/mainnet3/warp/configGett import { getRenzoPZETHWarpConfig } from './environments/mainnet3/warp/configGetters/getRenzoPZETHWarpConfig.js'; import { WarpRouteIds } from './environments/mainnet3/warp/warpIds.js'; -type WarpConfigGetterWithConfig = ( - routerConfig: ChainMap, +type WarpConfigGetter = ( + routerConfig: ChainMap, + abacusWorksEnvOwnerConfig: ChainMap, ) => Promise>; -type WarpConfigGetterWithoutConfig = () => Promise>; - -export const warpConfigGetterMap: Record< - string, - WarpConfigGetterWithConfig | WarpConfigGetterWithoutConfig -> = { +export const warpConfigGetterMap: Record = { [WarpRouteIds.Ancient8EthereumUSDC]: getAncient8EthereumUSDCWarpConfig, [WarpRouteIds.ArbitrumEthereumZircuitAMPHRETH]: getArbitrumEthereumZircuitAmphrETHWarpConfig, @@ -53,6 +52,7 @@ export const warpConfigGetterMap: Record< [WarpRouteIds.ArbitrumBaseBlastBscEthereumFraxtalLineaModeOptimismSeiTaikoZircuitEZETH]: getRenzoEZETHWarpConfig, [WarpRouteIds.InevmInjectiveINJ]: getInevmInjectiveINJWarpConfig, + [WarpRouteIds.EthereumFlowCbBTC]: getEthereumFlowCbBTCWarpConfig, [WarpRouteIds.EthereumSeiFastUSD]: getEthereumSeiFastUSDWarpConfig, [WarpRouteIds.EthereumVictionETH]: getEthereumVictionETHWarpConfig, [WarpRouteIds.EthereumVictionUSDC]: getEthereumVictionUSDCWarpConfig, @@ -60,12 +60,13 @@ export const warpConfigGetterMap: Record< [WarpRouteIds.EthereumZircuitPZETH]: getRenzoPZETHWarpConfig, [WarpRouteIds.EthereumBscLumiaLUMIA]: getEthereumBscLUMIAWarpConfig, [WarpRouteIds.MantapacificNeutronTIA]: getMantapacificNeutronTiaWarpConfig, - [WarpRouteIds.EclipseStrideTIA]: getEclipseStrideTiaWarpConfig, - [WarpRouteIds.EclipseStrideSTTIA]: getEclipseStrideStTiaWarpConfig, + [WarpRouteIds.EclipseEthereumApxEth]: getEclipseEthereumApxEthWarpConfig, [WarpRouteIds.EclipseEthereumSolanaUSDT]: getEclipseEthereumSolanaUSDTWarpConfig, [WarpRouteIds.EclipseEthereumWBTC]: getEclipseEthereumWBTCWarpConfig, [WarpRouteIds.EclipseEthereumWeETHs]: getEclipseEthereumWeEthsWarpConfig, + [WarpRouteIds.EclipseStrideTIA]: getEclipseStrideTiaWarpConfig, + [WarpRouteIds.EclipseStrideSTTIA]: getEclipseStrideStTiaWarpConfig, }; export async function getWarpConfig( @@ -77,6 +78,19 @@ export async function getWarpConfig( envConfig, multiProvider, ); + // Strip the owners from the router config + const routerConfigWithoutOwner = objMap(routerConfig, (_chain, config) => { + const { owner, ownerOverrides, ...configWithoutOwner } = config; + return configWithoutOwner; + }); + // Isolate the owners from the router config + const abacusWorksEnvOwnerConfig = objMap(routerConfig, (_chain, config) => { + const { owner, ownerOverrides } = config; + return { + owner, + ownerOverrides, + }; + }); const warpConfigGetter = warpConfigGetterMap[warpRouteId]; if (!warpConfigGetter) { @@ -87,9 +101,5 @@ export async function getWarpConfig( ); } - if (warpConfigGetter.length === 1) { - return warpConfigGetter(routerConfig); - } else { - return (warpConfigGetter as WarpConfigGetterWithoutConfig)(); - } + return warpConfigGetter(routerConfigWithoutOwner, abacusWorksEnvOwnerConfig); } diff --git a/typescript/infra/helm/warp-routes/templates/_helpers.tpl b/typescript/infra/helm/warp-routes/templates/_helpers.tpl index bc732a5a37..2a9424b0a9 100644 --- a/typescript/infra/helm/warp-routes/templates/_helpers.tpl +++ b/typescript/infra/helm/warp-routes/templates/_helpers.tpl @@ -69,7 +69,7 @@ The warp-routes container imagePullPolicy: IfNotPresent env: - name: LOG_FORMAT - value: pretty + value: json command: - ./node_modules/.bin/tsx - ./typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts diff --git a/typescript/infra/package.json b/typescript/infra/package.json index c62699a662..400bb11546 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,29 +1,29 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "7.0.0", + "version": "7.1.0", "dependencies": { - "@arbitrum/sdk": "^3.0.0", + "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", - "@aws-sdk/client-kms": "3.48.0", - "@aws-sdk/client-s3": "^3.74.0", + "@aws-sdk/client-kms": "^3.577.0", + "@aws-sdk/client-s3": "^3.577.0", "@cosmjs/amino": "^0.32.4", "@eth-optimism/sdk": "^3.1.6", "@ethersproject/experimental": "^5.7.0", "@ethersproject/hardware-wallets": "^5.7.0", - "@ethersproject/providers": "^5.7.2", + "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "7.0.0", - "@hyperlane-xyz/registry": "4.10.0", - "@hyperlane-xyz/sdk": "7.0.0", - "@hyperlane-xyz/utils": "7.0.0", - "@inquirer/prompts": "^5.3.8", + "@hyperlane-xyz/helloworld": "7.1.0", + "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", + "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-core-sdk-types": "2.3.0", "@solana/web3.js": "^1.95.4", - "asn1.js": "5.4.1", + "asn1.js": "^5.4.1", "aws-kms-ethers-signer": "^0.1.3", "deep-object-diff": "^1.1.9", "dotenv": "^10.0.0", @@ -39,17 +39,17 @@ "@types/chai": "^4.2.21", "@types/json-stable-stringify": "^1.0.36", "@types/mocha": "^10.0.1", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", "@types/prompts": "^2.0.14", "@types/sinon-chai": "^3.2.12", "@types/yargs": "^17.0.24", - "chai": "4.5.0", + "chai": "^4.5.0", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "hardhat": "^2.22.2", "mocha": "^10.2.0", "prettier": "^2.8.8", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3" }, "private": true, diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index 4fd4c8ec3d..f47d13f879 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -1,11 +1,7 @@ import path, { join } from 'path'; import yargs, { Argv } from 'yargs'; -import { - ChainAddresses, - IRegistry, - warpConfigToWarpAddresses, -} from '@hyperlane-xyz/registry'; +import { ChainAddresses, IRegistry } from '@hyperlane-xyz/registry'; import { ChainMap, ChainMetadata, @@ -157,20 +153,26 @@ export function withChain(args: Argv) { .alias('c', 'chain'); } -export function withChains(args: Argv) { +export function withChains(args: Argv, chainOptions?: ChainName[]) { return ( args .describe('chains', 'Set of chains to perform actions on.') .array('chains') - .choices('chains', getChains()) + .choices( + 'chains', + !chainOptions || chainOptions.length === 0 ? getChains() : chainOptions, + ) // Ensure chains are unique .coerce('chains', (chains: string[]) => Array.from(new Set(chains))) .alias('c', 'chains') ); } -export function withChainsRequired(args: Argv) { - return withChains(args).demandOption('chains'); +export function withChainsRequired( + args: Argv, + chainOptions?: ChainName[], +) { + return withChains(args, chainOptions).demandOption('chains'); } export function withWarpRouteId(args: Argv) { @@ -191,9 +193,8 @@ export function withProtocol(args: Argv) { export function withAgentRole(args: Argv) { return args - .describe('role', 'agent roles') - .array('role') - .coerce('role', (role: string[]): Role[] => role.map(assertRole)) + .describe('role', 'agent role') + .coerce('role', (role: string): Role => assertRole(role)) .demandOption('role') .alias('r', 'role'); } @@ -206,11 +207,16 @@ export function withAgentRoles(args: Argv) { .coerce('roles', (role: string[]): Role[] => role.map(assertRole)) .choices('roles', Object.values(Role)) // Ensure roles are unique - .coerce('roles', (roles: string[]) => Array.from(new Set(roles))) + .coerce('roles', (roles: Role[]) => Array.from(new Set(roles))) .alias('r', 'roles') + .alias('role', 'roles') ); } +export function withAgentRolesRequired(args: Argv) { + return withAgentRoles(args).demandOption('roles'); +} + export function withKeyRoleAndChain(args: Argv) { return args .describe('role', 'key role') @@ -264,6 +270,15 @@ export function withRpcUrls(args: Argv) { .alias('r', 'rpcUrls'); } +export function withTxHashes(args: Argv) { + return args + .describe('txHashes', 'transaction hash') + .string('txHashes') + .array('txHashes') + .demandOption('txHashes') + .alias('t', 'txHashes'); +} + // not requiring to build coreConfig to get agentConfig export async function getAgentConfigsBasedOnArgs(argv?: { environment: DeployEnvironment; diff --git a/typescript/infra/scripts/agents/utils.ts b/typescript/infra/scripts/agents/utils.ts index 84fe60f597..fa3a1da4ce 100644 --- a/typescript/infra/scripts/agents/utils.ts +++ b/typescript/infra/scripts/agents/utils.ts @@ -11,7 +11,7 @@ import { HelmCommand } from '../../src/utils/helm.js'; import { assertCorrectKubeContext, getArgs, - withAgentRole, + withAgentRolesRequired, withChains, withContext, } from '../agent-utils.js'; @@ -70,21 +70,23 @@ export class AgentCli { protected async init() { if (this.initialized) return; - const argv = await withChains(withAgentRole(withContext(getArgs()))) + const argv = await withChains( + withAgentRolesRequired(withContext(getArgs())), + ) .describe('dry-run', 'Run through the steps without making any changes') .boolean('dry-run').argv; if ( argv.chains && argv.chains.length > 0 && - !argv.role.includes(Role.Validator) + !argv.roles.includes(Role.Validator) ) { console.warn('Chain argument applies to validator role only. Ignoring.'); } const { envConfig, agentConfig } = await getConfigsBasedOnArgs(argv); await assertCorrectKubeContext(envConfig); - this.roles = argv.role; + this.roles = argv.roles; this.envConfig = envConfig; this.agentConfig = agentConfig; this.dryRun = argv.dryRun || false; diff --git a/typescript/infra/scripts/check/check-utils.ts b/typescript/infra/scripts/check/check-utils.ts index 5925832fbd..bac0229f57 100644 --- a/typescript/infra/scripts/check/check-utils.ts +++ b/typescript/infra/scripts/check/check-utils.ts @@ -14,6 +14,7 @@ import { InterchainAccountConfig, InterchainQuery, InterchainQueryChecker, + MultiProvider, attachContractsMapAndGetForeignDeployments, hypERC20factories, proxiedFactories, @@ -72,9 +73,13 @@ export async function getGovernor( chains?: string[], fork?: string, govern?: boolean, + multiProvider: MultiProvider | undefined = undefined, ) { const envConfig = getEnvironmentConfig(environment); - let multiProvider = await envConfig.getMultiProvider(); + // If the multiProvider is not passed in, get it from the environment + if (!multiProvider) { + multiProvider = await envConfig.getMultiProvider(); + } // must rotate to forked provider before building core contracts if (fork) { diff --git a/typescript/infra/scripts/check/check-warp-deploy.ts b/typescript/infra/scripts/check/check-warp-deploy.ts index aa51c70165..f32d53c2b0 100644 --- a/typescript/infra/scripts/check/check-warp-deploy.ts +++ b/typescript/infra/scripts/check/check-warp-deploy.ts @@ -4,6 +4,7 @@ import { Gauge, Registry } from 'prom-client'; import { warpConfigGetterMap } from '../../config/warp.js'; import { submitMetrics } from '../../src/utils/metrics.js'; import { Modules } from '../agent-utils.js'; +import { getEnvironmentConfig } from '../core-utils.js'; import { getCheckWarpDeployArgs, @@ -16,6 +17,10 @@ async function main() { const { environment, asDeployer, chains, fork, context, pushMetrics } = await getCheckWarpDeployArgs().argv; + const envConfig = getEnvironmentConfig(environment); + // Get the multiprovider once to avoid recreating it for each warp route + const multiProvider = await envConfig.getMultiProvider(); + const metricsRegister = new Registry(); const checkerViolationsGauge = new Gauge( getCheckerViolationsGaugeObj(metricsRegister), @@ -38,6 +43,8 @@ async function main() { warpRouteId, chains, fork, + false, + multiProvider, ); await governor.check(); diff --git a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts index 4601dc702f..dabb1fbd27 100644 --- a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts +++ b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts @@ -1,4 +1,4 @@ -import { EthBridger, getL2Network } from '@arbitrum/sdk'; +import { EthBridger, getArbitrumNetwork } from '@arbitrum/sdk'; import { CrossChainMessenger } from '@eth-optimism/sdk'; import { Connection, PublicKey } from '@solana/web3.js'; import { BigNumber, ethers } from 'ethers'; @@ -841,13 +841,13 @@ class ContextFunder { private async bridgeToArbitrum(l2Chain: ChainName, amount: BigNumber) { const l1Chain = L2ToL1[l2Chain]; - const l2Network = await getL2Network( + const l2Network = await getArbitrumNetwork( this.multiProvider.getEvmChainId(l2Chain), ); const ethBridger = new EthBridger(l2Network); return ethBridger.deposit({ amount, - l1Signer: this.multiProvider.getSigner(l1Chain), + parentSigner: this.multiProvider.getSigner(l1Chain), overrides: this.multiProvider.getTransactionOverrides(l1Chain), }); } diff --git a/typescript/infra/scripts/create-keys.ts b/typescript/infra/scripts/keys/create-keys.ts similarity index 61% rename from typescript/infra/scripts/create-keys.ts rename to typescript/infra/scripts/keys/create-keys.ts index c5798679aa..43b7694b0b 100644 --- a/typescript/infra/scripts/create-keys.ts +++ b/typescript/infra/scripts/keys/create-keys.ts @@ -1,6 +1,5 @@ -import { createAgentKeysIfNotExists } from '../src/agents/key-utils.js'; - -import { getAgentConfigsBasedOnArgs } from './agent-utils.js'; +import { createAgentKeysIfNotExists } from '../../src/agents/key-utils.js'; +import { getAgentConfigsBasedOnArgs } from '../agent-utils.js'; async function main() { const { agentConfig } = await getAgentConfigsBasedOnArgs(); diff --git a/typescript/infra/scripts/delete-keys.ts b/typescript/infra/scripts/keys/delete-keys.ts similarity index 58% rename from typescript/infra/scripts/delete-keys.ts rename to typescript/infra/scripts/keys/delete-keys.ts index 934733cfda..12a0f1bb78 100644 --- a/typescript/infra/scripts/delete-keys.ts +++ b/typescript/infra/scripts/keys/delete-keys.ts @@ -1,6 +1,5 @@ -import { deleteAgentKeys } from '../src/agents/key-utils.js'; - -import { getAgentConfigsBasedOnArgs } from './agent-utils.js'; +import { deleteAgentKeys } from '../../src/agents/key-utils.js'; +import { getAgentConfigsBasedOnArgs } from '../agent-utils.js'; async function main() { const { agentConfig } = await getAgentConfigsBasedOnArgs(); diff --git a/typescript/infra/scripts/get-key-addresses.ts b/typescript/infra/scripts/keys/get-key-addresses.ts similarity index 80% rename from typescript/infra/scripts/get-key-addresses.ts rename to typescript/infra/scripts/keys/get-key-addresses.ts index b35c38cd22..9cd7df379a 100644 --- a/typescript/infra/scripts/get-key-addresses.ts +++ b/typescript/infra/scripts/keys/get-key-addresses.ts @@ -1,7 +1,6 @@ -import { getAllCloudAgentKeys } from '../src/agents/key-utils.js'; - -import { getArgs, withContext, withProtocol } from './agent-utils.js'; -import { getConfigsBasedOnArgs } from './core-utils.js'; +import { getAllCloudAgentKeys } from '../../src/agents/key-utils.js'; +import { getArgs, withContext, withProtocol } from '../agent-utils.js'; +import { getConfigsBasedOnArgs } from '../core-utils.js'; async function main() { const argv = await withProtocol(withContext(getArgs())).argv; diff --git a/typescript/infra/scripts/keys/get-key.ts b/typescript/infra/scripts/keys/get-key.ts new file mode 100644 index 0000000000..60338717de --- /dev/null +++ b/typescript/infra/scripts/keys/get-key.ts @@ -0,0 +1,38 @@ +import { getCloudAgentKey } from '../../src/agents/key-utils.js'; +import { + getArgs, + withAgentRole, + withContext, + withProtocol, +} from '../agent-utils.js'; +import { getConfigsBasedOnArgs } from '../core-utils.js'; + +async function main() { + const argv = await withAgentRole(withContext(getArgs())).argv; + + const { agentConfig } = await getConfigsBasedOnArgs(argv); + + // As a (very rudimentary) security precaution, we don't print the private key directly to + // the console if this script is ran directly. + // We only write the private key to the console if it is not a tty, e.g. if + // this is being called in a subshell or piped to another command. + // + // E.g. this will print the private key: + // $ echo `yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer` + // or this too: + // $ echo $(yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer) + // and even this: + // $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer | cat + // + // But this will not print the private key directly to the shell: + // $ yarn tsx infra/scripts/keys/get-key.ts -e mainnet3 --role deployer + if (process.stdout.isTTY) { + console.log(''); + } else { + const key = getCloudAgentKey(agentConfig, argv.role); + await key.fetch(); + console.log(key.privateKey); + } +} + +main().catch(console.error); diff --git a/typescript/infra/scripts/get-owner-ica.ts b/typescript/infra/scripts/keys/get-owner-ica.ts similarity index 92% rename from typescript/infra/scripts/get-owner-ica.ts rename to typescript/infra/scripts/keys/get-owner-ica.ts index 16c6db99e3..b4d42c860e 100644 --- a/typescript/infra/scripts/get-owner-ica.ts +++ b/typescript/infra/scripts/keys/get-owner-ica.ts @@ -1,11 +1,10 @@ import { AccountConfig, InterchainAccount } from '@hyperlane-xyz/sdk'; import { Address, eqAddress, isZeroishAddress } from '@hyperlane-xyz/utils'; -import { chainsToSkip } from '../src/config/chain.js'; -import { isEthereumProtocolChain } from '../src/utils/utils.js'; - -import { getArgs as getEnvArgs, withChains } from './agent-utils.js'; -import { getEnvironmentConfig, getHyperlaneCore } from './core-utils.js'; +import { chainsToSkip } from '../../src/config/chain.js'; +import { isEthereumProtocolChain } from '../../src/utils/utils.js'; +import { getArgs as getEnvArgs, withChains } from '../agent-utils.js'; +import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; function getArgs() { return withChains(getEnvArgs()) diff --git a/typescript/infra/scripts/rotate-key.ts b/typescript/infra/scripts/keys/rotate-key.ts similarity index 97% rename from typescript/infra/scripts/rotate-key.ts rename to typescript/infra/scripts/keys/rotate-key.ts index c7a9fe5597..bd01f6071c 100644 --- a/typescript/infra/scripts/rotate-key.ts +++ b/typescript/infra/scripts/keys/rotate-key.ts @@ -3,7 +3,7 @@ import { getArgs, withContext, withKeyRoleAndChain, -} from './agent-utils.js'; +} from '../agent-utils.js'; async function rotateKey() { const argv = await withContext(withKeyRoleAndChain(getArgs())).argv; diff --git a/typescript/infra/scripts/update-key.ts b/typescript/infra/scripts/keys/update-key.ts similarity index 97% rename from typescript/infra/scripts/update-key.ts rename to typescript/infra/scripts/keys/update-key.ts index 862b8c8bc6..da27c410bd 100644 --- a/typescript/infra/scripts/update-key.ts +++ b/typescript/infra/scripts/keys/update-key.ts @@ -3,7 +3,7 @@ import { getArgs, withContext, withKeyRoleAndChain, -} from './agent-utils.js'; +} from '../agent-utils.js'; async function rotateKey() { const argv = await withKeyRoleAndChain(withContext(getArgs())).argv; diff --git a/typescript/infra/scripts/safes/get-pending-txs.ts b/typescript/infra/scripts/safes/get-pending-txs.ts new file mode 100644 index 0000000000..0c7fc70842 --- /dev/null +++ b/typescript/infra/scripts/safes/get-pending-txs.ts @@ -0,0 +1,202 @@ +import { confirm } from '@inquirer/prompts'; +import chalk from 'chalk'; +import yargs from 'yargs'; + +import { MultiProvider } from '@hyperlane-xyz/sdk'; + +import { Contexts } from '../../config/contexts.js'; +import { safes } from '../../config/environments/mainnet3/owners.js'; +import { Role } from '../../src/roles.js'; +import { executeTx, getSafeAndService } from '../../src/utils/safe.js'; +import { withChains } from '../agent-utils.js'; +import { getEnvironmentConfig } from '../core-utils.js'; + +export enum SafeTxStatus { + NO_CONFIRMATIONS = '🔴', + PENDING = '🟡', + ONE_AWAY = '🔵', + READY_TO_EXECUTE = '🟢', +} + +type SafeStatus = { + chain: string; + nonce: number; + submissionDate: string; + shortTxHash: string; + fullTxHash: string; + confs: number; + threshold: number; + status: string; +}; + +export async function getPendingTxsForChains( + chains: string[], + multiProvider: MultiProvider, +): Promise { + const txs: SafeStatus[] = []; + await Promise.all( + chains.map(async (chain) => { + if (!safes[chain]) { + console.error(chalk.red.bold(`No safe found for ${chain}`)); + return; + } + + if (chain === 'endurance') { + console.info( + chalk.gray.italic( + `Skipping chain ${chain} as it does not have a functional safe API`, + ), + ); + return; + } + + let safeSdk, safeService; + try { + ({ safeSdk, safeService } = await getSafeAndService( + chain, + multiProvider, + safes[chain], + )); + } catch (error) { + console.warn( + chalk.yellow( + `Skipping chain ${chain} as there was an error getting the safe service: ${error}`, + ), + ); + return; + } + + const threshold = await safeSdk.getThreshold(); + const pendingTxs = await safeService.getPendingTransactions(safes[chain]); + if (pendingTxs.results.length === 0) { + return; + } + + pendingTxs.results.forEach( + ({ nonce, submissionDate, safeTxHash, confirmations }) => { + const confs = confirmations?.length ?? 0; + const status = + confs >= threshold + ? SafeTxStatus.READY_TO_EXECUTE + : confs === 0 + ? SafeTxStatus.NO_CONFIRMATIONS + : threshold - confs + ? SafeTxStatus.ONE_AWAY + : SafeTxStatus.PENDING; + + txs.push({ + chain, + nonce, + submissionDate: new Date(submissionDate).toDateString(), + shortTxHash: `${safeTxHash.slice(0, 6)}...${safeTxHash.slice(-4)}`, + fullTxHash: safeTxHash, + confs, + threshold, + status, + }); + }, + ); + }), + ); + return txs.sort( + (a, b) => a.chain.localeCompare(b.chain) || a.nonce - b.nonce, + ); +} + +async function main() { + const safeChains = Object.keys(safes); + const { chains, fullTxHash, execute } = await withChains( + yargs(process.argv.slice(2)), + safeChains, + ) + .describe( + 'fullTxHash', + 'If enabled, include the full tx hash in the output', + ) + .boolean('fullTxHash') + .default('fullTxHash', false) + .describe( + 'execute', + 'If enabled, execute transactions that have enough confirmations', + ) + .boolean('execute') + .default('execute', false).argv; + + const chainsToCheck = chains || safeChains; + if (chainsToCheck.length === 0) { + console.error('No chains provided'); + process.exit(1); + } + + const envConfig = getEnvironmentConfig('mainnet3'); + const multiProvider = await envConfig.getMultiProvider( + Contexts.Hyperlane, + Role.Deployer, + true, + chainsToCheck, + ); + + const pendingTxs = await getPendingTxsForChains(chainsToCheck, multiProvider); + if (pendingTxs.length === 0) { + console.info(chalk.green('No pending transactions found!')); + process.exit(0); + } + console.table(pendingTxs, [ + 'chain', + 'nonce', + 'submissionDate', + fullTxHash ? 'fullTxHash' : 'shortTxHash', + 'confs', + 'threshold', + 'status', + ]); + + const executableTxs = pendingTxs.filter( + (tx) => tx.status === SafeTxStatus.READY_TO_EXECUTE, + ); + if ( + executableTxs.length === 0 || + !execute || + !(await confirm({ + message: 'Execute transactions?', + default: execute, + })) + ) { + console.info(chalk.green('No transactions to execute!')); + process.exit(0); + } else { + console.info(chalk.blueBright('Executing transactions...')); + } + + for (const tx of executableTxs) { + const confirmExecuteTx = await confirm({ + message: `Execute transaction ${tx.shortTxHash} on chain ${tx.chain}?`, + default: execute, + }); + if (confirmExecuteTx) { + console.log( + `Executing transaction ${tx.shortTxHash} on chain ${tx.chain}`, + ); + try { + await executeTx( + tx.chain, + multiProvider, + safes[tx.chain], + tx.fullTxHash, + ); + } catch (error) { + console.error(chalk.red(`Error executing transaction: ${error}`)); + return; + } + } + } + + process.exit(0); +} + +main() + .then() + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/typescript/infra/scripts/safes/parse-txs.ts b/typescript/infra/scripts/safes/parse-txs.ts new file mode 100644 index 0000000000..0d4a2947e3 --- /dev/null +++ b/typescript/infra/scripts/safes/parse-txs.ts @@ -0,0 +1,68 @@ +import { BigNumber } from 'ethers'; + +import { AnnotatedEV5Transaction } from '@hyperlane-xyz/sdk'; +import { stringifyObject } from '@hyperlane-xyz/utils'; + +import { GovernTransactionReader } from '../../src/tx/govern-transaction-reader.js'; +import { getSafeTx } from '../../src/utils/safe.js'; +import { + getArgs, + withChainRequired, + withChainsRequired, + withTxHashes, +} from '../agent-utils.js'; +import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; + +async function main() { + const { environment, chains, txHashes } = await withTxHashes( + withChainsRequired(getArgs()), + ).argv; + + const config = getEnvironmentConfig(environment); + const multiProvider = await config.getMultiProvider(); + const { chainAddresses } = await getHyperlaneCore(environment, multiProvider); + + const reader = new GovernTransactionReader( + environment, + multiProvider, + chainAddresses, + config.core, + ); + + const chainResultEntries = await Promise.all( + chains.map(async (chain, chainIndex) => { + const txHash = txHashes[chainIndex]; + console.log(`Reading tx ${txHash} on ${chain}`); + const safeTx = await getSafeTx(chain, multiProvider, txHash); + const tx: AnnotatedEV5Transaction = { + to: safeTx.to, + data: safeTx.data, + value: BigNumber.from(safeTx.value), + }; + + try { + const results = await reader.read(chain, tx); + console.log(`Finished reading tx ${txHash} on ${chain}`); + return [chain, results]; + } catch (err) { + console.error('Error reading transaction', err, chain, tx); + process.exit(1); + } + }), + ); + + const chainResults = Object.fromEntries(chainResultEntries); + console.log(stringifyObject(chainResults, 'yaml', 2)); + + if (reader.errors.length) { + console.error('❌❌❌❌❌ Encountered fatal errors ❌❌❌❌❌'); + console.log(stringifyObject(reader.errors, 'yaml', 2)); + console.error('❌❌❌❌❌ Encountered fatal errors ❌❌❌❌❌'); + process.exit(1); + } +} + +main().catch((err) => { + console.error('Error:', err); + process.exit(1); +}); diff --git a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts index bc19f434f3..e7714778ca 100644 --- a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts +++ b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts @@ -46,11 +46,18 @@ async function getWarpRouteIdsInteractive() { value: id, })); - const selection = await checkbox({ - message: 'Select Warp Route IDs to deploy', - choices, - pageSize: 30, - }); + let selection: WarpRouteIds[] = []; + + while (!selection.length) { + selection = await checkbox({ + message: 'Select Warp Route IDs to deploy', + choices, + pageSize: 30, + }); + if (!selection.length) { + console.log('Please select at least one Warp Route ID'); + } + } return selection; } diff --git a/typescript/infra/scripts/warp-routes/generate-warp-config.ts b/typescript/infra/scripts/warp-routes/generate-warp-config.ts index 61f1cd46f6..077cef0d4c 100644 --- a/typescript/infra/scripts/warp-routes/generate-warp-config.ts +++ b/typescript/infra/scripts/warp-routes/generate-warp-config.ts @@ -34,4 +34,4 @@ async function main() { } } -main().catch(console.error).then(console.log); +main().catch((err) => console.error('Error:', err)); diff --git a/typescript/infra/scripts/warp-routes/monitor/metrics.ts b/typescript/infra/scripts/warp-routes/monitor/metrics.ts index 7f832b512f..eec6738ab1 100644 --- a/typescript/infra/scripts/warp-routes/monitor/metrics.ts +++ b/typescript/infra/scripts/warp-routes/monitor/metrics.ts @@ -74,17 +74,23 @@ export function updateTokenBalanceMetrics( }; warpRouteTokenBalance.labels(metrics).set(balanceInfo.balance); - logger.info('Wallet balance updated for token', { - labels: metrics, - balance: balanceInfo.balance, - }); + logger.info( + { + labels: metrics, + balance: balanceInfo.balance, + }, + 'Wallet balance updated for token', + ); if (balanceInfo.valueUSD) { warpRouteCollateralValue.labels(metrics).set(balanceInfo.valueUSD); - logger.info('Wallet balance updated for token', { - labels: metrics, - valueUSD: balanceInfo.valueUSD, - }); + logger.info( + { + labels: metrics, + valueUSD: balanceInfo.valueUSD, + }, + 'Wallet value updated for token', + ); } } diff --git a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts index f9af0039d3..7a8fdb645a 100644 --- a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts +++ b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts @@ -13,7 +13,7 @@ import { TokenStandard, WarpCore, } from '@hyperlane-xyz/sdk'; -import { ProtocolType, objMap, objMerge } from '@hyperlane-xyz/utils'; +import { ProtocolType, objMap, objMerge, sleep } from '@hyperlane-xyz/utils'; import { getWarpCoreConfig } from '../../../config/registry.js'; import { @@ -78,7 +78,7 @@ async function pollAndUpdateWarpRouteMetrics( apiKey: await getCoinGeckoApiKey(), }); - setInterval(async () => { + while (true) { await tryFn(async () => { await Promise.all( warpCore.tokens.map((token) => @@ -86,7 +86,8 @@ async function pollAndUpdateWarpRouteMetrics( ), ); }, 'Updating warp route metrics'); - }, checkFrequency); + await sleep(checkFrequency); + } } // Updates the metrics for a single token in a warp route. @@ -246,9 +247,7 @@ async function getCoinGeckoApiKey(): Promise { return apiKey; } -main() - .then(logger.info) - .catch((err) => { - logger.error('Error in main', err); - process.exit(1); - }); +main().catch((err) => { + logger.error('Error in main:', err); + process.exit(1); +}); diff --git a/typescript/infra/src/config/agent/relayer.ts b/typescript/infra/src/config/agent/relayer.ts index 648ab81aca..a7500ec74a 100644 --- a/typescript/infra/src/config/agent/relayer.ts +++ b/typescript/infra/src/config/agent/relayer.ts @@ -242,6 +242,18 @@ export function routerMatchingList( return matchingList(routers); } +// Create a matching list for the given senders to any destination or recipient +export function senderMatchingList( + senders: ChainMap<{ sender: Address }>, +): MatchingList { + return Object.entries(senders).map(([chain, { sender }]) => ({ + originDomain: getDomainId(chain), + senderAddress: addressToBytes32(sender), + destinationDomain: '*', + recipientAddress: '*', + })); +} + // Create a matching list for the given contract addresses export function matchingList( addressesMap: HyperlaneAddressesMap, diff --git a/typescript/infra/src/config/environment.ts b/typescript/infra/src/config/environment.ts index 25b17abff7..90761e1adc 100644 --- a/typescript/infra/src/config/environment.ts +++ b/typescript/infra/src/config/environment.ts @@ -104,3 +104,13 @@ export async function getRouterConfigsForAllVms( // Merge, giving evmRouterConfig precedence return objMerge(allRouterConfigs, evmRouterConfig); } + +export function getOwnerConfigForAddress(owner: string): OwnableConfig { + return { + owner, + // To ensure that any other overrides aren't applied + ownerOverrides: { + proxyAdmin: owner, + }, + }; +} diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 27f159079b..e42cd1f03d 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -1,13 +1,20 @@ -import { ChainMap } from '@hyperlane-xyz/sdk'; +import { + ChainMap, + OwnableConfig, + RouterConfig, + TokenRouterConfig, +} from '@hyperlane-xyz/sdk'; import { Address } from '@hyperlane-xyz/utils'; // Common collateral tokens to be used by warp route deployments. export const tokens: ChainMap> = { ethereum: { + amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd', + apxETH: '0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6', + cbBTC: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', + deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', - deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138', - amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', weETHs: '0x917cee801a67f933f2e6b33fc0cd1ed2d5909d88', }, @@ -15,3 +22,5 @@ export const tokens: ChainMap> = { fastUSD: '0x37a4dD9CED2b19Cfe8FAC251cd727b5787E45269', }, }; + +export type RouterConfigWithoutOwner = Omit; diff --git a/typescript/infra/src/tx/govern-transaction-reader.ts b/typescript/infra/src/tx/govern-transaction-reader.ts new file mode 100644 index 0000000000..6b0327bba1 --- /dev/null +++ b/typescript/infra/src/tx/govern-transaction-reader.ts @@ -0,0 +1,531 @@ +import { Result } from '@ethersproject/abi'; +import { decodeMultiSendData } from '@safe-global/protocol-kit/dist/src/utils/index.js'; +import { + MetaTransactionData, + OperationType, +} from '@safe-global/safe-core-sdk-types'; +import { BigNumber, ethers } from 'ethers'; + +import { + AnnotatedEV5Transaction, + ChainMap, + ChainName, + CoreConfig, + DerivedIsmConfig, + EvmIsmReader, + InterchainAccount, + MultiProvider, + coreFactories, + interchainAccountFactories, + normalizeConfig, +} from '@hyperlane-xyz/sdk'; +import { + addressToBytes32, + bytes32ToAddress, + deepEquals, + eqAddress, + retryAsync, +} from '@hyperlane-xyz/utils'; + +import { + icaOwnerChain, + icas, + safes, +} from '../../config/environments/mainnet3/owners.js'; +import { DeployEnvironment } from '../config/environment.js'; +import { getSafeAndService } from '../utils/safe.js'; + +interface GovernTransaction extends Record { + chain: ChainName; +} + +interface MultiSendTransaction { + index: number; + value: string; + operation: string; + decoded: GovernTransaction; +} + +interface MultiSendGovernTransactions extends GovernTransaction { + multisends: MultiSendTransaction[]; +} + +interface SetDefaultIsmInsight { + module: string; + insight: string; +} + +interface IcaRemoteCallInsight { + destination: { + domain: number; + chain: ChainName; + }; + router: { + address: string; + insight: string; + }; + ism: { + address: string; + insight: string; + }; + destinationIca: { + address: string; + insight: string; + }; + calls: GovernTransaction[]; +} + +export class GovernTransactionReader { + errors: any[] = []; + + constructor( + readonly environment: DeployEnvironment, + readonly multiProvider: MultiProvider, + readonly chainAddresses: ChainMap>, + readonly coreConfig: ChainMap, + ) {} + + async read( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + // If it's to an ICA + if (this.isIcaTransaction(chain, tx)) { + return this.readIcaTransaction(chain, tx); + } + + // If it's to a Mailbox + if (this.isMailboxTransaction(chain, tx)) { + return this.readMailboxTransaction(chain, tx); + } + + if (await this.isMultisendTransaction(chain, tx)) { + return this.readMultisendTransaction(chain, tx); + } + + const insight = '⚠️ Unknown transaction type'; + // If we get here, it's an unknown transaction + this.errors.push({ + chain: chain, + tx, + info: insight, + }); + + return { + chain, + insight, + tx, + }; + } + + private async readIcaTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('No data in ICA transaction'); + } + const { symbol } = await this.multiProvider.getNativeToken(chain); + const icaInterface = + interchainAccountFactories.interchainAccountRouter.interface; + const decoded = icaInterface.parseTransaction({ + data: tx.data, + value: tx.value, + }); + + const args = formatFunctionFragmentArgs( + decoded.args, + decoded.functionFragment, + ); + let prettyArgs = args; + + if ( + decoded.functionFragment.name === + icaInterface.functions['enrollRemoteRouter(uint32,bytes32)'].name + ) { + prettyArgs = await this.formatRouterEnrollments( + chain, + 'interchainAccountRouter', + args, + ); + } else if ( + decoded.functionFragment.name === + icaInterface.functions[ + 'callRemoteWithOverrides(uint32,bytes32,bytes32,(bytes32,uint256,bytes)[])' + ].name + ) { + prettyArgs = await this.readIcaRemoteCall(chain, args); + } + + return { + to: `ICA Router (${chain} ${this.chainAddresses[chain].interchainAccountRouter})`, + value: `${ethers.utils.formatEther(decoded.value)} ${symbol}`, + signature: decoded.signature, + args: prettyArgs, + chain, + }; + } + + private async formatRouterEnrollments( + chain: ChainName, + routerName: string, + args: Record, + ): Promise { + const { _domains: domains, _addresses: addresses } = args; + return domains.map((domain: number, index: number) => { + const remoteChainName = this.multiProvider.getChainName(domain); + const expectedRouter = this.chainAddresses[remoteChainName][routerName]; + const routerToBeEnrolled = addresses[index]; + const matchesExpectedRouter = + eqAddress(expectedRouter, bytes32ToAddress(routerToBeEnrolled)) && + // Poor man's check that the 12 byte padding is all zeroes + addressToBytes32(bytes32ToAddress(routerToBeEnrolled)) === + routerToBeEnrolled; + + let insight = '✅ matches expected router from artifacts'; + if (!matchesExpectedRouter) { + insight = `❌ fatal mismatch, expected ${expectedRouter}`; + this.errors.push({ + chain: chain, + remoteDomain: domain, + remoteChain: remoteChainName, + router: routerToBeEnrolled, + expected: expectedRouter, + info: 'Incorrect router getting enrolled', + }); + } + + return { + domain: domain, + chainName: remoteChainName, + router: routerToBeEnrolled, + insight, + }; + }); + } + + private async readMailboxTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('⚠️ No data in mailbox transaction'); + } + const mailboxInterface = coreFactories.mailbox.interface; + const decoded = mailboxInterface.parseTransaction({ + data: tx.data, + value: tx.value, + }); + + const args = formatFunctionFragmentArgs( + decoded.args, + decoded.functionFragment, + ); + let prettyArgs = args; + if ( + decoded.functionFragment.name === + mailboxInterface.functions['setDefaultIsm(address)'].name + ) { + prettyArgs = await this.formatMailboxSetDefaultIsm(chain, args); + } + + return { + chain, + to: `Mailbox (${chain} ${this.chainAddresses[chain].mailbox})`, + signature: decoded.signature, + args: prettyArgs, + }; + } + + private ismDerivationsInProgress: ChainMap = {}; + + private async deriveIsmConfig( + chain: string, + module: string, + ): Promise { + const reader = new EvmIsmReader(this.multiProvider, chain); + + // Start recording some info about the deriving + const startTime = Date.now(); + console.log('Deriving ISM config...', chain); + this.ismDerivationsInProgress[chain] = true; + + const derivedConfig = await reader.deriveIsmConfig(module); + + // Deriving is done, remove from in progress + delete this.ismDerivationsInProgress[chain]; + console.log( + 'Finished deriving ISM config', + chain, + 'in', + (Date.now() - startTime) / (1000 * 60), + 'mins', + ); + const remainingInProgress = Object.keys(this.ismDerivationsInProgress); + console.log( + 'Remaining derivations in progress:', + remainingInProgress.length, + 'chains', + remainingInProgress, + ); + + return derivedConfig; + } + + private async formatMailboxSetDefaultIsm( + chain: ChainName, + args: Record, + ): Promise { + const { _module: module } = args; + + const derivedConfig = this.deriveIsmConfig(chain, module); + const expectedIsmConfig = this.coreConfig[chain].defaultIsm; + + let insight = '✅ matches expected ISM config'; + const normalizedDerived = normalizeConfig(derivedConfig); + const normalizedExpected = normalizeConfig(expectedIsmConfig); + if (!deepEquals(normalizedDerived, normalizedExpected)) { + this.errors.push({ + chain: chain, + module, + derivedConfig, + expectedIsmConfig, + info: 'Incorrect default ISM being set', + }); + insight = `❌ fatal mismatch of ISM config`; + console.log( + 'Mismatch of ISM config', + chain, + JSON.stringify(normalizedDerived), + JSON.stringify(normalizedExpected), + ); + } + + return { + module, + insight, + }; + } + + private async readIcaRemoteCall( + chain: ChainName, + args: Record, + ): Promise { + const { + _destination: destination, + _router: router, + _ism: ism, + _calls: calls, + } = args; + const remoteChainName = this.multiProvider.getChainName(destination); + + const expectedRouter = + this.chainAddresses[remoteChainName].interchainAccountRouter; + const matchesExpectedRouter = + eqAddress(expectedRouter, bytes32ToAddress(router)) && + // Poor man's check that the 12 byte padding is all zeroes + addressToBytes32(bytes32ToAddress(router)) === router; + let routerInsight = '✅ matches expected router from artifacts'; + if (!matchesExpectedRouter) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + router: router, + expected: expectedRouter, + info: 'Incorrect router in ICA call', + }); + routerInsight = `❌ fatal mismatch, expected ${expectedRouter}`; + } + + let ismInsight = '✅ matches expected ISM'; + if (ism !== ethers.constants.HashZero) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + ism, + info: 'Incorrect ISM in ICA call, expected zero hash', + }); + ismInsight = `❌ fatal mismatch, expected zero hash`; + } + + const remoteIcaAddress = await InterchainAccount.fromAddressesMap( + this.chainAddresses, + this.multiProvider, + ).getAccount(remoteChainName, { + owner: safes[icaOwnerChain], + origin: icaOwnerChain, + routerOverride: router, + ismOverride: ism, + }); + const expectedRemoteIcaAddress = icas[remoteChainName as keyof typeof icas]; + let remoteIcaInsight = '✅ matches expected ICA'; + if ( + !expectedRemoteIcaAddress || + !eqAddress(remoteIcaAddress, expectedRemoteIcaAddress) + ) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + ica: remoteIcaAddress, + expected: expectedRemoteIcaAddress, + info: 'Incorrect destination ICA in ICA call', + }); + remoteIcaInsight = `❌ fatal mismatch, expected ${remoteIcaAddress}`; + } + + const decodedCalls = await Promise.all( + calls.map((call: any) => { + const icaCallAsTx = { + to: bytes32ToAddress(call[0]), + value: BigNumber.from(call[1]), + data: call[2], + }; + return this.read(remoteChainName, icaCallAsTx); + }), + ); + + return { + destination: { + domain: destination, + chain: remoteChainName, + }, + router: { + address: router, + insight: routerInsight, + }, + ism: { + address: ism, + insight: ismInsight, + }, + destinationIca: { + address: remoteIcaAddress, + insight: remoteIcaInsight, + }, + calls: decodedCalls, + }; + } + + private async readMultisendTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('No data in multisend transaction'); + } + const multisendDatas = decodeMultiSendData(tx.data); + + const { symbol } = await this.multiProvider.getNativeToken(chain); + + const multisends = await Promise.all( + multisendDatas.map(async (multisend, index) => { + const decoded = await this.read( + chain, + metaTransactionDataToEV5Transaction(multisend), + ); + return { + chain, + index, + value: `${ethers.utils.formatEther(multisend.value)} ${symbol}`, + operation: formatOperationType(multisend.operation), + decoded, + }; + }), + ); + + return { + chain, + multisends, + }; + } + + isIcaTransaction(chain: ChainName, tx: AnnotatedEV5Transaction): boolean { + return ( + tx.to !== undefined && + eqAddress(tx.to, this.chainAddresses[chain].interchainAccountRouter) + ); + } + + isMailboxTransaction(chain: ChainName, tx: AnnotatedEV5Transaction): boolean { + return ( + tx.to !== undefined && + eqAddress(tx.to, this.chainAddresses[chain].mailbox) + ); + } + + async isMultisendTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (tx.to === undefined) { + return false; + } + const multiSendCallOnlyAddress = await this.getMultiSendCallOnlyAddress( + chain, + ); + if (!multiSendCallOnlyAddress) { + return false; + } + + return eqAddress(multiSendCallOnlyAddress, tx.to); + } + + private multiSendCallOnlyAddressCache: ChainMap = {}; + + async getMultiSendCallOnlyAddress( + chain: ChainName, + ): Promise { + if (this.multiSendCallOnlyAddressCache[chain]) { + return this.multiSendCallOnlyAddressCache[chain]; + } + + const safe = safes[chain]; + if (!safe) { + return undefined; + } + + const { safeSdk } = await getSafeAndService( + chain, + this.multiProvider, + safe, + ); + + this.multiSendCallOnlyAddressCache[chain] = + safeSdk.getMultiSendCallOnlyAddress(); + return this.multiSendCallOnlyAddressCache[chain]; + } +} + +function metaTransactionDataToEV5Transaction( + metaTransactionData: MetaTransactionData, +): AnnotatedEV5Transaction { + return { + to: metaTransactionData.to, + value: BigNumber.from(metaTransactionData.value), + data: metaTransactionData.data, + }; +} + +function formatFunctionFragmentArgs( + args: Result, + fragment: ethers.utils.FunctionFragment, +): Record { + const accumulator: Record = {}; + return fragment.inputs.reduce((acc, input, index) => { + acc[input.name] = args[index]; + return acc; + }, accumulator); +} + +function formatOperationType(operation: OperationType | undefined): string { + switch (operation) { + case OperationType.Call: + return 'Call'; + case OperationType.DelegateCall: + return 'Delegate Call'; + default: + return '⚠️ Unknown ⚠️'; + } +} diff --git a/typescript/infra/src/utils/safe.ts b/typescript/infra/src/utils/safe.ts index 397e746c07..95e27c50e3 100644 --- a/typescript/infra/src/utils/safe.ts +++ b/typescript/infra/src/utils/safe.ts @@ -14,7 +14,7 @@ import { getSafe, getSafeService, } from '@hyperlane-xyz/sdk'; -import { Address, CallData, eqAddress } from '@hyperlane-xyz/utils'; +import { Address, CallData, eqAddress, retryAsync } from '@hyperlane-xyz/utils'; import safeSigners from '../../config/environments/mainnet3/safe/safeSigners.json' assert { type: 'json' }; import { AnnotatedCallData } from '../govern/HyperlaneAppGovernor.js'; @@ -24,10 +24,10 @@ export async function getSafeAndService( multiProvider: MultiProvider, safeAddress: Address, ) { - const safeSdk: Safe.default = await getSafe( - chain, - multiProvider, - safeAddress, + const safeSdk: Safe.default = await retryAsync( + () => getSafe(chain, multiProvider, safeAddress), + 5, + 1000, ); const safeService: SafeApiKit.default = getSafeService(chain, multiProvider); return { safeSdk, safeService }; @@ -41,6 +41,52 @@ export function createSafeTransactionData(call: CallData): MetaTransactionData { }; } +export async function executeTx( + chain: ChainNameOrId, + multiProvider: MultiProvider, + safeAddress: Address, + safeTxHash: string, +): Promise { + const { safeSdk, safeService } = await getSafeAndService( + chain, + multiProvider, + safeAddress, + ); + const safeTransaction = await safeService.getTransaction(safeTxHash); + if (!safeTransaction) { + throw new Error(`Failed to fetch transaction details for ${safeTxHash}`); + } + + // Throw if the safe doesn't have enough balance to cover the gas + let estimate; + try { + estimate = await safeService.estimateSafeTransaction( + safeAddress, + safeTransaction, + ); + } catch (error) { + throw new Error( + `Failed to estimate gas for Safe transaction ${safeTxHash} on chain ${chain}: ${error}`, + ); + } + const balance = await multiProvider + .getProvider(chain) + .getBalance(safeAddress); + if (balance.lt(estimate.safeTxGas)) { + throw new Error( + `Safe ${safeAddress} on ${chain} has insufficient balance (${balance.toString()}) for estimated gas (${ + estimate.safeTxGas + })`, + ); + } + + await safeSdk.executeTransaction(safeTransaction); + + console.log( + chalk.green.bold(`Executed transaction ${safeTxHash} on ${chain}`), + ); +} + export async function createSafeTransaction( safeSdk: Safe.default, safeService: SafeApiKit.default, @@ -115,6 +161,31 @@ export async function deleteAllPendingSafeTxs( ); } +export async function getSafeTx( + chain: ChainNameOrId, + multiProvider: MultiProvider, + safeTxHash: string, +): Promise { + const txServiceUrl = + multiProvider.getChainMetadata(chain).gnosisSafeTransactionServiceUrl; + + // Fetch the transaction details to get the proposer + const txDetailsUrl = `${txServiceUrl}/api/v1/multisig-transactions/${safeTxHash}/`; + const txDetailsResponse = await fetch(txDetailsUrl, { + method: 'GET', + headers: { 'Content-Type': 'application/json' }, + }); + + if (!txDetailsResponse.ok) { + console.error( + chalk.red(`Failed to fetch transaction details for ${safeTxHash}`), + ); + return; + } + + return txDetailsResponse.json(); +} + export async function deleteSafeTx( chain: ChainNameOrId, multiProvider: MultiProvider, diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 02b8d9dc99..fb9db10eed 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -22,7 +22,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '6cd61f1-20241112-111341', + tag: '4d0de30-20241119-171012', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, diff --git a/typescript/infra/test/warpIds.test.ts b/typescript/infra/test/warpIds.test.ts index ba171c5bab..11f8a2dd15 100644 --- a/typescript/infra/test/warpIds.test.ts +++ b/typescript/infra/test/warpIds.test.ts @@ -8,8 +8,10 @@ describe('Warp IDs', () => { const registry = getRegistry(); for (const warpId of Object.values(WarpRouteIds)) { // That's a long sentence! - expect(registry.getWarpRoute(warpId), `Warp ID ${warpId} not in registry`) - .to.not.be.null.and.not.be.undefined; + expect( + registry.getWarpRoute(warpId), + `Warp ID ${warpId} not in registry, the .registryrc or your local registry may be out of date`, + ).to.not.be.null.and.not.be.undefined; } }); }); diff --git a/typescript/sdk/.eslintrc b/typescript/sdk/.eslintrc deleted file mode 100644 index a0a6842678..0000000000 --- a/typescript/sdk/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rules": { - "@typescript-eslint/explicit-module-boundary-types": ["warn", { - "allowArgumentsExplicitlyTypedAsAny": true - }] - } -} diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index 028f546b2a..2395e197fe 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,22 @@ # @hyperlane-xyz/sdk +## 7.1.0 + +### Minor Changes + +- 6f2d50fbd: Updated Fraxtal set to include Superlane validators, updated Flow set +- 1159e0f4b: Enroll new validators for alephzeroevmmainnet, chilizmainnet, flowmainnet, immutablezkevmmainnet, metal, polynomialfi, rarichain, rootstockmainnet, superpositionmainnet, flame, prom, inevm. +- ff2b4e2fb: Added helpers to Token and token adapters to get bridged supply of tokens" +- 0e285a443: Add a validateZodResult util function +- 5db46bd31: Implements persistent relayer for use in CLI +- 0cd65c571: Add chainMetadataToCosmosChain function + +### Patch Changes + +- Updated dependencies [0e285a443] + - @hyperlane-xyz/utils@7.1.0 + - @hyperlane-xyz/core@5.8.1 + ## 7.0.0 ### Major Changes diff --git a/typescript/sdk/eslint.config.mjs b/typescript/sdk/eslint.config.mjs new file mode 100644 index 0000000000..2855488799 --- /dev/null +++ b/typescript/sdk/eslint.config.mjs @@ -0,0 +1,25 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + rules: { + '@typescript-eslint/explicit-module-boundary-types': [ + 'warn', + { + allowArgumentsExplicitlyTypedAsAny: true, + }, + ], + }, + }, + { + ignores: ['./src/ism/metadata/**/*.ts'], + rules: { + 'import/no-cycle': ['off'], + }, + }, + { + ignores: ['src/**/*.js'], + }, +]; diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 0918fb6839..0c621a763c 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,14 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "7.0.0", + "version": "7.1.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", - "@aws-sdk/client-s3": "^3.74.0", + "@aws-sdk/client-s3": "^3.577.0", + "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "5.8.0", - "@hyperlane-xyz/utils": "7.0.0", + "@hyperlane-xyz/core": "5.8.1", + "@hyperlane-xyz/utils": "7.1.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", @@ -19,27 +20,33 @@ "cross-fetch": "^3.1.5", "ethers": "^5.7.2", "pino": "^8.19.0", - "viem": "^2.21.40", + "viem": "^2.21.45", "zod": "^3.21.2" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@types/mocha": "^10.0.1", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", "@types/sinon": "^17.0.1", "@types/sinon-chai": "^3.2.12", "@types/ws": "^8.5.5", - "chai": "4.5.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", + "chai": "^4.5.0", "dotenv": "^10.0.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "ethereum-waffle": "^4.0.10", "hardhat": "^2.22.2", "mocha": "^10.2.0", "prettier": "^2.8.8", "sinon": "^13.0.2", "ts-node": "^10.8.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3", "yaml": "2.4.5" }, @@ -69,7 +76,7 @@ "dev": "tsc --watch", "check": "tsc --noEmit", "clean": "rm -rf ./dist ./cache", - "lint": "eslint src --ext .ts", + "lint": "eslint -c ./eslint.config.mjs", "prepublishOnly": "yarn build", "prettier": "prettier --write ./src", "test": "yarn test:unit && yarn test:hardhat && yarn test:foundry", diff --git a/typescript/sdk/src/consts/.eslintrc b/typescript/sdk/src/consts/.eslintrc deleted file mode 100644 index 7242f12412..0000000000 --- a/typescript/sdk/src/consts/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "sort-keys": ["error"] - } -} diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 5f80ff91ab..32bd501f35 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -163,6 +163,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + boba: { + threshold: 1, + validators: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + bsc: { threshold: 3, validators: [ @@ -182,6 +187,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + bsquared: { + threshold: 1, + validators: ['0xcadc90933c9fbe843358a4e70e46ad2db78e28aa'], + }, + camptestnet: { threshold: 1, validators: ['0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e'], @@ -271,6 +281,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + duckchain: { + threshold: 1, + validators: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + eclipsemainnet: { threshold: 3, validators: [ @@ -905,6 +920,11 @@ export const defaultMultisigConfigs: ChainMap = { validators: ['0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a'], }, + superseed: { + threshold: 1, + validators: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + taiko: { threshold: 3, validators: [ @@ -929,11 +949,21 @@ export const defaultMultisigConfigs: ChainMap = { validators: ['0x9750849beda0a7870462d4685f953fe39033a5ae'], }, + unichain: { + threshold: 1, + validators: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + unichaintestnet: { threshold: 1, validators: ['0x5e99961cf71918308c3b17ef21b5f515a4f86fe5'], }, + vana: { + threshold: 1, + validators: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + viction: { threshold: 2, validators: [ diff --git a/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts b/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts index 2891527b2c..16be1a1951 100644 --- a/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts +++ b/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts @@ -1,4 +1,3 @@ -/* eslint-disable sort-keys */ export const multisigIsmVerifyCosts = { '1': { '1': 151966, diff --git a/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts b/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts index 525ca4acd0..665133ed0f 100644 --- a/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts +++ b/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts @@ -195,7 +195,7 @@ describe('core', async () => { try { await deployer.deploy(coreConfig); // eslint-disable-next-line no-empty - } catch (e: any) {} + } catch {} }); afterEach(async () => { @@ -252,7 +252,7 @@ describe('core', async () => { deployer.chainTimeoutMs = 1; try { await deployer.deploy(coreConfig); - } catch (e: any) { + } catch { // TODO: figure out how to test specific error case // expect(e.message).to.include('Timed out in 1ms'); } diff --git a/typescript/sdk/src/core/EvmCoreModule.ts b/typescript/sdk/src/core/EvmCoreModule.ts index a14cdc5fe9..0d783aa341 100644 --- a/typescript/sdk/src/core/EvmCoreModule.ts +++ b/typescript/sdk/src/core/EvmCoreModule.ts @@ -21,8 +21,6 @@ import { HyperlaneAddresses, HyperlaneContractsMap, } from '../contracts/types.js'; -import { DeployedCoreAddresses } from '../core/schemas.js'; -import { CoreConfig } from '../core/types.js'; import { HyperlaneProxyFactoryDeployer } from '../deploy/HyperlaneProxyFactoryDeployer.js'; import { ProxyFactoryFactories, @@ -47,7 +45,8 @@ import { EvmCoreReader } from './EvmCoreReader.js'; import { EvmIcaModule } from './EvmIcaModule.js'; import { HyperlaneCoreDeployer } from './HyperlaneCoreDeployer.js'; import { CoreFactories } from './contracts.js'; -import { CoreConfigSchema } from './schemas.js'; +import { CoreConfigSchema, DeployedCoreAddresses } from './schemas.js'; +import { CoreConfig } from './types.js'; export class EvmCoreModule extends HyperlaneModule< ProtocolType.Ethereum, diff --git a/typescript/sdk/src/core/HyperlaneRelayer.ts b/typescript/sdk/src/core/HyperlaneRelayer.ts index 0a1a451ebf..48ddfd3234 100644 --- a/typescript/sdk/src/core/HyperlaneRelayer.ts +++ b/typescript/sdk/src/core/HyperlaneRelayer.ts @@ -17,10 +17,10 @@ import { } from '@hyperlane-xyz/utils'; import { DerivedHookConfig, EvmHookReader } from '../hook/EvmHookReader.js'; -import { HookConfigSchema } from '../hook/schemas.js'; +import { HookConfigSchema } from '../hook/types.js'; import { DerivedIsmConfig, EvmIsmReader } from '../ism/EvmIsmReader.js'; import { BaseMetadataBuilder } from '../ism/metadata/builder.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; +import { IsmConfigSchema } from '../ism/types.js'; import { MultiProvider } from '../providers/MultiProvider.js'; import { ChainName } from '../types.js'; @@ -307,7 +307,7 @@ export class HyperlaneRelayer { // TODO: handle batching await this.relayMessage(dispatchReceipt, undefined, dispatchMsg); - } catch (error) { + } catch { this.logger.error( `Failed to relay message ${id} (attempt #${attempts + 1})`, ); @@ -320,7 +320,7 @@ export class HyperlaneRelayer { } } - protected whitelistChains() { + protected whitelistChains(): string[] | undefined { return this.whitelist ? Object.keys(this.whitelist) : undefined; } diff --git a/typescript/sdk/src/core/schemas.ts b/typescript/sdk/src/core/schemas.ts index 470df95ab0..9959c30242 100644 --- a/typescript/sdk/src/core/schemas.ts +++ b/typescript/sdk/src/core/schemas.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; -import { HookConfigSchema } from '../hook/schemas.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; +import { HookConfigSchema } from '../hook/types.js'; +import { IsmConfigSchema } from '../ism/types.js'; import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; export const CoreConfigSchema = OwnableSchema.extend({ diff --git a/typescript/sdk/src/deploy/HyperlaneDeployer.ts b/typescript/sdk/src/deploy/HyperlaneDeployer.ts index c6cd2048c6..4deee15ac6 100644 --- a/typescript/sdk/src/deploy/HyperlaneDeployer.ts +++ b/typescript/sdk/src/deploy/HyperlaneDeployer.ts @@ -29,7 +29,7 @@ import { HyperlaneFactories, } from '../contracts/types.js'; import { HookConfig } from '../hook/types.js'; -import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js'; +import type { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js'; import { IsmConfig } from '../ism/types.js'; import { moduleMatchesConfig } from '../ism/utils.js'; import { InterchainAccount } from '../middleware/account/InterchainAccount.js'; diff --git a/typescript/sdk/src/deploy/verify/.eslintrc b/typescript/sdk/src/deploy/verify/.eslintrc deleted file mode 100644 index e3f712414b..0000000000 --- a/typescript/sdk/src/deploy/verify/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } -} diff --git a/typescript/sdk/src/deploy/verify/ContractVerifier.ts b/typescript/sdk/src/deploy/verify/ContractVerifier.ts index 992d2de3b9..49ecd30980 100644 --- a/typescript/sdk/src/deploy/verify/ContractVerifier.ts +++ b/typescript/sdk/src/deploy/verify/ContractVerifier.ts @@ -183,7 +183,7 @@ export class ContractVerifier { 'Parsing response from explorer...', ); responseJson = JSON.parse(responseTextString); - } catch (error) { + } catch { verificationLogger.trace( { failure: response.statusText, diff --git a/typescript/sdk/src/gas/adapters/serialization.ts b/typescript/sdk/src/gas/adapters/serialization.ts index 70cd808259..e7d34a4790 100644 --- a/typescript/sdk/src/gas/adapters/serialization.ts +++ b/typescript/sdk/src/gas/adapters/serialization.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { PublicKey } from '@solana/web3.js'; import { Domain } from '@hyperlane-xyz/utils'; diff --git a/typescript/sdk/src/gas/types.ts b/typescript/sdk/src/gas/types.ts index 55114478d2..6cb46630eb 100644 --- a/typescript/sdk/src/gas/types.ts +++ b/typescript/sdk/src/gas/types.ts @@ -5,7 +5,7 @@ import { InterchainGasPaymaster } from '@hyperlane-xyz/core'; import type { Address } from '@hyperlane-xyz/utils'; import type { CheckerViolation } from '../deploy/types.js'; -import { IgpSchema } from '../hook/schemas.js'; +import { IgpSchema } from '../hook/types.js'; import { ChainMap } from '../types.js'; export type IgpConfig = z.infer; diff --git a/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts b/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts index aa4c9d559d..ae66d7adbf 100644 --- a/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts +++ b/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { expect } from 'chai'; import { Signer } from 'ethers'; import hre from 'hardhat'; diff --git a/typescript/sdk/src/hook/EvmHookModule.ts b/typescript/sdk/src/hook/EvmHookModule.ts index 5f6a64e344..a1e82177a9 100644 --- a/typescript/sdk/src/hook/EvmHookModule.ts +++ b/typescript/sdk/src/hook/EvmHookModule.ts @@ -56,13 +56,13 @@ import { normalizeConfig } from '../utils/ism.js'; import { EvmHookReader } from './EvmHookReader.js'; import { DeployedHook, HookFactories, hookFactories } from './contracts.js'; -import { HookConfigSchema } from './schemas.js'; import { AggregationHookConfig, ArbL2ToL1HookConfig, DomainRoutingHookConfig, FallbackRoutingHookConfig, HookConfig, + HookConfigSchema, HookType, IgpHookConfig, MUTABLE_HOOK_TYPE, diff --git a/typescript/sdk/src/hook/EvmHookReader.test.ts b/typescript/sdk/src/hook/EvmHookReader.test.ts index befd73a431..3a8bb45763 100644 --- a/typescript/sdk/src/hook/EvmHookReader.test.ts +++ b/typescript/sdk/src/hook/EvmHookReader.test.ts @@ -148,7 +148,6 @@ describe('EvmHookReader', () => { expect(config).to.deep.equal(hookConfig); }); - // eslint-disable-next-line @typescript-eslint/no-empty-function it('should derive op stack config correctly', async () => { const mockAddress = randomAddress(); const mockOwner = randomAddress(); diff --git a/typescript/sdk/src/hook/EvmHookReader.ts b/typescript/sdk/src/hook/EvmHookReader.ts index 9ebcd8ae03..dae0f9d589 100644 --- a/typescript/sdk/src/hook/EvmHookReader.ts +++ b/typescript/sdk/src/hook/EvmHookReader.ts @@ -269,7 +269,7 @@ export class EvmHookReader extends HyperlaneReader implements HookReader { this.provider, ); return oracle.owner(); - } catch (error) { + } catch { this.logger.debug( 'Domain not configured on IGP Hook', domainId, @@ -451,7 +451,7 @@ export class EvmHookReader extends HyperlaneReader implements HookReader { if (domainHook !== ethers.constants.AddressZero) { domainHooks[chainName] = await this.deriveHookConfig(domainHook); } - } catch (error) { + } catch { this.logger.debug( `Domain not configured on ${hook.constructor.name}`, domainId, diff --git a/typescript/sdk/src/hook/schemas.ts b/typescript/sdk/src/hook/schemas.ts deleted file mode 100644 index 16bd01b27f..0000000000 --- a/typescript/sdk/src/hook/schemas.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from 'zod'; - -import { StorageGasOracleConfigSchema } from '../gas/oracle/types.js'; -import { ZHash } from '../metadata/customZodTypes.js'; -import { OwnableSchema, PausableSchema } from '../schemas.js'; - -import { - AggregationHookConfig, - DomainRoutingHookConfig, - FallbackRoutingHookConfig, - HookType, -} from './types.js'; - -export const ProtocolFeeSchema = OwnableSchema.extend({ - type: z.literal(HookType.PROTOCOL_FEE), - beneficiary: z.string(), - maxProtocolFee: z.string(), - protocolFee: z.string(), -}); - -export const MerkleTreeSchema = z.object({ - type: z.literal(HookType.MERKLE_TREE), -}); - -export const PausableHookSchema = PausableSchema.extend({ - type: z.literal(HookType.PAUSABLE), -}); - -export const OpStackHookSchema = OwnableSchema.extend({ - type: z.literal(HookType.OP_STACK), - nativeBridge: z.string(), - destinationChain: z.string(), -}); - -export const ArbL2ToL1HookSchema = z.object({ - type: z.literal(HookType.ARB_L2_TO_L1), - arbSys: z - .string() - .describe( - 'precompile for sending messages to L1, interface here: https://github.com/OffchainLabs/nitro-contracts/blob/90037b996509312ef1addb3f9352457b8a99d6a6/src/precompiles/ArbSys.sol#L12', - ), - bridge: z - .string() - .optional() - .describe( - 'address of the bridge contract on L1, optional only needed for non @arbitrum/sdk chains', - ), - destinationChain: z.string(), - childHook: z.lazy((): z.ZodSchema => HookConfigSchema), -}); - -export const IgpSchema = OwnableSchema.extend({ - type: z.literal(HookType.INTERCHAIN_GAS_PAYMASTER), - beneficiary: z.string(), - oracleKey: z.string(), - overhead: z.record(z.number()), - oracleConfig: z.record(StorageGasOracleConfigSchema), -}); - -export const DomainRoutingHookConfigSchema: z.ZodSchema = - z.lazy(() => - OwnableSchema.extend({ - type: z.literal(HookType.ROUTING), - domains: z.record(HookConfigSchema), - }), - ); - -export const FallbackRoutingHookConfigSchema: z.ZodSchema = - z.lazy(() => - OwnableSchema.extend({ - type: z.literal(HookType.FALLBACK_ROUTING), - domains: z.record(HookConfigSchema), - fallback: HookConfigSchema, - }), - ); - -export const AggregationHookConfigSchema: z.ZodSchema = - z.lazy(() => - z.object({ - type: z.literal(HookType.AGGREGATION), - hooks: z.array(HookConfigSchema), - }), - ); - -export const HookConfigSchema = z.union([ - ZHash, - ProtocolFeeSchema, - PausableHookSchema, - OpStackHookSchema, - MerkleTreeSchema, - IgpSchema, - DomainRoutingHookConfigSchema, - FallbackRoutingHookConfigSchema, - AggregationHookConfigSchema, - ArbL2ToL1HookSchema, -]); diff --git a/typescript/sdk/src/hook/types.ts b/typescript/sdk/src/hook/types.ts index 01d5b0df74..3cfd824b7a 100644 --- a/typescript/sdk/src/hook/types.ts +++ b/typescript/sdk/src/hook/types.ts @@ -1,18 +1,11 @@ import { z } from 'zod'; import { OwnableConfig } from '../deploy/types.js'; +import { StorageGasOracleConfigSchema } from '../gas/oracle/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { OwnableSchema, PausableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - ArbL2ToL1HookSchema, - HookConfigSchema, - IgpSchema, - MerkleTreeSchema, - OpStackHookSchema, - PausableHookSchema, - ProtocolFeeSchema, -} from './schemas.js'; - // As found in IPostDispatchHook.sol export enum OnchainHookType { UNUSED, @@ -75,3 +68,87 @@ export const MUTABLE_HOOK_TYPE = [ HookType.FALLBACK_ROUTING, HookType.PAUSABLE, ]; + +export const ProtocolFeeSchema = OwnableSchema.extend({ + type: z.literal(HookType.PROTOCOL_FEE), + beneficiary: z.string(), + maxProtocolFee: z.string(), + protocolFee: z.string(), +}); + +export const MerkleTreeSchema = z.object({ + type: z.literal(HookType.MERKLE_TREE), +}); + +export const PausableHookSchema = PausableSchema.extend({ + type: z.literal(HookType.PAUSABLE), +}); + +export const OpStackHookSchema = OwnableSchema.extend({ + type: z.literal(HookType.OP_STACK), + nativeBridge: z.string(), + destinationChain: z.string(), +}); + +export const ArbL2ToL1HookSchema = z.object({ + type: z.literal(HookType.ARB_L2_TO_L1), + arbSys: z + .string() + .describe( + 'precompile for sending messages to L1, interface here: https://github.com/OffchainLabs/nitro-contracts/blob/90037b996509312ef1addb3f9352457b8a99d6a6/src/precompiles/ArbSys.sol#L12', + ), + bridge: z + .string() + .optional() + .describe( + 'address of the bridge contract on L1, optional only needed for non @arbitrum/sdk chains', + ), + destinationChain: z.string(), + childHook: z.lazy((): z.ZodSchema => HookConfigSchema), +}); + +export const IgpSchema = OwnableSchema.extend({ + type: z.literal(HookType.INTERCHAIN_GAS_PAYMASTER), + beneficiary: z.string(), + oracleKey: z.string(), + overhead: z.record(z.number()), + oracleConfig: z.record(StorageGasOracleConfigSchema), +}); + +export const DomainRoutingHookConfigSchema: z.ZodSchema = + z.lazy(() => + OwnableSchema.extend({ + type: z.literal(HookType.ROUTING), + domains: z.record(HookConfigSchema), + }), + ); + +export const FallbackRoutingHookConfigSchema: z.ZodSchema = + z.lazy(() => + OwnableSchema.extend({ + type: z.literal(HookType.FALLBACK_ROUTING), + domains: z.record(HookConfigSchema), + fallback: HookConfigSchema, + }), + ); + +export const AggregationHookConfigSchema: z.ZodSchema = + z.lazy(() => + z.object({ + type: z.literal(HookType.AGGREGATION), + hooks: z.array(HookConfigSchema), + }), + ); + +export const HookConfigSchema = z.union([ + ZHash, + ProtocolFeeSchema, + PausableHookSchema, + OpStackHookSchema, + MerkleTreeSchema, + IgpSchema, + DomainRoutingHookConfigSchema, + FallbackRoutingHookConfigSchema, + AggregationHookConfigSchema, + ArbL2ToL1HookSchema, +]); diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 68e474d188..61495f53c5 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -135,12 +135,12 @@ export { } from './gas/types.js'; export { EvmHookReader } from './hook/EvmHookReader.js'; export { HyperlaneHookDeployer } from './hook/HyperlaneHookDeployer.js'; -export { HookConfigSchema } from './hook/schemas.js'; export { AggregationHookConfig, DomainRoutingHookConfig, FallbackRoutingHookConfig, HookConfig, + HookConfigSchema, HookType, IgpHookConfig, MerkleTreeHookConfig, @@ -148,8 +148,9 @@ export { PausableHookConfig, ProtocolFeeHookConfig, } from './hook/types.js'; -export { EvmIsmReader } from './ism/EvmIsmReader.js'; +export { DerivedIsmConfig, EvmIsmReader } from './ism/EvmIsmReader.js'; export { HyperlaneIsmFactory } from './ism/HyperlaneIsmFactory.js'; +export { decodeIsmMetadata } from './ism/metadata/decode.js'; export { buildAggregationIsmConfigs, buildMultisigIsmConfigs, @@ -370,6 +371,10 @@ export { EV5TxTransformerInterface } from './providers/transactions/transformer/ export { EV5InterchainAccountTxTransformerPropsSchema } from './providers/transactions/transformer/ethersV5/schemas.js'; export { EV5InterchainAccountTxTransformerProps } from './providers/transactions/transformer/ethersV5/types.js'; +export { + chainMetadataToCosmosChain, + chainMetadataToViemChain, +} from './metadata/chainMetadataConversion.js'; export { EvmGasRouterAdapter, EvmRouterAdapter, @@ -496,6 +501,7 @@ export { stopImpersonatingAccount, } from './utils/fork.js'; export { multisigIsmVerificationCost, normalizeConfig } from './utils/ism.js'; +export { HyperlaneReader } from './utils/HyperlaneReader.js'; export { MultiGeneric } from './utils/MultiGeneric.js'; export { SealevelAccountDataWrapper, @@ -503,7 +509,6 @@ export { getSealevelAccountDataSchema, } from './utils/sealevelSerialization.js'; export { getChainIdFromTxs } from './utils/transactions.js'; -export { chainMetadataToViemChain } from './utils/viem.js'; export { FeeConstantConfig, RouteBlacklist, @@ -518,8 +523,8 @@ export { AggregationIsmConfigSchema, IsmConfigSchema, MultisigIsmConfigSchema, -} from './ism/schemas.js'; -export { MailboxClientConfigSchema as mailboxClientConfigSchema } from './router/schemas.js'; +} from './ism/types.js'; +export { MailboxClientConfigSchema as mailboxClientConfigSchema } from './router/types.js'; export { CollateralConfig, NativeConfig, diff --git a/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts b/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts index 00c31fc715..4f815138cc 100644 --- a/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts +++ b/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import assert from 'assert'; import { expect } from 'chai'; import { Signer } from 'ethers'; diff --git a/typescript/sdk/src/ism/EvmIsmModule.ts b/typescript/sdk/src/ism/EvmIsmModule.ts index 2f4e1ee1d8..6cb0593542 100644 --- a/typescript/sdk/src/ism/EvmIsmModule.ts +++ b/typescript/sdk/src/ism/EvmIsmModule.ts @@ -28,10 +28,10 @@ import { normalizeConfig } from '../utils/ism.js'; import { EvmIsmReader } from './EvmIsmReader.js'; import { HyperlaneIsmFactory } from './HyperlaneIsmFactory.js'; -import { IsmConfigSchema } from './schemas.js'; import { DeployedIsm, IsmConfig, + IsmConfigSchema, IsmType, MUTABLE_ISM_TYPE, RoutingIsmConfig, diff --git a/typescript/sdk/src/ism/EvmIsmReader.ts b/typescript/sdk/src/ism/EvmIsmReader.ts index 06493cb450..6257e7a6e2 100644 --- a/typescript/sdk/src/ism/EvmIsmReader.ts +++ b/typescript/sdk/src/ism/EvmIsmReader.ts @@ -158,7 +158,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { let ismType = IsmType.FALLBACK_ROUTING; try { await ism.mailbox(); - } catch (error) { + } catch { ismType = IsmType.ROUTING; this.logger.debug( 'Error accessing mailbox property, implying this is not a fallback routing ISM.', @@ -248,7 +248,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { relayer, type: IsmType.TRUSTED_RELAYER, }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "trustedRelayer" property, implying this is not a Trusted Relayer ISM.', address, @@ -266,7 +266,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { type: IsmType.PAUSABLE, paused, }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "paused" property, implying this is not a Pausable ISM.', address, @@ -283,7 +283,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { origin: address, nativeBridge: '', // no way to extract native bridge from the ism }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "VERIFIED_MASK_INDEX" property, implying this is not an OP Stack ISM.', address, diff --git a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index 2835e4a351..246f3d27f6 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -466,7 +466,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp { .map((log) => { try { return domainRoutingIsmFactory.interface.parseLog(log); - } catch (e) { + } catch { return undefined; } }) diff --git a/typescript/sdk/src/ism/metadata/aggregation.ts b/typescript/sdk/src/ism/metadata/aggregation.ts index 5c347a6007..0f35e7e2cf 100644 --- a/typescript/sdk/src/ism/metadata/aggregation.ts +++ b/typescript/sdk/src/ism/metadata/aggregation.ts @@ -10,12 +10,13 @@ import { import { DerivedIsmConfig } from '../EvmIsmReader.js'; import { AggregationIsmConfig, IsmType } from '../types.js'; +import type { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; import { - BaseMetadataBuilder, MetadataBuilder, MetadataContext, StructuredMetadata, -} from './builder.js'; +} from './types.js'; // null indicates that metadata is NOT INCLUDED for this submodule // empty or 0x string indicates that metadata is INCLUDED but NULL @@ -137,7 +138,7 @@ export class AggregationMetadataBuilder implements MetadataBuilder { const range = this.metadataRange(metadata, index); if (range.start == 0) return null; if (typeof ism === 'string') return range.encoded; - return BaseMetadataBuilder.decode(range.encoded, { + return decodeIsmMetadata(range.encoded, { ...context, ism: ism as DerivedIsmConfig, }); diff --git a/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts b/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts index f2b66d9cb9..e186da5c9a 100644 --- a/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts +++ b/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts @@ -16,8 +16,12 @@ import { MockArbSys__factory, TestRecipient, } from '@hyperlane-xyz/core'; -import { Address, WithAddress, objMap } from '@hyperlane-xyz/utils'; -import { bytes32ToAddress } from '@hyperlane-xyz/utils'; +import { + Address, + WithAddress, + bytes32ToAddress, + objMap, +} from '@hyperlane-xyz/utils'; import { testChains } from '../../consts/testChains.js'; import { @@ -38,7 +42,7 @@ import { HyperlaneIsmFactory } from '../HyperlaneIsmFactory.js'; import { ArbL2ToL1IsmConfig } from '../types.js'; import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; -import { MetadataContext } from './builder.js'; +import { MetadataContext } from './types.js'; describe('ArbL2ToL1MetadataBuilder', () => { const origin: ChainName = 'test4'; diff --git a/typescript/sdk/src/ism/metadata/arbL2ToL1.ts b/typescript/sdk/src/ism/metadata/arbL2ToL1.ts index 9b12010eb7..5279f1dafe 100644 --- a/typescript/sdk/src/ism/metadata/arbL2ToL1.ts +++ b/typescript/sdk/src/ism/metadata/arbL2ToL1.ts @@ -20,7 +20,7 @@ import { ArbL2ToL1HookConfig } from '../../hook/types.js'; import { findMatchingLogEvents } from '../../utils/logUtils.js'; import { ArbL2ToL1IsmConfig, IsmType } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; export type NitroChildToParentTransactionEvent = EventArgs; export type ArbL2ToL1Metadata = Omit< diff --git a/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts b/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts index fbda40a5b5..53fc89d3d9 100644 --- a/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts +++ b/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts @@ -39,7 +39,9 @@ import { EvmIsmReader } from '../EvmIsmReader.js'; import { randomIsmConfig } from '../HyperlaneIsmFactory.hardhat-test.js'; import { HyperlaneIsmFactory } from '../HyperlaneIsmFactory.js'; -import { BaseMetadataBuilder, MetadataContext } from './builder.js'; +import { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; +import { MetadataContext } from './types.js'; const MAX_ISM_DEPTH = 5; const MAX_NUM_VALIDATORS = 10; @@ -198,7 +200,7 @@ describe('BaseMetadataBuilder', () => { }); it(`should decode metadata for random ism config (${i})`, async () => { - BaseMetadataBuilder.decode(metadata, context); + decodeIsmMetadata(metadata, context); }); } }); diff --git a/typescript/sdk/src/ism/metadata/builder.ts b/typescript/sdk/src/ism/metadata/builder.ts index e290f390f7..c316c20dbf 100644 --- a/typescript/sdk/src/ism/metadata/builder.ts +++ b/typescript/sdk/src/ism/metadata/builder.ts @@ -1,53 +1,30 @@ -/* eslint-disable no-case-declarations */ -import { TransactionReceipt } from '@ethersproject/providers'; - -import { WithAddress, assert, rootLogger } from '@hyperlane-xyz/utils'; +import { + WithAddress, + assert, + deepFind, + rootLogger, +} from '@hyperlane-xyz/utils'; -import { deepFind } from '../../../../utils/dist/objects.js'; import { HyperlaneCore } from '../../core/HyperlaneCore.js'; -import { DispatchedMessage } from '../../core/types.js'; -import { DerivedHookConfig } from '../../hook/EvmHookReader.js'; import { ArbL2ToL1HookConfig, HookType, MerkleTreeHookConfig, } from '../../hook/types.js'; import { MultiProvider } from '../../providers/MultiProvider.js'; -import { DerivedIsmConfig } from '../EvmIsmReader.js'; import { IsmType } from '../types.js'; -import { - AggregationMetadata, - AggregationMetadataBuilder, -} from './aggregation.js'; -import { ArbL2ToL1Metadata, ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; -import { MultisigMetadata, MultisigMetadataBuilder } from './multisig.js'; -import { NullMetadata, NullMetadataBuilder } from './null.js'; -import { - DefaultFallbackRoutingMetadataBuilder, - RoutingMetadata, -} from './routing.js'; - -export type StructuredMetadata = - | NullMetadata - | MultisigMetadata - | ArbL2ToL1Metadata - | AggregationMetadata - | RoutingMetadata; - -export interface MetadataContext< - IsmContext = DerivedIsmConfig, - HookContext = DerivedHookConfig, -> { - message: DispatchedMessage; - dispatchTx: TransactionReceipt; - ism: IsmContext; - hook: HookContext; -} - -export interface MetadataBuilder { - build(context: MetadataContext): Promise; -} +import { AggregationMetadataBuilder } from './aggregation.js'; +import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; +import { decodeIsmMetadata } from './decode.js'; +import { MultisigMetadataBuilder } from './multisig.js'; +import { NullMetadataBuilder } from './null.js'; +import { DefaultFallbackRoutingMetadataBuilder } from './routing.js'; +import type { + MetadataBuilder, + MetadataContext, + StructuredMetadata, +} from './types.js'; export class BaseMetadataBuilder implements MetadataBuilder { public nullMetadataBuilder: NullMetadataBuilder; @@ -91,6 +68,7 @@ export class BaseMetadataBuilder implements MetadataBuilder { if (typeof hook === 'string') { throw new Error('Hook context must be an object (for multisig ISM)'); } + // eslint-disable-next-line no-case-declarations const merkleTreeHook = deepFind( hook, (v): v is WithAddress => @@ -137,32 +115,6 @@ export class BaseMetadataBuilder implements MetadataBuilder { metadata: string, context: MetadataContext, ): StructuredMetadata { - const { ism } = context; - switch (ism.type) { - case IsmType.TRUSTED_RELAYER: - return NullMetadataBuilder.decode(ism); - - case IsmType.MERKLE_ROOT_MULTISIG: - case IsmType.MESSAGE_ID_MULTISIG: - return MultisigMetadataBuilder.decode(metadata, ism.type); - - case IsmType.AGGREGATION: - return AggregationMetadataBuilder.decode(metadata, { ...context, ism }); - - case IsmType.ROUTING: - return DefaultFallbackRoutingMetadataBuilder.decode(metadata, { - ...context, - ism, - }); - - case IsmType.ARB_L2_TO_L1: - return ArbL2ToL1MetadataBuilder.decode(metadata, { - ...context, - ism, - }); - - default: - throw new Error(`Unsupported ISM type: ${ism.type}`); - } + return decodeIsmMetadata(metadata, context); } } diff --git a/typescript/sdk/src/ism/metadata/decode.ts b/typescript/sdk/src/ism/metadata/decode.ts new file mode 100644 index 0000000000..cdd4c6194d --- /dev/null +++ b/typescript/sdk/src/ism/metadata/decode.ts @@ -0,0 +1,41 @@ +import { IsmType } from '../types.js'; + +import { AggregationMetadataBuilder } from './aggregation.js'; +import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; +import { MultisigMetadataBuilder } from './multisig.js'; +import { NullMetadataBuilder } from './null.js'; +import { DefaultFallbackRoutingMetadataBuilder } from './routing.js'; +import { MetadataContext, StructuredMetadata } from './types.js'; + +export function decodeIsmMetadata( + metadata: string, + context: MetadataContext, +): StructuredMetadata { + const { ism } = context; + switch (ism.type) { + case IsmType.TRUSTED_RELAYER: + return NullMetadataBuilder.decode(ism); + + case IsmType.MERKLE_ROOT_MULTISIG: + case IsmType.MESSAGE_ID_MULTISIG: + return MultisigMetadataBuilder.decode(metadata, ism.type); + + case IsmType.AGGREGATION: + return AggregationMetadataBuilder.decode(metadata, { ...context, ism }); + + case IsmType.ROUTING: + return DefaultFallbackRoutingMetadataBuilder.decode(metadata, { + ...context, + ism, + }); + + case IsmType.ARB_L2_TO_L1: + return ArbL2ToL1MetadataBuilder.decode(metadata, { + ...context, + ism, + }); + + default: + throw new Error(`Unsupported ISM type: ${ism.type}`); + } +} diff --git a/typescript/sdk/src/ism/metadata/multisig.ts b/typescript/sdk/src/ism/metadata/multisig.ts index 1de554fa5d..74e50e355b 100644 --- a/typescript/sdk/src/ism/metadata/multisig.ts +++ b/typescript/sdk/src/ism/metadata/multisig.ts @@ -26,7 +26,7 @@ import { MerkleTreeHookConfig } from '../../hook/types.js'; import { ChainName } from '../../types.js'; import { IsmType, MultisigIsmConfig } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; interface MessageIdMultisigMetadata { type: IsmType.MESSAGE_ID_MULTISIG; diff --git a/typescript/sdk/src/ism/metadata/null.ts b/typescript/sdk/src/ism/metadata/null.ts index ed66277ce4..e4be778b73 100644 --- a/typescript/sdk/src/ism/metadata/null.ts +++ b/typescript/sdk/src/ism/metadata/null.ts @@ -3,7 +3,7 @@ import { WithAddress, assert, eqAddress } from '@hyperlane-xyz/utils'; import { MultiProvider } from '../../providers/MultiProvider.js'; import { IsmType, NullIsmConfig } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; export const NULL_METADATA = '0x'; diff --git a/typescript/sdk/src/ism/metadata/routing.ts b/typescript/sdk/src/ism/metadata/routing.ts index 36fd69e605..6a2e2168c4 100644 --- a/typescript/sdk/src/ism/metadata/routing.ts +++ b/typescript/sdk/src/ism/metadata/routing.ts @@ -5,12 +5,13 @@ import { ChainName } from '../../types.js'; import { DerivedIsmConfig, EvmIsmReader } from '../EvmIsmReader.js'; import { IsmType, RoutingIsmConfig } from '../types.js'; -import { - BaseMetadataBuilder, +import type { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; +import type { MetadataBuilder, MetadataContext, StructuredMetadata, -} from './builder.js'; +} from './types.js'; export type RoutingMetadata = { type: IsmType.ROUTING; @@ -45,7 +46,7 @@ export class RoutingMetadataBuilder implements MetadataBuilder { const originMetadata = typeof ism === 'string' ? metadata - : BaseMetadataBuilder.decode(metadata, { + : decodeIsmMetadata(metadata, { ...context, ism: ism as DerivedIsmConfig, }); diff --git a/typescript/sdk/src/ism/metadata/types.ts b/typescript/sdk/src/ism/metadata/types.ts new file mode 100644 index 0000000000..104ef5757d --- /dev/null +++ b/typescript/sdk/src/ism/metadata/types.ts @@ -0,0 +1,32 @@ +import type { providers } from 'ethers'; + +import type { DispatchedMessage } from '../../core/types.js'; +import type { DerivedHookConfig } from '../../hook/EvmHookReader.js'; +import type { DerivedIsmConfig } from '../EvmIsmReader.js'; + +import type { AggregationMetadata } from './aggregation.js'; +import type { ArbL2ToL1Metadata } from './arbL2ToL1.js'; +import type { MultisigMetadata } from './multisig.js'; +import type { NullMetadata } from './null.js'; +import type { RoutingMetadata } from './routing.js'; + +export type StructuredMetadata = + | NullMetadata + | MultisigMetadata + | ArbL2ToL1Metadata + | AggregationMetadata + | RoutingMetadata; + +export interface MetadataContext< + IsmContext = DerivedIsmConfig, + HookContext = DerivedHookConfig, +> { + message: DispatchedMessage; + dispatchTx: providers.TransactionReceipt; + ism: IsmContext; + hook: HookContext; +} + +export interface MetadataBuilder { + build(context: MetadataContext): Promise; +} diff --git a/typescript/sdk/src/ism/schemas.ts b/typescript/sdk/src/ism/schemas.ts deleted file mode 100644 index e9d2e1cda8..0000000000 --- a/typescript/sdk/src/ism/schemas.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { z } from 'zod'; - -import { ZHash } from '../metadata/customZodTypes.js'; -import { OwnableSchema, PausableSchema } from '../schemas.js'; - -import { AggregationIsmConfig, IsmType, RoutingIsmConfig } from './types.js'; - -const ValidatorInfoSchema = z.object({ - signingAddress: ZHash, - weight: z.number(), -}); - -export const TestIsmConfigSchema = z.object({ - type: z.literal(IsmType.TEST_ISM), -}); - -export const MultisigConfigSchema = z.object({ - validators: z.array(ZHash), - threshold: z.number(), -}); - -export const WeightedMultisigConfigSchema = z.object({ - validators: z.array(ValidatorInfoSchema), - thresholdWeight: z.number(), -}); - -export const TrustedRelayerIsmConfigSchema = z.object({ - type: z.literal(IsmType.TRUSTED_RELAYER), - relayer: z.string(), -}); - -export const OpStackIsmConfigSchema = z.object({ - type: z.literal(IsmType.OP_STACK), - origin: z.string(), - nativeBridge: z.string(), -}); - -export const ArbL2ToL1IsmConfigSchema = z.object({ - type: z.literal(IsmType.ARB_L2_TO_L1), - bridge: z.string(), -}); - -export const PausableIsmConfigSchema = PausableSchema.and( - z.object({ - type: z.literal(IsmType.PAUSABLE), - }), -); - -export const MultisigIsmConfigSchema = MultisigConfigSchema.and( - z.object({ - type: z.union([ - z.literal(IsmType.MERKLE_ROOT_MULTISIG), - z.literal(IsmType.MESSAGE_ID_MULTISIG), - z.literal(IsmType.STORAGE_MERKLE_ROOT_MULTISIG), - z.literal(IsmType.STORAGE_MESSAGE_ID_MULTISIG), - ]), - }), -); - -export const WeightedMultisigIsmConfigSchema = WeightedMultisigConfigSchema.and( - z.object({ - type: z.union([ - z.literal(IsmType.WEIGHTED_MERKLE_ROOT_MULTISIG), - z.literal(IsmType.WEIGHTED_MESSAGE_ID_MULTISIG), - ]), - }), -); - -export const RoutingIsmConfigSchema: z.ZodSchema = z.lazy( - () => - OwnableSchema.extend({ - type: z.union([ - z.literal(IsmType.ROUTING), - z.literal(IsmType.FALLBACK_ROUTING), - ]), - domains: z.record(IsmConfigSchema), - }), -); - -export const AggregationIsmConfigSchema: z.ZodSchema = z - .lazy(() => - z.object({ - type: z.literal(IsmType.AGGREGATION), - modules: z.array(IsmConfigSchema), - threshold: z.number(), - }), - ) - .refine((data) => data.threshold <= data.modules.length, { - message: 'Threshold must be less than or equal to the number of modules', - }); - -export const IsmConfigSchema = z.union([ - ZHash, - TestIsmConfigSchema, - OpStackIsmConfigSchema, - PausableIsmConfigSchema, - TrustedRelayerIsmConfigSchema, - MultisigIsmConfigSchema, - WeightedMultisigIsmConfigSchema, - RoutingIsmConfigSchema, - AggregationIsmConfigSchema, - ArbL2ToL1IsmConfigSchema, -]); diff --git a/typescript/sdk/src/ism/schemas.test.ts b/typescript/sdk/src/ism/types.test.ts similarity index 85% rename from typescript/sdk/src/ism/schemas.test.ts rename to typescript/sdk/src/ism/types.test.ts index 7605382c24..9c57ebf042 100644 --- a/typescript/sdk/src/ism/schemas.test.ts +++ b/typescript/sdk/src/ism/types.test.ts @@ -1,8 +1,7 @@ import { expect } from 'chai'; import { ethers } from 'ethers'; -import { AggregationIsmConfigSchema } from './schemas.js'; -import { IsmType } from './types.js'; +import { AggregationIsmConfigSchema, IsmType } from './types.js'; const SOME_ADDRESS = ethers.Wallet.createRandom().address; describe('AggregationIsmConfigSchema refine', () => { diff --git a/typescript/sdk/src/ism/types.ts b/typescript/sdk/src/ism/types.ts index 82e025a049..c215c346da 100644 --- a/typescript/sdk/src/ism/types.ts +++ b/typescript/sdk/src/ism/types.ts @@ -15,19 +15,10 @@ import { import type { Address, Domain, ValueOf } from '@hyperlane-xyz/utils'; import { OwnableConfig } from '../deploy/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { OwnableSchema, PausableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - ArbL2ToL1IsmConfigSchema, - IsmConfigSchema, - MultisigIsmConfigSchema, - OpStackIsmConfigSchema, - PausableIsmConfigSchema, - TestIsmConfigSchema, - TrustedRelayerIsmConfigSchema, - WeightedMultisigIsmConfigSchema, -} from './schemas.js'; - // this enum should match the IInterchainSecurityModule.sol enum // meant for the relayer export enum ModuleType { @@ -167,3 +158,100 @@ export type RoutingIsmDelta = { owner?: Address; // is the owner different mailbox?: Address; // is the mailbox different (only for fallback routing) }; + +const ValidatorInfoSchema = z.object({ + signingAddress: ZHash, + weight: z.number(), +}); + +export const TestIsmConfigSchema = z.object({ + type: z.literal(IsmType.TEST_ISM), +}); + +export const MultisigConfigSchema = z.object({ + validators: z.array(ZHash), + threshold: z.number(), +}); + +export const WeightedMultisigConfigSchema = z.object({ + validators: z.array(ValidatorInfoSchema), + thresholdWeight: z.number(), +}); + +export const TrustedRelayerIsmConfigSchema = z.object({ + type: z.literal(IsmType.TRUSTED_RELAYER), + relayer: z.string(), +}); + +export const OpStackIsmConfigSchema = z.object({ + type: z.literal(IsmType.OP_STACK), + origin: z.string(), + nativeBridge: z.string(), +}); + +export const ArbL2ToL1IsmConfigSchema = z.object({ + type: z.literal(IsmType.ARB_L2_TO_L1), + bridge: z.string(), +}); + +export const PausableIsmConfigSchema = PausableSchema.and( + z.object({ + type: z.literal(IsmType.PAUSABLE), + }), +); + +export const MultisigIsmConfigSchema = MultisigConfigSchema.and( + z.object({ + type: z.union([ + z.literal(IsmType.MERKLE_ROOT_MULTISIG), + z.literal(IsmType.MESSAGE_ID_MULTISIG), + z.literal(IsmType.STORAGE_MERKLE_ROOT_MULTISIG), + z.literal(IsmType.STORAGE_MESSAGE_ID_MULTISIG), + ]), + }), +); + +export const WeightedMultisigIsmConfigSchema = WeightedMultisigConfigSchema.and( + z.object({ + type: z.union([ + z.literal(IsmType.WEIGHTED_MERKLE_ROOT_MULTISIG), + z.literal(IsmType.WEIGHTED_MESSAGE_ID_MULTISIG), + ]), + }), +); + +export const RoutingIsmConfigSchema: z.ZodSchema = z.lazy( + () => + OwnableSchema.extend({ + type: z.union([ + z.literal(IsmType.ROUTING), + z.literal(IsmType.FALLBACK_ROUTING), + ]), + domains: z.record(IsmConfigSchema), + }), +); + +export const AggregationIsmConfigSchema: z.ZodSchema = z + .lazy(() => + z.object({ + type: z.literal(IsmType.AGGREGATION), + modules: z.array(IsmConfigSchema), + threshold: z.number(), + }), + ) + .refine((data) => data.threshold <= data.modules.length, { + message: 'Threshold must be less than or equal to the number of modules', + }); + +export const IsmConfigSchema = z.union([ + ZHash, + TestIsmConfigSchema, + OpStackIsmConfigSchema, + PausableIsmConfigSchema, + TrustedRelayerIsmConfigSchema, + MultisigIsmConfigSchema, + WeightedMultisigIsmConfigSchema, + RoutingIsmConfigSchema, + AggregationIsmConfigSchema, + ArbL2ToL1IsmConfigSchema, +]); diff --git a/typescript/sdk/src/ism/utils.ts b/typescript/sdk/src/ism/utils.ts index 7c28d757a1..4ad2657981 100644 --- a/typescript/sdk/src/ism/utils.ts +++ b/typescript/sdk/src/ism/utils.ts @@ -270,7 +270,7 @@ export async function moduleMatchesConfig( let mailboxAddress; try { mailboxAddress = await client.mailbox(); - } catch (error) { + } catch { matches = false; break; } diff --git a/typescript/sdk/src/metadata/chainMetadataConversion.ts b/typescript/sdk/src/metadata/chainMetadataConversion.ts new file mode 100644 index 0000000000..d0574e3017 --- /dev/null +++ b/typescript/sdk/src/metadata/chainMetadataConversion.ts @@ -0,0 +1,98 @@ +import type { AssetList, Chain as CosmosChain } from '@chain-registry/types'; +import { Chain, defineChain } from 'viem'; + +import { test1 } from '../consts/testChains.js'; +import { + ChainMetadata, + getChainIdNumber, +} from '../metadata/chainMetadataTypes.js'; + +export function chainMetadataToViemChain(metadata: ChainMetadata): Chain { + return defineChain({ + id: getChainIdNumber(metadata), + name: metadata.displayName || metadata.name, + network: metadata.name, + nativeCurrency: metadata.nativeToken || test1.nativeToken!, + rpcUrls: { + public: { http: [metadata.rpcUrls[0].http] }, + default: { http: [metadata.rpcUrls[0].http] }, + }, + blockExplorers: metadata.blockExplorers?.length + ? { + default: { + name: metadata.blockExplorers[0].name, + url: metadata.blockExplorers[0].url, + }, + } + : undefined, + testnet: !!metadata.isTestnet, + }); +} + +export function chainMetadataToCosmosChain(metadata: ChainMetadata): { + chain: CosmosChain; + assets: AssetList; +} { + const { + name, + displayName, + chainId, + rpcUrls, + restUrls, + isTestnet, + nativeToken, + bech32Prefix, + slip44, + } = metadata; + + if (!nativeToken) throw new Error(`Missing native token for ${name}`); + + const chain: CosmosChain = { + chain_name: name, + chain_type: 'cosmos', + status: 'live', + network_type: isTestnet ? 'testnet' : 'mainnet', + pretty_name: displayName || name, + chain_id: chainId as string, + bech32_prefix: bech32Prefix!, + slip44: slip44!, + apis: { + rpc: [{ address: rpcUrls[0].http, provider: displayName || name }], + rest: restUrls + ? [{ address: restUrls[0].http, provider: displayName || name }] + : [], + }, + fees: { + fee_tokens: [{ denom: 'token' }], + }, + staking: { + staking_tokens: [{ denom: 'stake' }], + }, + }; + + const assets: AssetList = { + chain_name: name, + assets: [ + { + description: `The native token of ${displayName || name} chain.`, + denom_units: [{ denom: 'token', exponent: nativeToken.decimals }], + base: 'token', + name: 'token', + display: 'token', + symbol: 'token', + type_asset: 'sdk.coin', + }, + { + description: `The native token of ${displayName || name} chain.`, + denom_units: [{ denom: 'token', exponent: nativeToken.decimals }], + base: 'stake', + name: 'stake', + display: 'stake', + symbol: 'stake', + type_asset: 'sdk.coin', + }, + ], + }; + + return { chain, assets }; +} diff --git a/typescript/sdk/src/middleware/liquidity-layer/.eslintrc b/typescript/sdk/src/middleware/liquidity-layer/.eslintrc deleted file mode 100644 index e3f712414b..0000000000 --- a/typescript/sdk/src/middleware/liquidity-layer/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } -} diff --git a/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts b/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts index 93e324a24d..6e26989348 100644 --- a/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts +++ b/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts @@ -11,6 +11,7 @@ import { addressToBytes32, ensure0x, eqAddress, + rootLogger, strip0x, } from '@hyperlane-xyz/utils'; @@ -23,6 +24,8 @@ import { fetchWithTimeout } from '../../utils/fetch.js'; import { BridgeAdapterConfig } from './LiquidityLayerRouterDeployer.js'; import { liquidityLayerFactories } from './contracts.js'; +const logger = rootLogger.child({ module: 'LiquidityLayerApp' }); + const PORTAL_VAA_SERVICE_TESTNET_BASE_URL = 'https://wormhole-v2-testnet-api.certus.one/v1/signed_vaa/'; const CIRCLE_ATTESTATIONS_TESTNET_BASE_URL = @@ -77,7 +80,7 @@ export class LiquidityLayerApp extends HyperlaneApp< } async fetchCircleMessageTransactions(chain: ChainName): Promise { - console.log(`Fetch circle messages for ${chain}`); + logger.info(`Fetch circle messages for ${chain}`); const url = new URL(this.multiProvider.getExplorerApiUrl(chain)); url.searchParams.set('module', 'logs'); url.searchParams.set('action', 'getLogs'); @@ -140,7 +143,7 @@ export class LiquidityLayerApp extends HyperlaneApp< chain: ChainName, txHash: string, ): Promise { - console.debug(`Parse Circle messages for chain ${chain} ${txHash}`); + logger.debug(`Parse Circle messages for chain ${chain} ${txHash}`); const provider = this.multiProvider.getProvider(chain); const receipt = await provider.getTransactionReceipt(txHash); const matchingLogs = receipt.logs @@ -207,7 +210,7 @@ export class LiquidityLayerApp extends HyperlaneApp< await destinationPortalAdapter.portalTransfersProcessed(transferId); if (!eqAddress(transferTokenAddress, ethers.constants.AddressZero)) { - console.log( + logger.info( `Transfer with nonce ${message.nonce} from ${message.origin} to ${message.destination} already processed`, ); return; @@ -229,11 +232,11 @@ export class LiquidityLayerApp extends HyperlaneApp< ).then((response) => response.json()); if (vaa.code && vaa.code === PORTAL_VAA_SERVICE_SUCCESS_CODE) { - console.log(`VAA not yet found for nonce ${message.nonce}`); + logger.info(`VAA not yet found for nonce ${message.nonce}`); return; } - console.debug( + logger.debug( `Complete portal transfer for nonce ${message.nonce} on ${message.destination}`, ); @@ -246,10 +249,10 @@ export class LiquidityLayerApp extends HyperlaneApp< ); } catch (error: any) { if (error?.error?.reason?.includes('no wrapper for this token')) { - console.log( + logger.info( 'No wrapper for this token, you should register the token at https://wormhole-foundation.github.io/example-token-bridge-ui/#/register', ); - console.log(message); + logger.info(message); return; } throw error; @@ -268,11 +271,11 @@ export class LiquidityLayerApp extends HyperlaneApp< const alreadyProcessed = await transmitter.usedNonces(message.nonceHash); if (alreadyProcessed) { - console.log(`Message sent on ${message.txHash} was already processed`); + logger.info(`Message sent on ${message.txHash} was already processed`); return; } - console.log(`Attempt Circle message delivery`, JSON.stringify(message)); + logger.info(`Attempt Circle message delivery`, JSON.stringify(message)); const messageHash = ethers.utils.keccak256(message.message); const baseurl = this.multiProvider.getChainMetadata(message.chain).isTestnet @@ -282,19 +285,19 @@ export class LiquidityLayerApp extends HyperlaneApp< const attestations = await attestationsB.json(); if (attestations.status !== 'complete') { - console.log( + logger.info( `Attestations not available for message nonce ${message.nonce} on ${message.txHash}`, ); return; } - console.log(`Ready to submit attestations for message ${message.nonce}`); + logger.info(`Ready to submit attestations for message ${message.nonce}`); const tx = await transmitter.receiveMessage( message.message, attestations.attestation, ); - console.log( + logger.info( `Submitted attestations in ${this.multiProvider.tryGetExplorerTxUrl( message.remoteChain, tx, diff --git a/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts b/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts index 58ee3e7ef1..d30f9ddd11 100644 --- a/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts +++ b/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts @@ -1,5 +1,5 @@ import { BigNumber, errors as EthersError, providers, utils } from 'ethers'; -import pino, { Logger } from 'pino'; +import { Logger, pino } from 'pino'; import { raceWithContext, @@ -126,7 +126,7 @@ export class HyperlaneSmartProvider async getPriorityFee(): Promise { try { return BigNumber.from(await this.perform('maxPriorityFeePerGas', {})); - } catch (error) { + } catch { return BigNumber.from('1500000000'); } } diff --git a/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts b/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts index 53d1b44524..61616ff3c0 100644 --- a/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts +++ b/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts @@ -1,7 +1,6 @@ import { Logger } from 'pino'; -import { Annotated, rootLogger } from '@hyperlane-xyz/utils'; -import { ProtocolType } from '@hyperlane-xyz/utils'; +import { Annotated, ProtocolType, rootLogger } from '@hyperlane-xyz/utils'; import { ProtocolTypedReceipt, diff --git a/typescript/sdk/src/router/schemas.ts b/typescript/sdk/src/router/schemas.ts deleted file mode 100644 index 571cb0d1f5..0000000000 --- a/typescript/sdk/src/router/schemas.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { z } from 'zod'; - -import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; -import { HookConfigSchema } from '../hook/schemas.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; -import { ZHash } from '../metadata/customZodTypes.js'; -import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; - -export const MailboxClientConfigSchema = OwnableSchema.extend({ - mailbox: ZHash, - hook: HookConfigSchema.optional(), - interchainSecurityModule: IsmConfigSchema.optional(), - ismFactoryAddresses: ProxyFactoryFactoriesSchema.optional(), -}); - -export const ForeignDeploymentConfigSchema = z.object({ - foreignDeployment: z.string().optional(), -}); - -const RemoteRouterDomain = z.string(); -const RemoteRouterRouter = z.string().startsWith('0x'); -export const RemoteRoutersSchema = z.record( - RemoteRouterDomain, - RemoteRouterRouter, -); - -export const RouterConfigSchema = MailboxClientConfigSchema.merge( - ForeignDeploymentConfigSchema, -).merge( - z.object({ - remoteRouters: RemoteRoutersSchema.optional(), - proxyAdmin: DeployedOwnableSchema.optional(), - }), -); - -const DestinationGasDomain = z.string(); -const DestinationGasAmount = z.string(); // This must be a string type to match Ether's type -export const DestinationGasSchema = z.record( - DestinationGasDomain, - DestinationGasAmount, -); -export const GasRouterConfigSchema = RouterConfigSchema.extend({ - gas: z.number().optional(), - destinationGas: DestinationGasSchema.optional(), -}); diff --git a/typescript/sdk/src/router/types.ts b/typescript/sdk/src/router/types.ts index 17e36ead66..d950e43a30 100644 --- a/typescript/sdk/src/router/types.ts +++ b/typescript/sdk/src/router/types.ts @@ -11,16 +11,12 @@ import { Address, AddressBytes32 } from '@hyperlane-xyz/utils'; import { HyperlaneFactories } from '../contracts/types.js'; import { UpgradeConfig } from '../deploy/proxy.js'; import { CheckerViolation } from '../deploy/types.js'; +import { HookConfigSchema } from '../hook/types.js'; +import { IsmConfigSchema } from '../ism/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - DestinationGasSchema, - GasRouterConfigSchema, - MailboxClientConfigSchema, - RemoteRoutersSchema, - RouterConfigSchema, -} from './schemas.js'; - export type RouterAddress = { router: Address; }; @@ -68,3 +64,40 @@ export interface RouterViolation extends CheckerViolation { export type RemoteRouters = z.infer; export type DestinationGas = z.infer; + +export const MailboxClientConfigSchema = OwnableSchema.extend({ + mailbox: ZHash, + hook: HookConfigSchema.optional(), + interchainSecurityModule: IsmConfigSchema.optional(), +}); + +export const ForeignDeploymentConfigSchema = z.object({ + foreignDeployment: z.string().optional(), +}); + +const RemoteRouterDomain = z.string(); +const RemoteRouterRouter = z.string().startsWith('0x'); +export const RemoteRoutersSchema = z.record( + RemoteRouterDomain, + RemoteRouterRouter, +); + +export const RouterConfigSchema = MailboxClientConfigSchema.merge( + ForeignDeploymentConfigSchema, +).merge( + z.object({ + remoteRouters: RemoteRoutersSchema.optional(), + proxyAdmin: DeployedOwnableSchema.optional(), + }), +); + +const DestinationGasDomain = z.string(); +const DestinationGasAmount = z.string(); // This must be a string type to match Ether's type +export const DestinationGasSchema = z.record( + DestinationGasDomain, + DestinationGasAmount, +); +export const GasRouterConfigSchema = RouterConfigSchema.extend({ + gas: z.number().optional(), + destinationGas: DestinationGasSchema.optional(), +}); diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts index 5895d783fc..7ed443eb6c 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts @@ -123,6 +123,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -151,6 +152,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -187,6 +189,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -219,6 +222,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -249,6 +253,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const { remoteRouters } = await evmERC20WarpModule.read(); expect(Object.keys(remoteRouters!).length).to.equal(numOfRouters); @@ -285,13 +290,14 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); for (const interchainSecurityModule of ismConfigToUpdate) { const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, + interchainSecurityModule, }; await sendTxs(await evmERC20WarpModule.update(expectedConfig)); @@ -316,6 +322,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); @@ -327,7 +334,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { }; const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule, }; @@ -374,11 +380,11 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule: { type: IsmType.ROUTING, owner: randomAddress(), @@ -415,6 +421,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const numOfRouters = Math.floor(Math.random() * 10); await sendTxs( @@ -446,6 +453,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const remoteRouters = randomRemoteRouters(1); await sendTxs( @@ -498,6 +506,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -527,7 +536,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, }; const owner = signer.address.toLowerCase(); @@ -538,6 +546,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -571,7 +580,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, remoteRouters: { [domain]: randomAddress(), }, @@ -584,6 +592,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...config, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); await sendTxs( await evmERC20WarpModule.update({ diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.ts b/typescript/sdk/src/token/EvmERC20WarpModule.ts index 2652c78269..729842fca4 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.ts @@ -6,7 +6,11 @@ import { TokenRouter__factory, } from '@hyperlane-xyz/core'; import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; -import { ContractVerifier, ExplorerLicenseType } from '@hyperlane-xyz/sdk'; +import { + ContractVerifier, + ExplorerLicenseType, + HyperlaneAddresses, +} from '@hyperlane-xyz/sdk'; import { Address, Domain, @@ -25,6 +29,7 @@ import { HyperlaneModule, HyperlaneModuleParams, } from '../core/AbstractHyperlaneModule.js'; +import { ProxyFactoryFactories } from '../deploy/contracts.js'; import { proxyAdminUpdateTxs } from '../deploy/proxy.js'; import { EvmIsmModule } from '../ism/EvmIsmModule.js'; import { DerivedIsmConfig } from '../ism/EvmIsmReader.js'; @@ -40,7 +45,7 @@ import { TokenRouterConfig, TokenRouterConfigSchema } from './schemas.js'; export class EvmERC20WarpModule extends HyperlaneModule< ProtocolType.Ethereum, TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } > { @@ -56,7 +61,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< protected readonly multiProvider: MultiProvider, args: HyperlaneModuleParams< TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } >, @@ -242,36 +247,34 @@ export class EvmERC20WarpModule extends HyperlaneModule< return []; } - if (expectedConfig.ismFactoryAddresses) { - const actualDeployedIsm = ( - actualConfig.interchainSecurityModule as DerivedIsmConfig - ).address; - - // Try to update (may also deploy) Ism with the expected config - const { - deployedIsm: expectedDeployedIsm, - updateTransactions: ismUpdateTransactions, - } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); - - // If an ISM is updated in-place, push the update txs - updateTransactions.push(...ismUpdateTransactions); - - // If a new ISM is deployed, push the setInterchainSecurityModule tx - if (actualDeployedIsm !== expectedDeployedIsm) { - const contractToUpdate = MailboxClient__factory.connect( - this.args.addresses.deployedTokenRoute, - this.multiProvider.getProvider(this.domainId), - ); - updateTransactions.push({ - chainId: this.chainId, - annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, - to: contractToUpdate.address, - data: contractToUpdate.interface.encodeFunctionData( - 'setInterchainSecurityModule', - [expectedDeployedIsm], - ), - }); - } + const actualDeployedIsm = ( + actualConfig.interchainSecurityModule as DerivedIsmConfig + ).address; + + // Try to update (may also deploy) Ism with the expected config + const { + deployedIsm: expectedDeployedIsm, + updateTransactions: ismUpdateTransactions, + } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); + + // If an ISM is updated in-place, push the update txs + updateTransactions.push(...ismUpdateTransactions); + + // If a new ISM is deployed, push the setInterchainSecurityModule tx + if (actualDeployedIsm !== expectedDeployedIsm) { + const contractToUpdate = MailboxClient__factory.connect( + this.args.addresses.deployedTokenRoute, + this.multiProvider.getProvider(this.domainId), + ); + updateTransactions.push({ + chainId: this.chainId, + annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, + to: contractToUpdate.address, + data: contractToUpdate.interface.encodeFunctionData( + 'setInterchainSecurityModule', + [expectedDeployedIsm], + ), + }); } return updateTransactions; @@ -313,10 +316,6 @@ export class EvmERC20WarpModule extends HyperlaneModule< expectedConfig.interchainSecurityModule, 'Ism not derived correctly', ); - assert( - expectedConfig.ismFactoryAddresses, - 'Ism Factories addresses not provided', - ); const ismModule = new EvmIsmModule( this.multiProvider, @@ -324,7 +323,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< chain: this.args.chain, config: expectedConfig.interchainSecurityModule, addresses: { - ...expectedConfig.ismFactoryAddresses, + ...this.args.addresses, mailbox: expectedConfig.mailbox, deployedIsm: ( actualConfig.interchainSecurityModule as DerivedIsmConfig @@ -357,8 +356,15 @@ export class EvmERC20WarpModule extends HyperlaneModule< config: TokenRouterConfig; multiProvider: MultiProvider; contractVerifier?: ContractVerifier; + proxyFactoryFactories: HyperlaneAddresses; }): Promise { - const { chain, config, multiProvider, contractVerifier } = params; + const { + chain, + config, + multiProvider, + contractVerifier, + proxyFactoryFactories, + } = params; const chainName = multiProvider.getChainName(chain); const deployer = new HypERC20Deployer(multiProvider); const deployedContracts = await deployer.deployContracts(chainName, config); @@ -367,6 +373,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< multiProvider, { addresses: { + ...proxyFactoryFactories, deployedTokenRoute: deployedContracts[config.type].address, }, chain, diff --git a/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts b/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts index df2ab1affe..d65f4fad7b 100644 --- a/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts +++ b/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts @@ -124,7 +124,7 @@ export class EvmERC20WarpRouteReader extends HyperlaneReader { const warpRoute = factory.connect(warpRouteAddress, this.provider); await warpRoute[method](); return tokenType as TokenType; - } catch (e) { + } catch { continue; } finally { this.setSmartProviderLogLevel(getLogLevel()); // returns to original level defined by rootLogger diff --git a/typescript/sdk/src/token/Token.ts b/typescript/sdk/src/token/Token.ts index b639159692..0217802e7c 100644 --- a/typescript/sdk/src/token/Token.ts +++ b/typescript/sdk/src/token/Token.ts @@ -40,6 +40,7 @@ import { } from './adapters/CosmosTokenAdapter.js'; import { EvmHypCollateralAdapter, + EvmHypCollateralFiatAdapter, EvmHypNativeAdapter, EvmHypSyntheticAdapter, EvmHypXERC20Adapter, @@ -192,13 +193,16 @@ export class Token implements IToken { }); } else if ( standard === TokenStandard.EvmHypCollateral || - standard === TokenStandard.EvmHypCollateralFiat || standard === TokenStandard.EvmHypOwnerCollateral || standard === TokenStandard.EvmHypRebaseCollateral ) { return new EvmHypCollateralAdapter(chainName, multiProvider, { token: addressOrDenom, }); + } else if (standard === TokenStandard.EvmHypCollateralFiat) { + return new EvmHypCollateralFiatAdapter(chainName, multiProvider, { + token: addressOrDenom, + }); } else if ( standard === TokenStandard.EvmHypSynthetic || standard === TokenStandard.EvmHypSyntheticRebase diff --git a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts index 1205d123bb..f699780c68 100644 --- a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts +++ b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - /* eslint-disable no-console */ import { CosmWasmClient, diff --git a/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts b/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts index 794d5cdff9..cd9910a5a2 100644 --- a/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/EvmTokenAdapter.ts @@ -261,9 +261,7 @@ export class EvmHypCollateralAdapter return this.wrappedTokenAddress!; } - protected async getWrappedTokenAdapter(): Promise< - ITokenAdapter - > { + protected async getWrappedTokenAdapter(): Promise { return new EvmTokenAdapter(this.chainName, this.multiProvider, { token: await this.getWrappedTokenAddress(), }); @@ -304,6 +302,21 @@ export class EvmHypCollateralAdapter } } +export class EvmHypCollateralFiatAdapter + extends EvmHypCollateralAdapter + implements IHypTokenAdapter +{ + /** + * Note this may be inaccurate, as this returns the total supply + * of the fiat token, which may be used by other bridges. + * However this is the best we can do with a simple view call. + */ + override async getBridgedSupply(): Promise { + const wrapped = await this.getWrappedTokenAdapter(); + return wrapped.getTotalSupply(); + } +} + // Interacts with HypXERC20Lockbox contracts export class EvmHypXERC20LockboxAdapter extends EvmHypCollateralAdapter diff --git a/typescript/sdk/src/token/checker.ts b/typescript/sdk/src/token/checker.ts index 9dcc0569ba..156658ddc1 100644 --- a/typescript/sdk/src/token/checker.ts +++ b/typescript/sdk/src/token/checker.ts @@ -73,7 +73,7 @@ export class HypERC20Checker extends ProxiedRouterChecker< from: await this.multiProvider.getSignerAddress(chain), value: BigNumber.from(1), }); - } catch (e) { + } catch { const violation: TokenMismatchViolation = { type: 'deployed token not payable', chain, diff --git a/typescript/sdk/src/token/deploy.ts b/typescript/sdk/src/token/deploy.ts index aa7376c883..87f77bc882 100644 --- a/typescript/sdk/src/token/deploy.ts +++ b/typescript/sdk/src/token/deploy.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { constants } from 'ethers'; import { diff --git a/typescript/sdk/src/token/schemas.ts b/typescript/sdk/src/token/schemas.ts index ae9ee15a41..7c975530f1 100644 --- a/typescript/sdk/src/token/schemas.ts +++ b/typescript/sdk/src/token/schemas.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { objMap } from '@hyperlane-xyz/utils'; -import { GasRouterConfigSchema } from '../router/schemas.js'; +import { GasRouterConfigSchema } from '../router/types.js'; import { isCompliant } from '../utils/schemas.js'; import { TokenType } from './config.js'; diff --git a/typescript/sdk/src/utils/.eslintrc b/typescript/sdk/src/utils/.eslintrc deleted file mode 100644 index ba8754a123..0000000000 --- a/typescript/sdk/src/utils/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "@typescript-eslint/explicit-module-boundary-types": ["off"] - } -} diff --git a/typescript/sdk/src/utils/gnosisSafe.js b/typescript/sdk/src/utils/gnosisSafe.js index c5c14fca8d..51235e2121 100644 --- a/typescript/sdk/src/utils/gnosisSafe.js +++ b/typescript/sdk/src/utils/gnosisSafe.js @@ -103,7 +103,7 @@ export async function canProposeSafeTransactions( let safeService; try { safeService = getSafeService(chain, multiProvider); - } catch (e) { + } catch { return false; } const safe = await getSafe(chain, multiProvider, safeAddress); diff --git a/typescript/sdk/src/utils/ism.ts b/typescript/sdk/src/utils/ism.ts index 92c267e662..669cf7e9d5 100644 --- a/typescript/sdk/src/utils/ism.ts +++ b/typescript/sdk/src/utils/ism.ts @@ -25,7 +25,7 @@ function lowerCaseConfig(obj: any): any { } else if (obj !== null && typeof obj === 'object') { const newObj: any = {}; for (const key in obj) { - if (key !== 'address') { + if (key !== 'address' && key !== 'ownerOverrides') { newObj[key] = key === 'type' ? obj[key] : normalizeConfig(obj[key]); } } diff --git a/typescript/sdk/src/utils/logUtils.ts b/typescript/sdk/src/utils/logUtils.ts index 5e2eeb3665..b35a8e51ac 100644 --- a/typescript/sdk/src/utils/logUtils.ts +++ b/typescript/sdk/src/utils/logUtils.ts @@ -10,7 +10,7 @@ export function findMatchingLogEvents( .map((log) => { try { return iface.parseLog(log); - } catch (e) { + } catch { return undefined; } }) diff --git a/typescript/sdk/src/utils/sealevelSerialization.ts b/typescript/sdk/src/utils/sealevelSerialization.ts index 13b3dcacd3..8d0907c22d 100644 --- a/typescript/sdk/src/utils/sealevelSerialization.ts +++ b/typescript/sdk/src/utils/sealevelSerialization.ts @@ -10,7 +10,6 @@ export class SealevelAccountDataWrapper { initialized!: boolean; discriminator?: unknown; data!: T; - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types constructor(public readonly fields: any) { Object.assign(this, fields); } diff --git a/typescript/sdk/src/utils/viem.ts b/typescript/sdk/src/utils/viem.ts deleted file mode 100644 index 38b574b2dd..0000000000 --- a/typescript/sdk/src/utils/viem.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Chain, defineChain } from 'viem'; - -import { test1 } from '../consts/testChains.js'; -import { - ChainMetadata, - getChainIdNumber, -} from '../metadata/chainMetadataTypes.js'; - -export function chainMetadataToViemChain(metadata: ChainMetadata): Chain { - return defineChain({ - id: getChainIdNumber(metadata), - name: metadata.displayName || metadata.name, - network: metadata.name, - nativeCurrency: metadata.nativeToken || test1.nativeToken!, - rpcUrls: { - public: { http: [metadata.rpcUrls[0].http] }, - default: { http: [metadata.rpcUrls[0].http] }, - }, - blockExplorers: metadata.blockExplorers?.length - ? { - default: { - name: metadata.blockExplorers[0].name, - url: metadata.blockExplorers[0].url, - }, - } - : undefined, - testnet: !!metadata.isTestnet, - }); -} diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index cecdf5b646..9d852ab866 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/utils +## 7.1.0 + +### Minor Changes + +- 0e285a443: Add an isRelativeUrl function + ## 7.0.0 ### Major Changes diff --git a/typescript/utils/eslint.config.mjs b/typescript/utils/eslint.config.mjs new file mode 100644 index 0000000000..b82e3eedb1 --- /dev/null +++ b/typescript/utils/eslint.config.mjs @@ -0,0 +1,3 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [...MonorepoDefaults, { files: ['./src/**/*.ts'] }]; diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 0442c8e62e..4da150a928 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "7.0.0", + "version": "7.1.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", @@ -12,11 +12,18 @@ "yaml": "2.4.5" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", "@types/sinon": "^17.0.1", "@types/sinon-chai": "^3.2.12", - "chai": "4.5.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", + "chai": "^4.5.0", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "mocha": "^10.2.0", "prettier": "^2.8.8", "sinon": "^13.0.2", @@ -36,6 +43,7 @@ "build": "tsc", "clean": "rm -rf ./dist", "check": "tsc --noEmit", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src", "test": "mocha --config .mocharc.json './src/**/*.test.ts'", "test:ci": "yarn test" diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index b43d22d96e..93426071ef 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -80,7 +80,7 @@ export function isValidAddressEvm(address: Address) { try { const isValid = address && ethersUtils.isAddress(address); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -90,7 +90,7 @@ export function isValidAddressSealevel(address: Address) { try { const isValid = address && new PublicKey(address).toBase58(); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -104,7 +104,7 @@ export function isValidAddressCosmos(address: Address) { COSMOS_FACTORY_TOKEN_REGEX.test(address) || fromBech32(address)); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -126,7 +126,7 @@ export function normalizeAddressEvm(address: Address) { if (isZeroishAddress(address)) return address; try { return ethersUtils.getAddress(address); - } catch (error) { + } catch { return address; } } @@ -135,7 +135,7 @@ export function normalizeAddressSealevel(address: Address) { if (isZeroishAddress(address)) return address; try { return new PublicKey(address).toBase58(); - } catch (error) { + } catch { return address; } } @@ -144,7 +144,7 @@ export function normalizeAddressCosmos(address: Address) { if (isZeroishAddress(address)) return address; try { return normalizeBech32(address); - } catch (error) { + } catch { return address; } } diff --git a/typescript/utils/src/amount.ts b/typescript/utils/src/amount.ts index f415c268d3..ab8a3b3347 100644 --- a/typescript/utils/src/amount.ts +++ b/typescript/utils/src/amount.ts @@ -82,7 +82,7 @@ export function tryParseAmount( const parsed = BigNumber(value); if (!parsed || parsed.isNaN() || !parsed.isFinite()) return null; else return parsed; - } catch (error) { + } catch { return null; } } diff --git a/typescript/utils/src/base64.ts b/typescript/utils/src/base64.ts index 1d2ae02fab..d09c4502e2 100644 --- a/typescript/utils/src/base64.ts +++ b/typescript/utils/src/base64.ts @@ -4,7 +4,7 @@ export function toBase64(data: any): string | undefined { try { if (!data) throw new Error('No data to encode'); return btoa(JSON.stringify(data)); - } catch (error) { + } catch { rootLogger.error('Unable to serialize + encode data to base64', data); return undefined; } @@ -15,7 +15,7 @@ export function fromBase64(data: string | string[]): T | undefined { if (!data) throw new Error('No data to decode'); const msg = Array.isArray(data) ? data[0] : data; return JSON.parse(atob(msg)); - } catch (error) { + } catch { rootLogger.error('Unable to decode + deserialize data from base64', data); return undefined; } diff --git a/typescript/utils/src/big-numbers.ts b/typescript/utils/src/big-numbers.ts index fa20e0759d..51e7a31ba9 100644 --- a/typescript/utils/src/big-numbers.ts +++ b/typescript/utils/src/big-numbers.ts @@ -15,7 +15,7 @@ export function isBigNumberish( try { const val = BigNumber(value!); return !val.isNaN() && val.isFinite() && BigNumber.isBigNumber(val); - } catch (error) { + } catch { return false; } } @@ -28,7 +28,7 @@ export function isBigNumberish( export function isZeroish(value: BigNumber.Value): boolean { try { return BigNumber(value).isZero(); - } catch (error) { + } catch { return false; } } diff --git a/typescript/utils/src/env.ts b/typescript/utils/src/env.ts index ff24f2486a..8841f56a80 100644 --- a/typescript/utils/src/env.ts +++ b/typescript/utils/src/env.ts @@ -3,7 +3,7 @@ export function safelyAccessEnvVar(name: string, toLowerCase = false) { try { return toLowerCase ? process.env[name]?.toLowerCase() : process.env[name]; - } catch (error) { + } catch { return undefined; } } diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index b6e68e660c..3c4c413f7c 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -109,6 +109,7 @@ export { arrayToObject, deepCopy, deepEquals, + deepFind, diffObjMerge, invertKeysAndValues, isObjEmpty, @@ -140,6 +141,7 @@ export { streamToString, toHexString, toTitleCase, + toUpperCamelCase, trimToLength, } from './strings.js'; export { isNullish, isNumeric } from './typeof.js'; diff --git a/typescript/utils/src/strings.ts b/typescript/utils/src/strings.ts index 26d40838aa..bc50107bba 100644 --- a/typescript/utils/src/strings.ts +++ b/typescript/utils/src/strings.ts @@ -6,6 +6,10 @@ export function toTitleCase(str: string) { }); } +export function toUpperCamelCase(string: string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + // Only allows letters and numbers const alphanumericRgex = /[^a-zA-Z0-9]/gi; export function sanitizeString(str: string) { diff --git a/typescript/utils/src/url.ts b/typescript/utils/src/url.ts index 98f9ee412d..0d1c2b0abc 100644 --- a/typescript/utils/src/url.ts +++ b/typescript/utils/src/url.ts @@ -3,7 +3,7 @@ export function isUrl(value?: string | null) { if (!value) return false; const url = new URL(value); return !!url.hostname; - } catch (error) { + } catch { return false; } } @@ -13,7 +13,7 @@ export function isHttpsUrl(value?: string | null) { if (!value) return false; const url = new URL(value); return url.protocol === 'https:'; - } catch (error) { + } catch { return false; } } diff --git a/typescript/widgets/.eslintignore b/typescript/widgets/.eslintignore deleted file mode 100644 index c047b2694b..0000000000 --- a/typescript/widgets/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -coverage -tailwind.config.js -postcss.config.js -src/stories/**/*.stories.tsx diff --git a/typescript/widgets/.eslintrc b/typescript/widgets/.eslintrc deleted file mode 100644 index 5cf219d569..0000000000 --- a/typescript/widgets/.eslintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": [ - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "prettier" - ], - "plugins": ["react", "react-hooks"], - "rules": { - // TODO use utils rootLogger in widgets lib - "no-console": ["off"], - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn" - } -} diff --git a/typescript/widgets/.storybook/main.ts b/typescript/widgets/.storybook/main.ts index d4aa7c9948..b14ff0a597 100644 --- a/typescript/widgets/.storybook/main.ts +++ b/typescript/widgets/.storybook/main.ts @@ -10,6 +10,11 @@ const config: StorybookConfig = { '@storybook/addon-onboarding', '@storybook/addon-interactions', ], + refs: { + '@chakra-ui/react': { + disable: true, + }, + }, framework: { name: '@storybook/react-vite', options: {}, diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index d1ec7cde41..bcfbecee33 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,30 @@ # @hyperlane-xyz/widgets +## 7.1.0 + +### Minor Changes + +- 0cd65c571: Add multi-protocol wallet integration hooks and types +- 186663505: New Icons + Updated modal with new props + Updated storybook for modal and icon list +- 0e285a443: Add various utility hooks: useIsSsr, useTimeout, useDebounce, useInterval +- 92b5fe777: Props and style update: IconButton and Tooltip + New Icons: XCircleIcon and SwapIcon + +### Patch Changes + +- 794501ba6: Prevent propagation of form submissions from ChainSearchMenu +- Updated dependencies [6f2d50fbd] +- Updated dependencies [1159e0f4b] +- Updated dependencies [0e285a443] +- Updated dependencies [ff2b4e2fb] +- Updated dependencies [0e285a443] +- Updated dependencies [5db46bd31] +- Updated dependencies [0cd65c571] + - @hyperlane-xyz/sdk@7.1.0 + - @hyperlane-xyz/utils@7.1.0 + ## 7.0.0 ### Patch Changes diff --git a/typescript/widgets/eslint.config.mjs b/typescript/widgets/eslint.config.mjs new file mode 100644 index 0000000000..e9f4b3ff39 --- /dev/null +++ b/typescript/widgets/eslint.config.mjs @@ -0,0 +1,40 @@ +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; + +import MonorepoDefaults, {compat} from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + ...compat.extends("plugin:react/recommended", "plugin:react-hooks/recommended"), + { + settings: { + react: { + version: '18', + defaultVersion: '18', + }, + }, + }, + { + files: ['./src/**/*.ts', './src/**/*.tsx'], + plugins: { + react, + 'react-hooks': reactHooks, + }, + + + rules: { + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + }, + }, + { + ignores: [ + '**/src/stories/*', + 'tailwind.config.js', + 'postcss.config.js', + '.storybook/*', + ], + }, +]; diff --git a/typescript/widgets/mg.eslint.config.mjs b/typescript/widgets/mg.eslint.config.mjs new file mode 100644 index 0000000000..a66e159b3d --- /dev/null +++ b/typescript/widgets/mg.eslint.config.mjs @@ -0,0 +1,38 @@ +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...fixupConfigRules( + compat.extends("plugin:react/recommended", "plugin:react-hooks/recommended", "prettier"), +), { + plugins: { + react: fixupPluginRules(react), + "react-hooks": fixupPluginRules(reactHooks), + }, + + settings: { + react: { + version: "18", + defaultVersion: "18", + }, + }, + + rules: { + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + }, +}]; \ No newline at end of file diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 27f88002bb..ec40cfe6d6 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,20 +1,33 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "7.0.0", + "version": "7.1.0", "peerDependencies": { "react": "^18", "react-dom": "^18" }, "dependencies": { + "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "7.0.0", - "@hyperlane-xyz/utils": "7.0.0", + "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/utils": "7.1.0", + "@interchain-ui/react": "^1.23.28", + "@rainbow-me/rainbowkit": "^2.2.0", + "@solana/wallet-adapter-react": "^0.15.32", + "@solana/wallet-adapter-react-ui": "^0.9.31", + "@solana/web3.js": "^1.95.4", "clsx": "^2.1.1", - "react-tooltip": "^5.28.0" + "react-tooltip": "^5.28.0", + "viem": "^2.21.45", + "wagmi": "^2.12.26" }, "devDependencies": { - "@hyperlane-xyz/registry": "4.7.0", + "@chakra-ui/react": "^2.8.2", + "@cosmjs/cosmwasm-stargate": "^0.32.4", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@eslint/js": "^9.15.0", + "@hyperlane-xyz/registry": "6.1.0", "@storybook/addon-essentials": "^7.6.14", "@storybook/addon-interactions": "^7.6.14", "@storybook/addon-links": "^7.6.14", @@ -23,18 +36,22 @@ "@storybook/react": "^7.6.14", "@storybook/react-vite": "^7.6.14", "@storybook/test": "^7.6.14", - "@types/node": "^18.11.18", + "@tanstack/react-query": "^5.59.20", + "@types/node": "^18.14.5", "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", "@types/ws": "^8.5.5", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "babel-loader": "^8.3.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-storybook": "^0.6.15", + "eslint-plugin-storybook": "^0.11.1", + "framer-motion": "^10.16.4", "postcss": "^8.4.21", "prettier": "^2.8.8", "react": "^18.2.0", @@ -72,7 +89,7 @@ "build:ts": "tsc", "build:css": "tailwindcss -c ./tailwind.config.cjs -i ./src/styles.css -o ./dist/styles.css --minify", "clean": "rm -rf ./dist ./cache ./storybook-static", - "lint": "eslint ./src --ext .ts", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" diff --git a/typescript/widgets/src/chains/ChainAddMenu.tsx b/typescript/widgets/src/chains/ChainAddMenu.tsx index 102b1bf5e1..032366f01e 100644 --- a/typescript/widgets/src/chains/ChainAddMenu.tsx +++ b/typescript/widgets/src/chains/ChainAddMenu.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { useState } from 'react'; import { DEFAULT_GITHUB_REGISTRY } from '@hyperlane-xyz/registry'; @@ -21,6 +21,7 @@ import { CopyButton } from '../components/CopyButton.js'; import { LinkButton } from '../components/LinkButton.js'; import { ChevronIcon } from '../icons/Chevron.js'; import { PlusIcon } from '../icons/Plus.js'; +import { widgetLogger } from '../logger.js'; export interface ChainAddMenuProps { chainMetadata: ChainMap; @@ -143,7 +144,7 @@ function tryParseMetadataInput( const result = ChainMetadataSchema.safeParse(parsed.data); if (!result.success) { - console.error('Error validating chain config', result.error); + widgetLogger.error('Error validating chain config', result.error); const firstIssue = result.error.issues[0]; return failure(`${firstIssue.path} => ${firstIssue.message}`); } diff --git a/typescript/widgets/src/chains/ChainDetailsMenu.tsx b/typescript/widgets/src/chains/ChainDetailsMenu.tsx index 7c175d0d88..468b60a8e4 100644 --- a/typescript/widgets/src/chains/ChainDetailsMenu.tsx +++ b/typescript/widgets/src/chains/ChainDetailsMenu.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { PropsWithChildren, useEffect, useMemo, useState } from 'react'; import { stringify as yamlStringify } from 'yaml'; diff --git a/typescript/widgets/src/chains/ChainLogo.tsx b/typescript/widgets/src/chains/ChainLogo.tsx index 082c8eaf3f..0f58c66f1b 100644 --- a/typescript/widgets/src/chains/ChainLogo.tsx +++ b/typescript/widgets/src/chains/ChainLogo.tsx @@ -4,6 +4,7 @@ import type { IRegistry } from '@hyperlane-xyz/registry'; import { Circle } from '../icons/Circle.js'; import { QuestionMarkIcon } from '../icons/QuestionMark.js'; +import { widgetLogger } from '../logger.js'; type SvgIcon = (props: { width: number; @@ -41,8 +42,8 @@ export function ChainLogo({ registry .getChainLogoUri(chainName) .then((uri) => uri && setSvgLogos({ ...svgLogos, [chainName]: uri })) - .catch((err) => console.error(err)); - }, [chainName, registry, svgLogos, Icon]); + .catch((err) => widgetLogger.error('Error fetching log uri', err)); + }, [chainName, logoUri, registry, svgLogos, Icon]); if (!uri && !Icon) { return ( diff --git a/typescript/widgets/src/chains/ChainSearchMenu.tsx b/typescript/widgets/src/chains/ChainSearchMenu.tsx index 3d88152f5d..a945e4bd93 100644 --- a/typescript/widgets/src/chains/ChainSearchMenu.tsx +++ b/typescript/widgets/src/chains/ChainSearchMenu.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { ChainMap, @@ -77,11 +77,11 @@ export function ChainSearchMenu({ showAddChainMenu, defaultSortField, }: ChainSearchMenuProps) { - const [drilldownChain, setDrilldownChain] = React.useState< - ChainName | undefined - >(showChainDetails); + const [drilldownChain, setDrilldownChain] = useState( + showChainDetails, + ); - const [addChain, setAddChain] = React.useState(showAddChainMenu || false); + const [addChain, setAddChain] = useState(showAddChainMenu || false); const { listData, mergedMetadata } = useMemo(() => { const mergedMetadata = mergeChainMetadataMap( @@ -89,7 +89,7 @@ export function ChainSearchMenu({ overrideChainMetadata, ); return { mergedMetadata, listData: Object.values(mergedMetadata) }; - }, [chainMetadata]); + }, [chainMetadata, overrideChainMetadata]); const { ListComponent, searchFn, sortOptions, defaultSortState } = useCustomizedListItems(customListItemField, defaultSortField); @@ -297,7 +297,7 @@ function useCustomizedListItems( ({ data }: { data: ChainMetadata<{ disabled?: boolean }> }) => ( ), - [ChainListItem, customListItemField], + [customListItemField], ); // Bind the custom field to the search function diff --git a/typescript/widgets/src/components/Button.tsx b/typescript/widgets/src/components/Button.tsx index 3177af05b7..e983bd5645 100644 --- a/typescript/widgets/src/components/Button.tsx +++ b/typescript/widgets/src/components/Button.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren>; diff --git a/typescript/widgets/src/components/ErrorBoundary.tsx b/typescript/widgets/src/components/ErrorBoundary.tsx index a21611ec08..79a7ce15e2 100644 --- a/typescript/widgets/src/components/ErrorBoundary.tsx +++ b/typescript/widgets/src/components/ErrorBoundary.tsx @@ -3,6 +3,7 @@ import React, { Component, PropsWithChildren, ReactNode } from 'react'; import { errorToString } from '@hyperlane-xyz/utils'; import { ErrorIcon } from '../icons/Error.js'; +import { widgetLogger } from '../logger.js'; type Props = PropsWithChildren<{ supportLink?: ReactNode; @@ -24,7 +25,7 @@ export class ErrorBoundary extends Component { error, errorInfo, }); - console.error('Error caught by error boundary', error, errorInfo); + widgetLogger.error('Error caught by error boundary', error, errorInfo); } render() { diff --git a/typescript/widgets/src/components/IconButton.tsx b/typescript/widgets/src/components/IconButton.tsx index 314ba40fa4..eeeddc57d7 100644 --- a/typescript/widgets/src/components/IconButton.tsx +++ b/typescript/widgets/src/components/IconButton.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren> & { diff --git a/typescript/widgets/src/components/LinkButton.tsx b/typescript/widgets/src/components/LinkButton.tsx index 026bf6ba11..5fb6c53c9c 100644 --- a/typescript/widgets/src/components/LinkButton.tsx +++ b/typescript/widgets/src/components/LinkButton.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren>; diff --git a/typescript/widgets/src/components/SearchMenu.tsx b/typescript/widgets/src/components/SearchMenu.tsx index 831b46e748..750d2bfb3d 100644 --- a/typescript/widgets/src/components/SearchMenu.tsx +++ b/typescript/widgets/src/components/SearchMenu.tsx @@ -1,6 +1,7 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentType, + forwardRef, useCallback, useEffect, useMemo, @@ -102,12 +103,13 @@ export function SearchMenu< const handleSubmit = useCallback( (e: React.FormEvent) => { e.preventDefault(); + e.stopPropagation(); if (results.length === 1) { const item = results[0]; isEditMode ? onClickEditItem(item) : onClickItem(item); } }, - [results, isEditMode], + [results, isEditMode, onClickEditItem, onClickItem], ); useEffect(() => { @@ -183,7 +185,7 @@ export function SearchMenu< ); } -const SearchBar = React.forwardRef(function SearchBar( +const SearchBar = forwardRef(function SearchBar( { onChange, value, ...props }: InputProps, ref: React.Ref, ) { @@ -254,6 +256,7 @@ function SortDropdown({ buttonClassname="htw-flex htw-items-stretch hover:htw-bg-gray-100 active:htw-scale-95" menuClassname="htw-py-1.5 htw-px-2 htw-flex htw-flex-col htw-gap-2 htw-text-sm htw-border htw-border-gray-100" menuItems={options.map((o) => ( + // eslint-disable-next-line react/jsx-key
onSetSortBy(o)} @@ -298,7 +301,7 @@ function FilterDropdown({ (k) => !deepEquals(value[k], defaultValue[k]), ); return modifiedKeys.map((k) => value[k]); - }, [value]); + }, [value, defaultValue]); const hasFilters = filterValues.length > 0; const onClear = () => { diff --git a/typescript/widgets/src/components/TextInput.tsx b/typescript/widgets/src/components/TextInput.tsx index e2dfa8e8e7..42f74f199d 100644 --- a/typescript/widgets/src/components/TextInput.tsx +++ b/typescript/widgets/src/components/TextInput.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, InputHTMLAttributes } from 'react'; +import React, { ChangeEvent, InputHTMLAttributes, forwardRef } from 'react'; export type InputProps = Omit< InputHTMLAttributes, @@ -28,4 +28,4 @@ export function _TextInput( ); } -export const TextInput = React.forwardRef(_TextInput); +export const TextInput = forwardRef(_TextInput); diff --git a/typescript/widgets/src/icons/Web.tsx b/typescript/widgets/src/icons/Web.tsx index 8915ed026d..228087f5cd 100644 --- a/typescript/widgets/src/icons/Web.tsx +++ b/typescript/widgets/src/icons/Web.tsx @@ -57,9 +57,9 @@ function _Web({ color = ColorPalette.Black, ...rest }: DefaultIconProps) { /> ); diff --git a/typescript/widgets/src/index.ts b/typescript/widgets/src/index.ts index fcc90c3006..655e3c1731 100644 --- a/typescript/widgets/src/index.ts +++ b/typescript/widgets/src/index.ts @@ -56,12 +56,17 @@ export { WalletIcon } from './icons/Wallet.js'; export { WarningIcon } from './icons/Warning.js'; export { WebIcon } from './icons/Web.js'; export { WideChevronIcon } from './icons/WideChevron.js'; -export { XCircleIcon } from './icons/XCircle.js'; export { XIcon } from './icons/X.js'; +export { XCircleIcon } from './icons/XCircle.js'; export { DropdownMenu, type DropdownMenuProps } from './layout/DropdownMenu.js'; export { Modal, useModal, type ModalProps } from './layout/Modal.js'; export { Popover, type PopoverProps } from './layout/Popover.js'; +export { CosmosLogo } from './logos/Cosmos.js'; +export { EthereumLogo } from './logos/Ethereum.js'; export { HyperlaneLogo } from './logos/Hyperlane.js'; +export { PROTOCOL_TO_LOGO } from './logos/protocols.js'; +export { SolanaLogo } from './logos/Solana.js'; +export { WalletConnectLogo } from './logos/WalletConnect.js'; export { MessageTimeline } from './messages/MessageTimeline.js'; export { MessageStage, @@ -81,3 +86,62 @@ export { useDebounce } from './utils/debounce.js'; export { useIsSsr } from './utils/ssr.js'; export { useInterval, useTimeout } from './utils/timeout.js'; export { useConnectionHealthTest } from './utils/useChainConnectionTest.js'; +export { + AccountList, + AccountSummary, +} from './walletIntegrations/AccountList.js'; +export { ConnectWalletButton } from './walletIntegrations/ConnectWalletButton.js'; +export { + getCosmosKitChainConfigs, + useCosmosAccount, + useCosmosActiveChain, + useCosmosConnectFn, + useCosmosDisconnectFn, + useCosmosTransactionFns, + useCosmosWalletDetails, +} from './walletIntegrations/cosmos.js'; +export { + getWagmiChainConfigs, + useEthereumAccount, + useEthereumActiveChain, + useEthereumConnectFn, + useEthereumDisconnectFn, + useEthereumTransactionFns, + useEthereumWalletDetails, +} from './walletIntegrations/ethereum.js'; +export { + getAccountAddressAndPubKey, + getAccountAddressForChain, + useAccountAddressForChain, + useAccountForChain, + useAccounts, + useActiveChains, + useConnectFns, + useDisconnectFns, + useTransactionFns, + useWalletDetails, +} from './walletIntegrations/multiProtocol.js'; +export { MultiProtocolWalletModal } from './walletIntegrations/MultiProtocolWalletModal.js'; +export { + useSolanaAccount, + useSolanaActiveChain, + useSolanaConnectFn, + useSolanaDisconnectFn, + useSolanaTransactionFns, + useSolanaWalletDetails, +} from './walletIntegrations/solana.js'; +export type { + AccountInfo, + ActiveChainInfo, + ChainAddress, + ChainTransactionFns, + SendTransactionFn, + SwitchNetworkFn, + WalletDetails, +} from './walletIntegrations/types.js'; +export { + ethers5TxToWagmiTx, + findChainByRpcUrl, + getChainsForProtocol, +} from './walletIntegrations/utils.js'; +export { WalletLogo } from './walletIntegrations/WalletLogo.js'; diff --git a/typescript/widgets/src/layout/DropdownMenu.tsx b/typescript/widgets/src/layout/DropdownMenu.tsx index 837a219e76..6dbca2248a 100644 --- a/typescript/widgets/src/layout/DropdownMenu.tsx +++ b/typescript/widgets/src/layout/DropdownMenu.tsx @@ -1,5 +1,5 @@ import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, ReactNode } from 'react'; export type DropdownMenuProps = { diff --git a/typescript/widgets/src/layout/Modal.tsx b/typescript/widgets/src/layout/Modal.tsx index bc0b872f01..12a774bbe7 100644 --- a/typescript/widgets/src/layout/Modal.tsx +++ b/typescript/widgets/src/layout/Modal.tsx @@ -4,7 +4,7 @@ import { DialogPanel, DialogTitle, } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, PropsWithChildren, useState } from 'react'; import { IconButton } from '../components/IconButton.js'; diff --git a/typescript/widgets/src/layout/Popover.tsx b/typescript/widgets/src/layout/Popover.tsx index 34e7793fb2..f0f1b82292 100644 --- a/typescript/widgets/src/layout/Popover.tsx +++ b/typescript/widgets/src/layout/Popover.tsx @@ -3,7 +3,7 @@ import { PopoverPanel, Popover as _Popover, } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, ReactNode } from 'react'; export type PopoverProps = { diff --git a/typescript/widgets/src/logger.ts b/typescript/widgets/src/logger.ts new file mode 100644 index 0000000000..b459551117 --- /dev/null +++ b/typescript/widgets/src/logger.ts @@ -0,0 +1,3 @@ +import { rootLogger } from '@hyperlane-xyz/utils'; + +export const widgetLogger = rootLogger.child({ module: 'widgets' }); diff --git a/typescript/widgets/src/logos/Cosmos.tsx b/typescript/widgets/src/logos/Cosmos.tsx new file mode 100644 index 0000000000..96b2ee8141 --- /dev/null +++ b/typescript/widgets/src/logos/Cosmos.tsx @@ -0,0 +1,40 @@ +import React, { SVGProps, memo } from 'react'; + +function _CosmosLogo(props: SVGProps) { + return ( + + + + + + + ); +} + +export const CosmosLogo = memo(_CosmosLogo); diff --git a/typescript/widgets/src/logos/Ethereum.tsx b/typescript/widgets/src/logos/Ethereum.tsx new file mode 100644 index 0000000000..6a298601c2 --- /dev/null +++ b/typescript/widgets/src/logos/Ethereum.tsx @@ -0,0 +1,27 @@ +import React, { SVGProps, memo } from 'react'; + +function _EthereumLogo(props: SVGProps) { + return ( + + + + + + + + + + + ); +} + +export const EthereumLogo = memo(_EthereumLogo); diff --git a/typescript/widgets/src/logos/Solana.tsx b/typescript/widgets/src/logos/Solana.tsx new file mode 100644 index 0000000000..07b3affa3f --- /dev/null +++ b/typescript/widgets/src/logos/Solana.tsx @@ -0,0 +1,63 @@ +import React, { SVGProps, memo } from 'react'; + +function _SolanaLogo(props: SVGProps) { + return ( + + + + + + + + + + + + + + + + + + ); +} + +export const SolanaLogo = memo(_SolanaLogo); diff --git a/typescript/widgets/src/logos/WalletConnect.tsx b/typescript/widgets/src/logos/WalletConnect.tsx new file mode 100644 index 0000000000..89b474cbe2 --- /dev/null +++ b/typescript/widgets/src/logos/WalletConnect.tsx @@ -0,0 +1,33 @@ +import React, { SVGProps, memo } from 'react'; + +function _WalletConnectLogo(props: SVGProps) { + return ( + + + + + + + + + + ); +} + +export const WalletConnectLogo = memo(_WalletConnectLogo); diff --git a/typescript/widgets/src/logos/protocols.ts b/typescript/widgets/src/logos/protocols.ts new file mode 100644 index 0000000000..414e4e4507 --- /dev/null +++ b/typescript/widgets/src/logos/protocols.ts @@ -0,0 +1,16 @@ +import { FC, SVGProps } from 'react'; + +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { CosmosLogo } from './Cosmos.js'; +import { EthereumLogo } from './Ethereum.js'; +import { SolanaLogo } from './Solana.js'; + +export const PROTOCOL_TO_LOGO: Record< + ProtocolType, + FC, 'ref'>> +> = { + [ProtocolType.Ethereum]: EthereumLogo, + [ProtocolType.Sealevel]: SolanaLogo, + [ProtocolType.Cosmos]: CosmosLogo, +}; diff --git a/typescript/widgets/src/messages/useMessage.ts b/typescript/widgets/src/messages/useMessage.ts index 38471facf2..3434f621c1 100644 --- a/typescript/widgets/src/messages/useMessage.ts +++ b/typescript/widgets/src/messages/useMessage.ts @@ -1,11 +1,14 @@ import { useCallback, useState } from 'react'; import { HYPERLANE_EXPLORER_API_URL } from '../consts.js'; +import { widgetLogger } from '../logger.js'; import { executeExplorerQuery } from '../utils/explorers.js'; import { useInterval } from '../utils/timeout.js'; import { ApiMessage, MessageStatus } from './types.js'; +const logger = widgetLogger.child({ module: 'useMessage' }); + interface Params { messageId?: string; originTxHash?: string; @@ -40,7 +43,7 @@ export function useMessage({ }) .catch((e) => setError(e.toString())) .finally(() => setIsLoading(false)); - }, [messageId, originTxHash, data]); + }, [explorerApiUrl, messageId, originTxHash, data]); useInterval(fetcher, retryInterval); @@ -66,13 +69,13 @@ async function fetchMessage( const result = await executeExplorerQuery(url, 5000); if (result.length > 1) { - console.warn('More than one message received, should not occur'); + logger.warn('More than one message received, should not occur'); return result[0]; } else if (result.length === 1) { - console.debug('Message data found, id:', result[0].id); + logger.debug('Message data found, id:', result[0].id); return result[0]; } else { - console.debug('Message data not found'); + logger.debug('Message data not found'); return null; } } diff --git a/typescript/widgets/src/messages/useMessageStage.ts b/typescript/widgets/src/messages/useMessageStage.ts index 9351e31d44..26dd1678b4 100644 --- a/typescript/widgets/src/messages/useMessageStage.ts +++ b/typescript/widgets/src/messages/useMessageStage.ts @@ -4,6 +4,7 @@ import type { MultiProvider } from '@hyperlane-xyz/sdk'; import { fetchWithTimeout } from '@hyperlane-xyz/utils'; import { HYPERLANE_EXPLORER_API_URL } from '../consts.js'; +import { widgetLogger } from '../logger.js'; import { queryExplorerForBlock } from '../utils/explorers.js'; import { useInterval } from '../utils/timeout.js'; @@ -14,6 +15,8 @@ import { StageTimings, } from './types.js'; +const logger = widgetLogger.child({ module: 'useMessageStage' }); + const VALIDATION_TIME_EST = 5; const DEFAULT_BLOCK_TIME_EST = 3; const DEFAULT_FINALITY_BLOCKS = 3; @@ -67,7 +70,7 @@ export function useMessageStage({ }) .catch((e) => setError(e.toString())) .finally(() => setIsLoading(false)); - }, [message, data]); + }, [explorerApiUrl, multiProvider, message, data]); useInterval(fetcher, retryInterval); @@ -192,7 +195,7 @@ async function tryFetchChainLatestBlock( ) { const metadata = multiProvider.tryGetChainMetadata(domainId); if (!metadata) return null; - console.debug(`Attempting to fetch latest block for:`, metadata.name); + logger.debug(`Attempting to fetch latest block for:`, metadata.name); try { const block = await queryExplorerForBlock( metadata.name, @@ -201,7 +204,7 @@ async function tryFetchChainLatestBlock( ); return block; } catch (error) { - console.error('Error fetching latest block', error); + logger.error('Error fetching latest block', error); return null; } } @@ -213,7 +216,7 @@ async function tryFetchLatestNonce( ) { const metadata = multiProvider.tryGetChainMetadata(domainId); if (!metadata) return null; - console.debug(`Attempting to fetch nonce for:`, metadata.name); + logger.debug(`Attempting to fetch nonce for:`, metadata.name); try { const response = await fetchWithTimeout( `${explorerApiUrl}/latest-nonce`, @@ -227,10 +230,10 @@ async function tryFetchLatestNonce( 3000, ); const result = await response.json(); - console.debug(`Found nonce:`, result.nonce); + logger.debug(`Found nonce:`, result.nonce); return result.nonce; } catch (error) { - console.error('Error fetching nonce', error); + logger.error('Error fetching nonce', error); return null; } } diff --git a/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx b/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx new file mode 100644 index 0000000000..dd2aadff71 --- /dev/null +++ b/typescript/widgets/src/stories/MultiProtocolWalletModal.stories.tsx @@ -0,0 +1,124 @@ +import { ChakraProvider } from '@chakra-ui/react'; +import { ChainProvider } from '@cosmos-kit/react'; +import '@interchain-ui/react/styles'; +import { RainbowKitProvider } from '@rainbow-me/rainbowkit'; +import '@rainbow-me/rainbowkit/styles.css'; +import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'; +import { + ConnectionProvider, + WalletProvider, +} from '@solana/wallet-adapter-react'; +import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'; +import '@solana/wallet-adapter-react-ui/styles.css'; +import { clusterApiUrl } from '@solana/web3.js'; +import { Meta, StoryObj } from '@storybook/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import React, { PropsWithChildren, useState } from 'react'; +import { WagmiProvider, createConfig, http } from 'wagmi'; + +import { cosmoshub, ethereum, solanamainnet } from '@hyperlane-xyz/registry'; +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { AccountList } from '../walletIntegrations/AccountList.js'; +import { ConnectWalletButton } from '../walletIntegrations/ConnectWalletButton.js'; +import { MultiProtocolWalletModal } from '../walletIntegrations/MultiProtocolWalletModal.js'; +import { getCosmosKitChainConfigs } from '../walletIntegrations/cosmos.js'; +import { getWagmiChainConfigs } from '../walletIntegrations/ethereum.js'; + +const multiProvider = new MultiProtocolProvider({ + ethereum, + cosmoshub, + solanamainnet, +}); + +function MinimalDapp({ protocols }: { protocols?: ProtocolType[] }) { + const [isOpen, setIsOpen] = useState(false); + const open = () => setIsOpen(true); + const close = () => setIsOpen(false); + + return ( + + + +
+

CONNECT BUTTON

+ +

ACCOUNT SUMMARY

+ +
+ +
+
+
+ ); +} + +const wagmiConfig = createConfig({ + chains: [getWagmiChainConfigs(multiProvider)[0]], + transports: { [ethereum.chainId]: http() }, +}); + +function EthereumWalletProvider({ children }: PropsWithChildren) { + const queryClient = new QueryClient(); + + return ( + + + {children} + + + ); +} + +const cosmosKitConfig = getCosmosKitChainConfigs(multiProvider); + +function CosmosWalletProvider({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} + +function SolanaWalletProvider({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} + +const meta = { + title: 'MultiProtocolWalletModal', + component: MinimalDapp, +} satisfies Meta; +export default meta; +type Story = StoryObj; + +export const DefaultPicker = { + args: {}, +} satisfies Story; + +export const EvmOnlyPicker = { + args: { protocols: [ProtocolType.Ethereum] }, +} satisfies Story; diff --git a/typescript/widgets/src/utils/clipboard.ts b/typescript/widgets/src/utils/clipboard.ts index eb331af45d..454b73a766 100644 --- a/typescript/widgets/src/utils/clipboard.ts +++ b/typescript/widgets/src/utils/clipboard.ts @@ -1,3 +1,5 @@ +import { widgetLogger } from '../logger.js'; + export function isClipboardReadSupported() { return !!navigator?.clipboard?.readText; } @@ -7,7 +9,7 @@ export async function tryClipboardSet(value: string) { await navigator.clipboard.writeText(value); return true; } catch (error) { - console.error('Failed to set clipboard', error); + widgetLogger.error('Failed to set clipboard', error); return false; } } @@ -18,7 +20,7 @@ export async function tryClipboardGet() { const value = await navigator.clipboard.readText(); return value; } catch (error) { - console.error('Failed to read from clipboard', error); + widgetLogger.error('Failed to read from clipboard', error); return null; } } diff --git a/typescript/widgets/src/utils/explorers.ts b/typescript/widgets/src/utils/explorers.ts index 38c470d31c..b546f425dc 100644 --- a/typescript/widgets/src/utils/explorers.ts +++ b/typescript/widgets/src/utils/explorers.ts @@ -1,6 +1,8 @@ import type { MultiProvider } from '@hyperlane-xyz/sdk'; import { fetchWithTimeout } from '@hyperlane-xyz/utils'; +import { widgetLogger } from '../logger.js'; + export interface ExplorerQueryResponse { status: string; message: string; @@ -29,7 +31,7 @@ export async function queryExplorer

( throw new Error(`No URL found for explorer for chain ${chainName}`); let url = `${baseUrl}/${path}`; - console.debug('Querying explorer url:', url); + widgetLogger.debug('Querying explorer url:', url); if (apiKey) { url += `&apikey=${apiKey}`; @@ -76,7 +78,7 @@ export async function queryExplorerForBlock( ); if (!block?.number || parseInt(block.number.toString()) < 0) { const msg = 'Invalid block result'; - console.error(msg, JSON.stringify(block), path); + widgetLogger.error(msg, JSON.stringify(block), path); throw new Error(msg); } return block; diff --git a/typescript/widgets/src/utils/useChainConnectionTest.ts b/typescript/widgets/src/utils/useChainConnectionTest.ts index 920b2e7dd0..6892fb83bd 100644 --- a/typescript/widgets/src/utils/useChainConnectionTest.ts +++ b/typescript/widgets/src/utils/useChainConnectionTest.ts @@ -26,7 +26,7 @@ export function useConnectionHealthTest( timeout(tester(chainMetadata, index), HEALTH_TEST_TIMEOUT) .then((result) => setIsHealthy(result)) .catch(() => setIsHealthy(false)); - }, [chainMetadata, index, tester]); + }, [chainMetadata, index, type, tester]); return isHealthy; } diff --git a/typescript/widgets/src/walletIntegrations/AccountList.tsx b/typescript/widgets/src/walletIntegrations/AccountList.tsx new file mode 100644 index 0000000000..63d08baada --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/AccountList.tsx @@ -0,0 +1,143 @@ +import { clsx } from 'clsx'; +import React, { ButtonHTMLAttributes } from 'react'; + +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType, objKeys } from '@hyperlane-xyz/utils'; + +import { Button } from '../components/Button.js'; +import { IconButton } from '../components/IconButton.js'; +import { LogoutIcon } from '../icons/Logout.js'; +import { WalletIcon } from '../icons/Wallet.js'; +import { XCircleIcon } from '../icons/XCircle.js'; +import { widgetLogger } from '../logger.js'; +import { tryClipboardSet } from '../utils/clipboard.js'; +import { WalletLogo } from '../walletIntegrations/WalletLogo.js'; +import { + useAccounts, + useDisconnectFns, + useWalletDetails, +} from '../walletIntegrations/multiProtocol.js'; + +import { AccountInfo, WalletDetails } from './types.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/AccountList' }); + +export function AccountList({ + multiProvider, + onClickConnectWallet, + onCopySuccess, + className, +}: { + multiProvider: MultiProtocolProvider; + onClickConnectWallet: () => void; + onCopySuccess?: () => void; + className?: string; +}) { + const { readyAccounts } = useAccounts(multiProvider); + const disconnectFns = useDisconnectFns(); + const walletDetails = useWalletDetails(); + + const onClickDisconnect = async (protocol: ProtocolType) => { + try { + const disconnectFn = disconnectFns[protocol]; + if (disconnectFn) await disconnectFn(); + } catch (error) { + logger.error('Error disconnecting wallet', error); + } + }; + + const onClickDisconnectAll = async () => { + for (const protocol of objKeys(disconnectFns)) { + await onClickDisconnect(protocol); + } + }; + + return ( +

+ {readyAccounts.map((acc, i) => ( + onClickDisconnect(acc.protocol)} + /> + ))} + + +
+ ); +} + +type AccountSummaryProps = { + account: AccountInfo; + walletDetails: WalletDetails; + onCopySuccess?: () => void; + onClickDisconnect: () => Promise; +} & ButtonHTMLAttributes; + +export function AccountSummary({ + account, + onCopySuccess, + walletDetails, + onClickDisconnect, + className, + ...rest +}: AccountSummaryProps) { + const numAddresses = account?.addresses?.length || 0; + const onlyAddress = + numAddresses === 1 ? account.addresses[0].address : undefined; + + const onClickCopy = async () => { + const copyValue = account.addresses.map((a) => a.address).join(', '); + await tryClipboardSet(copyValue); + onCopySuccess?.(); + }; + + return ( +
+ +
+ + + +
+
+ ); +} + +const styles = { + btn: 'htw-flex htw-w-full htw-items-center all:htw-justify-start htw-rounded-sm htw-text-sm hover:htw-bg-gray-200 all:hover:htw-opacity-100', +}; diff --git a/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx new file mode 100644 index 0000000000..1d64e9cf70 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx @@ -0,0 +1,115 @@ +import { clsx } from 'clsx'; +import React, { ButtonHTMLAttributes } from 'react'; + +import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType, shortenAddress } from '@hyperlane-xyz/utils'; + +import { Button } from '../components/Button.js'; +import { ChevronIcon } from '../icons/Chevron.js'; +import { WalletIcon } from '../icons/Wallet.js'; +import { useIsSsr } from '../utils/ssr.js'; + +import { WalletLogo } from './WalletLogo.js'; +import { useAccounts, useWalletDetails } from './multiProtocol.js'; + +type Props = { + multiProvider: MultiProtocolProvider; + onClickWhenConnected: () => void; + onClickWhenUnconnected: () => void; + countClassName?: string; +} & ButtonHTMLAttributes; + +export function ConnectWalletButton({ + multiProvider, + onClickWhenConnected, + onClickWhenUnconnected, + className, + countClassName, + ...rest +}: Props) { + const isSsr = useIsSsr(); + + const { readyAccounts } = useAccounts(multiProvider); + const walletDetails = useWalletDetails(); + + const numReady = readyAccounts.length; + const firstAccount = readyAccounts[0]; + const firstWallet = + walletDetails[firstAccount?.protocol || ProtocolType.Ethereum]; + + if (isSsr) { + // https://github.com/wagmi-dev/wagmi/issues/542#issuecomment-1144178142 + return null; + } + + return ( +
+
+ {numReady === 0 && ( + + )} + + {numReady === 1 && ( + + )} + + {numReady > 1 && ( + + )} +
+
+ ); +} diff --git a/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx b/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx new file mode 100644 index 0000000000..2c200f1cef --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/MultiProtocolWalletModal.tsx @@ -0,0 +1,86 @@ +import React, { PropsWithChildren } from 'react'; + +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { Modal } from '../layout/Modal.js'; +import { PROTOCOL_TO_LOGO } from '../logos/protocols.js'; + +import { useConnectFns } from './multiProtocol.js'; + +export function MultiProtocolWalletModal({ + isOpen, + close, + protocols, +}: { + isOpen: boolean; + close: () => void; + protocols?: ProtocolType[]; // defaults to all protocols if not provided +}) { + const connectFns = useConnectFns(); + + const onClickProtocol = (protocol: ProtocolType) => { + close(); + const connectFn = connectFns[protocol]; + if (connectFn) connectFn(); + }; + + const includesProtocol = (protocol: ProtocolType) => + !protocols || protocols.includes(protocol); + + return ( + +
+ {includesProtocol(ProtocolType.Ethereum) && ( + + Ethereum + + )} + {includesProtocol(ProtocolType.Sealevel) && ( + + Solana + + )} + {includesProtocol(ProtocolType.Cosmos) && ( + + Cosmos + + )} +
+
+ ); +} + +function ProtocolButton({ + onClick, + subTitle, + protocol, + children, +}: PropsWithChildren<{ + subTitle: string; + protocol: ProtocolType; + onClick: (protocol: ProtocolType) => void; +}>) { + const Logo = PROTOCOL_TO_LOGO[protocol]; + return ( + + ); +} diff --git a/typescript/widgets/src/walletIntegrations/WalletLogo.tsx b/typescript/widgets/src/walletIntegrations/WalletLogo.tsx new file mode 100644 index 0000000000..a41658295c --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/WalletLogo.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import { WalletIcon } from '../icons/Wallet.js'; +import { WalletConnectLogo } from '../logos/WalletConnect.js'; + +import { WalletDetails } from './types.js'; + +export function WalletLogo({ + walletDetails, + size, +}: { + walletDetails: WalletDetails; + size?: number; +}) { + const src = walletDetails.logoUrl?.trim(); + + if (src) { + return ; + } else if (walletDetails.name?.toLowerCase() === 'walletconnect') { + return ; + } else { + return ; + } +} diff --git a/typescript/widgets/src/walletIntegrations/cosmos.ts b/typescript/widgets/src/walletIntegrations/cosmos.ts new file mode 100644 index 0000000000..7b54c61cf1 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/cosmos.ts @@ -0,0 +1,208 @@ +import type { AssetList, Chain as CosmosChain } from '@chain-registry/types'; +import type { + DeliverTxResponse, + ExecuteResult, + IndexedTx, +} from '@cosmjs/cosmwasm-stargate'; +import { useChain, useChains } from '@cosmos-kit/react'; +import { useCallback, useMemo } from 'react'; + +import { cosmoshub } from '@hyperlane-xyz/registry'; +import { + ChainMetadata, + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, + chainMetadataToCosmosChain, +} from '@hyperlane-xyz/sdk'; +import { HexString, ProtocolType, assert } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainAddress, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { getChainsForProtocol } from './utils.js'; + +// Used because the CosmosKit hooks always require a chain name +const PLACEHOLDER_COSMOS_CHAIN = cosmoshub.name; + +const logger = widgetLogger.child({ + module: 'widgets/walletIntegrations/cosmos', +}); + +export function useCosmosAccount( + multiProvider: MultiProtocolProvider, +): AccountInfo { + const cosmosChains = getCosmosChainNames(multiProvider); + const chainToContext = useChains(cosmosChains); + return useMemo(() => { + const addresses: Array = []; + let publicKey: Promise | undefined = undefined; + let connectorName: string | undefined = undefined; + let isReady = false; + for (const [chainName, context] of Object.entries(chainToContext)) { + if (!context.address) continue; + addresses.push({ address: context.address, chainName }); + publicKey = context + .getAccount() + .then((acc) => Buffer.from(acc.pubkey).toString('hex')); + isReady = true; + connectorName ||= context.wallet?.prettyName; + } + return { + protocol: ProtocolType.Cosmos, + addresses, + publicKey, + isReady, + }; + }, [chainToContext]); +} + +export function useCosmosWalletDetails() { + const { wallet } = useChain(PLACEHOLDER_COSMOS_CHAIN); + const { logo, prettyName } = wallet || {}; + + return useMemo( + () => ({ + name: prettyName, + logoUrl: typeof logo === 'string' ? logo : undefined, + }), + [prettyName, logo], + ); +} + +export function useCosmosConnectFn(): () => void { + const { openView } = useChain(PLACEHOLDER_COSMOS_CHAIN); + return openView; +} + +export function useCosmosDisconnectFn(): () => Promise { + const { disconnect, address } = useChain(PLACEHOLDER_COSMOS_CHAIN); + const safeDisconnect = async () => { + if (address) await disconnect(); + }; + return safeDisconnect; +} + +export function useCosmosActiveChain( + _multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + // Cosmoskit doesn't have the concept of an active chain + return useMemo(() => ({} as ActiveChainInfo), []); +} + +export function useCosmosTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const cosmosChains = getCosmosChainNames(multiProvider); + const chainToContext = useChains(cosmosChains); + + const onSwitchNetwork = useCallback( + async (chainName: ChainName) => { + const displayName = + multiProvider.getChainMetadata(chainName).displayName || chainName; + // CosmosKit does not have switch capability + throw new Error( + `Cosmos wallet must be connected to origin chain ${displayName}}`, + ); + }, + [multiProvider], + ); + + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + const chainContext = chainToContext[chainName]; + if (!chainContext?.address) + throw new Error(`Cosmos wallet not connected for ${chainName}`); + + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + + logger.debug(`Sending tx on chain ${chainName}`); + const { getSigningCosmWasmClient, getSigningStargateClient } = + chainContext; + let result: ExecuteResult | DeliverTxResponse; + let txDetails: IndexedTx | null; + if (tx.type === ProviderType.CosmJsWasm) { + const client = await getSigningCosmWasmClient(); + result = await client.executeMultiple( + chainContext.address, + [tx.transaction], + 'auto', + ); + txDetails = await client.getTx(result.transactionHash); + } else if (tx.type === ProviderType.CosmJs) { + const client = await getSigningStargateClient(); + // The fee param of 'auto' here stopped working for Neutron-based IBC transfers + // It seems the signAndBroadcast method uses a default fee multiplier of 1.4 + // https://github.com/cosmos/cosmjs/blob/e819a1fc0e99a3e5320d8d6667a08d3b92e5e836/packages/stargate/src/signingstargateclient.ts#L115 + // A multiplier of 1.6 was insufficient for Celestia -> Neutron|Cosmos -> XXX transfers, but 2 worked. + result = await client.signAndBroadcast( + chainContext.address, + [tx.transaction], + 2, + ); + txDetails = await client.getTx(result.transactionHash); + } else { + throw new Error(`Invalid cosmos provider type ${tx.type}`); + } + + const confirm = async (): Promise => { + assert(txDetails, `Cosmos tx failed: ${JSON.stringify(result)}`); + return { + type: tx.type, + receipt: { ...txDetails, transactionHash: result.transactionHash }, + }; + }; + return { hash: result.transactionHash, confirm }; + }, + [onSwitchNetwork, chainToContext], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} + +function getCosmosChains( + multiProvider: MultiProtocolProvider, +): ChainMetadata[] { + return [ + ...getChainsForProtocol(multiProvider, ProtocolType.Cosmos), + cosmoshub, + ]; +} + +function getCosmosChainNames( + multiProvider: MultiProtocolProvider, +): ChainName[] { + return getCosmosChains(multiProvider).map((c) => c.name); +} + +// Metadata formatted for use in Wagmi config +export function getCosmosKitChainConfigs( + multiProvider: MultiProtocolProvider, +): { + chains: CosmosChain[]; + assets: AssetList[]; +} { + const chains = getCosmosChains(multiProvider); + const configList = chains.map(chainMetadataToCosmosChain); + return { + chains: configList.map((c) => c.chain), + assets: configList.map((c) => c.assets), + }; +} diff --git a/typescript/widgets/src/walletIntegrations/ethereum.ts b/typescript/widgets/src/walletIntegrations/ethereum.ts new file mode 100644 index 0000000000..0a9e8a4a13 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/ethereum.ts @@ -0,0 +1,169 @@ +import { useConnectModal } from '@rainbow-me/rainbowkit'; +import { + getAccount, + sendTransaction, + switchChain, + waitForTransactionReceipt, +} from '@wagmi/core'; +import { useCallback, useMemo } from 'react'; +import { Chain as ViemChain } from 'viem'; +import { useAccount, useConfig, useDisconnect } from 'wagmi'; + +import { + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, + chainMetadataToViemChain, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType, assert, sleep } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { ethers5TxToWagmiTx, getChainsForProtocol } from './utils.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/ethereum' }); + +export function useEthereumAccount( + _multiProvider: MultiProtocolProvider, +): AccountInfo { + const { address, isConnected, connector } = useAccount(); + const isReady = !!(address && isConnected && connector); + + return useMemo( + () => ({ + protocol: ProtocolType.Ethereum, + addresses: address ? [{ address: `${address}` }] : [], + isReady: isReady, + }), + [address, isReady], + ); +} + +export function useEthereumWalletDetails() { + const { connector } = useAccount(); + const name = connector?.name; + const logoUrl = connector?.icon; + + return useMemo( + () => ({ + name, + logoUrl, + }), + [name, logoUrl], + ); +} + +export function useEthereumConnectFn(): () => void { + const { openConnectModal } = useConnectModal(); + return useCallback(() => openConnectModal?.(), [openConnectModal]); +} + +export function useEthereumDisconnectFn(): () => Promise { + const { disconnectAsync } = useDisconnect(); + return disconnectAsync; +} + +export function useEthereumActiveChain( + multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + const { chain } = useAccount(); + return useMemo( + () => ({ + chainDisplayName: chain?.name, + chainName: chain + ? multiProvider.tryGetChainMetadata(chain.id)?.name + : undefined, + }), + [chain, multiProvider], + ); +} + +export function useEthereumTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const config = useConfig(); + + const onSwitchNetwork = useCallback( + async (chainName: ChainName) => { + const chainId = multiProvider.getChainMetadata(chainName) + .chainId as number; + await switchChain(config, { chainId }); + // Some wallets seem to require a brief pause after switch + await sleep(2000); + }, + [config, multiProvider], + ); + // Note, this doesn't use wagmi's prepare + send pattern because we're potentially sending two transactions + // The prepare hooks are recommended to use pre-click downtime to run async calls, but since the flow + // may require two serial txs, the prepare hooks aren't useful and complicate hook architecture considerably. + // See https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/issues/19 + // See https://github.com/wagmi-dev/wagmi/discussions/1564 + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + if (tx.type !== ProviderType.EthersV5) + throw new Error(`Unsupported tx type: ${tx.type}`); + + // If the active chain is different from tx origin chain, try to switch network first + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + + // Since the network switching is not foolproof, we also force a network check here + const chainId = multiProvider.getChainMetadata(chainName) + .chainId as number; + logger.debug('Checking wallet current chain'); + const latestNetwork = await getAccount(config); + assert( + latestNetwork?.chain?.id === chainId, + `Wallet not on chain ${chainName} (ChainMismatchError)`, + ); + + logger.debug(`Sending tx on chain ${chainName}`); + const wagmiTx = ethers5TxToWagmiTx(tx.transaction); + const hash = await sendTransaction(config, { + chainId, + ...wagmiTx, + }); + const confirm = (): Promise => { + const foo = waitForTransactionReceipt(config, { + chainId, + hash, + confirmations: 1, + }); + return foo.then((r) => ({ + type: ProviderType.Viem, + receipt: { ...r, contractAddress: r.contractAddress || null }, + })); + }; + + return { hash, confirm }; + }, + [config, onSwitchNetwork, multiProvider], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} + +// Metadata formatted for use in Wagmi config +export function getWagmiChainConfigs( + multiProvider: MultiProtocolProvider, +): ViemChain[] { + return getChainsForProtocol(multiProvider, ProtocolType.Ethereum).map( + chainMetadataToViemChain, + ); +} diff --git a/typescript/widgets/src/walletIntegrations/multiProtocol.tsx b/typescript/widgets/src/walletIntegrations/multiProtocol.tsx new file mode 100644 index 0000000000..9fb58abb17 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/multiProtocol.tsx @@ -0,0 +1,256 @@ +import { useMemo } from 'react'; + +import { ChainName, MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { Address, HexString, ProtocolType } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + useCosmosAccount, + useCosmosActiveChain, + useCosmosConnectFn, + useCosmosDisconnectFn, + useCosmosTransactionFns, + useCosmosWalletDetails, +} from './cosmos.js'; +import { + useEthereumAccount, + useEthereumActiveChain, + useEthereumConnectFn, + useEthereumDisconnectFn, + useEthereumTransactionFns, + useEthereumWalletDetails, +} from './ethereum.js'; +import { + useSolanaAccount, + useSolanaActiveChain, + useSolanaConnectFn, + useSolanaDisconnectFn, + useSolanaTransactionFns, + useSolanaWalletDetails, +} from './solana.js'; +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; + +const logger = widgetLogger.child({ + module: 'walletIntegrations/multiProtocol', +}); + +export function useAccounts( + multiProvider: MultiProtocolProvider, + blacklistedAddresses: Address[] = [], +): { + accounts: Record; + readyAccounts: Array; +} { + const evmAccountInfo = useEthereumAccount(multiProvider); + const solAccountInfo = useSolanaAccount(multiProvider); + const cosmAccountInfo = useCosmosAccount(multiProvider); + + // Filtered ready accounts + const readyAccounts = useMemo( + () => + [evmAccountInfo, solAccountInfo, cosmAccountInfo].filter( + (a) => a.isReady, + ), + [evmAccountInfo, solAccountInfo, cosmAccountInfo], + ); + + // Check if any of the ready accounts are blacklisted + const readyAddresses = readyAccounts + .map((a) => a.addresses) + .flat() + .map((a) => a.address.toLowerCase()); + if (readyAddresses.some((a) => blacklistedAddresses.includes(a))) { + throw new Error('Wallet address is blacklisted'); + } + + return useMemo( + () => ({ + accounts: { + [ProtocolType.Ethereum]: evmAccountInfo, + [ProtocolType.Sealevel]: solAccountInfo, + [ProtocolType.Cosmos]: cosmAccountInfo, + }, + readyAccounts, + }), + [evmAccountInfo, solAccountInfo, cosmAccountInfo, readyAccounts], + ); +} + +export function useAccountForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, +): AccountInfo | undefined { + const { accounts } = useAccounts(multiProvider); + const protocol = chainName ? multiProvider.getProtocol(chainName) : undefined; + if (!chainName || !protocol) return undefined; + return accounts?.[protocol]; +} + +export function useAccountAddressForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, +): Address | undefined { + const { accounts } = useAccounts(multiProvider); + return getAccountAddressForChain(multiProvider, chainName, accounts); +} + +export function getAccountAddressForChain( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, + accounts?: Record, +): Address | undefined { + if (!chainName || !accounts) return undefined; + const protocol = multiProvider.getProtocol(chainName); + const account = accounts[protocol]; + if (protocol === ProtocolType.Cosmos) { + return account?.addresses.find((a) => a.chainName === chainName)?.address; + } else { + // Use first because only cosmos has the notion of per-chain addresses + return account?.addresses[0]?.address; + } +} + +export function getAccountAddressAndPubKey( + multiProvider: MultiProtocolProvider, + chainName?: ChainName, + accounts?: Record, +): { address?: Address; publicKey?: Promise } { + const address = getAccountAddressForChain(multiProvider, chainName, accounts); + if (!accounts || !chainName || !address) return {}; + const protocol = multiProvider.getProtocol(chainName); + const publicKey = accounts[protocol]?.publicKey; + return { address, publicKey }; +} + +export function useWalletDetails(): Record { + const evmWallet = useEthereumWalletDetails(); + const solWallet = useSolanaWalletDetails(); + const cosmosWallet = useCosmosWalletDetails(); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: evmWallet, + [ProtocolType.Sealevel]: solWallet, + [ProtocolType.Cosmos]: cosmosWallet, + }), + [evmWallet, solWallet, cosmosWallet], + ); +} + +export function useConnectFns(): Record void> { + const onConnectEthereum = useEthereumConnectFn(); + const onConnectSolana = useSolanaConnectFn(); + const onConnectCosmos = useCosmosConnectFn(); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: onConnectEthereum, + [ProtocolType.Sealevel]: onConnectSolana, + [ProtocolType.Cosmos]: onConnectCosmos, + }), + [onConnectEthereum, onConnectSolana, onConnectCosmos], + ); +} + +export function useDisconnectFns(): Record Promise> { + const disconnectEvm = useEthereumDisconnectFn(); + const disconnectSol = useSolanaDisconnectFn(); + const disconnectCosmos = useCosmosDisconnectFn(); + + const onClickDisconnect = + (env: ProtocolType, disconnectFn?: () => Promise | void) => + async () => { + try { + if (!disconnectFn) throw new Error('Disconnect function is null'); + await disconnectFn(); + } catch (error) { + logger.error(`Error disconnecting from ${env} wallet`, error); + } + }; + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: onClickDisconnect( + ProtocolType.Ethereum, + disconnectEvm, + ), + [ProtocolType.Sealevel]: onClickDisconnect( + ProtocolType.Sealevel, + disconnectSol, + ), + [ProtocolType.Cosmos]: onClickDisconnect( + ProtocolType.Cosmos, + disconnectCosmos, + ), + }), + [disconnectEvm, disconnectSol, disconnectCosmos], + ); +} + +export function useActiveChains(multiProvider: MultiProtocolProvider): { + chains: Record; + readyChains: Array; +} { + const evmChain = useEthereumActiveChain(multiProvider); + const solChain = useSolanaActiveChain(multiProvider); + const cosmChain = useCosmosActiveChain(multiProvider); + + const readyChains = useMemo( + () => [evmChain, solChain, cosmChain].filter((c) => !!c.chainDisplayName), + [evmChain, solChain, cosmChain], + ); + + return useMemo( + () => ({ + chains: { + [ProtocolType.Ethereum]: evmChain, + [ProtocolType.Sealevel]: solChain, + [ProtocolType.Cosmos]: cosmChain, + }, + readyChains, + }), + [evmChain, solChain, cosmChain, readyChains], + ); +} + +export function useTransactionFns( + multiProvider: MultiProtocolProvider, +): Record { + const { switchNetwork: onSwitchEvmNetwork, sendTransaction: onSendEvmTx } = + useEthereumTransactionFns(multiProvider); + const { switchNetwork: onSwitchSolNetwork, sendTransaction: onSendSolTx } = + useSolanaTransactionFns(multiProvider); + const { switchNetwork: onSwitchCosmNetwork, sendTransaction: onSendCosmTx } = + useCosmosTransactionFns(multiProvider); + + return useMemo( + () => ({ + [ProtocolType.Ethereum]: { + sendTransaction: onSendEvmTx, + switchNetwork: onSwitchEvmNetwork, + }, + [ProtocolType.Sealevel]: { + sendTransaction: onSendSolTx, + switchNetwork: onSwitchSolNetwork, + }, + [ProtocolType.Cosmos]: { + sendTransaction: onSendCosmTx, + switchNetwork: onSwitchCosmNetwork, + }, + }), + [ + onSendEvmTx, + onSendSolTx, + onSwitchEvmNetwork, + onSwitchSolNetwork, + onSendCosmTx, + onSwitchCosmNetwork, + ], + ); +} diff --git a/typescript/widgets/src/walletIntegrations/solana.ts b/typescript/widgets/src/walletIntegrations/solana.ts new file mode 100644 index 0000000000..94874645af --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/solana.ts @@ -0,0 +1,138 @@ +import { useConnection, useWallet } from '@solana/wallet-adapter-react'; +import { useWalletModal } from '@solana/wallet-adapter-react-ui'; +import { Connection } from '@solana/web3.js'; +import { useCallback, useMemo } from 'react'; + +import { + ChainName, + MultiProtocolProvider, + ProviderType, + TypedTransactionReceipt, + WarpTypedTransaction, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { widgetLogger } from '../logger.js'; + +import { + AccountInfo, + ActiveChainInfo, + ChainTransactionFns, + WalletDetails, +} from './types.js'; +import { findChainByRpcUrl } from './utils.js'; + +const logger = widgetLogger.child({ module: 'walletIntegrations/solana' }); + +export function useSolanaAccount( + _multiProvider: MultiProtocolProvider, +): AccountInfo { + const { publicKey, connected, wallet } = useWallet(); + const isReady = !!(publicKey && wallet && connected); + const address = publicKey?.toBase58(); + + return useMemo( + () => ({ + protocol: ProtocolType.Sealevel, + addresses: address ? [{ address: address }] : [], + isReady: isReady, + }), + [address, isReady], + ); +} + +export function useSolanaWalletDetails() { + const { wallet } = useWallet(); + const { name, icon } = wallet?.adapter || {}; + + return useMemo( + () => ({ + name, + logoUrl: icon, + }), + [name, icon], + ); +} + +export function useSolanaConnectFn(): () => void { + const { setVisible } = useWalletModal(); + return useCallback(() => setVisible(true), [setVisible]); +} + +export function useSolanaDisconnectFn(): () => Promise { + const { disconnect } = useWallet(); + return disconnect; +} + +export function useSolanaActiveChain( + multiProvider: MultiProtocolProvider, +): ActiveChainInfo { + const { connection } = useConnection(); + const connectionEndpoint = connection?.rpcEndpoint; + return useMemo(() => { + try { + const hostname = new URL(connectionEndpoint).hostname; + const metadata = findChainByRpcUrl(multiProvider, hostname); + if (!metadata) return {}; + return { + chainDisplayName: metadata.displayName, + chainName: metadata.name, + }; + } catch (error) { + logger.warn('Error finding sol active chain', error); + return {}; + } + }, [connectionEndpoint, multiProvider]); +} + +export function useSolanaTransactionFns( + multiProvider: MultiProtocolProvider, +): ChainTransactionFns { + const { sendTransaction: sendSolTransaction } = useWallet(); + + const onSwitchNetwork = useCallback(async (chainName: ChainName) => { + logger.warn(`Solana wallet must be connected to origin chain ${chainName}`); + }, []); + + const onSendTx = useCallback( + async ({ + tx, + chainName, + activeChainName, + }: { + tx: WarpTypedTransaction; + chainName: ChainName; + activeChainName?: ChainName; + }) => { + if (tx.type !== ProviderType.SolanaWeb3) + throw new Error(`Unsupported tx type: ${tx.type}`); + if (activeChainName && activeChainName !== chainName) + await onSwitchNetwork(chainName); + const rpcUrl = multiProvider.getRpcUrl(chainName); + const connection = new Connection(rpcUrl, 'confirmed'); + const { + context: { slot: minContextSlot }, + value: { blockhash, lastValidBlockHeight }, + } = await connection.getLatestBlockhashAndContext(); + + logger.debug(`Sending tx on chain ${chainName}`); + const signature = await sendSolTransaction(tx.transaction, connection, { + minContextSlot, + }); + + const confirm = (): Promise => + connection + .confirmTransaction({ blockhash, lastValidBlockHeight, signature }) + .then(() => connection.getTransaction(signature)) + .then((r) => ({ + type: ProviderType.SolanaWeb3, + receipt: r!, + })); + + return { hash: signature, confirm }; + }, + [onSwitchNetwork, sendSolTransaction, multiProvider], + ); + + return { sendTransaction: onSendTx, switchNetwork: onSwitchNetwork }; +} diff --git a/typescript/widgets/src/walletIntegrations/types.ts b/typescript/widgets/src/walletIntegrations/types.ts new file mode 100644 index 0000000000..cab39fbdf2 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/types.ts @@ -0,0 +1,48 @@ +import { + ChainName, + TypedTransactionReceipt, + WarpTypedTransaction, +} from '@hyperlane-xyz/sdk'; +import { HexString, ProtocolType } from '@hyperlane-xyz/utils'; + +export interface ChainAddress { + address: string; + chainName?: ChainName; +} + +export interface AccountInfo { + protocol: ProtocolType; + // This needs to be an array instead of a single address b.c. + // Cosmos wallets have different addresses per chain + addresses: Array; + // And another Cosmos exception, public keys are needed + // for tx simulation and gas estimation + publicKey?: Promise; + isReady: boolean; +} + +export interface WalletDetails { + name?: string; + logoUrl?: string; +} + +export interface ActiveChainInfo { + chainDisplayName?: string; + chainName?: ChainName; +} + +export type SendTransactionFn< + TxReq extends WarpTypedTransaction = WarpTypedTransaction, + TxResp extends TypedTransactionReceipt = TypedTransactionReceipt, +> = (params: { + tx: TxReq; + chainName: ChainName; + activeChainName?: ChainName; +}) => Promise<{ hash: string; confirm: () => Promise }>; + +export type SwitchNetworkFn = (chainName: ChainName) => Promise; + +export interface ChainTransactionFns { + sendTransaction: SendTransactionFn; + switchNetwork?: SwitchNetworkFn; +} diff --git a/typescript/widgets/src/walletIntegrations/utils.ts b/typescript/widgets/src/walletIntegrations/utils.ts new file mode 100644 index 0000000000..b0a994f1d8 --- /dev/null +++ b/typescript/widgets/src/walletIntegrations/utils.ts @@ -0,0 +1,56 @@ +import { SendTransactionParameters } from '@wagmi/core'; +import { + PopulatedTransaction as Ethers5Transaction, + BigNumber as EthersBN, +} from 'ethers'; + +import { ChainMetadata, MultiProtocolProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +export function ethers5TxToWagmiTx( + tx: Ethers5Transaction, +): SendTransactionParameters { + if (!tx.to) throw new Error('No tx recipient address specified'); + if (!tx.data) throw new Error('No tx data specified'); + return { + to: tx.to as `0x${string}`, + value: ethersBnToBigInt(tx.value || EthersBN.from('0')), + data: tx.data as `0x{string}`, + nonce: tx.nonce, + chainId: tx.chainId, + gas: tx.gasLimit ? ethersBnToBigInt(tx.gasLimit) : undefined, + gasPrice: tx.gasPrice ? ethersBnToBigInt(tx.gasPrice) : undefined, + maxFeePerGas: tx.maxFeePerGas + ? ethersBnToBigInt(tx.maxFeePerGas) + : undefined, + maxPriorityFeePerGas: tx.maxPriorityFeePerGas + ? ethersBnToBigInt(tx.maxPriorityFeePerGas) + : undefined, + }; +} + +function ethersBnToBigInt(bn: EthersBN): bigint { + return BigInt(bn.toString()); +} + +export function getChainsForProtocol( + multiProvider: MultiProtocolProvider, + protocol: ProtocolType, +): ChainMetadata[] { + return Object.values(multiProvider.metadata).filter( + (c) => c.protocol === protocol, + ); +} + +export function findChainByRpcUrl( + multiProvider: MultiProtocolProvider, + url?: string, +) { + if (!url) return undefined; + const allMetadata = Object.values(multiProvider.metadata); + const searchUrl = url.toLowerCase(); + return allMetadata.find( + (m) => + !!m.rpcUrls.find((rpc) => rpc.http.toLowerCase().includes(searchUrl)), + ); +} diff --git a/typescript/widgets/tailwind.config.cjs b/typescript/widgets/tailwind.config.cjs index f410968ec4..48dedefff0 100644 --- a/typescript/widgets/tailwind.config.cjs +++ b/typescript/widgets/tailwind.config.cjs @@ -12,6 +12,7 @@ module.exports = { mono: ['Courier New', 'monospace'], }, screens: { + all: '1px', xs: '480px', ...defaultTheme.screens, }, diff --git a/yarn.lock b/yarn.lock index 9ba2eef3e1..bc7551faf5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,7 +19,7 @@ __metadata: languageName: node linkType: hard -"@adraffy/ens-normalize@npm:1.11.0": +"@adraffy/ens-normalize@npm:^1.10.1": version: 1.11.0 resolution: "@adraffy/ens-normalize@npm:1.11.0" checksum: 10/abef75f21470ea43dd6071168e092d2d13e38067e349e76186c78838ae174a46c3e18ca50921d05bea6ec3203074147c9e271f8cb6531d1c2c0e146f3199ddcb @@ -55,18 +55,6 @@ __metadata: languageName: node linkType: hard -"@arbitrum/sdk@npm:^3.0.0": - version: 3.0.0 - resolution: "@arbitrum/sdk@npm:3.0.0" - dependencies: - "@ethersproject/address": "npm:^5.0.8" - "@ethersproject/bignumber": "npm:^5.1.1" - "@ethersproject/bytes": "npm:^5.0.8" - ethers: "npm:^5.1.0" - checksum: 10/f4f7d05631d2014546cccff85926a638e3725e522e2c9c73c70caafec8f14cf7b22f58c8f942ced2f8bd44ea545b63c99cf5044c833edd0d52934afdddbf1d40 - languageName: node - linkType: hard - "@arbitrum/sdk@npm:^4.0.0": version: 4.0.1 resolution: "@arbitrum/sdk@npm:4.0.1" @@ -91,17 +79,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/crc32@npm:2.0.0" - dependencies: - "@aws-crypto/util": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - tslib: "npm:^1.11.1" - checksum: 10/da8e32353f958775b4476150c6b457ce1a04b962cdb227842f8a3fa52cb996eb979b2858d19abd6703256c0befc08ee80e3ce48e02d39900640dc6696b151701 - languageName: node - linkType: hard - "@aws-crypto/crc32@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/crc32@npm:3.0.0" @@ -113,17 +90,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32c@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/crc32c@npm:2.0.0" - dependencies: - "@aws-crypto/util": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - tslib: "npm:^1.11.1" - checksum: 10/04496af8f9a4822bf09793c7df20fbebbdda75484eb1c8a89e98b41ab4e0b57ce9e33b4b30d6b741d85c2f751298fc39919184b5985c66e252d180ddc6f30ab1 - languageName: node - linkType: hard - "@aws-crypto/crc32c@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/crc32c@npm:3.0.0" @@ -153,20 +119,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/sha1-browser@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/sha1-browser@npm:2.0.0" - dependencies: - "@aws-crypto/ie11-detection": "npm:^2.0.0" - "@aws-crypto/supports-web-crypto": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - "@aws-sdk/util-locate-window": "npm:^3.0.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/7a1e828741339effdb26e89b28d30010f954192c75dc197fe9856faf46d9fd998b3a8c473c3f8b86ebc259ef1162191c6bd4c9c23803ea0b66b3abcff511917a - languageName: node - linkType: hard - "@aws-crypto/sha1-browser@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/sha1-browser@npm:3.0.0" @@ -319,16 +271,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/abort-controller@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/97a5a4dfb433be2738a4ca11b830e434df1e7af9448dbbce3bd11d9f13f1e29eb987a859163250b8d49e3f0e8b8cbc5199131138b5e16a2f99daa9c2a1454f79 - languageName: node - linkType: hard - "@aws-sdk/abort-controller@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/abort-controller@npm:3.78.0" @@ -339,25 +281,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader-native@npm:3.58.0": - version: 3.58.0 - resolution: "@aws-sdk/chunked-blob-reader-native@npm:3.58.0" - dependencies: - "@aws-sdk/util-base64-browser": "npm:3.58.0" - tslib: "npm:^2.3.1" - checksum: 10/7826f67d2f1f4af0939ae0d764ee617e02fd4e46e14e12714b559043c9ab77dcd7287ec94636bc2849b2b179803058313a1902944d647a4afe81989730c5de08 - languageName: node - linkType: hard - -"@aws-sdk/chunked-blob-reader@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/chunked-blob-reader@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/e19fcff0162b2b28a46a3c3c4936f4e7ae7c2588aac0948ec2796ac6b0d51ae8e3d50bd855f7b07230c80e00708283352435d024e16834b61d7d353b22120d73 - languageName: node - linkType: hard - "@aws-sdk/client-iam@npm:^3.74.0": version: 3.107.0 resolution: "@aws-sdk/client-iam@npm:3.107.0" @@ -403,47 +326,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-kms@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-kms@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/client-sts": "npm:3.48.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-node": "npm:3.48.0" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/eff5d95d51bddcefe533dbab1c45cc06e1cd4b6549ae9cc2e1cbfb23dec21292649e5d9335751cfb773674e73507e35fc026245878d7e61c903ed12242f76e9b - languageName: node - linkType: hard - "@aws-sdk/client-kms@npm:^3.28.0, @aws-sdk/client-kms@npm:^3.39.0": version: 3.142.0 resolution: "@aws-sdk/client-kms@npm:3.142.0" @@ -601,68 +483,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-s3@npm:^3.74.0": - version: 3.107.0 - resolution: "@aws-sdk/client-s3@npm:3.107.0" - dependencies: - "@aws-crypto/sha1-browser": "npm:2.0.0" - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/client-sts": "npm:3.105.0" - "@aws-sdk/config-resolver": "npm:3.80.0" - "@aws-sdk/credential-provider-node": "npm:3.105.0" - "@aws-sdk/eventstream-serde-browser": "npm:3.78.0" - "@aws-sdk/eventstream-serde-config-resolver": "npm:3.78.0" - "@aws-sdk/eventstream-serde-node": "npm:3.78.0" - "@aws-sdk/fetch-http-handler": "npm:3.78.0" - "@aws-sdk/hash-blob-browser": "npm:3.78.0" - "@aws-sdk/hash-node": "npm:3.78.0" - "@aws-sdk/hash-stream-node": "npm:3.78.0" - "@aws-sdk/invalid-dependency": "npm:3.78.0" - "@aws-sdk/md5-js": "npm:3.78.0" - "@aws-sdk/middleware-bucket-endpoint": "npm:3.80.0" - "@aws-sdk/middleware-content-length": "npm:3.78.0" - "@aws-sdk/middleware-expect-continue": "npm:3.78.0" - "@aws-sdk/middleware-flexible-checksums": "npm:3.78.0" - "@aws-sdk/middleware-host-header": "npm:3.78.0" - "@aws-sdk/middleware-location-constraint": "npm:3.78.0" - "@aws-sdk/middleware-logger": "npm:3.78.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.105.0" - "@aws-sdk/middleware-retry": "npm:3.80.0" - "@aws-sdk/middleware-sdk-s3": "npm:3.105.0" - "@aws-sdk/middleware-serde": "npm:3.78.0" - "@aws-sdk/middleware-signing": "npm:3.78.0" - "@aws-sdk/middleware-ssec": "npm:3.78.0" - "@aws-sdk/middleware-stack": "npm:3.78.0" - "@aws-sdk/middleware-user-agent": "npm:3.78.0" - "@aws-sdk/node-config-provider": "npm:3.80.0" - "@aws-sdk/node-http-handler": "npm:3.94.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.88.0" - "@aws-sdk/smithy-client": "npm:3.99.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/url-parser": "npm:3.78.0" - "@aws-sdk/util-base64-browser": "npm:3.58.0" - "@aws-sdk/util-base64-node": "npm:3.55.0" - "@aws-sdk/util-body-length-browser": "npm:3.55.0" - "@aws-sdk/util-body-length-node": "npm:3.55.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.99.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.99.0" - "@aws-sdk/util-stream-browser": "npm:3.78.0" - "@aws-sdk/util-stream-node": "npm:3.78.0" - "@aws-sdk/util-user-agent-browser": "npm:3.78.0" - "@aws-sdk/util-user-agent-node": "npm:3.80.0" - "@aws-sdk/util-utf8-browser": "npm:3.55.0" - "@aws-sdk/util-utf8-node": "npm:3.55.0" - "@aws-sdk/util-waiter": "npm:3.78.0" - "@aws-sdk/xml-builder": "npm:3.55.0" - entities: "npm:2.2.0" - fast-xml-parser: "npm:3.19.0" - tslib: "npm:^2.3.1" - checksum: 10/827f4fae394677bba41f581c851effc438935e49480d99a26c15c3315ea7a1a696c15163b2de44ef0b40e7bb05396c372e3b200e974133e238d262c33fbe6f1d - languageName: node - linkType: hard - "@aws-sdk/client-sso-oidc@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sso-oidc@npm:3.577.0" @@ -789,44 +609,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-sso@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/917bb56fdc67a324aa7c933f0dc9405036f98306ddf4a8cccade01801d91a8becde30f5b979a7f4f8084fddc3b028292a8c3fce03d9d1f60c9ed450e602aa607 - languageName: node - linkType: hard - "@aws-sdk/client-sso@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sso@npm:3.577.0" @@ -961,49 +743,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-sts@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-node": "npm:3.48.0" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-sdk-sts": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - entities: "npm:2.2.0" - fast-xml-parser: "npm:3.19.0" - tslib: "npm:^2.3.0" - checksum: 10/2ee2017400b1fc8113a2b74325f3bbc5f333143df910c78ad9dd3ab109ec1e1066b713d54192791966dfe7497e69b675938ddd9a896a125eada237f0d2bd2152 - languageName: node - linkType: hard - "@aws-sdk/client-sts@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sts@npm:3.577.0" @@ -1065,18 +804,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/config-resolver@npm:3.47.2" - dependencies: - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-config-provider": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/7e4f342261a12bb8c041fdc8ab76f9e1b2a2370e607f50a7a099cba174a3d11a32640399d344ed312ace34d7e118b71ca7c4c83df595989718b501cecc894413 - languageName: node - linkType: hard - "@aws-sdk/config-resolver@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/config-resolver@npm:3.80.0" @@ -1116,17 +843,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-env@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/11416fb43d27a60c5c3b493f4145adabb6e4277642e94e429eb770c5ee9029a49230ac63b9088a9465c8bf93acf48673c289ae1666a7e34ab6c6f9d58539e08e - languageName: node - linkType: hard - "@aws-sdk/credential-provider-env@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-env@npm:3.577.0" @@ -1180,19 +896,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-imds@npm:3.47.2" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/37745d9957be76f2edcb73c7668e1af35c7e532f0dec477927222a692ebf84dcaa4393d8c27b8460eb2fdf7d8a4bbf1f959ac9dd3a8f05f0884d5bb20b2f2663 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-imds@npm:3.81.0": version: 3.81.0 resolution: "@aws-sdk/credential-provider-imds@npm:3.81.0" @@ -1238,23 +941,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.48.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/credential-provider-sso": "npm:3.48.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/9c2d58944e5d6dd9076b82d6858562e7a5b4766b32d8a4a23040b6d0933b8cb8481a97939d1c53a29a26dd6b2486601e466146b0f2e99b37afd21cc58ae19537 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-ini@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.577.0" @@ -1311,25 +997,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.48.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/credential-provider-ini": "npm:3.48.0" - "@aws-sdk/credential-provider-process": "npm:3.47.2" - "@aws-sdk/credential-provider-sso": "npm:3.48.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/6b038691cffad9a8cd54a1e7cb4da927205fea7e5ba2add4788216f2af4280635d1e6b0c63927866fc0ba6f156b76485643670a462dacfb841e9abba91fb4584 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-node@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-node@npm:3.577.0" @@ -1362,19 +1029,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-process@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/d59d900f443b8fd2f8b74902bc0c0d6bdf0156a8d44981165e051e6856793d80b84ba43b87f77c24fe1569426365bfb226e3599d60e589abbe2349de00e32666 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-process@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-process@npm:3.577.0" @@ -1426,20 +1080,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.48.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.48.0" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/0c012e75023687c72fcf8945b0b83242d8d2e2f526b2c241f77ab9b1ab462292f836b5e1866966b6bf5db3ff2c1fba2a554304651e8257ccbe2e47d3bc1f8db1 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-sso@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.577.0" @@ -1466,17 +1106,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/eb85ea63ad1875dccb1efec76cb8c297a256fa9988a45141d242812e0ea059fa9b41ab4a912aea96c66a25321cc7c003ab834c707df96949c6380c6ca1111929 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-web-identity@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.577.0" @@ -1502,63 +1131,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/eventstream-marshaller@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-marshaller@npm:3.78.0" - dependencies: - "@aws-crypto/crc32": "npm:2.0.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-hex-encoding": "npm:3.58.0" - tslib: "npm:^2.3.1" - checksum: 10/e62d0792d28d2bc9b7ce04c95442d698f2d7043872bfc0c91422ed4e3a5b38fa1284148dc4be06545aaa0d52107650bb53da9a37733f23e30ff83ca83a93652d - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/eventstream-serde-universal": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/f2be29f11c2c02c41fd161495edab2b2a90a0087840626aa8d5209e005e6be510d48cf543871a77e508db472c47922823101fda35dd9f1f2e65401ce652edfb5 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-config-resolver@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/38bf3a5a496bedf5f5bb1a32da4934dbfe720594fb0d3028da861428f1d0fba2091d1d634eada9e132019486682a5d318648120bf5ca87ddfe38b8a3be7c0c62 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/eventstream-serde-universal": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/d0eb279d27d4757c33e7ccb69ff31036ab1d5573570daebeabac773a708e89fa85c0bf8569c6d6faf976734ef4e09d5375f589723819e095d076090ff68361c7 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-universal@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fe8f7f219ce43d8920ff8a1434507f1504b652e03b18a53f01f7d9d60a1f0ccf6d5d0abff8c3317be20e93c317491ae140af404f5175f6b8056cf315ceb9cb86 - languageName: node - linkType: hard - "@aws-sdk/fetch-http-handler@npm:3.131.0": version: 3.131.0 resolution: "@aws-sdk/fetch-http-handler@npm:3.131.0" @@ -1572,19 +1144,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/fetch-http-handler@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/querystring-builder": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a37cc6cce12ab8d1a280d7f9c60e97972ed4bc9d7677418af65cd0ea18e8db4d01561a6d8d4ce8da643256b5e9087369d881532001c7076d85810a60143de69b - languageName: node - linkType: hard - "@aws-sdk/fetch-http-handler@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/fetch-http-handler@npm:3.78.0" @@ -1598,18 +1157,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.78.0" - dependencies: - "@aws-sdk/chunked-blob-reader": "npm:3.55.0" - "@aws-sdk/chunked-blob-reader-native": "npm:3.58.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/5e257b36f93bfa3af233c061f8cb2f8be28d1a21a176654acffc90b0040174fff6d181012d33729a59d7e991f0e960dfbd455a34181c1298ede52418ad606a58 - languageName: node - linkType: hard - "@aws-sdk/hash-node@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/hash-node@npm:3.127.0" @@ -1621,17 +1168,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/hash-node@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/b240e43e4bd4744e32e7f578118435cc9e0d069e50ec9c9669beb8813582fb1f0ddb5d58948593d7227d7cce4d2fe416255b91c8c5c8ee7385e7f7520b0a9e10 - languageName: node - linkType: hard - "@aws-sdk/hash-node@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/hash-node@npm:3.78.0" @@ -1643,16 +1179,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/dba65ef684458e45c03b9555d6ecb16747299bc30be3341b34f542f1b511bbda685df384dc729717254e4ae1756b775e2743b3e93e1635cf6d8dd34a90f167ac - languageName: node - linkType: hard - "@aws-sdk/invalid-dependency@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/invalid-dependency@npm:3.127.0" @@ -1663,16 +1189,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/invalid-dependency@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a5808f8e4d4d696610a3be8e6dee2ad387187eef9a05edaf008b4af12838f9f5cb900729698228fdeaed5ededdae080d91d1c2607cc30d650cb92dd09a8c7b05 - languageName: node - linkType: hard - "@aws-sdk/invalid-dependency@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/invalid-dependency@npm:3.78.0" @@ -1683,15 +1199,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/is-array-buffer@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/is-array-buffer@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/5287771b7ca6e1d8b02e32c62fb7065cd6c827ea9ef030a5868cfacc7cf88aec9d9d6fc65ab216326e00184c423a9e574d93704b8cbc63338c2a378a00fdd02b - languageName: node - linkType: hard - "@aws-sdk/is-array-buffer@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/is-array-buffer@npm:3.55.0" @@ -1701,18 +1208,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/md5-js@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-utf8-browser": "npm:3.55.0" - "@aws-sdk/util-utf8-node": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/03967189ad87b6e5b234f8125cee0da890e024517e7d58474c4714fcc134069233bae65e949cd285b1e963be07c06500b1a82481880836fe978788002f3360c3 - languageName: node - linkType: hard - "@aws-sdk/middleware-bucket-endpoint@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.577.0" @@ -1728,19 +1223,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.80.0": - version: 3.80.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.80.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - "@aws-sdk/util-config-provider": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/06ba62bcb728d16bc70079af23385902880580f2f69f1a7fb3dc24012157974989a846047a9f08424f3b7e662089b34b09b4d560017785d699fa71e8da3cbb05 - languageName: node - linkType: hard - "@aws-sdk/middleware-content-length@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-content-length@npm:3.127.0" @@ -1752,17 +1234,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-content-length@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/0c76fd9c82e9cc568fb6431b3ef34e97bd03a0a1827800363acab75bf1a47384b05fe1d9377becd4781f075de3f95fc089b083791595a01c4deca95f3db626df - languageName: node - linkType: hard - "@aws-sdk/middleware-content-length@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-content-length@npm:3.78.0" @@ -1786,18 +1257,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.78.0" - dependencies: - "@aws-sdk/middleware-header-default": "npm:3.78.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/6db82f13c17a66a1e897419b707480298608caa32b5543229d29a2d1e2ef266d4dfda397164429ca1fe87e730da4d7c4f2a537a0ab0b4aa9d41b88509fd4c8f9 - languageName: node - linkType: hard - "@aws-sdk/middleware-flexible-checksums@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.577.0" @@ -1814,31 +1273,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.78.0" - dependencies: - "@aws-crypto/crc32": "npm:2.0.0" - "@aws-crypto/crc32c": "npm:2.0.0" - "@aws-sdk/is-array-buffer": "npm:3.55.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/5062b9f8fbd3f8700aa0ee221d6be08e10715b3b473ae1251ff33df7751b995c1efaed52a20d116fa96c517066b696fce1fb29ecf0dddc2bd5fd696c45a46f56 - languageName: node - linkType: hard - -"@aws-sdk/middleware-header-default@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-header-default@npm:3.78.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fba1438bbc32e39120a7657d6d0204e616c4170f564638ed7b33c122ee229a9199f2d74b4efaa380e3da59aa2896b7f365c41d5fef7c7aa8ad0e0edb3a2e3e9d - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-host-header@npm:3.127.0" @@ -1850,17 +1284,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-host-header@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/8f17bf82fa35a175a2443188860e21c52dbdd1cdf7be2dff685f12e32f6b7b7cbda749a45900a5b78cb7392d8b15f6893f22bbb16dfd5737a1e56a59741021fb - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-host-header@npm:3.577.0" @@ -1895,16 +1318,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/88e2aa48c49af4cacbe44022b4729c52dc173ec1c7672f44326641b7169e298e6cff435d1e1502455982521b407d1df5ab7cf33e7770bcf5c947427ec5e160f5 - languageName: node - linkType: hard - "@aws-sdk/middleware-logger@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-logger@npm:3.127.0" @@ -1915,16 +1328,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-logger@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/515f84cbd57346d9599d12e3cb9dd7b80a353ef79dba4601e3d37a32db2d2abc0066d397658dbb5c6f93c5ca49ae6e91b9e3ca76dc9ab6feb23ddbf081383612 - languageName: node - linkType: hard - "@aws-sdk/middleware-logger@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-logger@npm:3.577.0" @@ -1994,19 +1397,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-retry@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/service-error-classification": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - uuid: "npm:^8.3.2" - checksum: 10/e9f56166045ca3446f864ee75d7226cbf665c9a21d2237daba87c7bbeea9aa1035c05fc03dc9153a92fe780b4a3469277e8ebb33fa1b57233573c1a0f066462b - languageName: node - linkType: hard - "@aws-sdk/middleware-retry@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/middleware-retry@npm:3.80.0" @@ -2021,18 +1411,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.105.0": - version: 3.105.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.105.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/bf7d38974d8ff75e01f6ade411e9b09e3e90ad57a78bf21c45762b4eea78fe9741b36395c418c9bccf6b17020a678d519575300bd6a0296769b576a5c8865d5c - languageName: node - linkType: hard - "@aws-sdk/middleware-sdk-s3@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-sdk-s3@npm:3.577.0" @@ -2064,20 +1442,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.47.2" - dependencies: - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/135c88d46b6350a13485c046a1ca27a7d44dc9fea3ea9206785b418a59f9cbbb4d7ca79c75d1521ed8920a7d57acd588d77b8d1e14ab4e5fddaccf87c559dea2 - languageName: node - linkType: hard - "@aws-sdk/middleware-sdk-sts@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-sdk-sts@npm:3.78.0" @@ -2102,16 +1466,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-serde@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/89f0b72750e1f4f25f94277381d8e4c7ee1694570f99830edd5ef4c21f714737b49eb206c6d78139ae0cfb861831dbfcbc29c66cf565ec59468189ca3003fedb - languageName: node - linkType: hard - "@aws-sdk/middleware-serde@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-serde@npm:3.78.0" @@ -2135,19 +1489,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-signing@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/1127e94e56efb3caad0b1bc5ccddb80daae0ca810a6b75a5b6b12d1da9812ec0734e15f80d33e7a94a173debf0a8135a5d31c7f308cf7fe99bb2ee56df9335d7 - languageName: node - linkType: hard - "@aws-sdk/middleware-signing@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-signing@npm:3.577.0" @@ -2187,16 +1528,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fa9b087bd6c718f0c5f04f7f75ad8afcba743a95231e50c9b913ab1202bc23b5a96e0c81363457889c4184ed0342818a7c2f90f977379bce22e03865a6f6ce42 - languageName: node - linkType: hard - "@aws-sdk/middleware-stack@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-stack@npm:3.127.0" @@ -2206,15 +1537,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-stack@npm:3.47.2" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/427ed4888602ebd342c0443eb992f0daf419ea5cbe50b715b9d89dd99529ec14603d171e29d9adda11121e2bb84bafd586c2719b631aae5e396038c99a2e669a - languageName: node - linkType: hard - "@aws-sdk/middleware-stack@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-stack@npm:3.78.0" @@ -2235,17 +1557,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-user-agent@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/fb4620b773d8927236308eacb58422cac3792558a3cef307580e67412cc8f1bf9af18509f29417238078fb8b6334205c63b7cdce81921e4b678278f7b346ae44 - languageName: node - linkType: hard - "@aws-sdk/middleware-user-agent@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.577.0" @@ -2282,18 +1593,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/node-config-provider@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/17a83bd6b259d627ab6869a889ea7a21197d629ba320004c3d6fe771e8ff162e275445fa7eda9007a5ae761af53a3d9586d1c8fbb45e11c5a2d41601b3bbda23 - languageName: node - linkType: hard - "@aws-sdk/node-config-provider@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/node-config-provider@npm:3.80.0" @@ -2319,19 +1618,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/node-http-handler@npm:3.47.2" - dependencies: - "@aws-sdk/abort-controller": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/querystring-builder": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/c864b92c35a6d7955af3c4764538324e02d7aa34f54c78dd3679515d989ca151e7ba55a65de7e5686a311aa3070c12c331fd88210aadb008925134bd31afe4ef - languageName: node - linkType: hard - "@aws-sdk/node-http-handler@npm:3.94.0": version: 3.94.0 resolution: "@aws-sdk/node-http-handler@npm:3.94.0" @@ -2355,16 +1641,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/property-provider@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/e731ed31300fa0352744a5209e5f476a5ec82390ad2bbe1d58ded4a6de7ce3ec299e9580d07d4bddebe626ef3069c5806a0e060f63ce419f7a5dc48b6967cc9a - languageName: node - linkType: hard - "@aws-sdk/property-provider@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/property-provider@npm:3.78.0" @@ -2385,16 +1661,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/protocol-http@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/8d6cfcbe620256480198f0782a1f7a51f954ad076593ec09d01ffb23bf7f069c7716e629221b9793d2ab2903268d21597e4e386d9aacdd3d8ea2bdaa8a657d16 - languageName: node - linkType: hard - "@aws-sdk/protocol-http@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/protocol-http@npm:3.78.0" @@ -2416,17 +1682,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/querystring-builder@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-uri-escape": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/4408739767ae6ef17c00d8df3b3936ba8a49737af34d1bd3e67e0a855b6fece11a75b539e7955ab6404688176f1ff6d6625528eae90518bf91e78bb9ce3f7ee7 - languageName: node - linkType: hard - "@aws-sdk/querystring-builder@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/querystring-builder@npm:3.78.0" @@ -2448,16 +1703,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/querystring-parser@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a975024dd2df3391c19ea468fa826fdb2c1dca2947993978a1e461db60f232c689da4a413d1205cbcac53c64f8cea9fbcfe1f10459bd2cc3cc86c9c95ae75d98 - languageName: node - linkType: hard - "@aws-sdk/querystring-parser@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/querystring-parser@npm:3.78.0" @@ -2489,13 +1734,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/service-error-classification@npm:3.47.2" - checksum: 10/f7be80e30f7fc5f980a58e73c9a54e93217de05c9146eed7649bff6f28d4568da4aeeed927801512ddcc55664756d7caab2f62c9dd814185188c0b761611c7bf - languageName: node - linkType: hard - "@aws-sdk/service-error-classification@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/service-error-classification@npm:3.78.0" @@ -2512,15 +1750,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/1068855025162e82bcef8eeaeea7b2f2e3ec5d488c7ea361616f8f40447c0ac34ad27ddbe89adfb9dcb20e6ef8986dc5a42632636a9e541e25247d135dc42548 - languageName: node - linkType: hard - "@aws-sdk/shared-ini-file-loader@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/shared-ini-file-loader@npm:3.80.0" @@ -2544,24 +1773,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.88.0": - version: 3.88.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.88.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/signature-v4": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - tslib: "npm:^2.3.1" - peerDependencies: - "@aws-sdk/signature-v4-crt": ^3.79.0 - peerDependenciesMeta: - "@aws-sdk/signature-v4-crt": - optional: true - checksum: 10/2382e05d517f18a4229ceef89e975e84eb94630afd9a11793deb70b5ea26446f50311caae586b38016ee5e1bb6d17b316774b93263be6c74994b2704ea03347b - languageName: node - linkType: hard - "@aws-sdk/signature-v4@npm:3.130.0": version: 3.130.0 resolution: "@aws-sdk/signature-v4@npm:3.130.0" @@ -2576,19 +1787,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/signature-v4@npm:3.47.2" - dependencies: - "@aws-sdk/is-array-buffer": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-hex-encoding": "npm:3.47.1" - "@aws-sdk/util-uri-escape": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/281e618b58c2ec5e508cabafa965d3f66ce6f310ac612f39458a4aa2622a8ab978585a24effa0c2eb70e8aaf1d5ac47658878bd6fbac363e515727c5e766909c - languageName: node - linkType: hard - "@aws-sdk/signature-v4@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/signature-v4@npm:3.78.0" @@ -2614,17 +1812,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/smithy-client@npm:3.47.2" - dependencies: - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/b3a3bf3182542d93bbd4badcce4a5656dbbfb42f675c213441bdfc8de27df13ca802aa5940fcad6158e77372cdffe205993d2aaf802d55427b71197b72330a8e - languageName: node - linkType: hard - "@aws-sdk/smithy-client@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/smithy-client@npm:3.99.0" @@ -2658,13 +1845,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/types@npm:3.47.1" - checksum: 10/6a799ce69fe87aa52c931ba86337a1b280ddfddbd59abebf4222113e2e2757c64f18dbcbc680ec88a1a14ce7b3a84a60fda3f6a55c6d0ab0665453720e976874 - languageName: node - linkType: hard - "@aws-sdk/types@npm:3.577.0, @aws-sdk/types@npm:^3.222.0": version: 3.577.0 resolution: "@aws-sdk/types@npm:3.577.0" @@ -2693,17 +1873,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/url-parser@npm:3.47.2" - dependencies: - "@aws-sdk/querystring-parser": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/c286c19a2768b529dcf8477aa4c97c64f1e756211ef402707adc393b45bfebcc44e6c660acb11e722e12975a86e6b43e6c006a65174828284fdc3f26c2c7e33c - languageName: node - linkType: hard - "@aws-sdk/url-parser@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/url-parser@npm:3.78.0" @@ -2715,15 +1884,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/d8e56df636218c247ba3c6d1bc5c96ad853cdd5660f74bd0c43bcde4ddc1d6d6f2ee975f78772d99371d3d7315730cf03da73d47e90f32fdfc54359ee2e54915 - languageName: node - linkType: hard - "@aws-sdk/util-arn-parser@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/util-arn-parser@npm:3.568.0" @@ -2742,15 +1902,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-base64-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-base64-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/f79516ee53849cd7995a3372a25c5309456c719aa2f6444fe68807ee82dc0b4aba7990f30d4a1f1a504501201f67ab5b28826115c664930f33cb6856ca423194 - languageName: node - linkType: hard - "@aws-sdk/util-base64-browser@npm:3.58.0": version: 3.58.0 resolution: "@aws-sdk/util-base64-browser@npm:3.58.0" @@ -2760,16 +1911,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-base64-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-base64-node@npm:3.47.2" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/abcea31871d4666fb59fc49432ce5c57ebe8f732b01e5fe6270df4a8926d794a7fb88282011543d96938686899bedffb9373bb2e0412460ff3dbed4b03007406 - languageName: node - linkType: hard - "@aws-sdk/util-base64-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-base64-node@npm:3.55.0" @@ -2780,15 +1921,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-body-length-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-body-length-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/273caa8cba716ed61235695554d59c940224035a53b5188891bb09d0bdbf13bd9e40603040a682c77b47e3e30764aed8649c49929bfcbc024a2b4404e2bb5a0d - languageName: node - linkType: hard - "@aws-sdk/util-body-length-browser@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-body-length-browser@npm:3.55.0" @@ -2798,15 +1930,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-body-length-node@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-body-length-node@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/1e226859ea45fbb2cc5f4ac694fc8b4b0f531ff7df64621f1b43c7412c44a85e9d5e8fdd0de48d73d10cbb35c8aece52e6ad5e0858c886e66c22315f075c2811 - languageName: node - linkType: hard - "@aws-sdk/util-body-length-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-body-length-node@npm:3.55.0" @@ -2816,16 +1939,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-buffer-from@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-buffer-from@npm:3.47.2" - dependencies: - "@aws-sdk/is-array-buffer": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/bacddc53a02b1e601c34601685d2bc829856f257f531d3e969a2b9ca5523244c314b214ce680ac7f8d411e58ed4800dd1a08eb18ccd697561f153d766416692a - languageName: node - linkType: hard - "@aws-sdk/util-buffer-from@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-buffer-from@npm:3.55.0" @@ -2845,15 +1958,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-config-provider@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-config-provider@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/747ab73fd87dc99dadacad255d36a1766d4eb15cf2a553050d46bff48fb66e906d099bf1594049fe79ba1353fa51d5225af2a67703ec2ec98759beae981a55b7 - languageName: node - linkType: hard - "@aws-sdk/util-config-provider@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-config-provider@npm:3.55.0" @@ -2863,16 +1967,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-credentials@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-credentials@npm:3.47.2" - dependencies: - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/801cd30e796e8b09873beab22cc02ca941b3eb93e0f8241bf473bc26ddd3bd87cdfe7f289e9846fa68a5dad0032cf2bca011cce63eecc3a635ef0aa0c2117f73 - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-browser@npm:3.142.0": version: 3.142.0 resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.142.0" @@ -2885,18 +1979,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - bowser: "npm:^2.11.0" - tslib: "npm:^2.3.0" - checksum: 10/d987d132b6e0efb8d5b27f72dfa7ea5f642b2f6f9a13bec6bceb4d37c5345f04ce9e5ef296e83fc4f68d4f2d5bd08f656fe28390a57a0b86a87f7e3de909d6cd - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-browser@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.99.0" @@ -2923,20 +2005,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.47.2" - dependencies: - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/dfb2892338a3b0f2b58ab7569fc6271eaae5b0bf2889ca87fc6f1deffe59813c70e8874a8a8ec45882cbf97d5e56536b157022249bcc951f7f29a098a1623412 - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-node@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/util-defaults-mode-node@npm:3.99.0" @@ -2972,15 +2040,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-hex-encoding@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/9a76516009af3f32eecbf69062de7178ba61dac9f4a9203337712cd2a31a723f74bf452d864cb8d3b1351d548acb9ae12bfd43429df53e354d4993c393d4f0ee - languageName: node - linkType: hard - "@aws-sdk/util-hex-encoding@npm:3.58.0": version: 3.58.0 resolution: "@aws-sdk/util-hex-encoding@npm:3.58.0" @@ -3017,35 +2076,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/b7ffa0c49561c816625a1d147b3958c9320f90469cb2bbbc475a99c7ec6bc009e4a8a05032d55e91d4d51a54743ab6eeb96ee91b867985bc688364340bbe2550 - languageName: node - linkType: hard - -"@aws-sdk/util-stream-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/util-stream-node@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/2054d281919c54a1b85ce04de3d8e4c0a6273ee88f7d3073cfaefe0fd1d815203eebefe17f550d5a7e4884f66c03faa6c60ac94ca34d1eaa274590f562d20b28 - languageName: node - linkType: hard - -"@aws-sdk/util-uri-escape@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-uri-escape@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/68fc6e1909d884c2ef7d019428c003f61fc70971e020aa1656a12012a6e8e0a04df844a0b16ee20b757b3940c40ddeb27f8b35739bfef23b9629f74cf195e0e3 - languageName: node - linkType: hard - "@aws-sdk/util-uri-escape@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-uri-escape@npm:3.55.0" @@ -3066,17 +2096,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - bowser: "npm:^2.11.0" - tslib: "npm:^2.3.0" - checksum: 10/d174e3cc9f1ccc771d816ff0d509673252f2950a097ed0752a1d323834b8bcc2e4598d4bd18b1f9bc07dcc7648e9c4e023461bace2dc55469babf09700baa421 - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-browser@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/util-user-agent-browser@npm:3.577.0" @@ -3116,17 +2135,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-user-agent-node@npm:3.47.2" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/3fdaf3e174ead8b08029b7c30c9802a27b6a61b02581f11bb2c0fa3b66b9eafd3739c9bdeb6df554473e3a75d680553f1a98adb48d035b858c20b379341d5bfc - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-node@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.577.0" @@ -3164,15 +2172,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-utf8-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/c6a7eeef1ddf9a08621c08036b2f44fe6dd700feb4beb71e150c3060c493c907df6b745663bc18d53ce03483c54fae55532b479ba34440bbfb8dcb385013bbd1 - languageName: node - linkType: hard - "@aws-sdk/util-utf8-browser@npm:3.55.0, @aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.55.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.55.0" @@ -3192,16 +2191,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-utf8-node@npm:3.47.2" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/eaf0696d0430e7c4084a08adf305e1ff9840bb1a6c30df5687b822802d550f82d4ade355d6d62a1955f397f094ee582c3e37e0a5f0bf37a2cab95e9e02d7c970 - languageName: node - linkType: hard - "@aws-sdk/util-utf8-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-utf8-node@npm:3.55.0" @@ -3223,15 +2212,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/xml-builder@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/0924d5725921c1e6fa6685a9dba135747f977457dc9d957e35e7b92f4bccfc80b9a57d0d044179dcd73be4029fb0c3826571595dcaaf7da30016641e9e81f3d4 - languageName: node - linkType: hard - "@aws-sdk/xml-builder@npm:3.575.0": version: 3.575.0 resolution: "@aws-sdk/xml-builder@npm:3.575.0" @@ -3281,6 +2261,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.8, @babel/compat-data@npm:^7.25.0": version: 7.25.0 resolution: "@babel/compat-data@npm:7.25.0" @@ -3388,6 +2379,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" + dependencies: + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" @@ -3514,6 +2518,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.16.7": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-module-imports@npm:7.22.15" @@ -3670,6 +2684,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-validator-identifier@npm:7.16.7" @@ -3698,6 +2719,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -3834,6 +2862,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.0" @@ -4961,6 +4000,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.25.0": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699 + languageName: node + linkType: hard + "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": version: 7.25.0 resolution: "@babel/runtime@npm:7.25.0" @@ -4997,15 +4045,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.25.0": - version: 7.26.0 - resolution: "@babel/runtime@npm:7.26.0" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699 - languageName: node - linkType: hard - "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -5039,6 +4078,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e861180881507210150c1335ad94aff80fd9e9be6202e1efa752059c93224e2d5310186ddcdd4c0f0b0fc658ce48cb47823f15142b5c00c8456dde54f5de80b2 + languageName: node + linkType: hard + "@babel/traverse@npm:7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -5090,6 +4140,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a + languageName: node + linkType: hard + "@babel/types@npm:7.17.0": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -5165,6 +4230,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -5179,6 +4254,62 @@ __metadata: languageName: node linkType: hard +"@chain-registry/client@npm:^1.49.11": + version: 1.53.13 + resolution: "@chain-registry/client@npm:1.53.13" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + "@chain-registry/utils": "npm:^1.51.13" + bfs-path: "npm:^1.0.2" + cross-fetch: "npm:^3.1.5" + checksum: 10/d80b71ad6c607a2577cc4cc96213de192f7d004c7901c52f50d6a2f79570ff5b1bd477d409f7d6ba88aca5c8f555911414805e4dc81a1a58ec3f0b41f79530ea + languageName: node + linkType: hard + +"@chain-registry/keplr@npm:^1.69.13": + version: 1.74.32 + resolution: "@chain-registry/keplr@npm:1.74.32" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + "@keplr-wallet/cosmos": "npm:0.12.28" + "@keplr-wallet/crypto": "npm:0.12.28" + semver: "npm:^7.5.0" + checksum: 10/df93c4253c75ab52b682a166921e826030836bf77a434903472c60290fc7ee477841173931a2d804ec68671014d97bae8c919a32ade12990b6638f282c1644cd + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.46.11": + version: 0.46.15 + resolution: "@chain-registry/types@npm:0.46.15" + checksum: 10/de63ace15b36ec3f06a401483d8ad8822c794658df3541cff00aa54756499ea5e881f8709b0a7876ae2a0b8b05848e87e41e8baf0fdb46e12e8c68cacbccb5f3 + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.50.13": + version: 0.50.13 + resolution: "@chain-registry/types@npm:0.50.13" + checksum: 10/de71473b2de9fa2a3deff734496ef3c5839345355bd816f1d87c71a379e01b5740ba286b0203310fe803e69f25349447d11b6c088d80022973d7da7b5145784b + languageName: node + linkType: hard + +"@chain-registry/types@npm:^0.50.14": + version: 0.50.14 + resolution: "@chain-registry/types@npm:0.50.14" + checksum: 10/4a1e6978de66d50f98a804174fb8bfa712e42284473edc9e85e6c308dac3fcf381d1888248579128e7a78cec7539378bf7a149b20654741daa85b1c88b8beb8c + languageName: node + linkType: hard + +"@chain-registry/utils@npm:^1.51.13": + version: 1.51.13 + resolution: "@chain-registry/utils@npm:1.51.13" + dependencies: + "@chain-registry/types": "npm:^0.50.13" + bignumber.js: "npm:9.1.2" + sha.js: "npm:^2.4.11" + checksum: 10/d8b1bf249ae13f794a70bd12d2e916394f44d1d949dedf72c4e7532c08bc0da137dd87abd8f2d78562adf5c8c68fa37ccf0a00eed2ee35367d9975721b9b3a93 + languageName: node + linkType: hard + "@chainlink/ccip-read-server@npm:^0.2.1": version: 0.2.1 resolution: "@chainlink/ccip-read-server@npm:0.2.1" @@ -5236,6 +4367,99 @@ __metadata: languageName: node linkType: hard +"@chakra-ui/anatomy@npm:2.3.5": + version: 2.3.5 + resolution: "@chakra-ui/anatomy@npm:2.3.5" + checksum: 10/14b56dfffb76730ac94760443811f952bb2373939ad7539d56b313505733e840eea8cee45c95f96805cb0ed80bbde95d98227b155a02d86d3c1984747b4466ab + languageName: node + linkType: hard + +"@chakra-ui/hooks@npm:2.4.3": + version: 2.4.3 + resolution: "@chakra-ui/hooks@npm:2.4.3" + dependencies: + "@chakra-ui/utils": "npm:2.2.3" + "@zag-js/element-size": "npm:0.31.1" + copy-to-clipboard: "npm:3.3.3" + framesync: "npm:6.1.2" + peerDependencies: + react: ">=18" + checksum: 10/cf740474d5deba1286df8e61acadd1558e97900c6ca162bd0d0354edebfb38a311c0182c35ed95592d2b5ca7af0781dffb354d2048e5268ed3ae5efb61929e39 + languageName: node + linkType: hard + +"@chakra-ui/react@npm:^2.8.2": + version: 2.10.4 + resolution: "@chakra-ui/react@npm:2.10.4" + dependencies: + "@chakra-ui/hooks": "npm:2.4.3" + "@chakra-ui/styled-system": "npm:2.12.1" + "@chakra-ui/theme": "npm:3.4.7" + "@chakra-ui/utils": "npm:2.2.3" + "@popperjs/core": "npm:^2.11.8" + "@zag-js/focus-visible": "npm:^0.31.1" + aria-hidden: "npm:^1.2.3" + react-fast-compare: "npm:3.2.2" + react-focus-lock: "npm:^2.9.6" + react-remove-scroll: "npm:^2.5.7" + peerDependencies: + "@emotion/react": ">=11" + "@emotion/styled": ">=11" + framer-motion: ">=4.0.0" + react: ">=18" + react-dom: ">=18" + checksum: 10/d56ce89499c4c3b9563e7ce3d6fa981201b5e0bc0d7265d995b7ffccf71cbac0d308b304c9d42a220dba07ee4cac6243d276cf1258370208e71c49d2fcda9310 + languageName: node + linkType: hard + +"@chakra-ui/styled-system@npm:2.12.1": + version: 2.12.1 + resolution: "@chakra-ui/styled-system@npm:2.12.1" + dependencies: + "@chakra-ui/utils": "npm:2.2.3" + csstype: "npm:^3.1.2" + checksum: 10/2abddc5fa5cd6c2d8de555f4fb7ffeda1c3ffd65d4649286af2a58a5cc9560fe3c3f9acab8a1cdc58e16f35deaf5719fe3c9ff3f26dc45a4e5e5c9655085e549 + languageName: node + linkType: hard + +"@chakra-ui/theme-tools@npm:2.2.7": + version: 2.2.7 + resolution: "@chakra-ui/theme-tools@npm:2.2.7" + dependencies: + "@chakra-ui/anatomy": "npm:2.3.5" + "@chakra-ui/utils": "npm:2.2.3" + color2k: "npm:^2.0.2" + peerDependencies: + "@chakra-ui/styled-system": ">=2.0.0" + checksum: 10/0ab73ffe6eac1c7211f8661e323c99c844f1a0e466d39351898a3f08bb0436dd820726a989c3016098bf4c799c99b50cd82c13c6dee27cd4c59a8b78cd911a43 + languageName: node + linkType: hard + +"@chakra-ui/theme@npm:3.4.7": + version: 3.4.7 + resolution: "@chakra-ui/theme@npm:3.4.7" + dependencies: + "@chakra-ui/anatomy": "npm:2.3.5" + "@chakra-ui/theme-tools": "npm:2.2.7" + "@chakra-ui/utils": "npm:2.2.3" + peerDependencies: + "@chakra-ui/styled-system": ">=2.8.0" + checksum: 10/d15a7fe94c4fd8984a6167e67f41e72201bbc860171ddd7d8553c8db4e1327ae1c763ec505b80936b758b9ac524ee5c10905b59506f16b38f237e8966e310b70 + languageName: node + linkType: hard + +"@chakra-ui/utils@npm:2.2.3": + version: 2.2.3 + resolution: "@chakra-ui/utils@npm:2.2.3" + dependencies: + "@types/lodash.mergewith": "npm:4.6.9" + lodash.mergewith: "npm:4.6.2" + peerDependencies: + react: ">=16.8.0" + checksum: 10/0c22261c77b565e9bc44aa6891cc30324b05539de73061d2218c9e8859600eabca930217b11a1b614816d0bef04cdeab0f43d6060607670c5490fc9e8c166298 + languageName: node + linkType: hard + "@changesets/apply-release-plan@npm:^6.1.4": version: 6.1.4 resolution: "@changesets/apply-release-plan@npm:6.1.4" @@ -5550,6 +4774,18 @@ __metadata: languageName: node linkType: hard +"@coinbase/wallet-sdk@npm:4.2.3": + version: 4.2.3 + resolution: "@coinbase/wallet-sdk@npm:4.2.3" + dependencies: + "@noble/hashes": "npm:^1.4.0" + clsx: "npm:^1.2.1" + eventemitter3: "npm:^5.0.1" + preact: "npm:^10.24.2" + checksum: 10/dd16ae6d5f7f81b38dfcd95e7538adbe920380bb52206f494f1fafaa38906f2f97265f3eb3f5fe2e9bfab19618447cc19581935586c113d51945c8bab62c7f9a + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -5567,7 +4803,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/amino@npm:^0.32.4": +"@cosmjs/amino@npm:^0.32.3, @cosmjs/amino@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/amino@npm:0.32.4" dependencies: @@ -5579,7 +4815,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/cosmwasm-stargate@npm:^0.32.4": +"@cosmjs/cosmwasm-stargate@npm:^0.32.3, @cosmjs/cosmwasm-stargate@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/cosmwasm-stargate@npm:0.32.4" dependencies: @@ -5642,7 +4878,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/proto-signing@npm:^0.32.4": +"@cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/proto-signing@npm:0.32.4" dependencies: @@ -5668,7 +4904,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stargate@npm:^0.32.4": +"@cosmjs/stargate@npm:^0.32.3, @cosmjs/stargate@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/stargate@npm:0.32.4" dependencies: @@ -5720,6 +4956,62 @@ __metadata: languageName: node linkType: hard +"@cosmos-kit/core@npm:^2.15.0": + version: 2.15.0 + resolution: "@cosmos-kit/core@npm:2.15.0" + dependencies: + "@chain-registry/client": "npm:^1.49.11" + "@chain-registry/keplr": "npm:^1.69.13" + "@chain-registry/types": "npm:^0.46.11" + "@cosmjs/amino": "npm:^0.32.3" + "@cosmjs/cosmwasm-stargate": "npm:^0.32.3" + "@cosmjs/proto-signing": "npm:^0.32.3" + "@cosmjs/stargate": "npm:^0.32.3" + "@dao-dao/cosmiframe": "npm:^0.1.0" + "@walletconnect/types": "npm:2.11.0" + bowser: "npm:2.11.0" + cosmjs-types: "npm:^0.9.0" + events: "npm:3.3.0" + nock: "npm:13.5.4" + uuid: "npm:^9.0.1" + checksum: 10/fe13203a71390cbbcb014454ab28c9440281fdeedb23f8bca0984c0b756c4049d0716e104be7eeae809726ebf55bb1a67fc92cd3159e19b9d864177e0bf83215 + languageName: node + linkType: hard + +"@cosmos-kit/react-lite@npm:^2.15.1": + version: 2.15.1 + resolution: "@cosmos-kit/react-lite@npm:2.15.1" + dependencies: + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@dao-dao/cosmiframe": "npm:^0.1.0" + peerDependencies: + "@types/react": ">= 17" + "@types/react-dom": ">= 17" + react: ^18 + react-dom: ^18 + checksum: 10/3b3c3b7f9fea92c65d1fbb5585d397b09a06fb0a91089a6e4960259fa43d96fdf85ad4d285512df33373ee35fb85e487dace701700afb846960e505e795d80cb + languageName: node + linkType: hard + +"@cosmos-kit/react@npm:^2.18.0": + version: 2.20.1 + resolution: "@cosmos-kit/react@npm:2.20.1" + dependencies: + "@chain-registry/types": "npm:^0.46.11" + "@cosmos-kit/core": "npm:^2.15.0" + "@cosmos-kit/react-lite": "npm:^2.15.1" + "@react-icons/all-files": "npm:^4.1.0" + peerDependencies: + "@interchain-ui/react": ^1.23.9 + "@types/react": ">= 17" + "@types/react-dom": ">= 17" + react: ^18 + react-dom: ^18 + checksum: 10/dc66aedf2cf485262cac805b128f49cf8466d9e16916c242684e47468b5b9f7dec94d396926ae4be808532446864de48987311578d4fd1343d4abdf4876205d2 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:0.8.1, @cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -5729,6 +5021,18 @@ __metadata: languageName: node linkType: hard +"@dao-dao/cosmiframe@npm:^0.1.0": + version: 0.1.0 + resolution: "@dao-dao/cosmiframe@npm:0.1.0" + dependencies: + uuid: "npm:^9.0.1" + peerDependencies: + "@cosmjs/amino": "*" + "@cosmjs/proto-signing": "*" + checksum: 10/7a53a9047b3deecf1ad9b9aa80467d7d9e91f7187bfdd97b8fde77cdfaf4e828f9c9a85cacfb8f13ebe9ad30f578d1e652c7afc4dcd13b30f04440ff50c3a1d0 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -5736,7 +5040,166 @@ __metadata: languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0": +"@ecies/ciphers@npm:^0.2.1": + version: 0.2.1 + resolution: "@ecies/ciphers@npm:0.2.1" + peerDependencies: + "@noble/ciphers": ^1.0.0 + checksum: 10/4a2012358f79ef842c6a9fdcf3d4e1f7d3d59ad3d025cca52b3e7135f62d5c35d394882cbfe8ad5aa17f707663921bf466707d20712b5027a0af5813a6ad7b08 + languageName: node + linkType: hard + +"@effect/schema@npm:0.71.1": + version: 0.71.1 + resolution: "@effect/schema@npm:0.71.1" + dependencies: + fast-check: "npm:^3.21.0" + peerDependencies: + effect: ^3.6.5 + checksum: 10/d8ef78980409ce6fbe3de5ccba976cdcce86014916613a12dc9826ee27ad64e8f94579718a3099c6a9fc460aaafd471f573e75f74dfeaafb89b98275b4d2ed70 + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.12.0": + version: 11.12.0 + resolution: "@emotion/babel-plugin@npm:11.12.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.16.7" + "@babel/runtime": "npm:^7.18.3" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.2.0" + babel-plugin-macros: "npm:^3.1.0" + convert-source-map: "npm:^1.5.0" + escape-string-regexp: "npm:^4.0.0" + find-root: "npm:^1.1.0" + source-map: "npm:^0.5.7" + stylis: "npm:4.2.0" + checksum: 10/fe6f4522ea2b61ef4214dd0b0f3778aad9c18434b47e50ae5091af226526bf305455c313065826a090682520c9462c151d4df62ec128f14671d3125afc05b148 + languageName: node + linkType: hard + +"@emotion/cache@npm:^11.13.0": + version: 11.13.1 + resolution: "@emotion/cache@npm:11.13.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10/090c8ad2e5b23f1b3a95e94f1f0554a40ed1dcd844c9d31629a68ff824eff40f32d1362f67aefa440ee0aabd5a8cabcc76870fd6d77144d3ff251bdcdf1420b9 + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.0, @emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10/379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^0.8.2": + version: 0.8.8 + resolution: "@emotion/is-prop-valid@npm:0.8.8" + dependencies: + "@emotion/memoize": "npm:0.7.4" + checksum: 10/e85bdeb9d9d23de422f271e0f5311a0142b15055bb7e610440dbf250f0cdfd049df88af72a49e2c6081954481f1cbeca9172e2116ff536b38229397dfbed8082 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^1.3.0": + version: 1.3.1 + resolution: "@emotion/is-prop-valid@npm:1.3.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + checksum: 10/abbc5c7bf4017415da5b06067fc0b4771d1f22cf94ec37fd54c07b3bd1bcffbda2405ca686e7ee64a9cfc51461262b712f724850e838775347a949f72949ad03 + languageName: node + linkType: hard + +"@emotion/memoize@npm:0.7.4": + version: 0.7.4 + resolution: "@emotion/memoize@npm:0.7.4" + checksum: 10/4e3920d4ec95995657a37beb43d3f4b7d89fed6caa2b173a4c04d10482d089d5c3ea50bbc96618d918b020f26ed6e9c4026bbd45433566576c1f7b056c3271dc + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 10/038132359397348e378c593a773b1148cd0cf0a2285ffd067a0f63447b945f5278860d9de718f906a74c7c940ba1783ac2ca18f1c06a307b01cc0e3944e783b1 + languageName: node + linkType: hard + +"@emotion/react@npm:^11.13.3": + version: 11.13.3 + resolution: "@emotion/react@npm:11.13.3" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/cache": "npm:^11.13.0" + "@emotion/serialize": "npm:^1.3.1" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + hoist-non-react-statics: "npm:^3.3.1" + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ee70d3afc2e8dd771e6fe176d27dd87a5e21a54e54d871438fd1caa5aa2312d848c6866292fdc65a6ea1c945147c8422bda2d22ed739178af9902dc86d6b298a + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.2.0, @emotion/serialize@npm:^1.3.0, @emotion/serialize@npm:^1.3.1": + version: 1.3.2 + resolution: "@emotion/serialize@npm:1.3.2" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.1" + csstype: "npm:^3.0.2" + checksum: 10/ead557c1ff19d917ef8169c02738ef36f0851fbfdf0bf69a543045bddea3b7281dc8252ee466cc5fb44ed27d1e61280ff943bb60a2c04158751fb07b3457cc93 + languageName: node + linkType: hard + +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10/8ac6e9bf6b373a648f26ae7f1c24041038524f4c72f436f4f8c4761c665e58880c3229d8d89b1f7a4815dd8e5b49634d03e60187cb6f93097d7f7c1859e869d5 + languageName: node + linkType: hard + +"@emotion/styled@npm:^11.13.0": + version: 11.13.0 + resolution: "@emotion/styled@npm:11.13.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/is-prop-valid": "npm:^1.3.0" + "@emotion/serialize": "npm:^1.3.0" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5463a0f15fc12a9e20340f52df49461e948c3ae7e2dd763db0ff937b0b96dd4e82eed85cd15e24621efb3b097a095b88b01d60f50cf6f38fe3ab7db6e77f9615 + languageName: node + linkType: hard + +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10/6851c16edce01c494305f43b2cad7a26b939a821131b7c354e49b8e3b012c8810024755b0f4a03ef51117750309e55339825a97bd10411fb3687e68904769106 + languageName: node + linkType: hard + +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0, @emotion/use-insertion-effect-with-fallbacks@npm:^1.1.0": version: 1.1.0 resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.1.0" peerDependencies: @@ -5745,6 +5208,20 @@ __metadata: languageName: node linkType: hard +"@emotion/utils@npm:^1.4.0, @emotion/utils@npm:^1.4.1": + version: 1.4.1 + resolution: "@emotion/utils@npm:1.4.1" + checksum: 10/95e56fc0c9e05cf01a96268f0486ce813f1109a8653d2f575c67df9e8765d9c1b2daf09ad1ada67d933efbb08ca7990228e14b210c713daf90156b4869abe6a7 + languageName: node + linkType: hard + +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10/db5da0e89bd752c78b6bd65a1e56231f0abebe2f71c0bd8fc47dff96408f7065b02e214080f99924f6a3bfe7ee15afc48dad999d76df86b39b16e513f7a94f52 + languageName: node + linkType: hard + "@esbuild-plugins/node-globals-polyfill@npm:^0.2.3": version: 0.2.3 resolution: "@esbuild-plugins/node-globals-polyfill@npm:0.2.3" @@ -5766,13 +5243,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -5801,13 +5271,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm64@npm:0.21.5" @@ -5836,13 +5299,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm@npm:0.21.5" @@ -5871,13 +5327,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-x64@npm:0.21.5" @@ -5906,13 +5355,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-arm64@npm:0.21.5" @@ -5941,13 +5383,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-x64@npm:0.21.5" @@ -5976,13 +5411,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-arm64@npm:0.21.5" @@ -6011,13 +5439,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-x64@npm:0.21.5" @@ -6046,13 +5467,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm64@npm:0.21.5" @@ -6081,13 +5495,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm@npm:0.21.5" @@ -6116,13 +5523,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ia32@npm:0.21.5" @@ -6151,13 +5551,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-loong64@npm:0.21.5" @@ -6186,13 +5579,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-mips64el@npm:0.21.5" @@ -6221,13 +5607,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ppc64@npm:0.21.5" @@ -6256,13 +5635,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-riscv64@npm:0.21.5" @@ -6291,13 +5663,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-s390x@npm:0.21.5" @@ -6326,13 +5691,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-x64@npm:0.21.5" @@ -6361,13 +5719,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/netbsd-x64@npm:0.21.5" @@ -6403,13 +5754,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/openbsd-x64@npm:0.21.5" @@ -6438,13 +5782,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/sunos-x64@npm:0.21.5" @@ -6473,13 +5810,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-arm64@npm:0.21.5" @@ -6508,13 +5838,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-ia32@npm:0.21.5" @@ -6543,13 +5866,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-x64@npm:0.21.5" @@ -6575,34 +5891,68 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10/8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.19.0": + version: 0.19.0 + resolution: "@eslint/config-array@npm:0.19.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/16e4ec468ebcb10255ab8c61234c1b3e7ac5506016e432fb489a1c5528cace7a60ddb07515516e7fc166b1dbe6c407d8a6bfbaa2e7531d445d8feb845c989913 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.9.0": + version: 0.9.0 + resolution: "@eslint/core@npm:0.9.0" + checksum: 10/2d11e9c6fac14cfa817c7a9939fd6b79f2120928e4933952d061651db93797e0fcd67c858a14980ac26e90f6e0e49051436aefa4a4b06a26f24e3028366f73d9 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + checksum: 10/b32dd90ce7da68e89b88cd729db46b27aac79a2e6cb1fa75d25a6b766d586b443bfbf59622489efbd3c6f696f147b51111e81ec7cd23d70f215c5d474cad0261 + languageName: node + linkType: hard + +"@eslint/js@npm:9.15.0, @eslint/js@npm:^9.15.0": + version: 9.15.0 + resolution: "@eslint/js@npm:9.15.0" + checksum: 10/cdea71574a8be164147f426ffa5eca05a9c7fbfbae98387ed0cf772292fc9fb5ded69ce96eac110aaa633f6b7504ec551e1d33f2d6690ae95b11ec395553bae1 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10/221e8d9f281c605948cd6e030874aacce83fe097f8f9c1964787037bccf08e82b7aa9eff1850a30fffac43f1d76555727ec22a2af479d91e268e89d1e035131e languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 10/3c501ce8a997cf6cbbaf4ed358af5492875e3550c19b9621413b82caa9ae5382c584b0efa79835639e6e0ddaa568caf3499318e5bdab68643ef4199dce5eb0a0 +"@eslint/plugin-kit@npm:^0.2.3": + version: 0.2.3 + resolution: "@eslint/plugin-kit@npm:0.2.3" + dependencies: + levn: "npm:^0.4.1" + checksum: 10/0d0653ef840823fd5c0354ef8f1937e7763dbe830173eb6d2d55a19374bf04a06dff0e5214330c10a9425cf38655f632bb0d7d0666249b366e506ae291d82f7e languageName: node linkType: hard @@ -6812,6 +6162,16 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^3.2.0": + version: 3.2.0 + resolution: "@ethereumjs/common@npm:3.2.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + crc-32: "npm:^1.2.0" + checksum: 10/b3f612406b6bcefaf9117ceb42eff58d311e2b50205e3d55b4c793d803de517efbc84075e058dc0e2ec27a2bff11dfc279dda1fa2b249ed6ab3973be045898f4 + languageName: node + linkType: hard + "@ethereumjs/ethash@npm:^1.1.0": version: 1.1.0 resolution: "@ethereumjs/ethash@npm:1.1.0" @@ -6825,6 +6185,15 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/rlp@npm:^4.0.1": + version: 4.0.1 + resolution: "@ethereumjs/rlp@npm:4.0.1" + bin: + rlp: bin/rlp + checksum: 10/bfdffd634ce72f3b17e3d085d071f2fe7ce9680aebdf10713d74b30afd80ef882d17f19ff7175fcb049431a56e800bd3558d3b028bd0d82341927edb303ab450 + languageName: node + linkType: hard + "@ethereumjs/tx@npm:3.3.2": version: 3.3.2 resolution: "@ethereumjs/tx@npm:3.3.2" @@ -6855,6 +6224,29 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": + version: 4.2.0 + resolution: "@ethereumjs/tx@npm:4.2.0" + dependencies: + "@ethereumjs/common": "npm:^3.2.0" + "@ethereumjs/rlp": "npm:^4.0.1" + "@ethereumjs/util": "npm:^8.1.0" + ethereum-cryptography: "npm:^2.0.0" + checksum: 10/cbd2ffc3ef76ca5416d58f2f694858d9fcac946e6a107fef44cf3f308a7c9fcc996a6847868609354d72d5b356faee68408e9d5601c4c4f7dad8e18cb2c24a95 + languageName: node + linkType: hard + +"@ethereumjs/util@npm:^8.1.0": + version: 8.1.0 + resolution: "@ethereumjs/util@npm:8.1.0" + dependencies: + "@ethereumjs/rlp": "npm:^4.0.1" + ethereum-cryptography: "npm:^2.0.0" + micro-ftch: "npm:^0.3.1" + checksum: 10/cc35338932e49b15e54ca6e548b32a1f48eed7d7e1d34ee743e4d3600dd616668bd50f70139e86c5c35f55aac35fba3b6cc4e6f679cf650aeba66bf93016200c + languageName: node + linkType: hard + "@ethereumjs/vm@npm:5.6.0": version: 5.6.0 resolution: "@ethereumjs/vm@npm:5.6.0" @@ -6965,7 +6357,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.4.0, @ethersproject/address@npm:^5.7.0": +"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.4.0, @ethersproject/address@npm:^5.6.0, @ethersproject/address@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/address@npm:5.7.0" dependencies: @@ -7561,6 +6953,15 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.6.7": + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" + dependencies: + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/87d52989c3d2cc80373bc153b7a40814db3206ce7d0b2a2bdfb63e2ff39ffb8b999b1b0ccf28e548000ebf863bf16e2bed45eab4c4d287a5dbe974ef22368d82 + languageName: node + linkType: hard + "@floating-ui/dom@npm:^1.0.0": version: 1.6.8 resolution: "@floating-ui/dom@npm:1.6.8" @@ -7581,6 +6982,16 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.6.10": + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" + dependencies: + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/5c8e5fdcd3843140a606ab6dc6c12ad740f44e66b898966ef877393faaede0bbe14586e1049e2c2f08856437da8847e884a2762e78275fefa65a5a9cd71e580d + languageName: node + linkType: hard + "@floating-ui/react-dom@npm:^2.0.0": version: 2.1.1 resolution: "@floating-ui/react-dom@npm:2.1.1" @@ -7593,7 +7004,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.1.2": +"@floating-ui/react-dom@npm:^2.1.1, @floating-ui/react-dom@npm:^2.1.2": version: 2.1.2 resolution: "@floating-ui/react-dom@npm:2.1.2" dependencies: @@ -7619,6 +7030,20 @@ __metadata: languageName: node linkType: hard +"@floating-ui/react@npm:^0.26.23": + version: 0.26.27 + resolution: "@floating-ui/react@npm:0.26.27" + dependencies: + "@floating-ui/react-dom": "npm:^2.1.2" + "@floating-ui/utils": "npm:^0.2.8" + tabbable: "npm:^6.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10/ab6d05e5cc2c29272a6830c06dff07e8330f2b90234674f2d74ed8084659ebe3ac9472770a5f0e76007dd2ae89f9da75189d188437aea4b8ac2789afc21bb6b2 + languageName: node + linkType: hard + "@floating-ui/utils@npm:^0.2.5": version: 0.2.5 resolution: "@floating-ui/utils@npm:0.2.5" @@ -7640,6 +7065,63 @@ __metadata: languageName: node linkType: hard +"@formatjs/ecma402-abstract@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/ecma402-abstract@npm:2.2.3" + dependencies: + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/intl-localematcher": "npm:0.5.7" + tslib: "npm:2" + checksum: 10/d39e9f0d36c296a635f52aa35e07a67b6aa90383a30a046a0508e5d730676399fd0e67188eff463fe2a4d5febc9f567af45788fdf881e070910be7eb9294dd8c + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/fast-memoize@npm:2.2.3" + dependencies: + tslib: "npm:2" + checksum: 10/a9634acb5e03d051e09881eea5484ab02271f7d6b5f96ae9485674ab3c359aa881bc45fc07a1181ae4b2d6e288dadc169f578d142d698913ebbefa373014cac2 + languageName: node + linkType: hard + +"@formatjs/icu-messageformat-parser@npm:2.9.3": + version: 2.9.3 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.3" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + "@formatjs/icu-skeleton-parser": "npm:1.8.7" + tslib: "npm:2" + checksum: 10/b24a3db43e4bf612107e981d5b40c077543d2266a08aac5cf01d5f65bf60527d5d16795e2e30063cb180b1d36d401944cd2ffb3a19d79b0cd28fa59751d19b7c + languageName: node + linkType: hard + +"@formatjs/icu-skeleton-parser@npm:1.8.7": + version: 1.8.7 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.7" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + tslib: "npm:2" + checksum: 10/1a39815e5048f3c12a8d6a5b553271437b62e302724fc15c3b6967dc3e24823fcd9b8d3231a064991e163c147e54e588c571a092d557e93e78e738d218c6ef43 + languageName: node + linkType: hard + +"@formatjs/intl-localematcher@npm:0.5.7": + version: 0.5.7 + resolution: "@formatjs/intl-localematcher@npm:0.5.7" + dependencies: + tslib: "npm:2" + checksum: 10/52201f12212e7e9cba1a4f99020da587b13e44e06e03c4ccd4e5ac0829b411e73dfe0904a9039ef81eeabeea04ed8cfae9e727e6791acd0230745b7bd3ad059e + languageName: node + linkType: hard + +"@formkit/auto-animate@npm:^0.8.2": + version: 0.8.2 + resolution: "@formkit/auto-animate@npm:0.8.2" + checksum: 10/4414fbc9d13ddf8f9e39adfa1a96a9d3affca8d5fb3b148bd4bb9149066910a179b8477a9ce0af51d2abb2ee8d126d25d290460845ed8018858c569eed15655f + languageName: node + linkType: hard + "@ganache/ethereum-address@npm:0.1.4": version: 0.1.4 resolution: "@ganache/ethereum-address@npm:0.1.4" @@ -7771,14 +7253,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10/6d43c6727463772d05610aa05c83dab2bfbe78291022ee7a92cb50999910b8c720c76cc312822e2dea2b497aa1b3fef5fe9f68803fc45c9d4ed105874a65e339 languageName: node linkType: hard @@ -7789,10 +7277,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 10/ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10/eb457f699529de7f07649679ec9e0353055eebe443c2efe71c6dd950258892475a038e13c6a8c5e13ed1fb538cdd0a8794faa96b24b6ffc4c87fb1fc9f70ad7f + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: 10/39fafc7319e88f61befebd5e1b4f0136534ea6a9bd10d74366698187bd63544210ec5d79a87ed4d91297f1cc64c4c53d45fb0077a2abfdce212cf0d3862d5f04 languageName: node linkType: hard @@ -7802,15 +7297,16 @@ __metadata: dependencies: "@chainlink/ccip-read-server": "npm:^0.2.1" "@jest/globals": "npm:^29.7.0" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" dotenv-flow: "npm:^4.1.0" - ethers: "npm:5.7.2" + eslint: "npm:^9.15.0" + ethers: "npm:^5.7.2" jest: "npm:^29.7.0" nodemon: "npm:^3.0.3" prettier: "npm:^2.8.8" ts-jest: "npm:^29.1.2" ts-node: "npm:^10.8.0" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft @@ -7821,34 +7317,37 @@ __metadata: dependencies: "@aws-sdk/client-kms": "npm:^3.577.0" "@aws-sdk/client-s3": "npm:^3.577.0" + "@eslint/js": "npm:^9.15.0" "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:7.0.0" - "@hyperlane-xyz/utils": "npm:7.0.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" - "@inquirer/prompts": "npm:^3.0.0" + "@inquirer/prompts": "npm:3.3.2" "@types/chai-as-promised": "npm:^8" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" "@types/yargs": "npm:^17.0.24" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" ansi-escapes: "npm:^7.0.0" asn1.js: "npm:^5.4.1" bignumber.js: "npm:^9.1.1" chai: "npm:^4.5.0" chai-as-promised: "npm:^8.0.0" chalk: "npm:^5.3.0" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethers: "npm:^5.7.2" latest-version: "npm:^8.0.0" mocha: "npm:^10.2.0" prettier: "npm:^2.8.8" terminal-link: "npm:^3.0.0" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" yaml: "npm:2.4.5" yargs: "npm:^17.7.2" @@ -7860,24 +7359,24 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.8.0, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.8.1, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:7.0.0" + "@hyperlane-xyz/utils": "npm:7.1.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts": "npm:^4.9.3" - "@openzeppelin/contracts-upgradeable": "npm:^v4.9.3" + "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" "@typechain/ethers-v5": "npm:^11.1.2" "@typechain/ethers-v6": "npm:^0.5.1" "@typechain/hardhat": "npm:^9.1.0" "@types/node": "npm:^18.14.5" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" fx-portal: "npm:^1.0.3" @@ -7909,7 +7408,7 @@ __metadata: "@cloudflare/vitest-pool-workers": "npm:^0.4.5" "@cloudflare/workers-types": "npm:^4.20240821.1" "@faker-js/faker": "npm:^8.4.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" prettier: "npm:^2.8.8" typescript: "npm:5.3.3" vitest: "npm:1.4.0" @@ -7917,13 +7416,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:7.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:7.1.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: - "@hyperlane-xyz/core": "npm:5.8.0" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:7.0.0" + "@eslint/js": "npm:^9.15.0" + "@hyperlane-xyz/core": "npm:5.8.1" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7931,11 +7431,13 @@ __metadata: "@typechain/ethers-v5": "npm:^11.1.2" "@typechain/ethers-v6": "npm:^0.5.1" "@typechain/hardhat": "npm:^9.1.0" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" - chai: "npm:4.5.0" - eslint: "npm:^8.57.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" + chai: "npm:^4.5.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" hardhat: "npm:^2.22.2" @@ -7960,21 +7462,21 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperlane-xyz/infra@workspace:typescript/infra" dependencies: - "@arbitrum/sdk": "npm:^3.0.0" + "@arbitrum/sdk": "npm:^4.0.0" "@aws-sdk/client-iam": "npm:^3.74.0" - "@aws-sdk/client-kms": "npm:3.48.0" - "@aws-sdk/client-s3": "npm:^3.74.0" + "@aws-sdk/client-kms": "npm:^3.577.0" + "@aws-sdk/client-s3": "npm:^3.577.0" "@cosmjs/amino": "npm:^0.32.4" "@eth-optimism/sdk": "npm:^3.1.6" "@ethersproject/experimental": "npm:^5.7.0" "@ethersproject/hardware-wallets": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.2" + "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:7.0.0" - "@hyperlane-xyz/registry": "npm:4.10.0" - "@hyperlane-xyz/sdk": "npm:7.0.0" - "@hyperlane-xyz/utils": "npm:7.0.0" - "@inquirer/prompts": "npm:^5.3.8" + "@hyperlane-xyz/helloworld": "npm:7.1.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" + "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -7985,13 +7487,13 @@ __metadata: "@types/chai": "npm:^4.2.21" "@types/json-stable-stringify": "npm:^1.0.36" "@types/mocha": "npm:^10.0.1" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" "@types/prompts": "npm:^2.0.14" "@types/sinon-chai": "npm:^3.2.12" "@types/yargs": "npm:^17.0.24" - asn1.js: "npm:5.4.1" + asn1.js: "npm:^5.4.1" aws-kms-ethers-signer: "npm:^0.1.3" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" deep-object-diff: "npm:^1.1.9" dotenv: "npm:^10.0.0" ethereum-waffle: "npm:^4.0.10" @@ -8002,7 +7504,7 @@ __metadata: prettier: "npm:^2.8.8" prom-client: "npm:^14.0.1" prompts: "npm:^2.4.2" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" yaml: "npm:2.4.5" yargs: "npm:^17.7.2" @@ -8016,49 +7518,45 @@ __metadata: resolution: "@hyperlane-xyz/monorepo@workspace:." dependencies: "@changesets/cli": "npm:^2.26.2" + "@eslint/js": "npm:^9.15.0" "@trivago/prettier-plugin-sort-imports": "npm:^4.2.1" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" - eslint: "npm:^8.57.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" eslint-plugin-jest: "npm:^28.2.0" husky: "npm:^8.0.0" lint-staged: "npm:^12.4.3" prettier: "npm:^2.8.8" - tsx: "npm:^4.7.1" + syncpack: "npm:^13.0.0" + tsx: "npm:^4.19.1" languageName: unknown linkType: soft -"@hyperlane-xyz/registry@npm:4.10.0": - version: 4.10.0 - resolution: "@hyperlane-xyz/registry@npm:4.10.0" - dependencies: - yaml: "npm:2.4.5" - zod: "npm:^3.21.2" - checksum: 10/22bb18f426cbada8b97db0894fe5d0980dfc08ecbd5174c978b7aeb6d8df9706f93d7e9cf0630644d2455ad05feee714dc2a38ec515a717b0b257184637902fb - languageName: node - linkType: hard - -"@hyperlane-xyz/registry@npm:4.7.0": - version: 4.7.0 - resolution: "@hyperlane-xyz/registry@npm:4.7.0" +"@hyperlane-xyz/registry@npm:6.1.0": + version: 6.1.0 + resolution: "@hyperlane-xyz/registry@npm:6.1.0" dependencies: yaml: "npm:2.4.5" zod: "npm:^3.21.2" - checksum: 10/d5b0090869417c3fc263c379791f439070113aee239990ffc20d9d90d74102b77008f3c630ce955a9b3f1f92f79b1df67d83a097b327cd5db2b01b382bf40f18 + checksum: 10/a0e1ecc02d83604793ddda0a3e00a9ffcaa38b1cddf9883b47cf8f1919b4474abd6cc2ee84846e6a35e1bc7539299b9bec92bfdf06be72beecff6aa44b73d382 languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:7.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:7.1.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: "@arbitrum/sdk": "npm:^4.0.0" - "@aws-sdk/client-s3": "npm:^3.74.0" + "@aws-sdk/client-s3": "npm:^3.577.0" + "@chain-registry/types": "npm:^0.50.14" "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" - "@hyperlane-xyz/core": "npm:5.8.0" - "@hyperlane-xyz/utils": "npm:7.0.0" + "@eslint/js": "npm:^9.15.0" + "@hyperlane-xyz/core": "npm:5.8.1" + "@hyperlane-xyz/utils": "npm:7.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -8067,16 +7565,21 @@ __metadata: "@solana/spl-token": "npm:^0.4.9" "@solana/web3.js": "npm:^1.95.4" "@types/mocha": "npm:^10.0.1" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" "@types/sinon": "npm:^17.0.1" "@types/sinon-chai": "npm:^3.2.12" "@types/ws": "npm:^8.5.5" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" cosmjs-types: "npm:^0.9.0" cross-fetch: "npm:^3.1.5" dotenv: "npm:^10.0.0" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" hardhat: "npm:^2.22.2" @@ -8085,9 +7588,9 @@ __metadata: prettier: "npm:^2.8.8" sinon: "npm:^13.0.2" ts-node: "npm:^10.8.0" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" - viem: "npm:^2.21.40" + viem: "npm:^2.21.45" yaml: "npm:2.4.5" zod: "npm:^3.21.2" peerDependencies: @@ -8096,18 +7599,25 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:7.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:7.1.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: "@cosmjs/encoding": "npm:^0.32.4" + "@eslint/js": "npm:^9.15.0" "@solana/web3.js": "npm:^1.95.4" "@types/lodash-es": "npm:^4.17.12" "@types/mocha": "npm:^10.0.1" "@types/sinon": "npm:^17.0.1" "@types/sinon-chai": "npm:^3.2.12" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" + eslint: "npm:^9.15.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethers: "npm:^5.7.2" lodash-es: "npm:^4.17.21" mocha: "npm:^10.2.0" @@ -8123,10 +7633,21 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperlane-xyz/widgets@workspace:typescript/widgets" dependencies: + "@chakra-ui/react": "npm:^2.8.2" + "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" + "@cosmos-kit/react": "npm:^2.18.0" + "@emotion/react": "npm:^11.13.3" + "@emotion/styled": "npm:^11.13.0" + "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" - "@hyperlane-xyz/registry": "npm:4.7.0" - "@hyperlane-xyz/sdk": "npm:7.0.0" - "@hyperlane-xyz/utils": "npm:7.0.0" + "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.1.0" + "@interchain-ui/react": "npm:^1.23.28" + "@rainbow-me/rainbowkit": "npm:^2.2.0" + "@solana/wallet-adapter-react": "npm:^0.15.32" + "@solana/wallet-adapter-react-ui": "npm:^0.9.31" + "@solana/web3.js": "npm:^1.95.4" "@storybook/addon-essentials": "npm:^7.6.14" "@storybook/addon-interactions": "npm:^7.6.14" "@storybook/addon-links": "npm:^7.6.14" @@ -8135,19 +7656,23 @@ __metadata: "@storybook/react": "npm:^7.6.14" "@storybook/react-vite": "npm:^7.6.14" "@storybook/test": "npm:^7.6.14" - "@types/node": "npm:^18.11.18" + "@tanstack/react-query": "npm:^5.59.20" + "@types/node": "npm:^18.14.5" "@types/react": "npm:^18.0.27" "@types/react-dom": "npm:^18.0.10" "@types/ws": "npm:^8.5.5" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" babel-loader: "npm:^8.3.0" clsx: "npm:^2.1.1" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" eslint-plugin-react: "npm:^7.37.2" eslint-plugin-react-hooks: "npm:^5.0.0" - eslint-plugin-storybook: "npm:^0.6.15" + eslint-plugin-storybook: "npm:^0.11.1" + framer-motion: "npm:^10.16.4" postcss: "npm:^8.4.21" prettier: "npm:^2.8.8" react: "npm:^18.2.0" @@ -8157,61 +7682,40 @@ __metadata: tailwindcss: "npm:^3.4.13" ts-node: "npm:^10.8.0" typescript: "npm:5.3.3" + viem: "npm:^2.21.45" vite: "npm:^5.1.1" + wagmi: "npm:^2.12.26" peerDependencies: react: ^18 react-dom: ^18 languageName: unknown linkType: soft -"@inquirer/checkbox@npm:^1.3.5": - version: 1.3.5 - resolution: "@inquirer/checkbox@npm:1.3.5" +"@inquirer/checkbox@npm:^1.5.2": + version: 1.5.2 + resolution: "@inquirer/checkbox@npm:1.5.2" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" figures: "npm:^3.2.0" - checksum: 10/e7e984ef44afe2dcdcf2bb56f24065ca15954ee0a16edbc0d614df8de383123a0e956c7c22e1786b60bc0dfb41f98fbcfb89fd33adabff26e223c5acd918aac1 - languageName: node - linkType: hard - -"@inquirer/checkbox@npm:^2.4.7": - version: 2.4.7 - resolution: "@inquirer/checkbox@npm:2.4.7" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/9bc0d6e9d6db90bcda3771d6b96e885e8c4e1f03d96a4fcd04b4eab2fafbecfafbced7a5cc24eca73f677452f9e354505f9cfb79a884dcf06772550845014d6f + checksum: 10/00e4dd403c739ce91368915d08ad98000a8dc7a83fe6fca12a4445b47768beb1c86dd99c675d79df6658a93cebca54286e34415c51f8926e6ffb338a2feb4db5 languageName: node linkType: hard -"@inquirer/confirm@npm:^2.0.6": - version: 2.0.6 - resolution: "@inquirer/confirm@npm:2.0.6" +"@inquirer/confirm@npm:^2.0.17": + version: 2.0.17 + resolution: "@inquirer/confirm@npm:2.0.17" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - checksum: 10/efbfeca4c2750ec65fd603d041039356d1f3f5b321305e11fefe40ebc7aa69e8e82fde42f216967462541a9a742768b8f816e4b5c86b3e82c0c886f7227e65ac - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^3.1.22": - version: 3.1.22 - resolution: "@inquirer/confirm@npm:3.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/14e547ae3194c6447d41bb87135c03aa5598fd340fced19e4e8bae1be4ae54a9ad3cf335a9c3c6dc54e2ffb7928319e0f4b428531b8ce720cd23d2444292ca36 + checksum: 10/76cdf50881c21bcab4813600502fb3975cbed56a85ad6deaaf06832b92b78b9c932842ffda0e911f29d7dee79dd9dc4724735bd1d60562a509c8ef6317c28c69 languageName: node linkType: hard -"@inquirer/core@npm:9.0.10, @inquirer/core@npm:^9.0.10": +"@inquirer/core@npm:9.0.10": version: 9.0.10 resolution: "@inquirer/core@npm:9.0.10" dependencies: @@ -8232,71 +7736,49 @@ __metadata: languageName: node linkType: hard -"@inquirer/core@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/core@npm:3.0.0" +"@inquirer/core@npm:^6.0.0": + version: 6.0.0 + resolution: "@inquirer/core@npm:6.0.0" dependencies: - "@inquirer/type": "npm:^1.1.1" - "@types/mute-stream": "npm:^0.0.1" - "@types/node": "npm:^20.4.2" + "@inquirer/type": "npm:^1.1.6" + "@types/mute-stream": "npm:^0.0.4" + "@types/node": "npm:^20.10.7" "@types/wrap-ansi": "npm:^3.0.0" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" - cli-spinners: "npm:^2.8.0" - cli-width: "npm:^4.0.0" + cli-spinners: "npm:^2.9.2" + cli-width: "npm:^4.1.0" figures: "npm:^3.2.0" mute-stream: "npm:^1.0.0" run-async: "npm:^3.0.0" - string-width: "npm:^4.2.3" + signal-exit: "npm:^4.1.0" strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^6.0.1" - checksum: 10/7524c15d004e1686c5b66086fe70b50ab50983dd6f887a90fa765cc4f9ae2ba7e063dbf0cb740233d55ee1c8b60f10a7b957245bee95223e755e9632c77a9ca4 + wrap-ansi: "npm:^6.2.0" + checksum: 10/a9f79fe538deab439afc845e16fa8832872b4562be6e39a5de8b50eca3e2b27be0e470fc4ee014f202a750213adc8a06068402d51d6d7b34b118b12b08200f85 languageName: node linkType: hard -"@inquirer/editor@npm:^1.2.4": - version: 1.2.4 - resolution: "@inquirer/editor@npm:1.2.4" +"@inquirer/editor@npm:^1.2.15": + version: 1.2.15 + resolution: "@inquirer/editor@npm:1.2.15" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - external-editor: "npm:^3.0.3" - checksum: 10/a3dac45256d334f79061b0e79b8e9427ee5d5b244367ac582811148f0fe2c7fc3bfaec3aab5fda0ea0293ff23c3c2ef2e66fdf6f6f9b56cf628b265d9cab5afd - languageName: node - linkType: hard - -"@inquirer/editor@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/editor@npm:2.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" external-editor: "npm:^3.1.0" - checksum: 10/d36255567c88ea48bf1071b00c502d6a32bc1402966db4f9ae1be59d41d64d11e02111317d880d0bdc42fbfb1b819240fb229c89b07dfb804a6d5fb176ab8bb0 + checksum: 10/fbb79f9972aae4cbf7a2e4c36995cf7c6e77b235c47cdd1a05e69f71626aa1ac48ddb3adc3a118568eea2bf5322bfafea71bd62a7969c883c15dbf71e9630e39 languageName: node linkType: hard -"@inquirer/expand@npm:^1.1.5": - version: 1.1.5 - resolution: "@inquirer/expand@npm:1.1.5" +"@inquirer/expand@npm:^1.1.16": + version: 1.1.16 + resolution: "@inquirer/expand@npm:1.1.16" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" figures: "npm:^3.2.0" - checksum: 10/04df9f1713864a965bfaff12358cbd4de97f58363dfb0b625ba4c4b4736bdb1cef38b5a726024ea41b0a55cdbdd1d271fbb6659a8e7fce8927383a8d1bf77562 - languageName: node - linkType: hard - -"@inquirer/expand@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/expand@npm:2.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/f997ba916d3ddcc6e2563158805e2ae7a7a6f98e24cf0a08e23d4101b7d78f78e7dce28e648b85ca7f41759eeefdf1c6f6abf2bce0f041fbda54aacf68522454 + checksum: 10/5158f8eb807bd1d55e7e7ca9288051f5947970b32b1a33cd9c94ea228c03cdb18508be5ecd0237061276721f5c9ca96741b3e2c288123c526cdd5049cdf566db languageName: node linkType: hard @@ -8307,167 +7789,159 @@ __metadata: languageName: node linkType: hard -"@inquirer/input@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/input@npm:1.2.5" +"@inquirer/input@npm:^1.2.16": + version: 1.2.16 + resolution: "@inquirer/input@npm:1.2.16" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - checksum: 10/6a524e231e19f9d2dc80b475722c25b94cfdbc3f4e70491f70f9bdd92409eb1a4f6c856f21d76953c4b6880ce5b657a8acfd12a5cfa7fe2b38f460df8729ce56 + checksum: 10/b4b189832ee900b9e088f43a1ce3a959c493ffb06bb112ff166603962e79981086cdf809b63ad908e1f531b52cd467c0681a8dae98005fc0eebe7cee43e41286 languageName: node linkType: hard -"@inquirer/input@npm:^2.2.9": - version: 2.2.9 - resolution: "@inquirer/input@npm:2.2.9" +"@inquirer/password@npm:^1.1.16": + version: 1.1.16 + resolution: "@inquirer/password@npm:1.1.16" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/9d0c97da9cc6972d4fb5bcb077e00e581aae90f6891d33c1c5e2f0324023c1772c6d5b03cd30ec7d4f71d22791d38bf45c47bafbe7dd9f74446693e7b120a2b0 + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + checksum: 10/f40309775c690a1d4d39fba1c1bb2a2b4b1beb8b20b1956a4541d4191d7b5eab8ac663c0d0c01caff413cecdf3b2e36e527c391f3aa9a8fc1931f329056e0a81 languageName: node linkType: hard -"@inquirer/number@npm:^1.0.10": - version: 1.0.10 - resolution: "@inquirer/number@npm:1.0.10" +"@inquirer/prompts@npm:3.3.2": + version: 3.3.2 + resolution: "@inquirer/prompts@npm:3.3.2" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/0f9323b581e1c35ee8fbf2acde301c3e354896aeac83f6854e9672575090e0d092d19aadadb3477659079c403e63a3206bf668dd4c87e86834f775744f57c955 + "@inquirer/checkbox": "npm:^1.5.2" + "@inquirer/confirm": "npm:^2.0.17" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/editor": "npm:^1.2.15" + "@inquirer/expand": "npm:^1.1.16" + "@inquirer/input": "npm:^1.2.16" + "@inquirer/password": "npm:^1.1.16" + "@inquirer/rawlist": "npm:^1.2.16" + "@inquirer/select": "npm:^1.3.3" + checksum: 10/d8b18c1fc87fd6774d6934600d2d7eda493bb3cceeb7f9d079acfac507d851b66cf9e9cd2dee3146649bf72db5d1788dacd7e22708bbcebc4c5a00fd94f08b67 languageName: node linkType: hard -"@inquirer/password@npm:^1.1.5": - version: 1.1.5 - resolution: "@inquirer/password@npm:1.1.5" +"@inquirer/rawlist@npm:^1.2.16": + version: 1.2.16 + resolution: "@inquirer/rawlist@npm:1.2.16" dependencies: - "@inquirer/input": "npm:^1.2.5" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - checksum: 10/81aa1a101cfffdcaab6e12487ffc672e5a5cad0c4e2c504f0c56b7bf3119077826d6df5b0a35a2a938c1ff888618d68e656f7acc5103abd5d7b2b56e97aa5ff3 + checksum: 10/a4acefb0f54e4d4c3f7c44d35971cb0b8cbf2acd6dbe490576cd24369f3304ff4a36255cd4cc851c2de7c037cf70f71c129bc6c8c5c80dce495998e6168904fd languageName: node linkType: hard -"@inquirer/password@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/password@npm:2.1.22" +"@inquirer/select@npm:^1.3.3": + version: 1.3.3 + resolution: "@inquirer/select@npm:1.3.3" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" ansi-escapes: "npm:^4.3.2" - checksum: 10/ce4e7c268f267c7436cf3a1b2890a9c92fddc2928bbe141d48f2f5a5daedbb3a2c601e44b0fe4e255792676ed241118ba69756b0d0b7d4492e0b7ee8fc548b90 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/prompts@npm:3.0.0" - dependencies: - "@inquirer/checkbox": "npm:^1.3.5" - "@inquirer/confirm": "npm:^2.0.6" - "@inquirer/core": "npm:^3.0.0" - "@inquirer/editor": "npm:^1.2.4" - "@inquirer/expand": "npm:^1.1.5" - "@inquirer/input": "npm:^1.2.5" - "@inquirer/password": "npm:^1.1.5" - "@inquirer/rawlist": "npm:^1.2.5" - "@inquirer/select": "npm:^1.2.5" - checksum: 10/aa35f8543f78f52b8cb939ac8fefd994fa3b118414525209c0993c40ecff856797c3050b8974bfec49eecadfdd25a6ecb50bb122ffc253ae2b0e4e9b5af1043b + chalk: "npm:^4.1.2" + figures: "npm:^3.2.0" + checksum: 10/0f33c51ab69c156b96092bfb107d08dd0f4227274917b9406aa23877e3ba94fd6738800fb973c44c051aaebdba72d07dc328df4b76e6e1285f68aa01a7ed0ed8 languageName: node linkType: hard -"@inquirer/prompts@npm:^5.3.8": - version: 5.3.8 - resolution: "@inquirer/prompts@npm:5.3.8" +"@inquirer/type@npm:^1.1.6": + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" dependencies: - "@inquirer/checkbox": "npm:^2.4.7" - "@inquirer/confirm": "npm:^3.1.22" - "@inquirer/editor": "npm:^2.1.22" - "@inquirer/expand": "npm:^2.1.22" - "@inquirer/input": "npm:^2.2.9" - "@inquirer/number": "npm:^1.0.10" - "@inquirer/password": "npm:^2.1.22" - "@inquirer/rawlist": "npm:^2.2.4" - "@inquirer/search": "npm:^1.0.7" - "@inquirer/select": "npm:^2.4.7" - checksum: 10/e60eba0d64590c96fed722107962f433fbd8ff13f5d8a3ad6ba56964db69c8bc6b91a439b4e90209184090aacf73d84b0504e8c5a6a0f778ced70deb580ac1cd + mute-stream: "npm:^1.0.0" + checksum: 10/bd3f3d7510785af4ad599e042e99e4be6380f52f79f3db140fe6fed0a605acf27b1a0a20fb5cc688eaf7b8aa0c36dacb1d89c7bba4586f38cbf58ba9f159e7b5 languageName: node linkType: hard -"@inquirer/rawlist@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/rawlist@npm:1.2.5" +"@inquirer/type@npm:^1.5.2": + version: 1.5.2 + resolution: "@inquirer/type@npm:1.5.2" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" - chalk: "npm:^4.1.2" - checksum: 10/e94388228305b0d1b49b4f4c6b744c89614c7f413cae2098ff5f7d685ae485b9ad3af9f93796061fad2c8bfa816e7daa9e349ee2499398011744d7c03f6718c3 + mute-stream: "npm:^1.0.0" + checksum: 10/90d9203b5d7da8530e210c5421630b577f24554c8b683a4b45ea0f5c6a89c451771170aa34f2b62ca57e4be4de41d6761c941475e25c54c82b527c05644f181f languageName: node linkType: hard -"@inquirer/rawlist@npm:^2.2.4": - version: 2.2.4 - resolution: "@inquirer/rawlist@npm:2.2.4" +"@interchain-ui/react@npm:^1.23.28": + version: 1.26.1 + resolution: "@interchain-ui/react@npm:1.26.1" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/dd9d34a5cca081d53a9798cdfed2fdb61455dcfa856f54bc036dc5f57aceb95a7484487632c157bdba75e50de24990ebb3bb178ee765b8c0a735ff61b29cebf4 + "@floating-ui/core": "npm:^1.6.7" + "@floating-ui/dom": "npm:^1.6.10" + "@floating-ui/react": "npm:^0.26.23" + "@floating-ui/react-dom": "npm:^2.1.1" + "@floating-ui/utils": "npm:^0.2.7" + "@formkit/auto-animate": "npm:^0.8.2" + "@react-aria/listbox": "npm:^3.13.3" + "@react-aria/overlays": "npm:^3.23.2" + "@react-aria/utils": "npm:^3.25.2" + "@tanstack/react-virtual": "npm:^3.10.5" + "@vanilla-extract/css": "npm:^1.15.5" + "@vanilla-extract/css-utils": "npm:^0.1.4" + "@vanilla-extract/dynamic": "npm:^2.1.2" + "@vanilla-extract/private": "npm:^1.0.6" + "@vanilla-extract/recipes": "npm:^0.5.5" + animejs: "npm:^3.2.2" + bignumber.js: "npm:^9.1.2" + client-only: "npm:^0.0.1" + clsx: "npm:^2.1.1" + copy-to-clipboard: "npm:^3.3.3" + immer: "npm:^10.1.1" + lodash: "npm:^4.17.21" + rainbow-sprinkles: "npm:^0.17.3" + react-aria: "npm:^3.34.3" + react-stately: "npm:^3.32.2" + zustand: "npm:^4.5.5" + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + checksum: 10/30bc0bc47799586f9eb58ed955aa2dc640dce1674653c87603a838462f3bacaaf64ae3202731f86b60aaff7393bf066b472657f51a3e2272e95e3df23b0a878a languageName: node linkType: hard -"@inquirer/search@npm:^1.0.7": - version: 1.0.7 - resolution: "@inquirer/search@npm:1.0.7" +"@internationalized/date@npm:^3.5.6": + version: 3.5.6 + resolution: "@internationalized/date@npm:3.5.6" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/3cd401cc1a7b01772e0e50ee27a0560cc647900f475d28a4f9b07843d4a85e1555c6adc1d7bc38ad2ef3546c524ca82c60272490d0bb159632c03cbe01f52bb1 + "@swc/helpers": "npm:^0.5.0" + checksum: 10/54734b53ca74a32aae368a8f963324352b1fd5b13029b6e82555307b8f2ff355658c90e82a4f38f154a3edf874387d1efd26fc80f2edd068ce04f48f6467f26c languageName: node linkType: hard -"@inquirer/select@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/select@npm:1.2.5" +"@internationalized/message@npm:^3.1.5": + version: 3.1.5 + resolution: "@internationalized/message@npm:3.1.5" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - figures: "npm:^3.2.0" - checksum: 10/42dec9663740db98d043d39aa799f1292d08ed12725520b316bbe3f7cb48d55e3587725072bdf5720220a2d29befb6f80544e914aa5e54bdfb4d4e00c9299f7d + "@swc/helpers": "npm:^0.5.0" + intl-messageformat: "npm:^10.1.0" + checksum: 10/210951fd8055af4db70d465e49bcbbdf2545ed223b936af9c1f18b745a51689ecb0ca49cbd5ee2dbfeccce2447808b7fe309bd12ee81f7e09283f20bf04200e9 languageName: node linkType: hard -"@inquirer/select@npm:^2.4.7": - version: 2.4.7 - resolution: "@inquirer/select@npm:2.4.7" +"@internationalized/number@npm:^3.5.4": + version: 3.5.4 + resolution: "@internationalized/number@npm:3.5.4" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/854a3d0393073913f9bd3bf2e4ec7b8d114dfb48308a0a6698cf5c2c627da2700db5bdb69d054eaec89bd4e52a1274e493fa78d4fa26a5893972d91825456047 - languageName: node - linkType: hard - -"@inquirer/type@npm:^1.1.1": - version: 1.1.1 - resolution: "@inquirer/type@npm:1.1.1" - checksum: 10/1fcce0bd6c92611ed67ee9252deebba0fa9a54aeb4e37fc349ec736c8e1ffaa58f3a02dbe84489ff9a90bebc6b1080a19169ef30c16a18128cf8f42d06a49f51 + "@swc/helpers": "npm:^0.5.0" + checksum: 10/16641aecb58c075a6322dc6b36a2c6e521845296f81b86a128d015f072d1af998289b71b4d8b9521e7576bdeabfaf8067a3e741b0116c8595d82a4461c1ae03b languageName: node linkType: hard -"@inquirer/type@npm:^1.5.2": - version: 1.5.2 - resolution: "@inquirer/type@npm:1.5.2" +"@internationalized/string@npm:^3.2.4": + version: 3.2.4 + resolution: "@internationalized/string@npm:3.2.4" dependencies: - mute-stream: "npm:^1.0.0" - checksum: 10/90d9203b5d7da8530e210c5421630b577f24554c8b683a4b45ea0f5c6a89c451771170aa34f2b62ca57e4be4de41d6761c941475e25c54c82b527c05644f181f + "@swc/helpers": "npm:^0.5.0" + checksum: 10/5fdb7f0bf7fa7055cdf62ded4efd6849d3db9cf0e6d53f349889e2ec9517b9135ad38a6bb8dcf25142c69c381618c0dd1a6a072117dd7cf2867ce17374f0f835 languageName: node linkType: hard @@ -8915,6 +8389,91 @@ __metadata: languageName: node linkType: hard +"@keplr-wallet/common@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/common@npm:0.12.28" + dependencies: + "@keplr-wallet/crypto": "npm:0.12.28" + "@keplr-wallet/types": "npm:0.12.28" + buffer: "npm:^6.0.3" + delay: "npm:^4.4.0" + mobx: "npm:^6.1.7" + checksum: 10/32efe4a89290c89aa5a593a0fa4bf635c0c5b8814d61b80ecc3baea837d2733a355db4cb057184227cf1712658795978cd66e7797574d639e6ba9dbcb7fde3d2 + languageName: node + linkType: hard + +"@keplr-wallet/cosmos@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/cosmos@npm:0.12.28" + dependencies: + "@ethersproject/address": "npm:^5.6.0" + "@keplr-wallet/common": "npm:0.12.28" + "@keplr-wallet/crypto": "npm:0.12.28" + "@keplr-wallet/proto-types": "npm:0.12.28" + "@keplr-wallet/simple-fetch": "npm:0.12.28" + "@keplr-wallet/types": "npm:0.12.28" + "@keplr-wallet/unit": "npm:0.12.28" + bech32: "npm:^1.1.4" + buffer: "npm:^6.0.3" + long: "npm:^4.0.0" + protobufjs: "npm:^6.11.2" + checksum: 10/685e84369f9fa0fd0e292e8c5031b8aa7ee2998285727eb31436b1f7a862e97c6731de6f84fd66ef4a20f0731c013f2f46296f57b7bf52ace6a874c8540004b8 + languageName: node + linkType: hard + +"@keplr-wallet/crypto@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/crypto@npm:0.12.28" + dependencies: + "@ethersproject/keccak256": "npm:^5.5.0" + bip32: "npm:^2.0.6" + bip39: "npm:^3.0.3" + bs58check: "npm:^2.1.2" + buffer: "npm:^6.0.3" + crypto-js: "npm:^4.0.0" + elliptic: "npm:^6.5.3" + sha.js: "npm:^2.4.11" + checksum: 10/76e5cf1c60b5108b9fb5bb5b8a841e6e51cbca76e0707198bef16bf6073cf574baee020216ead8acea8e5e60ee4f7386ee2c290bacfbe333ec1dfc849d942347 + languageName: node + linkType: hard + +"@keplr-wallet/proto-types@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/proto-types@npm:0.12.28" + dependencies: + long: "npm:^4.0.0" + protobufjs: "npm:^6.11.2" + checksum: 10/0537db803ce9a295443c206180220e932798f2769aaa8b552a3d99cbfa3f052ddace0dd50d09eb28bdd32c7d1ca3e10dcd2012c1611575da42650f478b162d5d + languageName: node + linkType: hard + +"@keplr-wallet/simple-fetch@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/simple-fetch@npm:0.12.28" + checksum: 10/36f8d769098b309a5069b992ffc3ed562e97d4e2553d04a97c0f55c423b80435d3b8c38f4ed57b5255c2342bf1675e2eb5cb64f158a6499e753b7e96ca90ef18 + languageName: node + linkType: hard + +"@keplr-wallet/types@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/types@npm:0.12.28" + dependencies: + long: "npm:^4.0.0" + checksum: 10/17ee47aac5690b89feb2109fb901a9af81ad7f94b743ba5de0203b051f7977941a78d3da70ef4ae5c2d82af0afd2de8de156f027c95c05d4f1a1fed39ea2df7d + languageName: node + linkType: hard + +"@keplr-wallet/unit@npm:0.12.28": + version: 0.12.28 + resolution: "@keplr-wallet/unit@npm:0.12.28" + dependencies: + "@keplr-wallet/types": "npm:0.12.28" + big-integer: "npm:^1.6.48" + utility-types: "npm:^3.10.0" + checksum: 10/f18361c2bdc2b59c0b7c3340466cab50d12634056ed89aee8363414e65eb314b570e43d019107c8ae6ee67e533b1b5e5bfa3beaec313763e68297bb9a3d6a3e8 + languageName: node + linkType: hard + "@layerzerolabs/lz-evm-messagelib-v2@npm:^2.0.2": version: 2.0.6 resolution: "@layerzerolabs/lz-evm-messagelib-v2@npm:2.0.6" @@ -9092,6 +8651,22 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.2.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" + checksum: 10/48e28c1f132eb1d5b385454dd23db2837bf913d108a0908e73816ceb594b1b09db34e05ccb86a18fb9c02fc100d62bbab350b6ec88e2c175f2c21c5f0220bfdd + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": + version: 1.6.3 + resolution: "@lit/reactive-element@npm:1.6.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.0.0" + checksum: 10/664c899bb0b144590dc4faf83b358b1504810eac107778c3aeb384affc65a7ef4eda754944bcc34a57237db03dff145332406345ac24da19ca37cf4b3cb343d3 + languageName: node + linkType: hard + "@manypkg/find-root@npm:^1.1.0": version: 1.1.0 resolution: "@manypkg/find-root@npm:1.1.0" @@ -9130,6 +8705,17 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-json-rpc-provider@npm:^1.0.0": + version: 1.0.1 + resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" + dependencies: + "@metamask/json-rpc-engine": "npm:^7.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + checksum: 10/4ed1a96afc32eb46f585ff54e16cb2aee2e7027dcf6a142d875b9c6248f15c9a00dd1df43035f2e64efbf01a96954040699d9d97e3b483c958f5b1d6c0fa6f50 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:^4.0.0": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -9143,6 +8729,318 @@ __metadata: languageName: node linkType: hard +"@metamask/json-rpc-engine@npm:^7.0.0": + version: 7.3.3 + resolution: "@metamask/json-rpc-engine@npm:7.3.3" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10/116664c974c522d280335d9a02cba731e4f08562c2980415f7535513cd308c7e612e52618086996e5ac2b67db7f1e6ac1bd8201aba7825163db17a25f2874cc9 + languageName: node + linkType: hard + +"@metamask/json-rpc-engine@npm:^8.0.1, @metamask/json-rpc-engine@npm:^8.0.2": + version: 8.0.2 + resolution: "@metamask/json-rpc-engine@npm:8.0.2" + dependencies: + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + checksum: 10/f088f4b648b9b55875b56e8237853e7282f13302a9db6a1f9bba06314dfd6cd0a23b3d27f8fde05a157b97ebb03b67bc2699ba455c99553dfb2ecccd73ab3474 + languageName: node + linkType: hard + +"@metamask/json-rpc-middleware-stream@npm:^7.0.1": + version: 7.0.2 + resolution: "@metamask/json-rpc-middleware-stream@npm:7.0.2" + dependencies: + "@metamask/json-rpc-engine": "npm:^8.0.2" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^8.3.0" + readable-stream: "npm:^3.6.2" + checksum: 10/850a857418fc6b8c73fb4f978b76d2cdc0372ccb2f0f7e6f0229117882a4687d716fc37638483c9ac1338f7957b3f8207bc6be8a3d4c0708339fe9dfc3510fe0 + languageName: node + linkType: hard + +"@metamask/object-multiplex@npm:^2.0.0": + version: 2.1.0 + resolution: "@metamask/object-multiplex@npm:2.1.0" + dependencies: + once: "npm:^1.4.0" + readable-stream: "npm:^3.6.2" + checksum: 10/e119f695e89eb20c3174f8ac6d74587498d85cff92c37e83e167cb758b3d3147d5b5e1a997d6198d430ebcf2cede6265bf5d4513fe96dbb2d82bbc6167752caa + languageName: node + linkType: hard + +"@metamask/onboarding@npm:^1.0.1": + version: 1.0.1 + resolution: "@metamask/onboarding@npm:1.0.1" + dependencies: + bowser: "npm:^2.9.0" + checksum: 10/2aa288e58fc34cb4708e311fc08abd33a0d9bc67671610955a2bd8d43a16330261f1159174c365611e249751ec984da9a9cb963bb0a87b3a6945d7caa6cc8799 + languageName: node + linkType: hard + +"@metamask/providers@npm:16.1.0": + version: 16.1.0 + resolution: "@metamask/providers@npm:16.1.0" + dependencies: + "@metamask/json-rpc-engine": "npm:^8.0.1" + "@metamask/json-rpc-middleware-stream": "npm:^7.0.1" + "@metamask/object-multiplex": "npm:^2.0.0" + "@metamask/rpc-errors": "npm:^6.2.1" + "@metamask/safe-event-emitter": "npm:^3.1.1" + "@metamask/utils": "npm:^8.3.0" + detect-browser: "npm:^5.2.0" + extension-port-stream: "npm:^3.0.0" + fast-deep-equal: "npm:^3.1.3" + is-stream: "npm:^2.0.0" + readable-stream: "npm:^3.6.2" + webextension-polyfill: "npm:^0.10.0" + checksum: 10/596bcc0206355e5698cc41458b07caa748f589790e1a3210f1a32d21103a3318902d953a641d4583b8179d653659ba29c42e65fba019a98533bdcf68316bf915 + languageName: node + linkType: hard + +"@metamask/rpc-errors@npm:^6.2.1": + version: 6.4.0 + resolution: "@metamask/rpc-errors@npm:6.4.0" + dependencies: + "@metamask/utils": "npm:^9.0.0" + fast-safe-stringify: "npm:^2.0.6" + checksum: 10/9a17525aa8ce9ac142a94c04000dba7f0635e8e155c6c045f57eca36cc78c255318cca2fad4571719a427dfd2df64b70bc6442989523a8de555480668d666ad5 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/safe-event-emitter@npm:2.0.0" + checksum: 10/3e4f00c64aa1ddf9b9ae5c2337fb8cee359b6c481ded0ec21ef70610960c51cdcc4a9b569de334dcd7cb1fe445cafd298360907c1e211e244c5990b55246f350 + languageName: node + linkType: hard + +"@metamask/safe-event-emitter@npm:^3.0.0, @metamask/safe-event-emitter@npm:^3.1.1": + version: 3.1.2 + resolution: "@metamask/safe-event-emitter@npm:3.1.2" + checksum: 10/8ef7579f9317eb5c94ecf3e6abb8d13b119af274b678805eac76abe4c0667bfdf539f385e552bb973e96333b71b77aa7c787cb3fce9cd5fb4b00f1dbbabf880d + languageName: node + linkType: hard + +"@metamask/sdk-communication-layer@npm:0.30.0": + version: 0.30.0 + resolution: "@metamask/sdk-communication-layer@npm:0.30.0" + dependencies: + bufferutil: "npm:^4.0.8" + date-fns: "npm:^2.29.3" + debug: "npm:^4.3.4" + utf-8-validate: "npm:^5.0.2" + uuid: "npm:^8.3.2" + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: ^0.3.16 + eventemitter2: ^6.4.7 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + checksum: 10/a68f67abbff258f89d3179869f85f7353e36ea26d2ba1e226a43959701207dff1015c5c2536a2a7afd72c8414131e451c84df9b926079f8b930c299328342b92 + languageName: node + linkType: hard + +"@metamask/sdk-install-modal-web@npm:0.30.0": + version: 0.30.0 + resolution: "@metamask/sdk-install-modal-web@npm:0.30.0" + dependencies: + qr-code-styling: "npm:^1.6.0-rc.1" + peerDependencies: + i18next: 23.11.5 + react: ^18.2.0 + react-dom: ^18.2.0 + react-native: "*" + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + react-native: + optional: true + checksum: 10/b1ea701706fcbb734c6e780bb3a28e4fe2cea99b8e03faf4330b0fe2682b0ec31d35c79fab4bd007584937d32602f4eb0f09ae1c1dd0fdec927de229014e1c6d + languageName: node + linkType: hard + +"@metamask/sdk@npm:0.30.1": + version: 0.30.1 + resolution: "@metamask/sdk@npm:0.30.1" + dependencies: + "@metamask/onboarding": "npm:^1.0.1" + "@metamask/providers": "npm:16.1.0" + "@metamask/sdk-communication-layer": "npm:0.30.0" + "@metamask/sdk-install-modal-web": "npm:0.30.0" + bowser: "npm:^2.9.0" + cross-fetch: "npm:^4.0.0" + debug: "npm:^4.3.4" + eciesjs: "npm:^0.4.8" + eth-rpc-errors: "npm:^4.0.3" + eventemitter2: "npm:^6.4.7" + i18next: "npm:23.11.5" + i18next-browser-languagedetector: "npm:7.1.0" + obj-multiplex: "npm:^1.0.0" + pump: "npm:^3.0.0" + qrcode-terminal-nooctal: "npm:^0.12.1" + react-native-webview: "npm:^11.26.0" + readable-stream: "npm:^3.6.2" + socket.io-client: "npm:^4.5.1" + util: "npm:^0.12.4" + uuid: "npm:^8.3.2" + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10/a30e975de75493daefcd34eebf37ebbe13a9aa811cf5acb82f727742f86fdef3a051f9abd209478e0f9c65efa0d4ea5010d4efcdb0d5701c05e317172ac30dfc + languageName: node + linkType: hard + +"@metamask/superstruct@npm:^3.0.0, @metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 10/5066fe228d5f11da387606d7f9545de2b473ab5a9e0f1bb8aea2f52d3e2c9d25e427151acde61f4a2de80a07a9871fe9505ad06abca6a61b7c3b54ed5c403b01 + languageName: node + linkType: hard + +"@metamask/utils@npm:^5.0.1": + version: 5.0.2 + resolution: "@metamask/utils@npm:5.0.2" + dependencies: + "@ethereumjs/tx": "npm:^4.1.2" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + semver: "npm:^7.3.8" + superstruct: "npm:^1.0.3" + checksum: 10/c0d3ee4c3144b557936ab01c1a64950c0f99782bd0cf5596c0fabe8fd224dba48ed3483c0ea954791fe2ee81064a445adb489df50c776bbbeb67b5b96e930115 + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.3.0": + version: 8.5.0 + resolution: "@metamask/utils@npm:8.5.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.0.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/68a42a55f7dc750b75467fb7c05a496c20dac073a2753e0f4d9642c4d8dcb3f9ddf51a09d30337e11637f1777f3dfe22e15b5159dbafb0fdb7bd8c9236056153 + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 + languageName: node + linkType: hard + +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/animation@npm:10.18.0" + dependencies: + "@motionone/easing": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/c7fc04dd10d6cade3d3b63d26f2532a2b2731233afc0454722e55ad8061fb3923d926db9cc09f1bcedb39f504fcee1e80adaab270523846998aad3017364a583 + languageName: node + linkType: hard + +"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": + version: 10.18.0 + resolution: "@motionone/dom@npm:10.18.0" + dependencies: + "@motionone/animation": "npm:^10.18.0" + "@motionone/generators": "npm:^10.18.0" + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 10/18abb5c174a84c90b2e59459fa3a9f8b655d063c259f2f3be5b6740e660285d2f66a8b25437dd963c3b9cdeae9fa5984ee8d217881088ea4d392cf39f8493a84 + languageName: node + linkType: hard + +"@motionone/easing@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/easing@npm:10.18.0" + dependencies: + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/a455a06ccee907ce9da7b1dfe392060a473132733e3f92bbee3a99c36af7baa333cf3c6e38c6d44ad0f9878fdafca3c3f4bcfe55aaeb2a633e45d8e0429f8fa5 + languageName: node + linkType: hard + +"@motionone/generators@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/generators@npm:10.18.0" + dependencies: + "@motionone/types": "npm:^10.17.1" + "@motionone/utils": "npm:^10.18.0" + tslib: "npm:^2.3.1" + checksum: 10/149720881e8db6a1ff38cea98349c3a00f72e5318b645459b68a2aeddb1f2be63ad2ae8978f6c4a63e2414f39e65f06de13a43fd35cf24dc3fb3e3c7f87526bc + languageName: node + linkType: hard + +"@motionone/svelte@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/svelte@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 10/5ad532d4d9bb16a9f311487e6409fa7e1a66ec12f82e3c36434ab6dfe3cedc61b35dae6314cee4fba8dca463b8a259cafb83801a932b7ad5f4a6e45baaa581f4 + languageName: node + linkType: hard + +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.1": + version: 10.17.1 + resolution: "@motionone/types@npm:10.17.1" + checksum: 10/21d92d733ba30f810b72609fe04f2ef86125ba0160b826974605cc4cc5fbb6ab7bbf1640cbc64fd6298eb8d36fb920ad3ca646c76adf0e2c47a4920200616952 + languageName: node + linkType: hard + +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/utils@npm:10.18.0" + dependencies: + "@motionone/types": "npm:^10.17.1" + hey-listen: "npm:^1.0.8" + tslib: "npm:^2.3.1" + checksum: 10/0fa9232d132383880d6004522ded763d60f490946584e02bca7f64df98fae07421071f3a85de06aa6ecb52632a47a7586b4143e824e459a87cc852fab657e549 + languageName: node + linkType: hard + +"@motionone/vue@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/vue@npm:10.16.4" + dependencies: + "@motionone/dom": "npm:^10.16.4" + tslib: "npm:^2.3.1" + checksum: 10/2400d31bbf5c3e02bc68f4b88d96d9c0672ba646bca0b6566e555cd7e8f14849a645f558f574e658fd90574a0b548b61712ae5edcee055c60288fd9382d711ea + languageName: node + linkType: hard + "@ndelangen/get-tarball@npm:^3.0.7": version: 3.0.9 resolution: "@ndelangen/get-tarball@npm:3.0.9" @@ -9154,7 +9052,23 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.6.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.4.2, @noble/curves@npm:~1.6.0": +"@noble/ciphers@npm:^1.0.0": + version: 1.0.0 + resolution: "@noble/ciphers@npm:1.0.0" + checksum: 10/0a03d2bfac316f6f235ae4cdbeeba372f8d32997239c27cb56d55cbd3d42e0f867e8d7c8d76716f5f645bb7d5d73f05ba1f2d2e7d8391e86936e3b97021bfcf6 + languageName: node + linkType: hard + +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" + dependencies: + "@noble/hashes": "npm:1.4.0" + checksum: 10/f433a2e8811ae345109388eadfa18ef2b0004c1f79417553241db4f0ad0d59550be6298a4f43d989c627e9f7551ffae6e402a4edf0173981e6da95fc7cab5123 + languageName: node + linkType: hard + +"@noble/curves@npm:1.6.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.4.2, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.6.0": version: 1.6.0 resolution: "@noble/curves@npm:1.6.0" dependencies: @@ -9186,7 +9100,14 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:~1.5.0": +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.5.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.5.0": version: 1.5.0 resolution: "@noble/hashes@npm:1.5.0" checksum: 10/da7fc7af52af7afcf59810a7eea6155075464ff462ffda2572dc6d57d53e2669b1ea2ec774e814f6273f1697e567f28d36823776c9bf7068cba2a2855140f26e @@ -9224,7 +9145,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -9234,6 +9155,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 10/0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@nomicfoundation/edr-darwin-arm64@npm:0.3.3": version: 0.3.3 resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.3.3" @@ -9758,7 +9686,7 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts-upgradeable@npm:^4.9.3, @openzeppelin/contracts-upgradeable@npm:^v4.9.3": +"@openzeppelin/contracts-upgradeable@npm:^4.9.3": version: 4.9.3 resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.3" checksum: 10/d8fd6fd9d2271fbdd3958c20769b72a241687883ecd3bea05a3969568cdcabdee9d53c21ac776a651c397507d9c22d8db0a4fb970d27bdab918979fae7285a2f @@ -9875,6 +9803,161 @@ __metadata: languageName: node linkType: hard +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-wasm@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher-wasm@npm:2.5.0" + dependencies: + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + napi-wasm: "npm:^1.1.0" + checksum: 10/2e17915320267b6d6305406a4b59cb0b0e88eb93ba6acc61c5382c517421a9132992fb8d1468a0030ee9945a1d6216ee6112452e78b30089590cd206c49d98a0 + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10/1e28b1aa9a63456ebfa7af3e41297d088bd31d9e32548604f4f26ed96c5808f4330cd515062e879c24a9eaab7894066c8a3951ee30b59e7cbe6786ab2c790dae + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -9909,6 +9992,13 @@ __metadata: languageName: node linkType: hard +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10/ddd16090cde777aaf102940f05d0274602079a95ad9805bd20bc55dcc7c3a2ba1b99dd5c73e5cc2753c3d31250ca52a67d58059459d7d27debb983a9f552936c + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -10703,6 +10793,219 @@ __metadata: languageName: node linkType: hard +"@rainbow-me/rainbowkit@npm:^2.2.0": + version: 2.2.0 + resolution: "@rainbow-me/rainbowkit@npm:2.2.0" + dependencies: + "@vanilla-extract/css": "npm:1.15.5" + "@vanilla-extract/dynamic": "npm:2.1.2" + "@vanilla-extract/sprinkles": "npm:1.6.3" + clsx: "npm:2.1.1" + qrcode: "npm:1.5.4" + react-remove-scroll: "npm:2.6.0" + ua-parser-js: "npm:^1.0.37" + peerDependencies: + "@tanstack/react-query": ">=5.0.0" + react: ">=18" + react-dom: ">=18" + viem: 2.x + wagmi: ^2.9.0 + checksum: 10/5848d39c2b34b533481ed636e44de2cde9d25cbe3fc5bebd77ce1e60ebddcb5cbfc3bfc3ecbc93a74c0fc8ddff4a4b098e2174b6a35a45231a0351e54ccd3ed4 + languageName: node + linkType: hard + +"@react-aria/breadcrumbs@npm:^3.5.18": + version: 3.5.18 + resolution: "@react-aria/breadcrumbs@npm:3.5.18" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/breadcrumbs": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4f4eaa50606a725bc00e95cc2123bed3db32c03c4a93067aeac12ea1d577cde34f2b4021f0eaace3a4e35dd77a0d36ad057449e7f50dbff1964d2de82f3aa9a0 + languageName: node + linkType: hard + +"@react-aria/button@npm:^3.10.1": + version: 3.10.1 + resolution: "@react-aria/button@npm:3.10.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/da59869337fb810adf4fef3f10a8b687604193533deec347e1f67ce48b04a2a07b4b83ef463f5b03fa6134e254fad0afc3a94e63cbda59022fbb09e3b99f7f5b + languageName: node + linkType: hard + +"@react-aria/calendar@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-aria/calendar@npm:3.5.13" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/calendar": "npm:^3.5.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8e5d5a556d9b94e0f98452944f409d189cab20111ea87ef1151c27763236cd778dc836d63a49832d792279ab2a6dc5cffb01fa099073986b1dac58f0d41af7ee + languageName: node + linkType: hard + +"@react-aria/checkbox@npm:^3.14.8": + version: 3.14.8 + resolution: "@react-aria/checkbox@npm:3.14.8" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/toggle": "npm:^3.10.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4389f9650da1a58c027ac63ce7973c6886ba0d9b3c19d2267e2e0c08f64aa0f97070c2a67d74b2d1758f9b50ca009ed2f2a5999dca5a6f392c163b7e0c4a9b23 + languageName: node + linkType: hard + +"@react-aria/color@npm:^3.0.1": + version: 3.0.1 + resolution: "@react-aria/color@npm:3.0.1" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a805e173fe48db2ef5e550fee96829891d527be190d6af2c7d6ce66db6a04c6a3524148576f6e86d99dff43b8475493a428f81a07676a0d954611f45fe304ef + languageName: node + linkType: hard + +"@react-aria/combobox@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/combobox@npm:3.10.5" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8267d6dc11fdaef68cbabce8d17f4d9f4943e3eb7de8cad93e316a4f3fd0d68334b68e01a9e9bc3ed6f4f09b2e5c6f6c497d49b2544a15242dec64ee8a7b84e5 + languageName: node + linkType: hard + +"@react-aria/datepicker@npm:^3.11.4": + version: 3.11.4 + resolution: "@react-aria/datepicker@npm:3.11.4" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/button": "npm:^3.10.0" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/11a6f8249139ca902bad9ec5b52a252ed08635afbcebd4a5516359e6b79487b70a42d000b0cf11c40cf4b4c3cb2e5a34aae9b702c67f0b20420086ac6b6b4233 + languageName: node + linkType: hard + +"@react-aria/dialog@npm:^3.5.19": + version: 3.5.19 + resolution: "@react-aria/dialog@npm:3.5.19" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/dialog": "npm:^3.5.13" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/44eba70f927cbdb003da37021ee6dde363abfa3c179437d83e19c72931c0fab12db20dbd603578d372df534ddce119e22b6908935544ce7a696523aa71b72e2e + languageName: node + linkType: hard + +"@react-aria/dnd@npm:^3.7.4": + version: 3.7.4 + resolution: "@react-aria/dnd@npm:3.7.4" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/02ea56a553a79bc9669e1ed1fbfec5d073e0627262112a215f9c8789c069cb8393f3ee761860e369601939a2f7f15a1462ca1e5ada1a8373bd29a21517e2dfae + languageName: node + linkType: hard + "@react-aria/focus@npm:^3.17.1": version: 3.18.2 resolution: "@react-aria/focus@npm:3.18.2" @@ -10718,6 +11021,100 @@ __metadata: languageName: node linkType: hard +"@react-aria/focus@npm:^3.18.4": + version: 3.18.4 + resolution: "@react-aria/focus@npm:3.18.4" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + clsx: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/912cd8a98cbe978240991bec8077c7956ca03ee78cb10152c7a1131a53fb622a5c9b87a4047909f032a7550c37ed9ec50488437a17c761c5c852b721cbaa0bd2 + languageName: node + linkType: hard + +"@react-aria/form@npm:^3.0.10": + version: 3.0.10 + resolution: "@react-aria/form@npm:3.0.10" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/339b75055b9332e6f082dccf3b3d8c5fb2b5f72ab65a2b1f2e17ac2d2140dde543f18b36501378e7ee4703e4dee49a1dc324ddea2f42614f6c11a827c72856c8 + languageName: node + linkType: hard + +"@react-aria/grid@npm:^3.10.5": + version: 3.10.5 + resolution: "@react-aria/grid@npm:3.10.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bbfccebfdc0aafb53d21f5bdc0b3e96ecd2e7d197c277938e6d373fdc560496cd633358aeb03ec3c2b020d2f7a2ddddb2bc3ab2c7fbc4d95a4403fee0dca1a2b + languageName: node + linkType: hard + +"@react-aria/gridlist@npm:^3.9.5": + version: 3.9.5 + resolution: "@react-aria/gridlist@npm:3.9.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a36d1028bf1affa6d628326ce1af303dbc2691d14e02f154563fe4177bfae3116fbef69282898a1bfeaf8d1c6c0f04e28ab2335e0cd09506a64a9b1a084987e7 + languageName: node + linkType: hard + +"@react-aria/i18n@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-aria/i18n@npm:3.12.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/message": "npm:^3.1.5" + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/54f111d9a9da68edcb8b821f7c8ead92f0c4d85307dbabee78bc5c89f5a19cdfa406b1e40b7c6f9dc26f7cedce4c9c5a10f8dcdae289e5a404c07b6fdda98aba + languageName: node + linkType: hard + "@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.2": version: 3.22.2 resolution: "@react-aria/interactions@npm:3.22.2" @@ -10732,6 +11129,306 @@ __metadata: languageName: node linkType: hard +"@react-aria/interactions@npm:^3.22.4": + version: 3.22.4 + resolution: "@react-aria/interactions@npm:3.22.4" + dependencies: + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/095d084bd642b47a5cc2a846fa50e0953682ddcad694cc78df344b1f235e292945746692f84d27f465f7ff0117b485c3f5b69f050be196df0c3e7343d3239551 + languageName: node + linkType: hard + +"@react-aria/label@npm:^3.7.12": + version: 3.7.12 + resolution: "@react-aria/label@npm:3.7.12" + dependencies: + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f93475462e0b962e9447f4c13c6d6ed0862e56c02747f87a81c986f6abaa1226fd215d5a32844e94b0a032cba36f80b3b6e05eed2926553cd30ab631a791bb64 + languageName: node + linkType: hard + +"@react-aria/link@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-aria/link@npm:3.7.6" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c14fb2abbd5c6b3f539fce11c244aa36f698ba6cb8dd591a0a79b2aedd499d81b1c2c6af03fa29a1531509bb9194483805c30773f17be015fbc9ccbac47b5023 + languageName: node + linkType: hard + +"@react-aria/listbox@npm:^3.13.3, @react-aria/listbox@npm:^3.13.5": + version: 3.13.5 + resolution: "@react-aria/listbox@npm:3.13.5" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/list": "npm:^3.11.0" + "@react-types/listbox": "npm:^3.5.2" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/631ec625e0c3e9db0fa2701bd288f093128e4b49558129467d34dee0748eb6ac371bf63f716ef62fbdff9e4f5d4a33e0ca1b45aae1213c7f624f799b2f0ec4b6 + languageName: node + linkType: hard + +"@react-aria/live-announcer@npm:^3.4.0": + version: 3.4.0 + resolution: "@react-aria/live-announcer@npm:3.4.0" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/d5fdd048eaaf2d048881d5b8fec369e558c039a4461908b10a28f2d7dc39b94b3b7b1eb385f9e577f7cf6e5f8e0e233facfbed0da98df3abffb1d74b3c8beb89 + languageName: node + linkType: hard + +"@react-aria/menu@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/menu@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/button": "npm:^3.10.0" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6714b959f34497e6377732103b83dabb6011cb95df61fa6a415a9737d8fad70a8e419b60ab4f4f553b5f034fba9f07104b0e6f7756c5cec64048e7d9ef743ac0 + languageName: node + linkType: hard + +"@react-aria/meter@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/meter@npm:3.4.17" + dependencies: + "@react-aria/progress": "npm:^3.4.17" + "@react-types/meter": "npm:^3.4.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4d485940733dfb2f2a3fc77ef3c98ec78a37fcbd258cc343444616591998c72ef473dfbc3f3111b845de41f9cfc211a2636c579b122844226f39dca0072c5f73 + languageName: node + linkType: hard + +"@react-aria/numberfield@npm:^3.11.8": + version: 3.11.8 + resolution: "@react-aria/numberfield@npm:3.11.8" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/spinbutton": "npm:^3.6.9" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/numberfield": "npm:^3.8.6" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2709e946298ee4a3be1802fddc87921e96be23c058c1fd50564a7c13e96779507de0ad005a3b51aefe41bcf0abf115ebb15f3be69887db4151bf2bcf7efec0eb + languageName: node + linkType: hard + +"@react-aria/overlays@npm:^3.23.2, @react-aria/overlays@npm:^3.23.4": + version: 3.23.4 + resolution: "@react-aria/overlays@npm:3.23.4" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/button": "npm:^3.10.0" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/6f641a1f7c1976758dd062c4345d2e8882575e2b645a4e4693f051699bae48c48979db3539e77c387aee64600d7a555b94687cd01449094cf875ce80ec6aa2ed + languageName: node + linkType: hard + +"@react-aria/progress@npm:^3.4.17": + version: 3.4.17 + resolution: "@react-aria/progress@npm:3.4.17" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/progress": "npm:^3.5.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/72c97dcd5b0fbbf5bde0d4282887d6621f7ad31f1895c93f77528ad54c673122a93aeea555ef517eb58dd3ae5e57310d15d5cd722870b4797a97673ebd449c95 + languageName: node + linkType: hard + +"@react-aria/radio@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/radio@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/radio": "npm:^3.10.8" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5254109a582d97eb9505c98b256de9b45ef019fb8a0e397def279be05ed539b69ea3c0e7842896df1574d576600a5168ae6e5a1178d8ee3ea0ba600be33ec143 + languageName: node + linkType: hard + +"@react-aria/searchfield@npm:^3.7.10": + version: 3.7.10 + resolution: "@react-aria/searchfield@npm:3.7.10" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-types/button": "npm:^3.10.0" + "@react-types/searchfield": "npm:^3.5.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1ec6fc47c85b7ca8677683bcc54a88c471314931a876040425ec16e1f92293e635f55ee638f885592927b4c2d7f7fb797c6272511cca526d3fcfbb0c64660ba0 + languageName: node + linkType: hard + +"@react-aria/select@npm:^3.14.11": + version: 3.14.11 + resolution: "@react-aria/select@npm:3.14.11" + dependencies: + "@react-aria/form": "npm:^3.0.10" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/select": "npm:^3.6.8" + "@react-types/button": "npm:^3.10.0" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/580a72f0d5738d30fbf31c6f4e56b69f5a0f1c5ef56d5da069c128540740ecc88b2ef285829ad3bedf7a2fed76255250fd54c94d46e705667ccc8f6d045e0553 + languageName: node + linkType: hard + +"@react-aria/selection@npm:^3.20.1": + version: 3.20.1 + resolution: "@react-aria/selection@npm:3.20.1" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/38693581ab743fb4e23a7d16a370330b5462c42119ae38862623a7ace2466f74f080dee50df9f3d1ab4d83c58a3ac17a5197061e5a31b70d6f14993109c468e8 + languageName: node + linkType: hard + +"@react-aria/separator@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-aria/separator@npm:3.4.3" + dependencies: + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c30b4386283dd7658377952a708b27c103c8c1f9077bdca3f67e4458be6dd327d8884f2036442ef8cebc698a4444be248bcc0ace202db9a2c30d44ce1b3ee5db + languageName: node + linkType: hard + +"@react-aria/slider@npm:^3.7.13": + version: 3.7.13 + resolution: "@react-aria/slider@npm:3.7.13" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/slider": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/48f666cd6171daa5c6913409a0ef9ee94fdb5471af5b03f9960fd659308e586dafc821251c7b861595e44d5b9222796ddb7783e239ddc039f9d7f944309f454f + languageName: node + linkType: hard + +"@react-aria/spinbutton@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/spinbutton@npm:3.6.9" + dependencies: + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/98ed79bfd2b502a91833f5546e665c514aec3367d9cc902d32c7c6a18be4b332e905322f9916e39e64aea2cbf08da368faee6916991a861c6719ad4b7b58951f + languageName: node + linkType: hard + "@react-aria/ssr@npm:^3.9.5": version: 3.9.5 resolution: "@react-aria/ssr@npm:3.9.5" @@ -10743,6 +11440,151 @@ __metadata: languageName: node linkType: hard +"@react-aria/ssr@npm:^3.9.6": + version: 3.9.6 + resolution: "@react-aria/ssr@npm:3.9.6" + dependencies: + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ea6b290346ce1e119ed9233fc0e34693d52ab9dc2509f07ab10710409b89484a544b7f26c1438802e97f3fb634844ae54638850cdd95caca0d1f5571781bf982 + languageName: node + linkType: hard + +"@react-aria/switch@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-aria/switch@npm:3.6.9" + dependencies: + "@react-aria/toggle": "npm:^3.10.9" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/shared": "npm:^3.25.0" + "@react-types/switch": "npm:^3.5.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ce627d19e48db97fbf7f5201e0d8c8108aa5f59714ca44e852902a1e6483e5f0b929e6523534ca9d5fdefbbf3c36414cb9c52a914ce13e8bd44d2f818bd4c853 + languageName: node + linkType: hard + +"@react-aria/table@npm:^3.15.5": + version: 3.15.5 + resolution: "@react-aria/table@npm:3.15.5" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/grid": "npm:^3.10.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/live-announcer": "npm:^3.4.0" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/table": "npm:^3.12.3" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ef229d6d6319c8cfa135c56a7eeb6915e72a3f9d05dc49f51222cf79990976fdb18529b3bf3038aca82ac71d75058b0b09507d70dbfa0fd4166afa3671e5f19a + languageName: node + linkType: hard + +"@react-aria/tabs@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-aria/tabs@npm:3.9.7" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/17837148337d68cb1b2468b76967b809a3c085c19da1dab3e7d701e585499e66d926f9ebec410de2c6a925b37d232871412b36c657fa54c4e48048b63ef4ad74 + languageName: node + linkType: hard + +"@react-aria/tag@npm:^3.4.7": + version: 3.4.7 + resolution: "@react-aria/tag@npm:3.4.7" + dependencies: + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/list": "npm:^3.11.0" + "@react-types/button": "npm:^3.10.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1624d1b6f44bf350dc46e0ee8a1550123ce73c4a2508e325e2eee4603bc5cb13d8f8d8a997be12c34756b47154d4a1e60281d572615a97507198bcd65d80b870 + languageName: node + linkType: hard + +"@react-aria/textfield@npm:^3.14.10": + version: 3.14.10 + resolution: "@react-aria/textfield@npm:3.14.10" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/form": "npm:^3.0.10" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bac8bb98030ff889bee1d57abbfd073b31a23b275e6aea0a0f27b829e37eb041c836873daa507d4def8abc233a24bf56bf9aad6bdfb9a21412e4a3e7b47e1a34 + languageName: node + linkType: hard + +"@react-aria/toggle@npm:^3.10.9": + version: 3.10.9 + resolution: "@react-aria/toggle@npm:3.10.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/toggle": "npm:^3.7.8" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/51adc665376a36cf0ccf2250d7ef1c5c4c97073c5e9dc987b7e0710a1c3c7916e668d2fca6e84fff60a16b586206260b6fc27e3267e65ae4fd670b4ca70643d1 + languageName: node + linkType: hard + +"@react-aria/tooltip@npm:^3.7.9": + version: 3.7.9 + resolution: "@react-aria/tooltip@npm:3.7.9" + dependencies: + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tooltip": "npm:^3.4.12" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2e043bc87a8aa4e95e16c8d0ec98812cedd6b6e32099700b1fd2acdea74cf357c1476e1f5bf17c3b1bd45642089b2a09a0f1fb245544023146226df665fae594 + languageName: node + linkType: hard + "@react-aria/utils@npm:^3.25.2": version: 3.25.2 resolution: "@react-aria/utils@npm:3.25.2" @@ -10758,6 +11600,418 @@ __metadata: languageName: node linkType: hard +"@react-aria/utils@npm:^3.25.3": + version: 3.25.3 + resolution: "@react-aria/utils@npm:3.25.3" + dependencies: + "@react-aria/ssr": "npm:^3.9.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + clsx: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/86aed35da5cb0d48d949e40bf8226d5a6d6c92a8cdc60e3e12d524d1f3cc91ab6b54c5e1642823773cbb889fb61af7da22e89488b704b56fc5f4d8d59da7519b + languageName: node + linkType: hard + +"@react-aria/visually-hidden@npm:^3.8.17": + version: 3.8.17 + resolution: "@react-aria/visually-hidden@npm:3.8.17" + dependencies: + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/utils": "npm:^3.25.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/d9cdc97d80e750f4582cc3f2bcc0bde12b6c70fbd408ca9ebba2ef654ab27b0181cdd072a8b30ae36f14d9ec16a79c2d38d7cbe834c96fad693daebc7be41616 + languageName: node + linkType: hard + +"@react-icons/all-files@npm:^4.1.0": + version: 4.1.0 + resolution: "@react-icons/all-files@npm:4.1.0" + peerDependencies: + react: "*" + checksum: 10/56252b205bd5960e605e9de9a9eacd4b2a5cf9f2e6156f4a1803eee502a7d1749e479a56d68dfc5514decc06cf4ffdf11e36c71359a984892c54cfc4a4604bc8 + languageName: node + linkType: hard + +"@react-native-async-storage/async-storage@npm:^1.17.7": + version: 1.24.0 + resolution: "@react-native-async-storage/async-storage@npm:1.24.0" + dependencies: + merge-options: "npm:^3.0.4" + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + checksum: 10/5a6b7ac8bd7a9e537a53a3f2301530c284fd885a45ce4a4e0014859bc0f7c89bee5c4b5a6b3740b8d83751561159b237474d18f32fad75ea7d56d4ddb2180d91 + languageName: node + linkType: hard + +"@react-stately/calendar@npm:^3.5.5": + version: 3.5.5 + resolution: "@react-stately/calendar@npm:3.5.5" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/97d436bcedfff4975c74da301ad71fd63b329da5cf2ffe4ed80c71539decaa47000e24f11de2e6bf78378cfa68501aa4320448f686cdde6f7b1d7d6ecddc7b97 + languageName: node + linkType: hard + +"@react-stately/checkbox@npm:^3.6.9": + version: 3.6.9 + resolution: "@react-stately/checkbox@npm:3.6.9" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/45fe2277fc40ab457d374de150376f3093868153aeb144c3d7810ca2cfab15f5edb2adba7ed213eb3ee4e038cacb0607ce1f67e5066eaf9cd69b8b59577c8339 + languageName: node + linkType: hard + +"@react-stately/collections@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/collections@npm:3.11.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/241bedc27fb6f156d21642ab6a5ecc67b000569c6da58b93e693c1d2c57b27eaf58e71aabab8b5041e023d67ea8cbdf771e8a5bea43b86f1904ff1f4682a49da + languageName: node + linkType: hard + +"@react-stately/color@npm:^3.8.0": + version: 3.8.0 + resolution: "@react-stately/color@npm:3.8.0" + dependencies: + "@internationalized/number": "npm:^3.5.4" + "@internationalized/string": "npm:^3.2.4" + "@react-aria/i18n": "npm:^3.12.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/color": "npm:^3.0.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9049c3222707e3699fb2a22ee6d6be89e5b9c4b784a46fb9d4b9d22c9e09974905902d37a228bc344efed8147d40dd5bbc59875cc54ccb92d6d2d4827e89281e + languageName: node + linkType: hard + +"@react-stately/combobox@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-stately/combobox@npm:3.10.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/combobox": "npm:^3.13.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8897052576e311c522db246f11f950e62f19d41f4739c4992c9485f1c4ee0e1d7675421c6f0d982f3a5ae5c7de874d2050749ed44e08a316405a5fa960e993ac + languageName: node + linkType: hard + +"@react-stately/data@npm:^3.11.7": + version: 3.11.7 + resolution: "@react-stately/data@npm:3.11.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/31ba0cb0d1363370c7b22c3bb152e4556ff93e72dca2a4cb042e4750c32a835a15c42d262bde4e0ab4e9ddee6c0c5e501a0ebcb032d476db16fd63407f9504b8 + languageName: node + linkType: hard + +"@react-stately/datepicker@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/datepicker@npm:3.10.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@internationalized/string": "npm:^3.2.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/datepicker": "npm:^3.8.3" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/f3435997c14dc8466ecac63171412296021323c2b935795b067bddb165afcccb06ef85f425315aa3b0d2073b9b26549d33cc0e97d7416368c45b955ecc4228ef + languageName: node + linkType: hard + +"@react-stately/dnd@npm:^3.4.3": + version: 3.4.3 + resolution: "@react-stately/dnd@npm:3.4.3" + dependencies: + "@react-stately/selection": "npm:^3.17.0" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ecfadefa4be8e914af040a376c64e1a2945f3a53f9374d4446615c5a33e81e0f1a2732c177a4fac37fec44ee6acb66338757f7ebbb2d6c20d643fdcc92e6366a + languageName: node + linkType: hard + +"@react-stately/flags@npm:^3.0.4": + version: 3.0.4 + resolution: "@react-stately/flags@npm:3.0.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10/de1004c2e670a4876d4cb7beae9058e1e1ded410c4b51b11d076ad66feb83b0461321617fce488143330d17c0ab468641ddbd3e9883ed4371ed4578d61834bdf + languageName: node + linkType: hard + +"@react-stately/form@npm:^3.0.6": + version: 3.0.6 + resolution: "@react-stately/form@npm:3.0.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/9bd911e7d23ae334a025a0000f9b4faa4e86384c26f07534acfc86e467d2d9507b89f6bf54f54f3aad661cf97d86398ef2bc5b0bd69f2a8602b42b7f5bded78c + languageName: node + linkType: hard + +"@react-stately/grid@npm:^3.9.3": + version: 3.9.3 + resolution: "@react-stately/grid@npm:3.9.3" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c2dcd9cda30c4bc6ae7da0f612c9d288734e5ab58be674f1e4983d6dd5e0def0cac4be3a759b4974a49b97476d9119c92b79fba8b40576696f370fc30b7b684f + languageName: node + linkType: hard + +"@react-stately/list@npm:^3.11.0": + version: 3.11.0 + resolution: "@react-stately/list@npm:3.11.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1ba76430c5c112311fc07a6861fd7046562a60d25676d2a14dfb76cb9a00d0673b241ef11093551f819276b3dc7261d2fd7ffaf2b61c8fd634b03672c4443861 + languageName: node + linkType: hard + +"@react-stately/menu@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-stately/menu@npm:3.8.3" + dependencies: + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/menu": "npm:^3.9.12" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/67c73ca6adfaa24a836a148a7b57cbe348aac5b865cd58525d1fc41f2abd17da0540565ffba509c216de1008d8b24ae87a198aa8057b34825a0668090e2d0d27 + languageName: node + linkType: hard + +"@react-stately/numberfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-stately/numberfield@npm:3.9.7" + dependencies: + "@internationalized/number": "npm:^3.5.4" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/numberfield": "npm:^3.8.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/da4d0493d5a8e76af9a4d66ec477999fd9e26acc07dfc025494425ccdf3c5d72b104cfa9933b549e5c47b389dc7dfdc00ba34703d4d88da3e2171ddc44508385 + languageName: node + linkType: hard + +"@react-stately/overlays@npm:^3.6.11": + version: 3.6.11 + resolution: "@react-stately/overlays@npm:3.6.11" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/overlays": "npm:^3.8.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/98190b4b0ced5c94d924cf97b5d43a6e28f68aa44de7bb789c20354f30f00309c86089fb6948b5ec9d09f01605b5a412fb246545b7ee9bc34e3183e7261a2805 + languageName: node + linkType: hard + +"@react-stately/radio@npm:^3.10.8": + version: 3.10.8 + resolution: "@react-stately/radio@npm:3.10.8" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/radio": "npm:^3.8.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a750896af85433719281814d394378b612465d3078488b8b541812260a795933699b1d0ca3e71fbb68003aff203916670370ef0de6895cc0cce0b9d8c6e85b84 + languageName: node + linkType: hard + +"@react-stately/searchfield@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-stately/searchfield@npm:3.5.7" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/searchfield": "npm:^3.5.9" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/bcd6f7fcb644bf0202c365f6017faf0e0cea1320a81b7e44d1c4faa49e541a8911d027da695bb6870718cbfb70a6028bd870d69eb6cc91178bccb8232d25741e + languageName: node + linkType: hard + +"@react-stately/select@npm:^3.6.8": + version: 3.6.8 + resolution: "@react-stately/select@npm:3.6.8" + dependencies: + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/select": "npm:^3.9.7" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/fe79ed549db5ef5fbccf4312a90cd7a43e62e2a6ba7c183cb2b3c11dd6f17ba81c7c3f44eac42be67e7ebdf4eecf7a33513d5ef2badb9c13b22552da55b43df7 + languageName: node + linkType: hard + +"@react-stately/selection@npm:^3.17.0": + version: 3.17.0 + resolution: "@react-stately/selection@npm:3.17.0" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5ecb13294b85c0b6fa1fda1665fd81105601ca3976672a5faae95a67ab484a2538b913be68cb924ca0be0b010c9eb7bba139c34da7c61e3f581d2054029b9978 + languageName: node + linkType: hard + +"@react-stately/slider@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-stately/slider@npm:3.5.8" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c7c51f7d153b70d785b5ced5e918fd0f72278a4f288bb78c62da51a3ef0277db50f365803a1c7d9b57071cb99315a17fc9796b8aca608682711adb288c888dc6 + languageName: node + linkType: hard + +"@react-stately/table@npm:^3.12.3": + version: 3.12.3 + resolution: "@react-stately/table@npm:3.12.3" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/flags": "npm:^3.0.4" + "@react-stately/grid": "npm:^3.9.3" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + "@react-types/table": "npm:^3.10.2" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c82b4153c9205101b63e7974c72238997d05345b6c8cd15c4bb5484174df56f85128c3b4fe731734e0720e4ad98a3e8f1c933831c1cf7b5e24ed20c97229cd1b + languageName: node + linkType: hard + +"@react-stately/tabs@npm:^3.6.10": + version: 3.6.10 + resolution: "@react-stately/tabs@npm:3.6.10" + dependencies: + "@react-stately/list": "npm:^3.11.0" + "@react-types/shared": "npm:^3.25.0" + "@react-types/tabs": "npm:^3.3.10" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b5b2c78300fdaa6bd5a94964bd9e44e2aad39070170ac7202f4c78d327e174b8c1c4e051c7edc794c729e0430ab57e76a1e510942efe1adcf7477f2ecd40004c + languageName: node + linkType: hard + +"@react-stately/toggle@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-stately/toggle@npm:3.7.8" + dependencies: + "@react-stately/utils": "npm:^3.10.4" + "@react-types/checkbox": "npm:^3.8.4" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/65c662eab8a57e09228864399e46cbca3fdab1e7fea8c994431441bfc87a6d40c6897473ec48145cb9220067a7bf058d22d0f5257f2d49bfc6bc981b59a3b3ef + languageName: node + linkType: hard + +"@react-stately/tooltip@npm:^3.4.13": + version: 3.4.13 + resolution: "@react-stately/tooltip@npm:3.4.13" + dependencies: + "@react-stately/overlays": "npm:^3.6.11" + "@react-types/tooltip": "npm:^3.4.12" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8c2a44b20dad82bb10e7b8eb26c5844dd842468ac8e39e17c511e4122e1ee9a8ba63b66adc14a643330a0f08f6407b0e4a3896a05d4c71b170624006d67b55ac + languageName: node + linkType: hard + +"@react-stately/tree@npm:^3.8.5": + version: 3.8.5 + resolution: "@react-stately/tree@npm:3.8.5" + dependencies: + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/utils": "npm:^3.10.4" + "@react-types/shared": "npm:^3.25.0" + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a853a272b53b6159c98118171cff2088ab5b262860106d4f0867d38c13c1ca7ab3f4b2c6c335b79cb07e045ffa9ac81c3061e46914150a460839e2b1dbd695ea + languageName: node + linkType: hard + "@react-stately/utils@npm:^3.10.3": version: 3.10.3 resolution: "@react-stately/utils@npm:3.10.3" @@ -10769,6 +12023,235 @@ __metadata: languageName: node linkType: hard +"@react-stately/utils@npm:^3.10.4": + version: 3.10.4 + resolution: "@react-stately/utils@npm:3.10.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/8a56b4d0cf8d5a7a692d6f94ffff63feac2d7078fbc5642b94b0afcaaf7c8f7f4682cfe546f98265034c52576c198be5502cff3f9b145137884e50eb9ffb96d5 + languageName: node + linkType: hard + +"@react-types/breadcrumbs@npm:^3.7.8": + version: 3.7.8 + resolution: "@react-types/breadcrumbs@npm:3.7.8" + dependencies: + "@react-types/link": "npm:^3.5.8" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5a085a3e6fa8486ce39451c9698c1fc9d1d33526db78e06cdf8e38a02e6c9765c232ea8b7bdb2a5462d2917ccef62b570dc04cb825204747c29d43af30af776c + languageName: node + linkType: hard + +"@react-types/button@npm:^3.10.0": + version: 3.10.0 + resolution: "@react-types/button@npm:3.10.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/13973108d935e81a9e852bdc3a530a26a4cacc4a7ec37f1dde48202be0545066a71f4d7c476806d7911e91b2b9193c79f4e89dc616280b74db37cec3dd749fea + languageName: node + linkType: hard + +"@react-types/calendar@npm:^3.4.10": + version: 3.4.10 + resolution: "@react-types/calendar@npm:3.4.10" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0f90aa3394d160b09e93ce0acb66a226c1d4211e818f69b5ac0d9faf01a6729085d1fcad83566ddf425d18308c05f70e56007429ef2060f0bf4f595d3c28f066 + languageName: node + linkType: hard + +"@react-types/checkbox@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/checkbox@npm:3.8.4" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/15eb9951dc7ab24cb9f95b500df09d17e1c675f33121b589f778508f8c803f6f29bf6744441c48c1dc5e6d7755feda83e9464832b6771b1662757b564bfb80dd + languageName: node + linkType: hard + +"@react-types/color@npm:^3.0.0": + version: 3.0.0 + resolution: "@react-types/color@npm:3.0.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/slider": "npm:^3.7.6" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/ca56d14fbb70e43b67aa696abeeb1aba4df44b09081227b49bc476342119b5b374be4bf25f753799f28cb994f0dffc2abecea16f9c940fa091007416e485c81b + languageName: node + linkType: hard + +"@react-types/combobox@npm:^3.13.0": + version: 3.13.0 + resolution: "@react-types/combobox@npm:3.13.0" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/e69ae7389ff7b38aca0e6cee6c854b2f343c9a18cbec03a3773d59f2e148a97b3948abd49ed1f79c8d62e36f9f067dbd08c42c1e871090cab4dc2c421c3b6fc9 + languageName: node + linkType: hard + +"@react-types/datepicker@npm:^3.8.3": + version: 3.8.3 + resolution: "@react-types/datepicker@npm:3.8.3" + dependencies: + "@internationalized/date": "npm:^3.5.6" + "@react-types/calendar": "npm:^3.4.10" + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/15e4c21569f69be8de94ea3831c4fc7e1c62d7b704cfa4970da32677a152e20c13dd47dd4bd969e5598a9e100c572031159445100c4d08b7dcf92dcb932228db + languageName: node + linkType: hard + +"@react-types/dialog@npm:^3.5.13": + version: 3.5.13 + resolution: "@react-types/dialog@npm:3.5.13" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c7ee923c326b7377660400ec794ef98330388250aa32df23f5c22a63e483bcad221283de26181bf2a5cab2c20d517f528bf351c9786ac9fece3e3726e4ae07c3 + languageName: node + linkType: hard + +"@react-types/grid@npm:^3.2.9": + version: 3.2.9 + resolution: "@react-types/grid@npm:3.2.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/db85cb813a662de2673d14119036aa437c60358436bb9099c46706485fad47d1f7aa9df69131ec7ce122f78a684f9082a2aa03ac37d0370069ffd1bec1c11c3e + languageName: node + linkType: hard + +"@react-types/link@npm:^3.5.8": + version: 3.5.8 + resolution: "@react-types/link@npm:3.5.8" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3e20323be7cebfcd10cde779a884e1bea3cd5068cbd6eff60f62cb03718fb88cb024c14d0f79c86fe41fd790e10849d405b0115a68a08ffcc9715f303cc4563d + languageName: node + linkType: hard + +"@react-types/listbox@npm:^3.5.2": + version: 3.5.2 + resolution: "@react-types/listbox@npm:3.5.2" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/5aadf4665538613c8fc60dab1fe58ff02eff9f9b653fc6df772c94df17170cc7b31dd869e9293bdd437fccf168124d165162080084d32c2c01cd51f64ec2e3fd + languageName: node + linkType: hard + +"@react-types/menu@npm:^3.9.12": + version: 3.9.12 + resolution: "@react-types/menu@npm:3.9.12" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/a6276115c5da08c63b9641b985c366435e69847af680ace5fef32ce2ca6eab9669db5cc8f5a20e01377a54f17392a95864ee40831b13b2258ed6d43bcc1398f5 + languageName: node + linkType: hard + +"@react-types/meter@npm:^3.4.4": + version: 3.4.4 + resolution: "@react-types/meter@npm:3.4.4" + dependencies: + "@react-types/progress": "npm:^3.5.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/cd05949d2ff361dedc576369d7a38688ac8be62b237881c8cf0314825bae5d923814c81dc83922b76d54c46936571ad7da186d6dcfeb37fb5425c119f77d8f21 + languageName: node + linkType: hard + +"@react-types/numberfield@npm:^3.8.6": + version: 3.8.6 + resolution: "@react-types/numberfield@npm:3.8.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/47ca14f31d970bad272ff9a2d06ee722d5ca7d5d5d60e47277040f9bbf0cb6b9835c234387e29446148c28df0a0d747c4ddb56d8a53c510b63a91547f808cf51 + languageName: node + linkType: hard + +"@react-types/overlays@npm:^3.8.10": + version: 3.8.10 + resolution: "@react-types/overlays@npm:3.8.10" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/2e8edf37f75df2884a280cbd25a3798d24b93669b8b2b606cadacaf40f605f63e437749cea28861fabecd78293302ac39108f4e65cedd412c474e92be9895561 + languageName: node + linkType: hard + +"@react-types/progress@npm:^3.5.7": + version: 3.5.7 + resolution: "@react-types/progress@npm:3.5.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/610cfd88946e566dd3cfe745a4b4f90b6216b6df6c55d19aab9e1c0c099e062baa7cf221c79e7fd1f46a7d4604df71bcd8914d8ec5e79b2694e9e605a0115dcc + languageName: node + linkType: hard + +"@react-types/radio@npm:^3.8.4": + version: 3.8.4 + resolution: "@react-types/radio@npm:3.8.4" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b00f2a97ef56b4860b2bb196433d78a068031427b4f99d2350f45ee444f49de7cad646220dae53ed1126555fe715050deefc67f9728e264a27b910b274f4a6b3 + languageName: node + linkType: hard + +"@react-types/searchfield@npm:^3.5.9": + version: 3.5.9 + resolution: "@react-types/searchfield@npm:3.5.9" + dependencies: + "@react-types/shared": "npm:^3.25.0" + "@react-types/textfield": "npm:^3.9.7" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/b5d53113f7cd6d55c69350345e042412fcd31fbd69ea9eff3a0b74e9575b9a50b6e3b9f6443e760bfce73c6950c513a6b0c43a6b5cbffa9b0d5f8a29236ee56d + languageName: node + linkType: hard + +"@react-types/select@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/select@npm:3.9.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/c53a9408e22cc7c622955a11a80339c412564720d08d621bbd5a28953731eb8afda8d0bb56b5242f8f94e99c3264b913f1228ec9454c3b637f4e8d2374e00f99 + languageName: node + linkType: hard + "@react-types/shared@npm:^3.24.1": version: 3.24.1 resolution: "@react-types/shared@npm:3.24.1" @@ -10778,6 +12261,83 @@ __metadata: languageName: node linkType: hard +"@react-types/shared@npm:^3.25.0": + version: 3.25.0 + resolution: "@react-types/shared@npm:3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/fa31eb6153c223210c2eee46934a63b922917bcde0ee583f2cfe59675db122c10e1cbae6549b1fea4284391fdbeca6888b36e9dc797231ad4a76def01490aea5 + languageName: node + linkType: hard + +"@react-types/slider@npm:^3.7.6": + version: 3.7.6 + resolution: "@react-types/slider@npm:3.7.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/01d15d8f946188cc45ddf63f3300c21aebaea015c88bd8883d64e740ead54873407fdbfb3dcc8b3c5198a40355c5c0027c006d41123220189783d1ac2193eee6 + languageName: node + linkType: hard + +"@react-types/switch@npm:^3.5.6": + version: 3.5.6 + resolution: "@react-types/switch@npm:3.5.6" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/1741c5c98686847a3a9c2f07bb47f409c0f35d32c3b8759c418ddee24a2e02e8f9a7f49690f8dfe304e811af191ea3d97bb68a0dd9355bfb85e95140dd8433c8 + languageName: node + linkType: hard + +"@react-types/table@npm:^3.10.2": + version: 3.10.2 + resolution: "@react-types/table@npm:3.10.2" + dependencies: + "@react-types/grid": "npm:^3.2.9" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/0fb7b38c56809500e0cc7a958965b54fb2d5172da3df28b994f24630c3aa931fef0993f15d3ec1c2716b910435aeb90c210abd27badec2de1f77ecdf6d03ab16 + languageName: node + linkType: hard + +"@react-types/tabs@npm:^3.3.10": + version: 3.3.10 + resolution: "@react-types/tabs@npm:3.3.10" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/4b2fd7d6f978067a7a603c83ed7292ff12c47b89a9c556da2cdc10c8a185868311318d4f6f7703e4cf4234a5cd2cb882ec48e4771fb61b2dfa00f47c0474949f + languageName: node + linkType: hard + +"@react-types/textfield@npm:^3.9.7": + version: 3.9.7 + resolution: "@react-types/textfield@npm:3.9.7" + dependencies: + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/73fc23fd7a83f0a44add2bdb1c10e1361a3aa4ee1d5e1dfb6b63f661140b58052d8dce735e79c0a2c9c66db596dfe9c312ee70ebcd100d2c8b102fbe6b8199ad + languageName: node + linkType: hard + +"@react-types/tooltip@npm:^3.4.12": + version: 3.4.12 + resolution: "@react-types/tooltip@npm:3.4.12" + dependencies: + "@react-types/overlays": "npm:^3.8.10" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/3321d0c938a46343f2961b53d9533ab62ea5fc1c4b199e7e1740dab2ba59765bc87ed04903819596f61bdaa07e2a1c8c29d6f6b34e3d495c0f43d656a7ac8d18 + languageName: node + linkType: hard + "@resolver-engine/core@npm:^0.3.3": version: 0.3.3 resolution: "@resolver-engine/core@npm:0.3.3" @@ -11063,6 +12623,13 @@ __metadata: languageName: node linkType: hard +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10/17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@safe-global/api-kit@npm:1.3.0": version: 1.3.0 resolution: "@safe-global/api-kit@npm:1.3.0" @@ -11092,6 +12659,26 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-apps-provider@npm:0.18.4": + version: 0.18.4 + resolution: "@safe-global/safe-apps-provider@npm:0.18.4" + dependencies: + "@safe-global/safe-apps-sdk": "npm:^9.1.0" + events: "npm:^3.3.0" + checksum: 10/252ccad3416f73e9fa5e7bdd074955ca6b81c55be89c3cd3e25a7cab9b01922cb9f9a02d2766dff15003908c7cccc47bc22f58dd2d4a65b504fd7870eabda41b + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:9.1.0, @safe-global/safe-apps-sdk@npm:^9.1.0": + version: 9.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.1.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" + viem: "npm:^2.1.1" + checksum: 10/b81e1a554509fc41f5b8ec3bcccaf477fd55824010774699dd2c00dee8431cfd351bf13893ff6acb1450028ce4de31a1316548a0e77a66d801ff9e0b4e08b9ff + languageName: node + linkType: hard + "@safe-global/safe-core-sdk-types@npm:2.3.0": version: 2.3.0 resolution: "@safe-global/safe-core-sdk-types@npm:2.3.0" @@ -11136,20 +12723,27 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.0.0": - version: 1.0.0 - resolution: "@scure/base@npm:1.0.0" - checksum: 10/cbf631e1f13536287e1f19137039d29757a008fad2d9b0c8113c140e1900519a95f4884cd61633fbb2adbe426c3c9bbfde2b77519145b3d81bac9853a52c599e +"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": + version: 3.22.2 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.2" + checksum: 10/7f2b3cab4a1673647c8f7fd927be280f891dc74dba733f302862dee135fedd9d8e1875b1790c75b84c54164b517727bfe08a6dcaf7411659db13eeaefd1407fd languageName: node linkType: hard -"@scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.6, @scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": version: 1.1.9 resolution: "@scure/base@npm:1.1.9" checksum: 10/f0ab7f687bbcdee2a01377fe3cd808bf63977999672751295b6a92625d5322f4754a96d40f6bd579bc367aad48ecf8a4e6d0390e70296e6ded1076f52adb16bb languageName: node linkType: hard +"@scure/base@npm:~1.0.0": + version: 1.0.0 + resolution: "@scure/base@npm:1.0.0" + checksum: 10/cbf631e1f13536287e1f19137039d29757a008fad2d9b0c8113c140e1900519a95f4884cd61633fbb2adbe426c3c9bbfde2b77519145b3d81bac9853a52c599e + languageName: node + linkType: hard + "@scure/bip32@npm:1.0.1": version: 1.0.1 resolution: "@scure/bip32@npm:1.0.1" @@ -11161,7 +12755,18 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.5.0": +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" + dependencies: + "@noble/curves": "npm:~1.4.0" + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10/6cd5062d902564d9e970597ec8b1adacb415b2eadfbb95aee1a1a0480a52eb0de4d294d3753aa8b48548064c9795ed108d348a31a8ce3fc88785377bb12c63b9 + languageName: node + linkType: hard + +"@scure/bip32@npm:1.5.0, @scure/bip32@npm:^1.5.0": version: 1.5.0 resolution: "@scure/bip32@npm:1.5.0" dependencies: @@ -11182,7 +12787,17 @@ __metadata: languageName: node linkType: hard -"@scure/bip39@npm:1.4.0": +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 10/7d71fd58153de22fe8cd65b525f6958a80487bc9d0fbc32c71c328aeafe41fa259f989d2f1e0fa4fdfeaf83b8fcf9310d52ed9862987e46c2f2bfb9dd8cf9fc1 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.4.0, @scure/bip39@npm:^1.4.0": version: 1.4.0 resolution: "@scure/bip39@npm:1.4.0" dependencies: @@ -11295,6 +12910,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^2.1.0": + version: 2.3.0 + resolution: "@sindresorhus/merge-streams@npm:2.3.0" + checksum: 10/798bcb53cd1ace9df84fcdd1ba86afdc9e0cd84f5758d26ae9b1eefd8e8887e5fc30051132b9e74daf01bb41fa5a2faf1369361f83d76a3b3d7ee938058fd71c + languageName: node + linkType: hard + "@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.3": version: 1.8.3 resolution: "@sinonjs/commons@npm:1.8.3" @@ -11913,6 +13535,60 @@ __metadata: languageName: node linkType: hard +"@socket.io/component-emitter@npm:~3.1.0": + version: 3.1.2 + resolution: "@socket.io/component-emitter@npm:3.1.2" + checksum: 10/89888f00699eb34e3070624eb7b8161fa29f064aeb1389a48f02195d55dd7c52a504e52160016859f6d6dffddd54324623cdd47fd34b3d46f9ed96c18c456edc + languageName: node + linkType: hard + +"@solana-mobile/mobile-wallet-adapter-protocol-web3js@npm:^2.1.4": + version: 2.1.4 + resolution: "@solana-mobile/mobile-wallet-adapter-protocol-web3js@npm:2.1.4" + dependencies: + "@solana-mobile/mobile-wallet-adapter-protocol": "npm:^2.1.4" + bs58: "npm:^5.0.0" + js-base64: "npm:^3.7.5" + peerDependencies: + "@solana/web3.js": ^1.58.0 + checksum: 10/477ccde5bfa9bb9f108dac4a3ae515b4c37489d9314076951cc467f9c0212780a03f10356c1d57d34197a384cb1aeaba90a1f743ee3cb7733373e6b1ff7d4f19 + languageName: node + linkType: hard + +"@solana-mobile/mobile-wallet-adapter-protocol@npm:^2.1.4": + version: 2.1.4 + resolution: "@solana-mobile/mobile-wallet-adapter-protocol@npm:2.1.4" + dependencies: + "@solana/wallet-standard": "npm:^1.1.2" + "@solana/wallet-standard-util": "npm:^1.1.1" + "@wallet-standard/core": "npm:^1.0.3" + js-base64: "npm:^3.7.5" + peerDependencies: + "@solana/web3.js": ^1.58.0 + react-native: ">0.69" + checksum: 10/48270b536251f601b635a0c6ecb46da332bf3f1f419b83affbb609a15242f199fda896babbea4a647a747af57e62f0aa8abf0e5d7b2047d260576c17e883528d + languageName: node + linkType: hard + +"@solana-mobile/wallet-adapter-mobile@npm:^2.0.0": + version: 2.1.4 + resolution: "@solana-mobile/wallet-adapter-mobile@npm:2.1.4" + dependencies: + "@react-native-async-storage/async-storage": "npm:^1.17.7" + "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "npm:^2.1.4" + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-features": "npm:^1.2.0" + js-base64: "npm:^3.7.5" + qrcode: "npm:^1.5.4" + peerDependencies: + "@solana/web3.js": ^1.58.0 + dependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 10/9dfc46a6b030f2b9dd8ae80c3bb6173a6cd9b0024b89894f14618fb7eb7b90c6041966a2265b71dcde5445ccf91eb2b8d2b1e2f3e73c7e13ea496717fcbbe632 + languageName: node + linkType: hard + "@solana/buffer-layout-utils@npm:^0.2.0": version: 0.2.0 resolution: "@solana/buffer-layout-utils@npm:0.2.0" @@ -12065,6 +13741,155 @@ __metadata: languageName: node linkType: hard +"@solana/wallet-adapter-base-ui@npm:^0.1.2": + version: 0.1.2 + resolution: "@solana/wallet-adapter-base-ui@npm:0.1.2" + dependencies: + "@solana/wallet-adapter-react": "npm:^0.15.35" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + checksum: 10/5f4045defe8caedfbd777c7e46590b320a5e8526291aba83c2b1c2666b9bdfa97f46ee1820d2beb1d2cfe62a09c134018a40679023e54e9d583826d2333981d0 + languageName: node + linkType: hard + +"@solana/wallet-adapter-base@npm:^0.9.23": + version: 0.9.23 + resolution: "@solana/wallet-adapter-base@npm:0.9.23" + dependencies: + "@solana/wallet-standard-features": "npm:^1.1.0" + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + eventemitter3: "npm:^4.0.7" + peerDependencies: + "@solana/web3.js": ^1.77.3 + checksum: 10/7b0ab2a3b33bf4796c9e544d13b3ac2b6628cdbff9e839772eb2b2ab34355708fe662cc8971b68748febffdcc2ced79725f6c1ff7832d0c1660558ad0052b372 + languageName: node + linkType: hard + +"@solana/wallet-adapter-react-ui@npm:^0.9.31": + version: 0.9.35 + resolution: "@solana/wallet-adapter-react-ui@npm:0.9.35" + dependencies: + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-adapter-base-ui": "npm:^0.1.2" + "@solana/wallet-adapter-react": "npm:^0.15.35" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + react-dom: "*" + checksum: 10/4c1dccec09bf2197bb757952d4229cdf272ea0b1c1b06e0f09aea55482c0754b96495ffdcf67391ff6a5df6a3f5bd144b501bb90946bd0038dec302ec6fbfb20 + languageName: node + linkType: hard + +"@solana/wallet-adapter-react@npm:^0.15.32, @solana/wallet-adapter-react@npm:^0.15.35": + version: 0.15.35 + resolution: "@solana/wallet-adapter-react@npm:0.15.35" + dependencies: + "@solana-mobile/wallet-adapter-mobile": "npm:^2.0.0" + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-wallet-adapter-react": "npm:^1.1.0" + peerDependencies: + "@solana/web3.js": ^1.77.3 + react: "*" + checksum: 10/52e009d8a49fb92e2fac90e9427fa790644e3f4b387ef39a1bb30047f8ae394a6367d3e9a9a97785d8e3fd90141800e7268f492aee0b9de0b88e113f565dd071 + languageName: node + linkType: hard + +"@solana/wallet-standard-chains@npm:^1.1.0": + version: 1.1.0 + resolution: "@solana/wallet-standard-chains@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.0.1" + checksum: 10/c87141660a01b1e4cb394c12bfa1b779e2c231dfe098518273b90c80afa0a4185bc4aeadca801452af7f8396eecec81c7e9f820d478cd4495d5918924a8bfaf3 + languageName: node + linkType: hard + +"@solana/wallet-standard-core@npm:^1.1.1": + version: 1.1.1 + resolution: "@solana/wallet-standard-core@npm:1.1.1" + dependencies: + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + "@solana/wallet-standard-util": "npm:^1.1.1" + checksum: 10/3c4f8aca67856cea12928a5cf99f2cb022a787263765f879024c69ef3d89a090777301b4ec68e534de2d1df33feee34ec530bf755488dd49415c131521d06b6c + languageName: node + linkType: hard + +"@solana/wallet-standard-features@npm:^1.1.0, @solana/wallet-standard-features@npm:^1.2.0": + version: 1.2.0 + resolution: "@solana/wallet-standard-features@npm:1.2.0" + dependencies: + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + checksum: 10/6a638783b282078f7c38ba0d2a69f302293d0c3226ea257d1cafd16d7b7332631d284e738d53d443dac984900a3b6d5fa34a1c92a51200901a43966048d4475c + languageName: node + linkType: hard + +"@solana/wallet-standard-util@npm:^1.1.1": + version: 1.1.1 + resolution: "@solana/wallet-standard-util@npm:1.1.1" + dependencies: + "@noble/curves": "npm:^1.1.0" + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + checksum: 10/be04a8905d1cb2bfe7b10119be374a3e51787375c3435563a935133ff3e6a4bcb482a65ba18024400fe2a2781e7900bce867fd4789de86731a7f15dd0d7978b2 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter-base@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter-base@npm:1.1.2" + dependencies: + "@solana/wallet-adapter-base": "npm:^0.9.23" + "@solana/wallet-standard-chains": "npm:^1.1.0" + "@solana/wallet-standard-features": "npm:^1.2.0" + "@solana/wallet-standard-util": "npm:^1.1.1" + "@wallet-standard/app": "npm:^1.0.1" + "@wallet-standard/base": "npm:^1.0.1" + "@wallet-standard/features": "npm:^1.0.3" + "@wallet-standard/wallet": "npm:^1.0.1" + peerDependencies: + "@solana/web3.js": ^1.58.0 + bs58: ^4.0.1 + checksum: 10/458269e1ca5205be4b3fe758a5bda528a03a6f65199a87968d008498901b221428690c0b4e75fd63344470a0a84206a28ab27868489b445428001cee7f770f68 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter-react@npm:^1.1.0, @solana/wallet-standard-wallet-adapter-react@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter-react@npm:1.1.2" + dependencies: + "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" + "@wallet-standard/app": "npm:^1.0.1" + "@wallet-standard/base": "npm:^1.0.1" + peerDependencies: + "@solana/wallet-adapter-base": "*" + react: "*" + checksum: 10/1e64f9ee7be8371b16ba51dfb01a6cea499bf0157c333bbc759f6e8c113a7930d6e47cf44ab25a497296be9a83a36caabc53f8ce0837091f38391f08b4a45539 + languageName: node + linkType: hard + +"@solana/wallet-standard-wallet-adapter@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard-wallet-adapter@npm:1.1.2" + dependencies: + "@solana/wallet-standard-wallet-adapter-base": "npm:^1.1.2" + "@solana/wallet-standard-wallet-adapter-react": "npm:^1.1.2" + checksum: 10/01571705e747129099006c45d2272117248d7f1be55190e519b78cfcfee9ce5f3307a65c32f50d6a4d388e56cb5a0be4dd028419c842d70680c665180f50dbf6 + languageName: node + linkType: hard + +"@solana/wallet-standard@npm:^1.1.2": + version: 1.1.2 + resolution: "@solana/wallet-standard@npm:1.1.2" + dependencies: + "@solana/wallet-standard-core": "npm:^1.1.1" + "@solana/wallet-standard-wallet-adapter": "npm:^1.1.2" + checksum: 10/3c17b9cafde0d796c50242916ac3fe07edbd1655dfe8a34d4e44dfbe8a82e5cbc389e867c48b802914785354c2310e237edb4ce7b9d22977ab2430f3cf52557f + languageName: node + linkType: hard + "@solana/web3.js@npm:^1.32.0": version: 1.78.5 resolution: "@solana/web3.js@npm:1.78.5" @@ -12136,6 +13961,176 @@ __metadata: languageName: node linkType: hard +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 10/1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 + languageName: node + linkType: hard + +"@stablelib/binary@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/binary@npm:1.0.1" + dependencies: + "@stablelib/int": "npm:^1.0.1" + checksum: 10/c5ed769e2b5d607a5cdb72d325fcf98db437627862fade839daad934bd9ccf02a6f6e34f9de8cb3b18d72fce2ba6cc019a5d22398187d7d69d2607165f27f8bf + languageName: node + linkType: hard + +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 10/23d4d632a8a15ca91be1dc56da92eefed695d9b66068d1ab27a5655d0233dc2ac0b8668f875af542ca4ed526893c65dd53e777c72c8056f3648115aac98823ee + languageName: node + linkType: hard + +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" + dependencies: + "@stablelib/aead": "npm:^1.0.1" + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/chacha": "npm:^1.0.1" + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/poly1305": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/2a4df136b078b7c09acb3c6fe029613d4c9f70a0ce8bec65551a4a5016930a4f9091d3b83ed1cfc9c2e7bd6ec7f5ee93a7dc729b784b3900dcb97f3c7f5da84a + languageName: node + linkType: hard + +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/38cd8095d94eda29a9bb8a742b1c945dba7f9ec91fc07ab351c826680d03976641ac6366c3d004a00a72d746fcd838215fe1263ef4b0660c453c5de18a0a4295 + languageName: node + linkType: hard + +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: 10/dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 + languageName: node + linkType: hard + +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": "npm:^1.0.2" + "@stablelib/sha512": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/52e861e4fbd9d3d0a1a370d9ad96de8e2e15f133249bbbc32da66b8993e843db598054a3af17a746beb3fd5043b7529613a5dda7f2e79de6613eb3ebe5ffe3dd + languageName: node + linkType: hard + +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 10/3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf + languageName: node + linkType: hard + +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/hmac": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/d3ac9e2fea2b4972a5d874ee9d96c94f8c8207452e2d243a2668b1325a7b20bd9a1541df32387789a0e9bfef82c3fe021a785f46eb3442c782443863faf75205 + languageName: node + linkType: hard + +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 10/65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 + languageName: node + linkType: hard + +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": "npm:^1.0.1" + checksum: 10/3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/b01d4b532a42e5260f7f263e3a670924849c7ba51569abd8ece8279a448e625cbe4049bff1d50ad0d3a9d5f268c1b52fc611808640a6e684550edd7589a0a581 + languageName: node + linkType: hard + +"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/4d55f6c676e2cc0dd2a32be0cfa96837f3e15ae48dc50a340e56db2b201f1341a9ecabb429a3a44a5bf31adee0a8151467a8e7cc15346c561c914faad415d4d4 + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/35d188cd62f20d27e1d61ea07984022e9a78815a023c8f7c747d92456a60823f0683138591e87158a47cd72e73cf24ecf97f8936aa6fba8b3bef6fcb138e723d + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 10/287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": "npm:^1.0.1" + "@stablelib/random": "npm:^1.0.2" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10/fb5469e390ee2515d926633e3e179038894ac4f5e8c8cd2c2fc912022e34a051112eab0fe80c4dbc6e59129679844182562a036abff89444e5c4a05dd42ed329 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:7.6.20": version: 7.6.20 resolution: "@storybook/addon-actions@npm:7.6.20" @@ -12650,16 +14645,7 @@ __metadata: languageName: node linkType: hard -"@storybook/csf@npm:^0.0.1": - version: 0.0.1 - resolution: "@storybook/csf@npm:0.0.1" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10/f6bb019bccd8abc14e45a85258158b7bd8cc525887ac8dc9151ed8c4908be3b5f5523da8a7a9b96ff11b13b6c1744e1a0e070560d63d836b950f595f9a5719d4 - languageName: node - linkType: hard - -"@storybook/csf@npm:^0.1.2": +"@storybook/csf@npm:^0.1.11, @storybook/csf@npm:^0.1.2": version: 0.1.11 resolution: "@storybook/csf@npm:0.1.11" dependencies: @@ -12948,6 +14934,36 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:5.60.5": + version: 5.60.5 + resolution: "@tanstack/query-core@npm:5.60.5" + checksum: 10/2c85ed3a26db31ea9fb2e44f94afee4564c8a5e47fc2c9f4e7a3b477e90642d1330ecdbc48f3b503205401772cedd94545eff23e628badd2bff5509b1da62e94 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.59.20": + version: 5.60.5 + resolution: "@tanstack/react-query@npm:5.60.5" + dependencies: + "@tanstack/query-core": "npm:5.60.5" + peerDependencies: + react: ^18 || ^19 + checksum: 10/00a5ef74ceb50f6bbacec2545392de65d3d9e6dc6de2a7107943460a83d1988eb66740f40b8682c8de0e9a1faff76256ab1584a816c70dd4ff9205dedc209f0a + languageName: node + linkType: hard + +"@tanstack/react-virtual@npm:^3.10.5": + version: 3.10.9 + resolution: "@tanstack/react-virtual@npm:3.10.9" + dependencies: + "@tanstack/virtual-core": "npm:3.10.9" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/a6c90118d0b084aedf0a2b02bc718df5cc1e594fb60d1dededf8a393d3e519e574e2ba67bb7adcaf8b4d6b206f6a10b37166f006bc7e50ad566475323d545b8c + languageName: node + linkType: hard + "@tanstack/react-virtual@npm:^3.8.1": version: 3.10.8 resolution: "@tanstack/react-virtual@npm:3.10.8" @@ -12967,6 +14983,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/virtual-core@npm:3.10.9": + version: 3.10.9 + resolution: "@tanstack/virtual-core@npm:3.10.9" + checksum: 10/15140fc41c728ed08486eba4c9caadbdb3c594f02d3b55fddca63813bc32e8cde64faf6ca6385f9815aeeedbc441dd8c9590aca4319c16a91f39b1937ef4eac7 + languageName: node + linkType: hard + "@testing-library/dom@npm:^9.3.1": version: 9.3.4 resolution: "@testing-library/dom@npm:9.3.4" @@ -13306,6 +15329,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.1.7": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "npm:*" + checksum: 10/47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -13362,6 +15394,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.33": version: 4.19.5 resolution: "@types/express-serve-static-core@npm:4.19.5" @@ -13486,7 +15525,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -13500,6 +15539,13 @@ __metadata: languageName: node linkType: hard +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10/4e5aed58cabb2bbf6f725da13421aa50a49abb6bc17bfab6c31b8774b073fa7b50d557c61f961a09a85f6056151190f8ac95f13f5b48136ba5841f7d4484ec56 + languageName: node + linkType: hard + "@types/jsonfile@npm:*": version: 6.1.4 resolution: "@types/jsonfile@npm:6.1.4" @@ -13545,6 +15591,15 @@ __metadata: languageName: node linkType: hard +"@types/lodash.mergewith@npm:4.6.9": + version: 4.6.9 + resolution: "@types/lodash.mergewith@npm:4.6.9" + dependencies: + "@types/lodash": "npm:*" + checksum: 10/c5a67e83040103decfd37090127118f5758773d0ce2a1756d442b371721737c7752f48f62544cc970f44abec8471f260cc4c844e1a4fdef8b76cb96bdec8a595 + languageName: node + linkType: hard + "@types/lodash@npm:*, @types/lodash@npm:^4.14.167": version: 4.17.7 resolution: "@types/lodash@npm:4.17.7" @@ -13617,12 +15672,10 @@ __metadata: languageName: node linkType: hard -"@types/mute-stream@npm:^0.0.1": - version: 0.0.1 - resolution: "@types/mute-stream@npm:0.0.1" - dependencies: - "@types/node": "npm:*" - checksum: 10/01bb9f45a77b691538cba7f0c89166a5bfb112993056ae06a8218cd47d417a5f6a5cfc31f0d31293790c647d27564fe6aa39aa9cb2ef08792d42ed40f18de8d5 +"@types/ms@npm:*": + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: 10/f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a languageName: node linkType: hard @@ -13671,6 +15724,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:10.12.18": + version: 10.12.18 + resolution: "@types/node@npm:10.12.18" + checksum: 10/cfa39e797eed0f9eb2070315c66a5be3839ba91c57ace4eff63203f2e8c871127dd45fa5a3bd2ee6d7760608ea13f30b4fbd9a7b0b6a71b478162b2eb23d07b6 + languageName: node + linkType: hard + "@types/node@npm:11.11.6": version: 11.11.6 resolution: "@types/node@npm:11.11.6" @@ -13710,14 +15770,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.9.1": - version: 16.18.38 - resolution: "@types/node@npm:16.18.38" - checksum: 10/233cc3c4ebbfb011ecd68a552080d4879ced7f66558ecab07d5adc504b3d52181ef31ce7be03c1a616afbc187530aac38f0016ce274d6b8fb89f79365b7c721a - languageName: node - linkType: hard - -"@types/node@npm:^18.0.0, @types/node@npm:^18.11.18": +"@types/node@npm:^18.0.0": version: 18.19.42 resolution: "@types/node@npm:18.19.42" dependencies: @@ -13733,10 +15786,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.4.2": - version: 20.4.5 - resolution: "@types/node@npm:20.4.5" - checksum: 10/aa31081f82a2d377f00cfd7ced73925753db1f542fca19e6b0442585a7322b8eacd957fdccaaff65d9976454d213af0980c12390c59a975cf8a368e3f872717a +"@types/node@npm:^20.10.7": + version: 20.17.8 + resolution: "@types/node@npm:20.17.8" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10/e3e968b327abc70fd437a223f8950dd4436047e954aa7db09abde5df1f58a5c49f33d6f14524e256d09719e1960d22bf072d62e4bda7375f7895a092c7eb2f9d languageName: node linkType: hard @@ -13763,6 +15818,13 @@ __metadata: languageName: node linkType: hard +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10/5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 + languageName: node + linkType: hard + "@types/pbkdf2@npm:^3.0.0": version: 3.1.0 resolution: "@types/pbkdf2@npm:3.1.0" @@ -13910,7 +15972,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": +"@types/semver@npm:^7.3.4": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 @@ -13994,6 +16056,13 @@ __metadata: languageName: node linkType: hard +"@types/trusted-types@npm:^2.0.2": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10/8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 + languageName: node + linkType: hard + "@types/unist@npm:^2.0.0": version: 2.0.10 resolution: "@types/unist@npm:2.0.10" @@ -14083,56 +16152,44 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.4.0" +"@typescript-eslint/eslint-plugin@npm:^8.1.6": + version: 8.16.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.16.0" dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/type-utils": "npm:7.4.0" - "@typescript-eslint/utils": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" - debug: "npm:^4.3.4" + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/type-utils": "npm:8.16.0" + "@typescript-eslint/utils": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" + ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/9bd8852c7e4e9608c3fded94f7c60506cc7d2b6d8a8c1cad6d48969a7363751b20282874e55ccdf180635cf204cb10b3e1e5c3d1cff34d4fcd07762be3fc138e + checksum: 10/aa3d551d4f09940eee0c08328cb0db3a2391a8bba6d044f6bb38c51ac864896519c647d4b8fd99f7c094cc677bcf22454b27322014a08b2f2fb25695a43820db languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/parser@npm:7.4.0" +"@typescript-eslint/parser@npm:^8.1.6": + version: 8.16.0 + resolution: "@typescript-eslint/parser@npm:8.16.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/typescript-estree": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/142a9e1187d305ed43b4fef659c36fa4e28359467198c986f0955c70b4067c9799f4c85d9881fbf099c55dfb265e30666e28b3ef290520e242b45ca7cb8e4ca9 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10/e827770baa202223bc0387e2fd24f630690809e460435b7dc9af336c77322290a770d62bd5284260fa881c86074d6a9fd6c97b07382520b115f6786b8ed499da + checksum: 10/ac1e2bfdbfe212da470bb17915b5228f7a6b027332b05eb8bcbbad440a81b2476c649e54e232084838e1edc005e6d7dc7a44899587d73672dd3d5484d9dbf9f8 languageName: node linkType: hard @@ -14146,37 +16203,30 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/scope-manager@npm:7.4.0" +"@typescript-eslint/scope-manager@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/scope-manager@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" - checksum: 10/8cf9292444f9731017a707cac34bef5ae0eb33b5cd42ed07fcd046e981d97889d9201d48e02f470f2315123f53771435e10b1dc81642af28a11df5352a8e8be2 + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" + checksum: 10/e0aea61f248b39049d4ce21c19f9c8af1a8024f4f92abc8c1d5b79ea65b013c6c4ff41efb92995050036aa95b6a705601917b56809d9ec1fbbab387054aeb269 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/type-utils@npm:7.4.0" +"@typescript-eslint/type-utils@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/type-utils@npm:8.16.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.4.0" - "@typescript-eslint/utils": "npm:7.4.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" + "@typescript-eslint/utils": "npm:8.16.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/a8bd0929d8237679b2b8a7817f070a4b9658ee976882fba8ff37e4a70dd33f87793e1b157771104111fe8054eaa8ad437a010b6aa465072fbdb932647125db2d - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10/24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 + checksum: 10/b91f6cef6af7e4f82a1dba9622d5ec9f46d1983eecfb88a1adbd310c7f980fedf5c8a198bfe968aae59fc386e4c437f55a7533988252eb9cbb0bdac8321e3dba languageName: node linkType: hard @@ -14187,28 +16237,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/types@npm:7.4.0" - checksum: 10/2782c5bf65cd3dfa9cd32bc3023676bbca22144987c3f6c6b67fd96c73d4a60b85a57458c49fd11b9971ac6531824bb3ae0664491e7a6de25d80c523c9be92b7 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e +"@typescript-eslint/types@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/types@npm:8.16.0" + checksum: 10/b37b26cd0e45b0cd6f7d492a07af583e4877d798495ab5fc1cfacb3c561b6d7981e3166f0475bb997e6c6d56ef903e160895174c7e63c08322dbb42d026cf7dc languageName: node linkType: hard @@ -14231,57 +16263,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.4.0" +"@typescript-eslint/typescript-estree@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10/162ec9d7582f45588342e1be36fdb60e41f50bbdfbc3035c91b517ff5d45244f776921c88d88e543e1c7d0f1e6ada5474a8316b78f1b0e6d2233b101bc45b166 + checksum: 10/823cf55d331cf7283547a2860a5d7bfd7dbd497be6e87b226dd7456b36db214de1504855afbbaef8d89932c11a1e589d4cb2a4093b6f1c542a4ce8319d988006 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/utils@npm:7.4.0" +"@typescript-eslint/utils@npm:8.16.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.16.0 + resolution: "@typescript-eslint/utils@npm:8.16.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/typescript-estree": "npm:7.4.0" - semver: "npm:^7.5.4" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" peerDependencies: - eslint: ^8.56.0 - checksum: 10/ffed27e770c486cd000ff892d9049b0afe8b9d6318452a5355b78a37436cbb414bceacae413a2ac813f3e584684825d5e0baa2e6376b7ad6013a108ac91bc19d - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^5.45.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/15ef13e43998a082b15f85db979f8d3ceb1f9ce4467b8016c267b1738d5e7cdb12aa90faf4b4e6dd6486c236cf9d33c463200465cf25ff997dbc0f12358550a1 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/80ba35b97a8e80ac2b54a56ac041b4f4583328d764e1693e7d3750de383cbcefcb7e838b75e550e8aa4df446f4b41460da6dc83543517280a4e3a61546c1a8dc languageName: node linkType: hard @@ -14302,16 +16316,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" @@ -14322,20 +16326,94 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.4.0" +"@typescript-eslint/visitor-keys@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/70dc99f2ad116c6e2d9e55af249e4453e06bba2ceea515adef2d2e86e97e557865bb1b1d467667462443eb0d624baba36f7442fd1082f3874339bbc381c26e93 + "@typescript-eslint/types": "npm:8.16.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/e3f231a3e8ca2f7a3dc0e9ebdc3ea1f51a377b1285727413b4c89c44dbfaf342f2574b1b4e7f478f295963045a6058e27b4827816fe2a5a2d09f565eb68522c7 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 +"@vanilla-extract/css-utils@npm:^0.1.4": + version: 0.1.4 + resolution: "@vanilla-extract/css-utils@npm:0.1.4" + checksum: 10/37edf1f8a6dae124bc84bc0ed1260b866f563a9e4487cca6888b4eaf8d74c2f07c92566f7290e435deb38c6cba6e4c6b8fb7c22c62917afb22a9491e5d7e4c2c + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:1.15.5": + version: 1.15.5 + resolution: "@vanilla-extract/css@npm:1.15.5" + dependencies: + "@emotion/hash": "npm:^0.9.0" + "@vanilla-extract/private": "npm:^1.0.6" + css-what: "npm:^6.1.0" + cssesc: "npm:^3.0.0" + csstype: "npm:^3.0.7" + dedent: "npm:^1.5.3" + deep-object-diff: "npm:^1.1.9" + deepmerge: "npm:^4.2.2" + lru-cache: "npm:^10.4.3" + media-query-parser: "npm:^2.0.2" + modern-ahocorasick: "npm:^1.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/4820caea8f7d63d5e691c72d3d324a09707040afa6b0abaaf0fea7d9ee1c133a19e5f3a383fd903453680cd0d698de0428ad2a7316e0c5e9771ffd79d813ddf6 + languageName: node + linkType: hard + +"@vanilla-extract/css@npm:^1.15.5": + version: 1.16.0 + resolution: "@vanilla-extract/css@npm:1.16.0" + dependencies: + "@emotion/hash": "npm:^0.9.0" + "@vanilla-extract/private": "npm:^1.0.6" + css-what: "npm:^6.1.0" + cssesc: "npm:^3.0.0" + csstype: "npm:^3.0.7" + dedent: "npm:^1.5.3" + deep-object-diff: "npm:^1.1.9" + deepmerge: "npm:^4.2.2" + lru-cache: "npm:^10.4.3" + media-query-parser: "npm:^2.0.2" + modern-ahocorasick: "npm:^1.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/101471e44239ca38ce2d2261a35ecf5457fb53ae346fc73fb4f1dbe545b7bc5e82fea3e0ea9c07409d53c80507410fb41260c32fcf6a5afa3be5f7cab9fab93d + languageName: node + linkType: hard + +"@vanilla-extract/dynamic@npm:2.1.2, @vanilla-extract/dynamic@npm:^2.1.2": + version: 2.1.2 + resolution: "@vanilla-extract/dynamic@npm:2.1.2" + dependencies: + "@vanilla-extract/private": "npm:^1.0.6" + checksum: 10/576b22e3f1a61abad2bc758d95f6f9eae9418f1bb6c8366211e82da7eed97ac8cf9b69fea3239832ccba280dab93d5b1def4290f64943b295f146fca78049d2d + languageName: node + linkType: hard + +"@vanilla-extract/private@npm:^1.0.6": + version: 1.0.6 + resolution: "@vanilla-extract/private@npm:1.0.6" + checksum: 10/50463610da0fc9069b3e2b33b6222ea2f005487432db9110ea430e474e29b3b756bcd1fffd47b87536358829d47bce6510398f050b5f6de07ee1e4e92eeade5a + languageName: node + linkType: hard + +"@vanilla-extract/recipes@npm:^0.5.5": + version: 0.5.5 + resolution: "@vanilla-extract/recipes@npm:0.5.5" + peerDependencies: + "@vanilla-extract/css": ^1.0.0 + checksum: 10/8d2b4f8163369424226ec9a47e754002b8a095bcf86c1a60a91b2183f59508519bd31ed41baefc950ad7ca225d75b3184c3b84d3c741c5c60d91618dd70452aa + languageName: node + linkType: hard + +"@vanilla-extract/sprinkles@npm:1.6.3": + version: 1.6.3 + resolution: "@vanilla-extract/sprinkles@npm:1.6.3" + peerDependencies: + "@vanilla-extract/css": ^1.0.0 + checksum: 10/74f8e2b189c0d48e279f1b85b5fedebf1f615ab31839964cf3861f2c5cf574567c0caeddf9c8b11327d81213f81d195efc79f136b725e6013b6d645d238d5c2b languageName: node linkType: hard @@ -14439,6 +16517,458 @@ __metadata: languageName: node linkType: hard +"@wagmi/connectors@npm:5.3.10": + version: 5.3.10 + resolution: "@wagmi/connectors@npm:5.3.10" + dependencies: + "@coinbase/wallet-sdk": "npm:4.2.3" + "@metamask/sdk": "npm:0.30.1" + "@safe-global/safe-apps-provider": "npm:0.18.4" + "@safe-global/safe-apps-sdk": "npm:9.1.0" + "@walletconnect/ethereum-provider": "npm:2.17.0" + cbw-sdk: "npm:@coinbase/wallet-sdk@3.9.3" + peerDependencies: + "@wagmi/core": 2.14.6 + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/2fa9852552d555d4dfbf45ede11ec22afd614f2b244a0bba5cd3e59196b13510d87d85b4f6677ed1949b746ab701ea47345bea3b49aa2a23441c974f5a9fe0fd + languageName: node + linkType: hard + +"@wagmi/core@npm:2.14.6": + version: 2.14.6 + resolution: "@wagmi/core@npm:2.14.6" + dependencies: + eventemitter3: "npm:5.0.1" + mipd: "npm:0.0.7" + zustand: "npm:5.0.0" + peerDependencies: + "@tanstack/query-core": ">=5.0.0" + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + "@tanstack/query-core": + optional: true + typescript: + optional: true + checksum: 10/3862660a83179e612bd357967b29b85ecd16f29030cb192eb5380f8fc7fd19ed49852b3315a012e9c2506b746dd1af870d07e9de322a3774dad2189775d3970e + languageName: node + linkType: hard + +"@wallet-standard/app@npm:^1.0.1, @wallet-standard/app@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/app@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/d233cc79fbd857689c8c14a60875df9d8ad120fa1c9d59aeeef7303489cdecd60a12bbc2f3794720aadf6ef369cf09d1409c26c0801273561bcdb12a07b08e19 + languageName: node + linkType: hard + +"@wallet-standard/base@npm:^1.0.1, @wallet-standard/base@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/base@npm:1.1.0" + checksum: 10/11dbb8ed80566265916ab193ad5eab1585d55996781a88039d2bc4480428b1e778901b2dcff3e688dcac7de45e8a9272026f37f07f1e75168caff581906c5079 + languageName: node + linkType: hard + +"@wallet-standard/core@npm:^1.0.3": + version: 1.1.0 + resolution: "@wallet-standard/core@npm:1.1.0" + dependencies: + "@wallet-standard/app": "npm:^1.1.0" + "@wallet-standard/base": "npm:^1.1.0" + "@wallet-standard/errors": "npm:^0.1.0" + "@wallet-standard/features": "npm:^1.1.0" + "@wallet-standard/wallet": "npm:^1.1.0" + checksum: 10/0f6a0045c3faa826dd64bea4245c287acb87f111396c261a199d3fa48344bf0b89f3e2bec874be8e32c215da728e7a19a9fe7365d008e8a969d980010a417c18 + languageName: node + linkType: hard + +"@wallet-standard/errors@npm:^0.1.0": + version: 0.1.0 + resolution: "@wallet-standard/errors@npm:0.1.0" + dependencies: + chalk: "npm:^5.3.0" + commander: "npm:^12.1.0" + bin: + errors: bin/cli.mjs + checksum: 10/5d00d0ddf5cb77cc1c9804ef7ef11fd8c7a5281c9642e9bc040a3bb01b809ef4caee7c784b695fbe61ed93bcf2c8c4d624c8b2c91050c94b0f356b124942951d + languageName: node + linkType: hard + +"@wallet-standard/features@npm:^1.0.3, @wallet-standard/features@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/features@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/e046f813ec4bfea172aeb6c11358a962afe8f9a6961453e621d624f89d8b5fc8a44404dacfe18d33be815df6e9117bbf914009f5a9f9ea91ff90a136043fcac8 + languageName: node + linkType: hard + +"@wallet-standard/wallet@npm:^1.0.1, @wallet-standard/wallet@npm:^1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/wallet@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10/b56846709c43b1dee6b44f7a9e15d89a00e4408d3d967eb438f415b42c5c52c4cf33a7b3126d0cf0dc0d78f244755e3d084a05824c1397ce58be169426c5337b + languageName: node + linkType: hard + +"@walletconnect/core@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/core@npm:2.17.0" + dependencies: + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + lodash.isequal: "npm:4.5.0" + uint8arrays: "npm:3.1.0" + checksum: 10/a37eff1a9b479fe1d51b4173128adecc0b9afd4897d912b396d19e5c2df6a928caa0fdb487f47ca26fae7f3ca59f263754f21b1861a178cfc11b4b2a783e50c4 + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/f6a1e3456e50cc7cfa58d99fd513ecac75573d0b8bcbbedcb1d7ec04ca9108df16b471afd40761b2a5cb4f66d8e33b7ba25f02c62c8365d68b1bd1ef52c1813e + languageName: node + linkType: hard + +"@walletconnect/ethereum-provider@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/ethereum-provider@npm:2.17.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/modal": "npm:2.7.0" + "@walletconnect/sign-client": "npm:2.17.0" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/universal-provider": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/7f86efca38e6a1a59623de090296f5beff3886af50757ea024c6c0d3237e7dd7e3719be979770d4257dfae3708b1c33a242fb061b9f981fe298d666522a2610f + languageName: node + linkType: hard + +"@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: 10/b5a105e9ac4d7d0a500085afd77b71e71a8ab78fd38b033e4ce91f8626fd8c254b1ba49a59c8c0ed8a00a7e8b93995163f414eda73c58694f8f830e453a902b6 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + checksum: 10/a68d7efe4e69c9749dd7c3a9e351dd22adccbb925447dd7f2b2978a4cd730695cc0b4e717a08bad0d0c60e0177b77618a53f3bfb4347659f3ccfe72d412c27fb + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.2": + version: 1.2.2 + resolution: "@walletconnect/heartbeat@npm:1.2.2" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10/f3a1c3c255ac9bd374b25e1ef65a61b1f623b9118d48471acaac1f9ee4ee1438d8d8cbc77733cdd980809b468443c046328fe5ac4084e01e0892f8c699cf44e7 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-http-connection@npm:1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.1" + cross-fetch: "npm:^3.1.4" + events: "npm:^3.3.0" + checksum: 10/c545906243df27fdbde3c8e9005217069dd22ce0f496c59f55843ca8fcb0c1a90d2c0ac6ecb16fa110ed85c36e5486f5a74621a5ca6230667d77ee3b0ae36cc6 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.8" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + checksum: 10/c3c78f00148043b70213f5174d537b210f1fb231d96103cbf7d0101626578d3c13fe99ac080df7a0056c7128ce488b0523eda0e3d1deed75754672848b4909a5 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: "npm:^1.0.0" + tslib: "npm:1.14.1" + checksum: 10/7b1209c2e6ff476e45b0d828bd4d7773873c4cff41e5ed235ff8014b4e8ff09ec704817347702fe3b8ca1c1b7920abfd0af94e0cdf582a92d8a0192d8c42dce8 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.4, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.4 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" + dependencies: + events: "npm:^3.3.0" + keyvaluestorage-interface: "npm:^1.0.0" + checksum: 10/8cdc9f7b5e3ae0d702a44a6fc4c388a2b627188df758ffd103ba9aac6596a787d2f319aa8f6928a03d990c71c17d9b876028f36b8e0c37bd5c9026231ed9ba45 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": "npm:^1.0.1" + "@walletconnect/jsonrpc-types": "npm:^1.0.3" + tslib: "npm:1.14.1" + checksum: 10/4687b4582a5c33883d94e87ca8bb22d129a2a47b6e1d9e2c3210b74f02d9677723b3bf2283d2f0fa69866b0a66a80cdfada9a2f1c204d485fbd10d2baed1f0a6 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-ws-connection@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": "npm:^1.0.6" + "@walletconnect/safe-json": "npm:^1.0.2" + events: "npm:^3.3.0" + ws: "npm:^7.5.1" + checksum: 10/2ad66217b62fb57a43c8edd33c27da0c9ba09cfec79f4d43e5d30bcb8224a48c1d1f0d6273be0371f2c7e33d8138a6fe03afa499b429ab7829d719677cd48f4d + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:1.1.1, @walletconnect/keyvaluestorage@npm:^1.1.1": + version: 1.1.1 + resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" + dependencies: + "@walletconnect/safe-json": "npm:^1.0.1" + idb-keyval: "npm:^6.2.1" + unstorage: "npm:^1.9.0" + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 10/fd9c275b3249d8e9f722866703b5c040eb35d0670c92a297428ffb700ac36c6b9978242beac5d2cfe97eb522ae01307cacd9c79ecf95640878804fce0f13c5e7 + languageName: node + linkType: hard + +"@walletconnect/logger@npm:2.1.2, @walletconnect/logger@npm:^2.0.1": + version: 2.1.2 + resolution: "@walletconnect/logger@npm:2.1.2" + dependencies: + "@walletconnect/safe-json": "npm:^1.0.2" + pino: "npm:7.11.0" + checksum: 10/2e6d438bd352595fff6691712c83953e3ad6b2b9ab298c5a8b670a024f53a3f744b165e5aa081a79261ee4801b93b6c60698a39947d613d49a8f6e6215ecd4c2 + languageName: node + linkType: hard + +"@walletconnect/modal-core@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-core@npm:2.7.0" + dependencies: + valtio: "npm:1.11.2" + checksum: 10/1549f9ba5c98dfed2f97fbfccfcd2e342550c7ba7a85970bff224258dd397bad0a29721b90fef408dcc6cdfa65c52253476a04c16fece9b4d48792f03c3a4b4f + languageName: node + linkType: hard + +"@walletconnect/modal-ui@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal-ui@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + lit: "npm:2.8.0" + motion: "npm:10.16.2" + qrcode: "npm:1.5.3" + checksum: 10/00d17001bde7646def34eaffef81c4a580f09fdf10902a7a938cd2a3738f8f1cbb10520c229989b64e147df9f4df8ca31bd1d904f9019acc63327b495fb5b3ed + languageName: node + linkType: hard + +"@walletconnect/modal@npm:2.7.0": + version: 2.7.0 + resolution: "@walletconnect/modal@npm:2.7.0" + dependencies: + "@walletconnect/modal-core": "npm:2.7.0" + "@walletconnect/modal-ui": "npm:2.7.0" + checksum: 10/a6b78cc06479e0aa98516784ff1f81b24839777f0ec38d2f9cc85b4dc932ad6e823187bbb699f80f898e7d4b09d1232134f348eb9d12697e74e742eeaec189f2 + languageName: node + linkType: hard + +"@walletconnect/relay-api@npm:1.0.11": + version: 1.0.11 + resolution: "@walletconnect/relay-api@npm:1.0.11" + dependencies: + "@walletconnect/jsonrpc-types": "npm:^1.0.2" + checksum: 10/d85f88b9744917ee5b36d2df23bf4012819b14b73229f9bdca942bee11dd3b3428808c7528c2b1f6b3d91fa1d34a22b1e20b46533e402301318cbd4ab59b9c17 + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": "npm:^1.0.2" + "@stablelib/random": "npm:^1.0.1" + "@walletconnect/safe-json": "npm:^1.0.1" + "@walletconnect/time": "npm:^1.0.2" + tslib: "npm:1.14.1" + uint8arrays: "npm:^3.0.0" + checksum: 10/d9128b2a25f38ebf2f49f8c184dad5c997ad6343513bddd7941459c2f2757e6acfbcdd36dc9c12d0491f55723d5e2c5c0ee2e9cf381b3247274b920e95d4db0e + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:1.0.2, @walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/b9d031dab3916d20fa5241d7ad2be425368ae489995ba3ba18d6ad88e81ad3ed093b8e867b8a4fc44759099896aeb5afee5635858cb80c4819ebc7ebb71ed5a6 + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/sign-client@npm:2.17.0" + dependencies: + "@walletconnect/core": "npm:2.17.0" + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/e3eb391b4f01ae353e7c5f3580971ac7e5b9bd5a6bdb77783d8954e9c0243bb32945de230cfd09fddb2a589f28a9359de8ca313e83eae2b2e396753957d87b4c + languageName: node + linkType: hard + +"@walletconnect/time@npm:1.0.2, @walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/ea84d0850e63306837f98a228e08a59f6945da38ba5553b1f158abeaa8ec4dc8a0025a0f0cfc843ddf05ce2947da95c02ac1e8cedce7092bbe1c2d46ca816dd9 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/types@npm:2.11.0" + dependencies: + "@walletconnect/events": "npm:^1.0.1" + "@walletconnect/heartbeat": "npm:1.2.1" + "@walletconnect/jsonrpc-types": "npm:1.0.3" + "@walletconnect/keyvaluestorage": "npm:^1.1.1" + "@walletconnect/logger": "npm:^2.0.1" + events: "npm:^3.3.0" + checksum: 10/72602e3a38dbc8db789467cbf40fad5500c2fdf736277dde11990b8d11d989c3c075cb3ab8a6e88dc7f1a6b559cd791a2aa5da843239c34a0ee726d1f73fd723 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/types@npm:2.17.0" + dependencies: + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:2.1.2" + events: "npm:3.3.0" + checksum: 10/a0ac222a0ef92c88c159178e643752345978c69109522adea6bebb217c29a182337b2698cb16864151a0c79a457ea1b8659602af1f00dd45e1bd5308c89585cf + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/universal-provider@npm:2.17.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:2.1.2" + "@walletconnect/sign-client": "npm:2.17.0" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/utils": "npm:2.17.0" + events: "npm:3.3.0" + checksum: 10/d03d5178677864c996460eb48072e7f9ca290fe2a1f660f4b9ec8c52e3d574af483fdbca8a95206cbe41cbc89a21b75b2ad13c55ababd3cad2e9a6e3567d2a0a + languageName: node + linkType: hard + +"@walletconnect/utils@npm:2.17.0": + version: 2.17.0 + resolution: "@walletconnect/utils@npm:2.17.0" + dependencies: + "@stablelib/chacha20poly1305": "npm:1.0.1" + "@stablelib/hkdf": "npm:1.0.1" + "@stablelib/random": "npm:1.0.2" + "@stablelib/sha256": "npm:1.0.1" + "@stablelib/x25519": "npm:1.0.3" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.17.0" + "@walletconnect/window-getters": "npm:1.0.1" + "@walletconnect/window-metadata": "npm:1.0.1" + detect-browser: "npm:5.3.0" + elliptic: "npm:^6.5.7" + query-string: "npm:7.1.3" + uint8arrays: "npm:3.1.0" + checksum: 10/b460aeb0eb0c8e9d50677596f5fd04f940a922027b4d348e53b026e4290cb67a08941bfc6dc0fad8ae55d7434554fbe07907741658845f710a1befa39e47698c + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:1.0.1, @walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: "npm:1.14.1" + checksum: 10/8d3fcb134fbbe903ba4a63f1fa5a7849fd443874bf45488260afc2fe3b1cbe211f86da1d76ee844be7c0e8618ae67402f94c213432fd80b04715eaf72e2e00e3 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": "npm:^1.0.1" + tslib: "npm:1.14.1" + checksum: 10/cf322e0860c4448cefcd81f34bc6d49d1a235a81e74a6146baefb74e47cf6c3c8050b65e534a3dc13f8d2aed3fc59732ccf48d5a01b5b23e08e1847fcffa950c + languageName: node + linkType: hard + "@yarnpkg/esbuild-plugin-pnp@npm:^3.0.0-rc.10": version: 3.0.0-rc.15 resolution: "@yarnpkg/esbuild-plugin-pnp@npm:3.0.0-rc.15" @@ -14477,6 +17007,29 @@ __metadata: languageName: node linkType: hard +"@zag-js/dom-query@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/dom-query@npm:0.31.1" + checksum: 10/61f7c28e7bccf1568eb4bbf7b74a9ba41f991be792098f9c512359fae70b460895c3e48f46f86738174b079dbeab58d6771fd2565927cfe2f6c05cb50bfa812f + languageName: node + linkType: hard + +"@zag-js/element-size@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/element-size@npm:0.31.1" + checksum: 10/a0bd5937cacce2da7705912dd79d49b162a28f9bb3f14171bc1d11aca07be9754a555d5af661c45d102833dc4558fb07ccb3aa89b9922339871bf03c7b8fa9d1 + languageName: node + linkType: hard + +"@zag-js/focus-visible@npm:^0.31.1": + version: 0.31.1 + resolution: "@zag-js/focus-visible@npm:0.31.1" + dependencies: + "@zag-js/dom-query": "npm:0.31.1" + checksum: 10/da879cf88d28a4c2da4d3f7e17797ef43dbdd9e00d6eafc72d6728be32785015bafcbc60736146fa819b33ae48bde5d8f1c9f4afff646b0dc7a7f4701b2dcd6d + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -14503,7 +17056,7 @@ __metadata: languageName: node linkType: hard -"abitype@npm:1.0.6": +"abitype@npm:1.0.6, abitype@npm:^1.0.6": version: 1.0.6 resolution: "abitype@npm:1.0.6" peerDependencies: @@ -14649,7 +17202,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -14787,6 +17349,13 @@ __metadata: languageName: node linkType: hard +"animejs@npm:^3.2.2": + version: 3.2.2 + resolution: "animejs@npm:3.2.2" + checksum: 10/7abdb56f415c666ba02f4e64fdbb10d457fed7e3711b0f006f97e48e5650097013397d890e8ceb31e9e06b73bf6dfd9202309d0dae0fc0b5190aa7c4e0ab7054 + languageName: node + linkType: hard + "ansi-align@npm:^3.0.0": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" @@ -14941,7 +17510,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3": +"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -15032,7 +17601,7 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": +"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.3": version: 1.2.4 resolution: "aria-hidden@npm:1.2.4" dependencies: @@ -15155,7 +17724,21 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1": +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlastindex@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/7c5c821f357cd53ab6cc305de8086430dd8d7a2485db87b13f843e868055e9582b1fd338f02338f67fc3a1603ceaf9610dd2a470b0b506f9d18934780f95b246 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -15259,7 +17842,7 @@ __metadata: languageName: node linkType: hard -"asn1.js@npm:5.4.1, asn1.js@npm:^5.4.1": +"asn1.js@npm:^5.4.1": version: 5.4.1 resolution: "asn1.js@npm:5.4.1" dependencies: @@ -15357,6 +17940,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.2.6": + version: 0.2.6 + resolution: "async-mutex@npm:0.2.6" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10/3cf676fc48b4686abf534cc02d4784bab3f35d7836a0a7476c96e57c3f6607dd3d94cc0989b29d33ce5ae5cde8be8e1a96f3e769ba3b0e1ba4a244f873aa5623 + languageName: node + linkType: hard + "async-mutex@npm:^0.4.0": version: 0.4.1 resolution: "async-mutex@npm:0.4.1" @@ -15565,6 +18157,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-macros@npm:^3.1.0": + version: 3.1.0 + resolution: "babel-plugin-macros@npm:3.1.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + cosmiconfig: "npm:^7.0.0" + resolve: "npm:^1.19.0" + checksum: 10/30be6ca45e9a124c58ca00af9a0753e5410ec0b79a737714fc4722bbbeb693e55d9258f05c437145ef4a867c2d1603e06a1c292d66c243ce1227458c8ea2ca8c + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.10": version: 0.4.11 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" @@ -15651,6 +18254,13 @@ __metadata: languageName: node linkType: hard +"base-x@npm:^4.0.0": + version: 4.0.0 + resolution: "base-x@npm:4.0.0" + checksum: 10/b25db9e07eb1998472a20557c7f00c797dc0595f79df95155ab74274e7fa98b9f2659b3ee547ac8773666b7f69540656793aeb97ad2b1ceccdb6fa5faaf69ac0 + languageName: node + linkType: hard + "base64-js@npm:^1.0.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -15692,7 +18302,14 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.44": +"bfs-path@npm:^1.0.2": + version: 1.0.2 + resolution: "bfs-path@npm:1.0.2" + checksum: 10/0c629521b925864315ed8c73b05aff561bac9819abc872180aace924b35b337a98ffd430a1b1f580896003c7e991527f761d2a4d4161edcad844a2f122cb9489 + languageName: node + linkType: hard + +"big-integer@npm:^1.6.44, big-integer@npm:^1.6.48": version: 1.6.52 resolution: "big-integer@npm:1.6.52" checksum: 10/4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 @@ -15732,6 +18349,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:9.1.2, bignumber.js@npm:^9.1.2": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 10/d89b8800a987225d2c00dcbf8a69dc08e92aa0880157c851c287b307d31ceb2fc2acb0c62c3e3a3d42b6c5fcae9b004035f13eb4386e56d529d7edac18d5c9d8 + languageName: node + linkType: hard + "bignumber.js@npm:^9.0.0, bignumber.js@npm:^9.0.1": version: 9.0.2 resolution: "bignumber.js@npm:9.0.2" @@ -15769,6 +18393,21 @@ __metadata: languageName: node linkType: hard +"bip32@npm:^2.0.6": + version: 2.0.6 + resolution: "bip32@npm:2.0.6" + dependencies: + "@types/node": "npm:10.12.18" + bs58check: "npm:^2.1.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + tiny-secp256k1: "npm:^1.1.3" + typeforce: "npm:^1.11.5" + wif: "npm:^2.0.6" + checksum: 10/9d71a946722c302b080771ab22dc83a0d7337a29845f80715c9d258cddaf42bb42b35ab49c3498e5cc60b27c1864397d6bdac713c9726ecf72c04f07b4cb5d40 + languageName: node + linkType: hard + "bip39@npm:3.0.4": version: 3.0.4 resolution: "bip39@npm:3.0.4" @@ -15781,6 +18420,15 @@ __metadata: languageName: node linkType: hard +"bip39@npm:^3.0.3": + version: 3.1.0 + resolution: "bip39@npm:3.1.0" + dependencies: + "@noble/hashes": "npm:^1.2.0" + checksum: 10/406c0b5bdab0d43df2ff8916c5b57bb7f65cd36a115cbd7620a75b972638f8511840bfc27bfc68946027086fd33ed3050d8cd304e85fd527503b23d857a8486e + languageName: node + linkType: hard + "birpc@npm:0.2.14": version: 0.2.14 resolution: "birpc@npm:0.2.14" @@ -15912,7 +18560,7 @@ __metadata: languageName: node linkType: hard -"bowser@npm:^2.11.0": +"bowser@npm:2.11.0, bowser@npm:^2.11.0, bowser@npm:^2.9.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" checksum: 10/ef46500eafe35072455e7c3ae771244e97827e0626686a9a3601c436d16eb272dad7ccbd49e2130b599b617ca9daa67027de827ffc4c220e02f63c84b69a8751 @@ -16083,7 +18731,16 @@ __metadata: languageName: node linkType: hard -"bs58check@npm:^2.1.2": +"bs58@npm:^5.0.0": + version: 5.0.0 + resolution: "bs58@npm:5.0.0" + dependencies: + base-x: "npm:^4.0.0" + checksum: 10/2475cb0684e07077521aac718e604a13e0f891d58cff923d437a2f7e9e28703ab39fce9f84c7c703ab369815a675f11e3bd394d38643bfe8969fbe42e6833d45 + languageName: node + linkType: hard + +"bs58check@npm:<3.0.0, bs58check@npm:^2.1.1, bs58check@npm:^2.1.2": version: 2.1.2 resolution: "bs58check@npm:2.1.2" dependencies: @@ -16205,6 +18862,16 @@ __metadata: languageName: node linkType: hard +"bufferutil@npm:^4.0.8": + version: 4.0.8 + resolution: "bufferutil@npm:4.0.8" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 10/d9337badc960a19d5a031db5de47159d7d8a11b6bab399bdfbf464ffa9ecd2972fef19bb61a7d2827e0c55f912c20713e12343386b86cb013f2b99c2324ab6a3 + languageName: node + linkType: hard + "bufio@npm:^1.0.7": version: 1.2.0 resolution: "bufio@npm:1.2.0" @@ -16449,6 +19116,23 @@ __metadata: languageName: node linkType: hard +"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": + version: 3.9.3 + resolution: "@coinbase/wallet-sdk@npm:3.9.3" + dependencies: + bn.js: "npm:^5.2.1" + buffer: "npm:^6.0.3" + clsx: "npm:^1.2.1" + eth-block-tracker: "npm:^7.1.0" + eth-json-rpc-filters: "npm:^6.0.0" + eventemitter3: "npm:^5.0.1" + keccak: "npm:^3.0.3" + preact: "npm:^10.16.0" + sha.js: "npm:^2.4.11" + checksum: 10/3bc3f0edad8ea46cb7a127993373093d95b6fef03d2a6a40bae7983a1d9a20a114faa8e7bf1230efd380ffb67b42dae405c6617cd6fad6d278bf9b9e021a0280 + languageName: node + linkType: hard + "chai-as-promised@npm:^8.0.0": version: 8.0.0 resolution: "chai-as-promised@npm:8.0.0" @@ -16460,7 +19144,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:4.5.0, chai@npm:^4.3.10, chai@npm:^4.3.7, chai@npm:^4.5.0": +"chai@npm:^4.3.10, chai@npm:^4.3.7, chai@npm:^4.5.0": version: 4.5.0 resolution: "chai@npm:4.5.0" dependencies: @@ -16505,6 +19189,22 @@ __metadata: languageName: node linkType: hard +"chalk-template@npm:1.1.0": + version: 1.1.0 + resolution: "chalk-template@npm:1.1.0" + dependencies: + chalk: "npm:^5.2.0" + checksum: 10/868aae8d4e7556ad2f35de4e04fe65dbe1ea6c5c80ad783f1c156d0a5c33f444c6814f49cbb68fe348c78e99daf2bcf566b47ad7e13603e4691ca78b2f422824 + languageName: node + linkType: hard + +"chalk@npm:5.3.0, chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -16536,13 +19236,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea - languageName: node - linkType: hard - "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -16695,7 +19388,7 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.6": +"citty@npm:^0.1.5, citty@npm:^0.1.6": version: 0.1.6 resolution: "citty@npm:0.1.6" dependencies: @@ -16769,6 +19462,15 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-cursor@npm:4.0.0" + dependencies: + restore-cursor: "npm:^4.0.0" + checksum: 10/ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc + languageName: node + linkType: hard + "cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" @@ -16776,13 +19478,6 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:^2.8.0": - version: 2.9.0 - resolution: "cli-spinners@npm:2.9.0" - checksum: 10/457497ccef70eec3f1d0825e4a3396ba43f6833a4900c2047c0efe2beecb1c0df476949ea378bcb6595754f7508e28ae943eeb30bbda807f59f547b270ec334c - languageName: node - linkType: hard - "cli-table3@npm:^0.5.0": version: 0.5.1 resolution: "cli-table3@npm:0.5.1" @@ -16843,13 +19538,6 @@ __metadata: languageName: node linkType: hard -"cli-width@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-width@npm:4.0.0" - checksum: 10/6de44fee34dadfc95a68ba012ea4d06d776289c251a283473e5ee240f26bbade4816766eb699c78b91804943c405097155bddf8c3e492daf1da7d9ab38a89878 - languageName: node - linkType: hard - "cli-width@npm:^4.1.0": version: 4.1.0 resolution: "cli-width@npm:4.1.0" @@ -16857,6 +19545,24 @@ __metadata: languageName: node linkType: hard +"client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 10/0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + +"clipboardy@npm:^4.0.0": + version: 4.0.0 + resolution: "clipboardy@npm:4.0.0" + dependencies: + execa: "npm:^8.0.1" + is-wsl: "npm:^3.1.0" + is64bit: "npm:^2.0.0" + checksum: 10/ec4ebe7e5c81d9c9cb994637e7b0e068c1c8fc272167ecd5519f967427271ec66e0e64da7268a2630b860eff42933aeabe25ba5e42bb80dbf1fae6362df059ed + languageName: node + linkType: hard + "cliui@npm:^5.0.0": version: 5.0.0 resolution: "cliui@npm:5.0.0" @@ -16928,13 +19634,20 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0, clsx@npm:^2.1.1": +"clsx@npm:2.1.1, clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 languageName: node linkType: hard +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -16997,6 +19710,13 @@ __metadata: languageName: node linkType: hard +"color2k@npm:^2.0.2": + version: 2.0.3 + resolution: "color2k@npm:2.0.3" + checksum: 10/63385b3c43749a96a4edfd5f4d30103f850e5a4ab01ad39ec70bebd940a237ab79cbd2d7b2bf4eede6ef6122a1b904877f628500fdc5521310e39d3572370d6c + languageName: node + linkType: hard + "colorette@npm:^2.0.16": version: 2.0.17 resolution: "colorette@npm:2.0.17" @@ -17051,6 +19771,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:12.1.0, commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 + languageName: node + linkType: hard + "commander@npm:3.0.2": version: 3.0.2 resolution: "commander@npm:3.0.2" @@ -17065,13 +19792,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 - languageName: node - linkType: hard - "commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -17229,6 +19949,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10/dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -17236,6 +19963,13 @@ __metadata: languageName: node linkType: hard +"cookie-es@npm:^1.2.2": + version: 1.2.2 + resolution: "cookie-es@npm:1.2.2" + checksum: 10/0fd742c11caa185928e450543f84df62d4b2c1fc7b5041196b57b7db04e1c6ac6585fb40e4f579a2819efefd2d6a9cbb4d17f71240d05f4dcd8f74ae81341a20 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -17264,6 +19998,15 @@ __metadata: languageName: node linkType: hard +"copy-to-clipboard@npm:3.3.3, copy-to-clipboard@npm:^3.3.3": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: "npm:^1.0.6" + checksum: 10/e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + "core-js-compat@npm:^3.36.1, core-js-compat@npm:^3.37.1": version: 3.37.1 resolution: "core-js-compat@npm:3.37.1" @@ -17304,6 +20047,36 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" + dependencies: + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/8bdf1dfbb6fdb3755195b6886dc0649a3c742ec75afa4cb8da7b070936aed22a4f4e5b7359faafe03180358f311dbc300d248fd6586c458203d376a40cc77826 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10/03600bb3870c80ed151b7b706b99a1f6d78df8f4bdad9c95485072ea13358ef294b13dd99f9e7bf4cc0b43bcd3599d40df7e648750d21c2f6817ca2cd687e071 + languageName: node + linkType: hard + "cosmiconfig@npm:^8.0.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -17397,6 +20170,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "cross-fetch@npm:4.0.0" + dependencies: + node-fetch: "npm:^2.6.12" + checksum: 10/e231a71926644ef122d334a3a4e73d9ba3ba4b480a8a277fb9badc434c1ba905b3d60c8034e18b348361a09afbec40ba9371036801ba2b675a7b84588f9f55d8 + languageName: node + linkType: hard + "cross-spawn@npm:^5.1.0": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" @@ -17421,7 +20203,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -17432,6 +20214,26 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.5": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 + languageName: node + linkType: hard + +"crossws@npm:>=0.2.0 <0.4.0": + version: 0.3.1 + resolution: "crossws@npm:0.3.1" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10/d358a58b364b3314a0e42ee66b1432c01d416128e53eda983eb121abdad5ff39831a1f1ea3e90e80157ceaa0fc925f5193c151b156aa62af9e0c9bcb2fb2a15a + languageName: node + linkType: hard + "crypt@npm:>= 0.0.1": version: 0.0.2 resolution: "crypt@npm:0.0.2" @@ -17439,7 +20241,7 @@ __metadata: languageName: node linkType: hard -"crypto-js@npm:^4.2.0": +"crypto-js@npm:^4.0.0, crypto-js@npm:^4.2.0": version: 4.2.0 resolution: "crypto-js@npm:4.2.0" checksum: 10/c7bcc56a6e01c3c397e95aa4a74e4241321f04677f9a618a8f48a63b5781617248afb9adb0629824792e7ec20ca0d4241a49b6b2938ae6f973ec4efc5c53c924 @@ -17453,6 +20255,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: 10/c67a3a2d0d81843af87f8bf0a4d0845b0f952377714abbb2884e48942409d57a2110eabee003609d02ee487b054614bdfcfc59ee265728ff105bd5aa221c1d0e + languageName: node + linkType: hard + "css.escape@npm:^1.5.1": version: 1.5.1 resolution: "css.escape@npm:1.5.1" @@ -17469,7 +20278,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": +"csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade @@ -17568,6 +20377,15 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:^2.29.3": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": "npm:^7.21.0" + checksum: 10/70b3e8ea7aaaaeaa2cd80bd889622a4bcb5d8028b4de9162cbcda359db06e16ff6e9309e54eead5341e71031818497f19aaf9839c87d1aba1e27bb4796e758a9 + languageName: node + linkType: hard + "date-fns@npm:^3.6.0": version: 3.6.0 resolution: "date-fns@npm:3.6.0" @@ -17612,7 +20430,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0": +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -17621,6 +20439,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + languageName: node + linkType: hard + "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -17652,6 +20482,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 10/17a0e5fa400bf9ea84432226e252aa7b5e72793e16bf80b907c99b46a799aeacc139ec20ea57121e50c7bd875a1a4365928f884e92abf02e21a5a13790a0f33e + languageName: node + linkType: hard + "decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0": version: 3.3.0 resolution: "decompress-response@npm:3.3.0" @@ -17691,6 +20528,18 @@ __metadata: languageName: node linkType: hard +"dedent@npm:^1.5.3": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10/e5277f6268f288649503125b781a7b7a2c9b22d011139688c0b3619fe40121e600eb1f077c891938d4b2428bdb6326cc3c77a763e4b1cc681bd9666ab1bad2a1 + languageName: node + linkType: hard + "deep-eql@npm:^3.0.1": version: 3.0.1 resolution: "deep-eql@npm:3.0.1" @@ -17872,6 +20721,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^4.4.0": + version: 4.4.1 + resolution: "delay@npm:4.4.1" + checksum: 10/97b001126a3979a398b6c5f33e437d78acda3b19731d9e6f991a05e2e09e7a410d655b8fdcaedc05743928bb533c0ac9401826cccb2af71c81d2cab50e199351 + languageName: node + linkType: hard + "delay@npm:^5.0.0": version: 5.0.0 resolution: "delay@npm:5.0.0" @@ -17914,6 +20770,13 @@ __metadata: languageName: node linkType: hard +"destr@npm:^2.0.3": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: 10/dbb756baa876810ec0ca4bcb702d86cc3b480ed14f36bf5747718ed211f96bca5520b63a4109eb181ad940ee2a645677d9a63d4a0ed11a7510619dae97317201 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -17921,6 +20784,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.3.0, detect-browser@npm:^5.2.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: 10/4a8551e1f5170633c9aa976f16c57f81f1044d071b2eb853c572bd817bf9cd0cc90c9c520d950edb5accd31b1b0c8ddb7a96e82040b0b5579f9f09c77446a117 + languageName: node + linkType: hard + "detect-indent@npm:^6.0.0, detect-indent@npm:^6.1.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -18031,6 +20901,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 10/0d8429699a6d5897ed371de494ef3c7072e8052b42abbd978e686a9b8689e70af005fa3e93e93263ee3653673ff5f89c36db830a57ae7c2e088cb9c496307507 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -18142,7 +21019,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.0.0": +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2": version: 4.1.3 resolution: "duplexify@npm:4.1.3" dependencies: @@ -18180,6 +21057,18 @@ __metadata: languageName: node linkType: hard +"eciesjs@npm:^0.4.8": + version: 0.4.11 + resolution: "eciesjs@npm:0.4.11" + dependencies: + "@ecies/ciphers": "npm:^0.2.1" + "@noble/ciphers": "npm:^1.0.0" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + checksum: 10/3906d6286c4cde8dd93f5b8e1ad085aa0fdfd9a272c77a382062a782693247d19b6a99d749aff77d037777cfc49c02a8869a3aad47f192ac4f473b87cdbff4af + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -18187,6 +21076,13 @@ __metadata: languageName: node linkType: hard +"effect@npm:3.6.5": + version: 3.6.5 + resolution: "effect@npm:3.6.5" + checksum: 10/e722cc1d262dfcff85b3e43d11edafb03d68e0acf670ed0d709d32218e6bf2ae7084ac627430094b1be6aee6ffdeec061b1d097d2216fce18ebc7264087ab2f0 + languageName: node + linkType: hard + "ejs@npm:^3.1.8": version: 3.1.10 resolution: "ejs@npm:3.1.10" @@ -18227,6 +21123,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.3, elliptic@npm:^6.5.7": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10/dc678c9febd89a219c4008ba3a9abb82237be853d9fd171cd602c8fb5ec39927e65c6b5e7a1b2a4ea82ee8e0ded72275e7932bb2da04a5790c2638b818e4e1c5 + languageName: node + linkType: hard + "emittery@npm:0.10.0": version: 0.10.0 resolution: "emittery@npm:0.10.0" @@ -18241,6 +21152,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^10.3.0": + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: 10/76bb92c5bcf0b6980d37e535156231e4a9d0aa6ab3b9f5eabf7690231d5aa5d5b8e516f36e6804cbdd0f1c23dfef2a60c40ab7bb8aedd890584281a565b97c50 + languageName: node + linkType: hard + "emoji-regex@npm:^7.0.1": version: 7.0.3 resolution: "emoji-regex@npm:7.0.3" @@ -18269,7 +21187,7 @@ __metadata: languageName: node linkType: hard -"encode-utf8@npm:^1.0.2": +"encode-utf8@npm:^1.0.2, encode-utf8@npm:^1.0.3": version: 1.0.3 resolution: "encode-utf8@npm:1.0.3" checksum: 10/0204c37cda21bf19bb8f87f7ec6c89a23d43488c2ef1e5cfa40b64ee9568e63e15dc323fa7f50a491e2c6d33843a6b409f6de09afbf6cf371cb8da596cc64b44 @@ -18304,7 +21222,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -18313,16 +21231,37 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" +"engine.io-client@npm:~6.6.1": + version: 6.6.2 + resolution: "engine.io-client@npm:6.6.2" dependencies: - ansi-colors: "npm:^4.1.1" - checksum: 10/751d14f037eb7683997e696fb8d5fe2675e0b0cde91182c128cf598acf3f5bd9005f35f7c2a9109e291140af496ebec237b6dac86067d59a9b44f3688107f426 + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.1" + engine.io-parser: "npm:~5.2.1" + ws: "npm:~8.17.1" + xmlhttprequest-ssl: "npm:~2.1.1" + checksum: 10/c006b3389bb8bd0381926b9633e9f547dec187ea28d2dd99cb42d516b0720bc4373f3f937c199ca616c95b2832e0f547f73326f614caedfe39c02fa93b7ac733 languageName: node linkType: hard -"enquirer@npm:^2.3.6": +"engine.io-parser@npm:~5.2.1": + version: 5.2.3 + resolution: "engine.io-parser@npm:5.2.3" + checksum: 10/eb0023fff5766e7ae9d59e52d92df53fea06d472cfd7b52e5d2c36b4c1dbf78cab5fde1052bcb3d4bb85bdb5aee10ae85d8a1c6c04676dac0c6cdf16bcba6380 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.15.0": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 + languageName: node + linkType: hard + +"enquirer@npm:2.4.1, enquirer@npm:^2.3.6": version: 2.4.1 resolution: "enquirer@npm:2.4.1" dependencies: @@ -18332,6 +21271,15 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.3.0": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: "npm:^4.1.1" + checksum: 10/751d14f037eb7683997e696fb8d5fe2675e0b0cde91182c128cf598acf3f5bd9005f35f7c2a9109e291140af496ebec237b6dac86067d59a9b44f3688107f426 + languageName: node + linkType: hard + "entities@npm:2.2.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -18339,7 +21287,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e @@ -18865,117 +21813,37 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/1f723ec71c3aa196473bf3298316eedc3f62d523924652dfeb60701b609792f918fc60db84b420d1d8ba9bfa7d69de2fc1d3157ba47c028bdae5d507a26a3c64 - languageName: node - linkType: hard - -"esbuild@npm:^0.21.3": - version: 0.21.5 - resolution: "esbuild@npm:0.21.5" - dependencies: - "@esbuild/aix-ppc64": "npm:0.21.5" - "@esbuild/android-arm": "npm:0.21.5" - "@esbuild/android-arm64": "npm:0.21.5" - "@esbuild/android-x64": "npm:0.21.5" - "@esbuild/darwin-arm64": "npm:0.21.5" - "@esbuild/darwin-x64": "npm:0.21.5" - "@esbuild/freebsd-arm64": "npm:0.21.5" - "@esbuild/freebsd-x64": "npm:0.21.5" - "@esbuild/linux-arm": "npm:0.21.5" - "@esbuild/linux-arm64": "npm:0.21.5" - "@esbuild/linux-ia32": "npm:0.21.5" - "@esbuild/linux-loong64": "npm:0.21.5" - "@esbuild/linux-mips64el": "npm:0.21.5" - "@esbuild/linux-ppc64": "npm:0.21.5" - "@esbuild/linux-riscv64": "npm:0.21.5" - "@esbuild/linux-s390x": "npm:0.21.5" - "@esbuild/linux-x64": "npm:0.21.5" - "@esbuild/netbsd-x64": "npm:0.21.5" - "@esbuild/openbsd-x64": "npm:0.21.5" - "@esbuild/sunos-x64": "npm:0.21.5" - "@esbuild/win32-arm64": "npm:0.21.5" - "@esbuild/win32-ia32": "npm:0.21.5" - "@esbuild/win32-x64": "npm:0.21.5" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b + checksum: 10/1f723ec71c3aa196473bf3298316eedc3f62d523924652dfeb60701b609792f918fc60db84b420d1d8ba9bfa7d69de2fc1d3157ba47c028bdae5d507a26a3c64 languageName: node linkType: hard -"esbuild@npm:~0.19.10": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": "npm:0.19.12" - "@esbuild/android-arm": "npm:0.19.12" - "@esbuild/android-arm64": "npm:0.19.12" - "@esbuild/android-x64": "npm:0.19.12" - "@esbuild/darwin-arm64": "npm:0.19.12" - "@esbuild/darwin-x64": "npm:0.19.12" - "@esbuild/freebsd-arm64": "npm:0.19.12" - "@esbuild/freebsd-x64": "npm:0.19.12" - "@esbuild/linux-arm": "npm:0.19.12" - "@esbuild/linux-arm64": "npm:0.19.12" - "@esbuild/linux-ia32": "npm:0.19.12" - "@esbuild/linux-loong64": "npm:0.19.12" - "@esbuild/linux-mips64el": "npm:0.19.12" - "@esbuild/linux-ppc64": "npm:0.19.12" - "@esbuild/linux-riscv64": "npm:0.19.12" - "@esbuild/linux-s390x": "npm:0.19.12" - "@esbuild/linux-x64": "npm:0.19.12" - "@esbuild/netbsd-x64": "npm:0.19.12" - "@esbuild/openbsd-x64": "npm:0.19.12" - "@esbuild/sunos-x64": "npm:0.19.12" - "@esbuild/win32-arm64": "npm:0.19.12" - "@esbuild/win32-ia32": "npm:0.19.12" - "@esbuild/win32-x64": "npm:0.19.12" +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -19025,7 +21893,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/861fa8eb2428e8d6521a4b7c7930139e3f45e8d51a86985cc29408172a41f6b18df7b3401e7e5e2d528cdf83742da601ddfdc77043ddc4f1c715a8ddb2d8a255 + checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b languageName: node linkType: hard @@ -19140,6 +22008,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:2.0.0, escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + "escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -19147,13 +22022,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - "escodegen@npm:1.8.x": version: 1.8.1 resolution: "escodegen@npm:1.8.1" @@ -19202,6 +22070,83 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10/d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.6.3": + version: 3.6.3 + resolution: "eslint-import-resolver-typescript@npm:3.6.3" + dependencies: + "@nolyfill/is-core-module": "npm:1.0.39" + debug: "npm:^4.3.5" + enhanced-resolve: "npm:^5.15.0" + eslint-module-utils: "npm:^2.8.1" + fast-glob: "npm:^3.3.2" + get-tsconfig: "npm:^4.7.5" + is-bun-module: "npm:^1.0.2" + is-glob: "npm:^4.0.3" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10/5f9956dbbd0becc3d6c6cb945dad0e5e6f529cfd0f488d5688f3c59840cd7f4a44ab6aee0f54b5c4188134dab9a01cb63c1201767bde7fc330b7c1a14747f8ac + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0, eslint-module-utils@npm:^2.8.1": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.31.0": + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10/6b76bd009ac2db0615d9019699d18e2a51a86cb8c1d0855a35fb1b418be23b40239e6debdc6e8c92c59f1468ed0ea8d7b85c817117a113d5cc225be8a02ad31c + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^28.2.0": version: 28.2.0 resolution: "eslint-plugin-jest@npm:28.2.0" @@ -19257,37 +22202,26 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^0.6.15": - version: 0.6.15 - resolution: "eslint-plugin-storybook@npm:0.6.15" +"eslint-plugin-storybook@npm:^0.11.1": + version: 0.11.1 + resolution: "eslint-plugin-storybook@npm:0.11.1" dependencies: - "@storybook/csf": "npm:^0.0.1" - "@typescript-eslint/utils": "npm:^5.45.0" - requireindex: "npm:^1.1.0" + "@storybook/csf": "npm:^0.1.11" + "@typescript-eslint/utils": "npm:^8.8.1" ts-dedent: "npm:^2.2.0" peerDependencies: eslint: ">=6" - checksum: 10/0c278594c8474ce2f176ffc6610240ae9d6c8f9dafbff02be61e6ae05f15081ce858c5b16e64d8995a3a3777c9d1725953fcde4312efab9118aa544a75b27c46 + checksum: 10/3a8757e403227665566a9ee35a735bf72529a8eb2d6ba270c99e6df140601984b43e7fcf274ebee601fe3d946c76edfeefcce4200077da53edc26212ba5bd03c languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10/c541ef384c92eb5c999b7d3443d80195fcafb3da335500946f6db76539b87d5826c8f2e1d23bf6afc3154ba8cd7c8e566f8dc00f1eea25fdf3afc8fb9c87b238 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + checksum: 10/cd9ab60d5a68f3a0fcac04d1cff5a7383d0f331964d5f1c446259123caec5b3ccc542284d07846e4f4d1389da77750821cc9a6e1ce18558c674977351666f9a6 languageName: node linkType: hard @@ -19305,69 +22239,70 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 languageName: node linkType: hard -"eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint@npm:^9.15.0": + version: 9.15.0 + resolution: "eslint@npm:9.15.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.0" + "@eslint/core": "npm:^0.9.0" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:9.15.0" + "@eslint/plugin-kit": "npm:^0.2.3" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.5" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 + checksum: 10/7ac1a2e6070bae64b2b0588fabad528cd3e478a6ba5e9f8185d8d9f2dce17a36630bd019b5d32d1052ea177444ab9c83f3c08baa76121c13e1ed0584ef158956 languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.14.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 languageName: node linkType: hard @@ -19391,12 +22326,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -19416,13 +22351,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -19467,6 +22395,19 @@ __metadata: languageName: node linkType: hard +"eth-block-tracker@npm:^7.1.0": + version: 7.1.0 + resolution: "eth-block-tracker@npm:7.1.0" + dependencies: + "@metamask/eth-json-rpc-provider": "npm:^1.0.0" + "@metamask/safe-event-emitter": "npm:^3.0.0" + "@metamask/utils": "npm:^5.0.1" + json-rpc-random-id: "npm:^1.0.1" + pify: "npm:^3.0.0" + checksum: 10/b001ecb126e949a9ff19950596d5180b2f1bc5504e3dec0c01b3417e8ad190f4a53dfc61be901b72ab6dd558d1d711b73eca560bc8a605d0348eef9f501defab + languageName: node + linkType: hard + "eth-ens-namehash@npm:2.0.8": version: 2.0.8 resolution: "eth-ens-namehash@npm:2.0.8" @@ -19505,6 +22446,19 @@ __metadata: languageName: node linkType: hard +"eth-json-rpc-filters@npm:^6.0.0": + version: 6.0.1 + resolution: "eth-json-rpc-filters@npm:6.0.1" + dependencies: + "@metamask/safe-event-emitter": "npm:^3.0.0" + async-mutex: "npm:^0.2.6" + eth-query: "npm:^2.1.2" + json-rpc-engine: "npm:^6.1.0" + pify: "npm:^5.0.0" + checksum: 10/d1fa8bb21da07c2f5d37c1e6053d499b272b4f49542077efc6b05eebe49affa9df7221c8c2439c4e33caa3f4ccb35240a6105abc83b83375dae03c0de53113a7 + languageName: node + linkType: hard + "eth-lib@npm:0.2.8": version: 0.2.8 resolution: "eth-lib@npm:0.2.8" @@ -19530,6 +22484,25 @@ __metadata: languageName: node linkType: hard +"eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: "npm:^1.0.0" + xtend: "npm:^4.0.1" + checksum: 10/af4f3575b8315f8156a83a24e850881053748aca97e4aee12dd6645ab56f0985c7000a5c45ccf315702f3e532f0c6464e03f4aba294c658dee89f5e5d1b86702 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^4.0.2, eth-rpc-errors@npm:^4.0.3": + version: 4.0.3 + resolution: "eth-rpc-errors@npm:4.0.3" + dependencies: + fast-safe-stringify: "npm:^2.0.6" + checksum: 10/47ce14170eabaee51ab1cc7e643bb3ef96ee6b15c6404806aedcd51750e00ae0b1a12c37785b180679b8d452b6dd44a0240bb018d01fa73efc85fcfa808b35a7 + languageName: node + linkType: hard + "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -19574,6 +22547,18 @@ __metadata: languageName: node linkType: hard +"ethereum-cryptography@npm:^2.0.0": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" + dependencies: + "@noble/curves": "npm:1.4.2" + "@noble/hashes": "npm:1.4.0" + "@scure/bip32": "npm:1.4.0" + "@scure/bip39": "npm:1.3.0" + checksum: 10/ab123bbfe843500ac2d645ce9edc4bc814962ffb598db6bf8bf01fbecac656e6c81ff4cf2472f1734844bbcbad2bf658d8b699cb7248d768e0f06ae13ecf43b8 + languageName: node + linkType: hard + "ethereum-waffle@npm:^4.0.10": version: 4.0.10 resolution: "ethereum-waffle@npm:4.0.10" @@ -19643,7 +22628,24 @@ __metadata: languageName: node linkType: hard -"ethers@npm:5.7.2, ethers@npm:^5.1.0, ethers@npm:^5.3.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": +"ethers@npm:^4.0.40": + version: 4.0.49 + resolution: "ethers@npm:4.0.49" + dependencies: + aes-js: "npm:3.0.0" + bn.js: "npm:^4.11.9" + elliptic: "npm:6.5.4" + hash.js: "npm:1.1.3" + js-sha3: "npm:0.5.7" + scrypt-js: "npm:2.0.4" + setimmediate: "npm:1.0.4" + uuid: "npm:2.0.1" + xmlhttprequest: "npm:1.8.0" + checksum: 10/a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 + languageName: node + linkType: hard + +"ethers@npm:^5.1.0, ethers@npm:^5.3.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": version: 5.7.2 resolution: "ethers@npm:5.7.2" dependencies: @@ -19681,23 +22683,6 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^4.0.40": - version: 4.0.49 - resolution: "ethers@npm:4.0.49" - dependencies: - aes-js: "npm:3.0.0" - bn.js: "npm:^4.11.9" - elliptic: "npm:6.5.4" - hash.js: "npm:1.1.3" - js-sha3: "npm:0.5.7" - scrypt-js: "npm:2.0.4" - setimmediate: "npm:1.0.4" - uuid: "npm:2.0.1" - xmlhttprequest: "npm:1.8.0" - checksum: 10/a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 - languageName: node - linkType: hard - "ethjs-unit@npm:0.1.6": version: 0.1.6 resolution: "ethjs-unit@npm:0.1.6" @@ -19725,6 +22710,13 @@ __metadata: languageName: node linkType: hard +"eventemitter2@npm:^6.4.7": + version: 6.4.9 + resolution: "eventemitter2@npm:6.4.9" + checksum: 10/b829b1c6b11e15926b635092b5ad62b4463d1c928859831dcae606e988cf41893059e3541f5a8209d21d2f15314422ddd4d84d20830b4bf44978608d15b06b08 + languageName: node + linkType: hard + "eventemitter3@npm:4.0.4": version: 4.0.4 resolution: "eventemitter3@npm:4.0.4" @@ -19732,6 +22724,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -19739,14 +22738,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 - languageName: node - linkType: hard - -"events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:3.3.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -19972,7 +22964,17 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": +"extension-port-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "extension-port-stream@npm:3.0.0" + dependencies: + readable-stream: "npm:^3.6.2 || ^4.4.2" + webextension-polyfill: "npm:>=0.10.0 <1.0" + checksum: 10/4f51d2258a96154c2d916a8a5425636a2b0817763e9277f7dc378d08b6f050c90d185dbde4313d27cf66ad99d4b3116479f9f699c40358c64cccfa524d2b55bf + languageName: node + linkType: hard + +"external-editor@npm:^3.1.0": version: 3.1.0 resolution: "external-editor@npm:3.1.0" dependencies: @@ -20025,6 +23027,24 @@ __metadata: languageName: node linkType: hard +"fast-check@npm:3.21.0": + version: 3.21.0 + resolution: "fast-check@npm:3.21.0" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10/64e221858d5d98c6ea10c81e6a1a66760565bca41883466891974197a5439c7f0fe1dc293b8d887eaf959d0ff85197cc9d76813ae6215b018cde313254db7d53 + languageName: node + linkType: hard + +"fast-check@npm:^3.21.0": + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10/03720c2d4adf02701a2e974b83d6439477851a6524c5980df0870dc0032f0200cc5e157f47641afa79dc42733b05058f2333df54291d5ac39d108d317a62e6c0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -20059,7 +23079,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.0": +"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -20086,13 +23106,20 @@ __metadata: languageName: node linkType: hard -"fast-redact@npm:^3.1.1": +"fast-redact@npm:^3.0.0, fast-redact@npm:^3.1.1": version: 3.5.0 resolution: "fast-redact@npm:3.5.0" checksum: 10/24b27e2023bd5a62f908d97a753b1adb8d89206b260f97727728e00b693197dea2fc2aa3711147a385d0ec6e713569fd533df37a4ef947e08cb65af3019c7ad5 languageName: node linkType: hard +"fast-safe-stringify@npm:^2.0.6": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10/dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 + languageName: node + linkType: hard + "fast-stable-stringify@npm:^1.0.0": version: 1.0.0 resolution: "fast-stable-stringify@npm:1.0.0" @@ -20163,12 +23190,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + flat-cache: "npm:^4.0.0" + checksum: 10/afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard @@ -20207,6 +23234,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: 10/9d681939eec2b4b129cb4f307b7e93d954a0657421d4e5357d86093b26d3f4f570909ed43717dcfd62428b3cf8cddd9841b35f9d40d12ac62cfabaa677942593 + languageName: node + linkType: hard + "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -20253,6 +23287,13 @@ __metadata: languageName: node linkType: hard +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10/caa799c976a14925ba7f31ca1a226fe73d3aa270f4f1b623fcfeb1c6e263111db4beb807d8acd31bd4d48d44c343b93688a9288dfbccca27463c36a0301b0bb9 + languageName: node + linkType: hard + "find-up@npm:3.0.0, find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -20310,13 +23351,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: - flatted: "npm:^3.1.0" - rimraf: "npm:^3.0.2" - checksum: 10/9fe5d0cb97c988e3b25242e71346965fae22757674db3fca14206850af2efa3ca3b04a3ba0eba8d5e20fd8a3be80a2e14b1c2917e70ffe1acb98a8c3327e4c9f + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10/58ce851d9045fffc7871ce2bd718bc485ad7e777bf748c054904b87c351ff1080c2c11da00788d78738bfb51b71e4d5ea12d13b98eb36e3358851ffe495b62dc languageName: node linkType: hard @@ -20329,10 +23370,10 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.5 - resolution: "flatted@npm:3.2.5" - checksum: 10/eed01f72ad0317561e4d6187f7408dc391f7849d9cd6700520ce06155d1859539b6899afdfefc815ce51ec48f97d1015350287c541b5302a49581cf25cec1cd2 +"flatted@npm:^3.2.9": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 languageName: node linkType: hard @@ -20352,6 +23393,15 @@ __metadata: languageName: node linkType: hard +"focus-lock@npm:^1.3.5": + version: 1.3.5 + resolution: "focus-lock@npm:1.3.5" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10/1078c9d1f5515c47961a27d22b3b09c2a4eaf42a405f9be621d5ec5f426086a65f5937bff8a104e93d4bd84a7d8364e2f3ec07be876dae259df207384bbfb5de + languageName: node + linkType: hard + "follow-redirects@npm:^1.12.1": version: 1.15.1 resolution: "follow-redirects@npm:1.15.1" @@ -20483,6 +23533,36 @@ __metadata: languageName: node linkType: hard +"framer-motion@npm:^10.16.4": + version: 10.18.0 + resolution: "framer-motion@npm:10.18.0" + dependencies: + "@emotion/is-prop-valid": "npm:^0.8.2" + tslib: "npm:^2.4.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependenciesMeta: + "@emotion/is-prop-valid": + optional: true + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10/8dc61e16af34ea7c7e830e03f588c54b7a186a767787eb6373ac692bbffa219959d50b7cf983f54305951e121ea7d50ebd4819920290fc6ad58b03fc5eb2bdde + languageName: node + linkType: hard + +"framesync@npm:6.1.2": + version: 6.1.2 + resolution: "framesync@npm:6.1.2" + dependencies: + tslib: "npm:2.4.0" + checksum: 10/741161b8978173acaf515ab45ff127496476e6262e624de3ccb995a67a8b32c65a4242e178646bb5554f128dd4a350ecff675c7fbd4e2aa4568dffab932ebe29 + languageName: node + linkType: hard + "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -20833,6 +23913,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.0.0": + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 10/8e8e779eb28701db7fdb1c8cab879e39e6ae23f52dadd89c8aed05869671cee611a65d4f8557b83e981428623247d8bc5d0c7a4ef3ea7a41d826e73600112ad8 + languageName: node + linkType: hard + "get-func-name@npm:^2.0.0": version: 2.0.0 resolution: "get-func-name@npm:2.0.0" @@ -20904,6 +23991,13 @@ __metadata: languageName: node linkType: hard +"get-port-please@npm:^3.1.2": + version: 3.1.2 + resolution: "get-port-please@npm:3.1.2" + checksum: 10/ec8b8da9f816edde114b76742ec29695730094904bb0e94309081e4adf3f797b483b9d648abcf5e0511c4e21a7bf68334672b9575f8b23bccf93bf97eb517f0e + languageName: node + linkType: hard + "get-port@npm:^3.1.0": version: 3.2.0 resolution: "get-port@npm:3.2.0" @@ -20979,15 +24073,6 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.2": - version: 4.7.3 - resolution: "get-tsconfig@npm:4.7.3" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/7397bb4f8aef936df4d9016555b662dcf5279f3c46428b7c7c1ff5e94ab2b87d018b3dda0f4bc1a28b154d5affd0eac5d014511172c085fd8a9cdff9ea7fe043 - languageName: node - linkType: hard - "get-tsconfig@npm:^4.7.5": version: 4.8.1 resolution: "get-tsconfig@npm:4.8.1" @@ -21227,19 +24312,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/9df85cde2f0dce6ac9b3a5e08bec109d2f3b38ddd055a83867e0672c55704866d53ce6a4265859fa630624baadd46f50ca38602a13607ad86be853a8c179d3e7 +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10/03939c8af95c6df5014b137cac83aa909090c3a3985caef06ee9a5a669790877af8698ab38007e4c0186873adc14c0b13764acc754b16a754c216cc56aa5f021 languageName: node linkType: hard @@ -21262,6 +24338,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:14.0.2": + version: 14.0.2 + resolution: "globby@npm:14.0.2" + dependencies: + "@sindresorhus/merge-streams": "npm:^2.1.0" + fast-glob: "npm:^3.3.2" + ignore: "npm:^5.2.4" + path-type: "npm:^5.0.0" + slash: "npm:^5.1.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10/67660da70fc1223f7170c1a62ba6c373385e9e39765d952b6518606dec15ed8c7958e9dae6ba5752a31dbc1e9126f146938b830ad680fe794141734ffc3fbb75 + languageName: node + linkType: hard + "globby@npm:^10.0.1": version: 10.0.2 resolution: "globby@npm:10.0.2" @@ -21477,6 +24567,24 @@ __metadata: languageName: node linkType: hard +"h3@npm:^1.12.0, h3@npm:^1.13.0": + version: 1.13.0 + resolution: "h3@npm:1.13.0" + dependencies: + cookie-es: "npm:^1.2.2" + crossws: "npm:>=0.2.0 <0.4.0" + defu: "npm:^6.1.4" + destr: "npm:^2.0.3" + iron-webcrypto: "npm:^1.2.1" + ohash: "npm:^1.1.4" + radix3: "npm:^1.1.2" + ufo: "npm:^1.5.4" + uncrypto: "npm:^0.1.3" + unenv: "npm:^1.10.0" + checksum: 10/ecdbe3cdddc767ea6f9be9939b14192dd296eb434641bbecc5b665f7210de8c03910ae40931668788395b5de6cd517afaa628d7b5ce0fb60786fce1ad6e81bcb + languageName: node + linkType: hard + "handlebars@npm:^4.0.1": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -21926,6 +25034,13 @@ __metadata: languageName: node linkType: hard +"hey-listen@npm:^1.0.8": + version: 1.0.8 + resolution: "hey-listen@npm:1.0.8" + checksum: 10/744b5f4c18c7cfb82b22bd22e1d300a9ac4eafe05a22e58fb87e48addfca8be00604d9aa006434ea02f9530990eb4b393ddb28659e2ab7f833ce873e32eb809c + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -21937,6 +25052,15 @@ __metadata: languageName: node linkType: hard +"hoist-non-react-statics@npm:^3.3.1": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10/1acbe85f33e5a39f90c822ad4d28b24daeb60f71c545279431dc98c312cd28a54f8d64788e477fe21dc502b0e3cf58589ebe5c1ad22af27245370391c2d24ea6 + languageName: node + linkType: hard + "hosted-git-info@npm:^2.1.4, hosted-git-info@npm:^2.6.0": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -21944,6 +25068,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^7.0.0": + version: 7.0.2 + resolution: "hosted-git-info@npm:7.0.2" + dependencies: + lru-cache: "npm:^10.0.1" + checksum: 10/8f085df8a4a637d995f357f48b1e3f6fc1f9f92e82b33fb406415b5741834ed431a510a09141071001e8deea2eee43ce72786463e2aa5e5a70db8648c0eedeab + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -22024,6 +25157,13 @@ __metadata: languageName: node linkType: hard +"http-shutdown@npm:^1.2.2": + version: 1.2.2 + resolution: "http-shutdown@npm:1.2.2" + checksum: 10/1c99b575b1a7ebd749950e7f59410348723638808336063321d89588b7f7b548d61c8e3566af0f1f4f961d941c758677d062d2289bc63356ead143da4d8f3daf + languageName: node + linkType: hard + "http-signature@npm:~1.2.0": version: 1.2.0 resolution: "http-signature@npm:1.2.0" @@ -22114,6 +25254,24 @@ __metadata: languageName: node linkType: hard +"i18next-browser-languagedetector@npm:7.1.0": + version: 7.1.0 + resolution: "i18next-browser-languagedetector@npm:7.1.0" + dependencies: + "@babel/runtime": "npm:^7.19.4" + checksum: 10/3b06c8a5df09092cffc0b6637b542bb572e8a25dcba97d0d8a5e5dd7539b90bf00000f3a279654693f4b5908c5fc4d1d4f3766dfb461dacab46be3d071266384 + languageName: node + linkType: hard + +"i18next@npm:23.11.5": + version: 23.11.5 + resolution: "i18next@npm:23.11.5" + dependencies: + "@babel/runtime": "npm:^7.23.2" + checksum: 10/3a8e0d5d2b9ac6c6fa8c2180452aaf816d60e1cc790da69d6be515feec85553f8af9fcc19414ade1a621f08236e84f38df4415a8234919fa97fa2e35624e86b6 + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -22132,6 +25290,13 @@ __metadata: languageName: node linkType: hard +"idb-keyval@npm:^6.2.1": + version: 6.2.1 + resolution: "idb-keyval@npm:6.2.1" + checksum: 10/9a1416ff5e2ceff3832f5645518f438833a5ff6ee316fe3ec111d580db120425991d64d8098a847be7541bbbb7cc941984b4d0d62d541c39f7a0f415594837c2 + languageName: node + linkType: hard + "idna-uts46-hx@npm:^2.3.1": version: 2.3.1 resolution: "idna-uts46-hx@npm:2.3.1" @@ -22169,6 +25334,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 + languageName: node + linkType: hard + "immediate@npm:^3.2.3": version: 3.3.0 resolution: "immediate@npm:3.3.0" @@ -22183,6 +25355,13 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.1.1": + version: 10.1.1 + resolution: "immer@npm:10.1.1" + checksum: 10/9dacf1e8c201d69191ccd88dc5d733bafe166cd45a5a360c5d7c88f1de0dff974a94114d72b35f3106adfe587fcfb131c545856184a2247d89d735ad25589863 + languageName: node + linkType: hard + "immutable@npm:^4.0.0-rc.12": version: 4.1.0 resolution: "immutable@npm:4.1.0" @@ -22304,7 +25483,19 @@ __metadata: languageName: node linkType: hard -"invariant@npm:2, invariant@npm:^2.2.4": +"intl-messageformat@npm:^10.1.0": + version: 10.7.6 + resolution: "intl-messageformat@npm:10.7.6" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.3" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.3" + tslib: "npm:2" + checksum: 10/53f40e386fcc2eaf1ec7d974b18c91e436bc2dc8188587aa652b307160220847b06275d28ca9757ffd9e8471bb6993bf503a71363ce5f9c155d8dc33b43ab97a + languageName: node + linkType: hard + +"invariant@npm:2, invariant@npm:2.2.4, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" dependencies: @@ -22336,6 +25527,13 @@ __metadata: languageName: node linkType: hard +"iron-webcrypto@npm:^1.2.1": + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: 10/c1f52ccfe2780efa5438c134538ee4b26c96a87d22f351d896781219efbce25b4fe716d1cb7f248e02da96881760541135acbcc7c0622ffedf71cb0e227bebf9 + languageName: node + linkType: hard + "is-absolute-url@npm:^3.0.0": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" @@ -22425,6 +25623,15 @@ __metadata: languageName: node linkType: hard +"is-bun-module@npm:^1.0.2": + version: 1.2.1 + resolution: "is-bun-module@npm:1.2.1" + dependencies: + semver: "npm:^7.6.3" + checksum: 10/1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": version: 1.2.4 resolution: "is-callable@npm:1.2.4" @@ -22470,6 +25677,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.15.1": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/77316d5891d5743854bcef2cd2f24c5458fb69fbc9705c12ca17d54a2017a67d0693bbf1ba8c77af376c0eef6bf6d1b27a4ab08e4db4e69914c3789bdf2ceec5 + languageName: node + linkType: hard + "is-core-module@npm:^2.8.1": version: 2.9.0 resolution: "is-core-module@npm:2.9.0" @@ -22513,6 +25729,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -22605,6 +25830,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -22612,6 +25848,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10/e8d52ad490bed7ae665032c7675ec07732bbfe25808b0efbc4d5a76b1a1f01c165f332775c63e25e9a03d319ebb6b24f571a9e902669fc1e40b0a60b5be6e26c + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -22680,7 +25923,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 @@ -22852,6 +26095,20 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.3.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10/20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10/f254e3da6b0ab1a57a94f7273a7798dd35d1d45b227759f600d0fa9d5649f9c07fa8d3c8a6360b0e376adf916d151ec24fc9a50c5295c58bae7ca54a76a063f9 + languageName: node + linkType: hard + "is-url@npm:^1.2.4": version: 1.2.4 resolution: "is-url@npm:1.2.4" @@ -22901,6 +26158,24 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10/f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"is64bit@npm:^2.0.0": + version: 2.0.0 + resolution: "is64bit@npm:2.0.0" + dependencies: + system-architecture: "npm:^0.1.0" + checksum: 10/94dafd5f29bfb96c542e89ef8c33e811159ca7d07a2890ab83026fa87706612af4101308d9392e9ee68e046e8604a6b59a8f41091f8556f6235efbcfd9c5574c + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -23595,6 +26870,22 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.1.2": + version: 2.4.0 + resolution: "jiti@npm:2.4.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/10aa999a4f9bccc82b1dab9ebaf4484a8770450883c1bf7fafc07f8fca1e417fd8e7731e651337d1060c9e2ff3f97362dcdfd27e86d1f385db97f4adf7b5a21d + languageName: node + linkType: hard + +"js-base64@npm:^3.7.5": + version: 3.7.7 + resolution: "js-base64@npm:3.7.7" + checksum: 10/185e34c536a6b1c4e1ad8bd96d25b49a9ea4e6803e259eaaaca95f1b392a0d590b2933c5ca8580c776f7279507944b81ff1faf889d84baa5e31f026e96d676a5 + languageName: node + linkType: hard + "js-cookie@npm:^2.2.1": version: 2.2.1 resolution: "js-cookie@npm:2.2.1" @@ -23661,7 +26952,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -23723,6 +27014,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -23755,6 +27055,23 @@ __metadata: languageName: node linkType: hard +"json-rpc-engine@npm:^6.1.0": + version: 6.1.0 + resolution: "json-rpc-engine@npm:6.1.0" + dependencies: + "@metamask/safe-event-emitter": "npm:^2.0.0" + eth-rpc-errors: "npm:^4.0.2" + checksum: 10/00d5b5228e90f126dd52176598db6e5611d295d3a3f7be21254c30c1b6555811260ef2ec2df035cd8e583e4b12096259da721e29f4ea2affb615f7dfc960a6a6 + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: 10/fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -23802,6 +27119,17 @@ __metadata: languageName: node linkType: hard +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10/a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 + languageName: node + linkType: hard + "json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -23811,6 +27139,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:3.3.1": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10/9b0dc391f20b47378f843ef1e877e73ec652a5bdc3c5fa1f36af0f119a55091d147a86c1ee86a232296f55c929bba174538c2bf0312610e0817a22de131cc3f4 + languageName: node + linkType: hard + "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -23944,6 +27279,18 @@ __metadata: languageName: node linkType: hard +"keccak@npm:^3.0.3": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + readable-stream: "npm:^3.6.0" + checksum: 10/45478bb0a57e44d0108646499b8360914b0fbc8b0e088f1076659cb34faaa9eb829c40f6dd9dadb3460bb86cc33153c41fed37fe5ce09465a60e71e78c23fa55 + languageName: node + linkType: hard + "keyv@npm:^4.0.0": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -23953,7 +27300,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -23962,6 +27309,13 @@ __metadata: languageName: node linkType: hard +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: 10/e652448bc915f9c21b9916678ed58f5314c831f0a284d190a340c0370296c71918e0cdc1156a17b12d1993941b302f0881e23fb9c395079e2065a7d2f33d0199 + languageName: node + linkType: hard + "kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -24272,6 +27626,35 @@ __metadata: languageName: node linkType: hard +"listhen@npm:^1.9.0": + version: 1.9.0 + resolution: "listhen@npm:1.9.0" + dependencies: + "@parcel/watcher": "npm:^2.4.1" + "@parcel/watcher-wasm": "npm:^2.4.1" + citty: "npm:^0.1.6" + clipboardy: "npm:^4.0.0" + consola: "npm:^3.2.3" + crossws: "npm:>=0.2.0 <0.4.0" + defu: "npm:^6.1.4" + get-port-please: "npm:^3.1.2" + h3: "npm:^1.12.0" + http-shutdown: "npm:^1.2.2" + jiti: "npm:^2.1.2" + mlly: "npm:^1.7.1" + node-forge: "npm:^1.3.1" + pathe: "npm:^1.1.2" + std-env: "npm:^3.7.0" + ufo: "npm:^1.5.4" + untun: "npm:^0.1.3" + uqr: "npm:^0.1.2" + bin: + listen: bin/listhen.mjs + listhen: bin/listhen.mjs + checksum: 10/72b869c8604301352c5d5825a7737705f0df2ce1795af8e779b6f956ba71302e13b12b2d35142687fb4e1e8ccc2747e2be3c9cbf20f7f96b73f897881aa3c384 + languageName: node + linkType: hard + "listr2@npm:^4.0.5": version: 4.0.5 resolution: "listr2@npm:4.0.5" @@ -24293,6 +27676,37 @@ __metadata: languageName: node linkType: hard +"lit-element@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-element@npm:3.3.3" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.1.0" + "@lit/reactive-element": "npm:^1.3.0" + lit-html: "npm:^2.8.0" + checksum: 10/7968e7f3ce3994911f27c4c54acc956488c91d8af81677cce3d6f0c2eaea45cceb79b064077159392238d6e43d46015a950269db9914fea8913566aacb17eaa1 + languageName: node + linkType: hard + +"lit-html@npm:^2.8.0": + version: 2.8.0 + resolution: "lit-html@npm:2.8.0" + dependencies: + "@types/trusted-types": "npm:^2.0.2" + checksum: 10/3503e55e2927c2ff94773cf041fc4128f92291869c9192f36eacb7f95132d11f6b329e5b910ab60a4456349cd2e6d23b33d83291b24d557bcd6b904d6314ac1a + languageName: node + linkType: hard + +"lit@npm:2.8.0": + version: 2.8.0 + resolution: "lit@npm:2.8.0" + dependencies: + "@lit/reactive-element": "npm:^1.6.0" + lit-element: "npm:^3.3.0" + lit-html: "npm:^2.8.0" + checksum: 10/aa64c1136b855ba328d41157dba67657d480345aeec3c1dd829abeb67719d759c9ff2ade9903f9cfb4f9d012b16087034aaa5b33f1182e70c615765562e3251b + languageName: node + linkType: hard + "load-yaml-file@npm:^0.2.0": version: 0.2.0 resolution: "load-yaml-file@npm:0.2.0" @@ -24392,6 +27806,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10/82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 + languageName: node + linkType: hard + "lodash.memoize@npm:4.x": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -24406,6 +27827,13 @@ __metadata: languageName: node linkType: hard +"lodash.mergewith@npm:4.6.2": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: 10/aea75a4492541a4902ac7e551dc6c54b722da0c187f84385d02e8fc33a7ae3454b837822446e5f63fcd5ad1671534ea408740b776670ea4d9c7890b10105fce0 + languageName: node + linkType: hard + "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -24446,6 +27874,16 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^6.0.0": + version: 6.0.0 + resolution: "log-symbols@npm:6.0.0" + dependencies: + chalk: "npm:^5.3.0" + is-unicode-supported: "npm:^1.3.0" + checksum: 10/510cdda36700cbcd87a2a691ea08d310a6c6b449084018f7f2ec4f732ca5e51b301ff1327aadd96f53c08318e616276c65f7fe22f2a16704fb0715d788bc3c33 + languageName: node + linkType: hard + "log-update@npm:^4.0.0": version: 4.0.0 resolution: "log-update@npm:4.0.0" @@ -24522,7 +27960,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a @@ -24760,6 +28198,15 @@ __metadata: languageName: node linkType: hard +"media-query-parser@npm:^2.0.2": + version: 2.0.2 + resolution: "media-query-parser@npm:2.0.2" + dependencies: + "@babel/runtime": "npm:^7.12.5" + checksum: 10/9dff3ed135149944717a8687567f4fda1d39d28637f265c6ce7efe5ed55cd88ed49136c912ee0c7f3a6e5debc50b1ff969db609d862318f1af97f48752b08b0b + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -24834,6 +28281,15 @@ __metadata: languageName: node linkType: hard +"merge-options@npm:^3.0.4": + version: 3.0.4 + resolution: "merge-options@npm:3.0.4" + dependencies: + is-plain-obj: "npm:^2.1.0" + checksum: 10/d86ddb3dd6e85d558dbf25dc944f3527b6bacb944db3fdda6e84a3f59c4e4b85231095f58b835758b9a57708342dee0f8de0dffa352974a48221487fe9f4584f + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -24882,6 +28338,13 @@ __metadata: languageName: node linkType: hard +"micro-ftch@npm:^0.3.1": + version: 0.3.1 + resolution: "micro-ftch@npm:0.3.1" + checksum: 10/a7ab07d25e28ec4ae492ce4542ea9b06eee85538742b3b1263b247366ee8872f2c5ce9c8651138b2f1d22c8212f691a7b8b5384fe86ead5aff1852e211f1c035 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -25084,6 +28547,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.5, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + languageName: node + linkType: hard + "minimatch@npm:^5.0.1": version: 5.1.0 resolution: "minimatch@npm:5.1.0" @@ -25102,15 +28574,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 - languageName: node - linkType: hard - "minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -25239,6 +28702,18 @@ __metadata: languageName: node linkType: hard +"mipd@npm:0.0.7": + version: 0.0.7 + resolution: "mipd@npm:0.0.7" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/c14dffef0ef7a3e71469aee553f5735f4a6a9f9a2b47ca02798040f2e006261c2e7e8b26ee0dc56a815c04d5612eb4be1eed474e7bb4e496eb0f5ada2fe1d2e7 + languageName: node + linkType: hard + "mixme@npm:^0.5.1": version: 0.5.10 resolution: "mixme@npm:0.5.10" @@ -25314,6 +28789,13 @@ __metadata: languageName: node linkType: hard +"mobx@npm:^6.1.7": + version: 6.13.5 + resolution: "mobx@npm:6.13.5" + checksum: 10/1b0842ae4f3d7319a532ee5fcb29d4ccde714248af9111e7c375bed4adbe49c4535c6383fd14933c4e7ec022c0b730deb55e32344dcfad025c711435b3e21c42 + languageName: node + linkType: hard + "mocha@npm:7.1.2": version: 7.1.2 resolution: "mocha@npm:7.1.2" @@ -25423,6 +28905,13 @@ __metadata: languageName: node linkType: hard +"modern-ahocorasick@npm:^1.0.0": + version: 1.0.1 + resolution: "modern-ahocorasick@npm:1.0.1" + checksum: 10/ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e + languageName: node + linkType: hard + "module-error@npm:^1.0.1, module-error@npm:^1.0.2": version: 1.0.2 resolution: "module-error@npm:1.0.2" @@ -25430,6 +28919,20 @@ __metadata: languageName: node linkType: hard +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" + dependencies: + "@motionone/animation": "npm:^10.15.1" + "@motionone/dom": "npm:^10.16.2" + "@motionone/svelte": "npm:^10.16.2" + "@motionone/types": "npm:^10.15.1" + "@motionone/utils": "npm:^10.15.1" + "@motionone/vue": "npm:^10.16.2" + checksum: 10/2470f12b97371eb876337b355ad158c545622b2cc7c83b0ba540d2c02afedb49990e78898e520b8f74cccc9ecf11d366ae005a35c60e92178fadd7434860a966 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -25451,7 +28954,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -25497,6 +29000,13 @@ __metadata: languageName: node linkType: hard +"multiformats@npm:^9.4.2": + version: 9.9.0 + resolution: "multiformats@npm:9.9.0" + checksum: 10/ad55c7d480d22f4258a68fd88aa2aab744fe0cb1e68d732fc886f67d858b37e3aa6c2cec12b2960ead7730d43be690931485238569952d8a3d7f90fdc726c652 + languageName: node + linkType: hard + "multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": version: 0.4.21 resolution: "multihashes@npm:0.4.21" @@ -25546,6 +29056,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.13.2": + version: 2.22.0 + resolution: "nan@npm:2.22.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10/ab165ba910e549fcc21fd561a33f534d86e81ae36c97b1019dcfe506b09692ff867c97794a54b49c9a83b8b485f529f0f58d24966c3a11863c97dc70814f4d50 + languageName: node + linkType: hard + "nan@npm:^2.14.0": version: 2.16.0 resolution: "nan@npm:2.16.0" @@ -25594,6 +29113,13 @@ __metadata: languageName: node linkType: hard +"napi-wasm@npm:^1.1.0": + version: 1.1.3 + resolution: "napi-wasm@npm:1.1.3" + checksum: 10/5cad19c3ba4c8b176453149542ea72f156be5db6d249611a76537833381f5cec802ed4d7ae5c3f7c0ef69d439c037f7247bbae7db711ed84f915be2a9fc43bb4 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -25642,6 +29168,17 @@ __metadata: languageName: node linkType: hard +"nock@npm:13.5.4": + version: 13.5.4 + resolution: "nock@npm:13.5.4" + dependencies: + debug: "npm:^4.1.0" + json-stringify-safe: "npm:^5.0.1" + propagate: "npm:^2.0.0" + checksum: 10/75bad391bae4efb81b742734af5f2d87309cd93d3ca6b78372fd37946d78ccb254d79104676619866915e6734abfc1b00fee2aa42073a4843ca3c746aad35a4d + languageName: node + linkType: hard + "node-abi@npm:^2.18.0, node-abi@npm:^2.21.0, node-abi@npm:^2.7.0": version: 2.30.1 resolution: "node-abi@npm:2.30.1" @@ -25678,6 +29215,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10/ee1e1ed6284a2f8cd1d59ac6175ecbabf8978dcf570345e9a8095a9d0a2b9ced591074ae77f9009287b00c402352b38aa9322a34f2199cdc9f567b842a636b94 + languageName: node + linkType: hard + "node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" @@ -25706,7 +29252,7 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.3": +"node-fetch-native@npm:^1.6.3, node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" checksum: 10/39c4c6d0c2a4bed1444943e1647ad0d79eb6638cf159bc37dffeafd22cffcf6a998e006aa1f3dd1d9d2258db7d78dee96b44bee4ba0bbaf0440ed348794f2543 @@ -25741,7 +29287,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1": +"node-forge@npm:^1, node-forge@npm:^1.3.1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" checksum: 10/05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d @@ -25949,6 +29495,18 @@ __metadata: languageName: node linkType: hard +"npm-package-arg@npm:11.0.3": + version: 11.0.3 + resolution: "npm-package-arg@npm:11.0.3" + dependencies: + hosted-git-info: "npm:^7.0.0" + proc-log: "npm:^4.0.0" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/bacc863907edf98940286edc2fd80327901c1e8b34426d538cdc708ed66bc6567f06d742d838eaf35db6804347bb4ba56ca9cef032c4b52743b33e7a22a2678e + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -26031,6 +29589,17 @@ __metadata: languageName: node linkType: hard +"obj-multiplex@npm:^1.0.0": + version: 1.0.0 + resolution: "obj-multiplex@npm:1.0.0" + dependencies: + end-of-stream: "npm:^1.4.0" + once: "npm:^1.4.0" + readable-stream: "npm:^2.3.3" + checksum: 10/6bdcb7d48a1cd4458a7ff0be0b3c1dc58e8e9e6504f937c10b1eac096a3d459b85d7ba32bdd9a45382bb238e245eb42ebcd91430c72f04b0a57c97f846f2d06f + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -26159,6 +29728,17 @@ __metadata: languageName: node linkType: hard +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10/44cb86dd2c660434be65f7585c54b62f0425b0c96b5c948d2756be253ef06737da7e68d7106e35506ce4a44d16aa85a413d11c5034eb7ce5579ec28752eb42d0 + languageName: node + linkType: hard + "object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" @@ -26186,6 +29766,17 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.4.1": + version: 1.4.1 + resolution: "ofetch@npm:1.4.1" + dependencies: + destr: "npm:^2.0.3" + node-fetch-native: "npm:^1.6.4" + ufo: "npm:^1.5.4" + checksum: 10/329ecd5595eff6da090c728e66f4223ad7ba5c2c309446f3707245c1b213da47dfd1eb1740f26b3da9e31ed7b7a903733bdaae85187b714514da865a0c5a4a9c + languageName: node + linkType: hard + "ohash@npm:^1.1.3": version: 1.1.3 resolution: "ohash@npm:1.1.3" @@ -26193,6 +29784,20 @@ __metadata: languageName: node linkType: hard +"ohash@npm:^1.1.4": + version: 1.1.4 + resolution: "ohash@npm:1.1.4" + checksum: 10/b11445234e59c9c2b00f357f8f00b6ba00e14c84fc0a232cdc14eb1d80066479b09d27af0201631e84b7a15ba7c4a1939f4cc47f2030e9bf83c9e8afc3ff7dfd + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: 10/36a3a1baea964dc01088884e9d87824cc1a3304ae702e7c688bdb5deec61fbb79325977dd6cba5988f60ad40fedc6ef31ec705adf65b4b042bc0d2686186c0dd + languageName: node + linkType: hard + "on-exit-leak-free@npm:^2.1.0": version: 2.1.2 resolution: "on-exit-leak-free@npm:2.1.2" @@ -26292,6 +29897,23 @@ __metadata: languageName: node linkType: hard +"ora@npm:8.0.1": + version: 8.0.1 + resolution: "ora@npm:8.0.1" + dependencies: + chalk: "npm:^5.3.0" + cli-cursor: "npm:^4.0.0" + cli-spinners: "npm:^2.9.2" + is-interactive: "npm:^2.0.0" + is-unicode-supported: "npm:^2.0.0" + log-symbols: "npm:^6.0.0" + stdin-discarder: "npm:^0.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/3d37bb3f53e965e5176004af319f82feef7323ee0b2428db5ee6f689b9b9ba939d7b1e81691d4614333c4fb9e294790eb049db9c1e990b14b9bbe150c6f09993 + languageName: node + linkType: hard + "ora@npm:^5.4.1": version: 5.4.1 resolution: "ora@npm:5.4.1" @@ -26323,6 +29945,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.1.2": + version: 0.1.2 + resolution: "ox@npm:0.1.2" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/cba00f13289599ff03cee3dbc19167c1d0f01829379d119f962b4e951ee2bf0d14491c7a45974e6a2a745117b13b22e9e4131d285e1f5247ea4e1cbc43c5c3d8 + languageName: node + linkType: hard + "p-cancelable@npm:^0.3.0": version: 0.3.0 resolution: "p-cancelable@npm:0.3.0" @@ -26671,6 +30313,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^5.0.0": + version: 5.0.0 + resolution: "path-type@npm:5.0.0" + checksum: 10/15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 + languageName: node + linkType: hard + "pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" @@ -26760,6 +30409,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10/668c1dc8d9fc1b34b9ce3b16ba59deb39d4dc743527bf2ed908d2b914cb8ba40aa5ba6960b27c417c241531c5aafd0598feeac2d50cb15278cf9863fa6b02a77 + languageName: node + linkType: hard + "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -26767,6 +30423,23 @@ __metadata: languageName: node linkType: hard +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 10/443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: "npm:^4.1.2" + split2: "npm:^4.0.0" + checksum: 10/d304a104e5cb0c3fef62ea544a4a39bf2472a602cdd7ddb136b0671b9c324ad93fa7888825c4cf33e624802436e897081ba92440f40518b9f2dbdbc0c889e409 + languageName: node + linkType: hard + "pino-abstract-transport@npm:v1.1.0": version: 1.1.0 resolution: "pino-abstract-transport@npm:1.1.0" @@ -26777,6 +30450,13 @@ __metadata: languageName: node linkType: hard +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 10/cec586f9634ef0e6582f62bc8fc5ca5b6e5e11ab88fe3950c66fb0fd5d6690f66bc39cd3f27216b925d2963ad5c3bba415718819ac20ebe0390c7d056cbfea1b + languageName: node + linkType: hard + "pino-std-serializers@npm:^6.0.0": version: 6.2.2 resolution: "pino-std-serializers@npm:6.2.2" @@ -26784,6 +30464,27 @@ __metadata: languageName: node linkType: hard +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + fast-redact: "npm:^3.0.0" + on-exit-leak-free: "npm:^0.2.0" + pino-abstract-transport: "npm:v0.5.0" + pino-std-serializers: "npm:^4.0.0" + process-warning: "npm:^1.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.1.0" + safe-stable-stringify: "npm:^2.1.0" + sonic-boom: "npm:^2.2.1" + thread-stream: "npm:^0.15.1" + bin: + pino: bin.js + checksum: 10/1c7b4b52fea76e0bc5d8b1190a0fee24279cb16d76fdb5833b32b64256fd8a94d641574b850faba5be72514f04045206b6d902a9a3f5ceae2a4296687088e073 + languageName: node + linkType: hard + "pino@npm:^8.19.0": version: 8.19.0 resolution: "pino@npm:8.19.0" @@ -26868,6 +30569,13 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 10/345781644740779752505af2fea3e9043f6c7cc349b18e1fb8842796360d1624791f0c24d33c0f27b05658373f90ffaa177a849e932e5fea1f540cef3975f3c9 + languageName: node + linkType: hard + "polished@npm:^4.2.2": version: 4.3.1 resolution: "polished@npm:4.3.1" @@ -26877,6 +30585,13 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^2.1.10": + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 10/ed7d0bb6e3e69f753080bf736b71f40e6ae4c13ec0c8c473ff73345345c088819966fdd68a62ad7482d464bf41176cf9421f5f63715d1a4532005eedc099db55 + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -26976,6 +30691,13 @@ __metadata: languageName: node linkType: hard +"preact@npm:^10.16.0, preact@npm:^10.24.2": + version: 10.24.3 + resolution: "preact@npm:10.24.3" + checksum: 10/e9c4c901a4ddd475a1072355b5c6c944b05797445e0d68f317ad0dbc976b831523573693ea75d2e12e7902042e3729af435377816d25558bf693ecf6b516c707 + languageName: node + linkType: hard + "prebuild-install@npm:^5.3.4": version: 5.3.6 resolution: "prebuild-install@npm:5.3.6" @@ -27133,6 +30855,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^4.0.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -27140,6 +30869,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: 10/8736d11d8d71c349d176e210305e84d74b13af06efb3c779377b056bfd608257d1e4e32b8fbbf90637c900f0313e40f7c9f583140884f667a21fc10a869b840c + languageName: node + linkType: hard + "process-warning@npm:^3.0.0": version: 3.0.0 resolution: "process-warning@npm:3.0.0" @@ -27196,7 +30932,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1, prompts@npm:^2.4.0, prompts@npm:^2.4.2": +"prompts@npm:2.4.2, prompts@npm:^2.0.1, prompts@npm:^2.4.0, prompts@npm:^2.4.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -27206,7 +30942,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -27217,6 +30953,13 @@ __metadata: languageName: node linkType: hard +"propagate@npm:^2.0.0": + version: 2.0.1 + resolution: "propagate@npm:2.0.1" + checksum: 10/8c761c16e8232f82f6d015d3e01e8bd4109f47ad804f904d950f6fe319813b448ca112246b6bfdc182b400424b155b0b7c4525a9bb009e6fa950200157569c14 + languageName: node + linkType: hard + "proper-lockfile@npm:^4.1.1": version: 4.1.2 resolution: "proper-lockfile@npm:4.1.2" @@ -27264,7 +31007,7 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^6.8.8": +"protobufjs@npm:^6.11.2, protobufjs@npm:^6.8.8": version: 6.11.4 resolution: "protobufjs@npm:6.11.4" dependencies: @@ -27318,6 +31061,13 @@ __metadata: languageName: node linkType: hard +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: 10/64b6277d08d89f0b2c468a84decf43f82a4e88da7075651e6adebc69d1b87fadc17cfeb43c024c00b65faa3f0908f7ac1e61f5f6849a404a547a742e6aa527a6 + languageName: node + linkType: hard + "proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -27430,6 +31180,13 @@ __metadata: languageName: node linkType: hard +"pure-rand@npm:^6.1.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10/256aa4bcaf9297256f552914e03cbdb0039c8fe1db11fa1e6d3f80790e16e563eb0a859a1e61082a95e224fc0c608661839439f8ecc6a3db4e48d46d99216ee4 + languageName: node + linkType: hard + "pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -27446,6 +31203,58 @@ __metadata: languageName: node linkType: hard +"qr-code-styling@npm:^1.6.0-rc.1": + version: 1.8.4 + resolution: "qr-code-styling@npm:1.8.4" + dependencies: + qrcode-generator: "npm:^1.4.4" + checksum: 10/ddc193ac15c16bed24a7a27eb15e14ba59efa48bad390a116802f57cb537905238a23fe4a06488951c4f107f0c7271950ebd58ce7f30cfd9ee07c4fea32bebff + languageName: node + linkType: hard + +"qrcode-generator@npm:^1.4.4": + version: 1.4.4 + resolution: "qrcode-generator@npm:1.4.4" + checksum: 10/65b2bba237d1f230eba0d08ae4267d04f326859c2265775ade99191be1b522158b623fcc0b613bbfc9d4edbbafb928fc41c66d61053b333f2eb0bcedb2ebadca + languageName: node + linkType: hard + +"qrcode-terminal-nooctal@npm:^0.12.1": + version: 0.12.1 + resolution: "qrcode-terminal-nooctal@npm:0.12.1" + bin: + qrcode-terminal: bin/qrcode-terminal.js + checksum: 10/8f437f9e95d8211c3b4eb3de572abd8e9695efa51b327e68e843fcbc2f017e32d6407caf4d8a8dca64d2d1270cf1cc1b16ebb6f2a69a1f891df430e8efdef66a + languageName: node + linkType: hard + +"qrcode@npm:1.5.3": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: "npm:^1.0.1" + encode-utf8: "npm:^1.0.3" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10/823642d59a81ba5f406a1e78415fee37fd53856038f49a85c4ca7aa32ba6b8505ab059a832718ac16612bed75aa2a18584faae38cf3c25e2c90fb19b8c55fe46 + languageName: node + linkType: hard + +"qrcode@npm:1.5.4, qrcode@npm:^1.5.4": + version: 1.5.4 + resolution: "qrcode@npm:1.5.4" + dependencies: + dijkstrajs: "npm:^1.0.1" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10/9a1b61760e4ea334545a0f54bbc11c537aba0a17cf52cab9fa1b07f8a1337eed0bc6f7fde41b197f2c82c249bc48728983bfaf861bb7ecb29dc597b2ae33c424 + languageName: node + linkType: hard + "qs@npm:6.10.3": version: 6.10.3 resolution: "qs@npm:6.10.3" @@ -27498,6 +31307,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: "npm:^0.2.2" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 10/3b6f2c167e76ca4094c5f1a9eb276efcbb9ebfd8b1a28c413f3c4e4e7d6428c8187bf46c8cbc9f92a229369dd0015de10a7fd712c8cee98d5d84c2ac6140357e + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -27544,6 +31365,23 @@ __metadata: languageName: node linkType: hard +"radix3@npm:^1.1.2": + version: 1.1.2 + resolution: "radix3@npm:1.1.2" + checksum: 10/5ed01a8e4b753e325c6ecb01d993de77f690e548ef9e149e7dc403ee7b109c2cb41e3d09bc3ce004d872c67c8dca1d556dbf7808b1ac7df9f86994e57d757557 + languageName: node + linkType: hard + +"rainbow-sprinkles@npm:^0.17.3": + version: 0.17.3 + resolution: "rainbow-sprinkles@npm:0.17.3" + peerDependencies: + "@vanilla-extract/css": ^1 + "@vanilla-extract/dynamic": ^2 + checksum: 10/63c668a58032a6914974e4e13c587338f70c1cd76d388ba133f920112c7f6e002b3ed6d98f6dc2c045f5522eafd78dc58aa6103b520150dcb8ca23b3b8744ce0 + languageName: node + linkType: hard + "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -27605,6 +31443,66 @@ __metadata: languageName: node linkType: hard +"react-aria@npm:^3.34.3": + version: 3.35.1 + resolution: "react-aria@npm:3.35.1" + dependencies: + "@internationalized/string": "npm:^3.2.4" + "@react-aria/breadcrumbs": "npm:^3.5.18" + "@react-aria/button": "npm:^3.10.1" + "@react-aria/calendar": "npm:^3.5.13" + "@react-aria/checkbox": "npm:^3.14.8" + "@react-aria/color": "npm:^3.0.1" + "@react-aria/combobox": "npm:^3.10.5" + "@react-aria/datepicker": "npm:^3.11.4" + "@react-aria/dialog": "npm:^3.5.19" + "@react-aria/dnd": "npm:^3.7.4" + "@react-aria/focus": "npm:^3.18.4" + "@react-aria/gridlist": "npm:^3.9.5" + "@react-aria/i18n": "npm:^3.12.3" + "@react-aria/interactions": "npm:^3.22.4" + "@react-aria/label": "npm:^3.7.12" + "@react-aria/link": "npm:^3.7.6" + "@react-aria/listbox": "npm:^3.13.5" + "@react-aria/menu": "npm:^3.15.5" + "@react-aria/meter": "npm:^3.4.17" + "@react-aria/numberfield": "npm:^3.11.8" + "@react-aria/overlays": "npm:^3.23.4" + "@react-aria/progress": "npm:^3.4.17" + "@react-aria/radio": "npm:^3.10.9" + "@react-aria/searchfield": "npm:^3.7.10" + "@react-aria/select": "npm:^3.14.11" + "@react-aria/selection": "npm:^3.20.1" + "@react-aria/separator": "npm:^3.4.3" + "@react-aria/slider": "npm:^3.7.13" + "@react-aria/ssr": "npm:^3.9.6" + "@react-aria/switch": "npm:^3.6.9" + "@react-aria/table": "npm:^3.15.5" + "@react-aria/tabs": "npm:^3.9.7" + "@react-aria/tag": "npm:^3.4.7" + "@react-aria/textfield": "npm:^3.14.10" + "@react-aria/tooltip": "npm:^3.7.9" + "@react-aria/utils": "npm:^3.25.3" + "@react-aria/visually-hidden": "npm:^3.8.17" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/eb63ad498582374f1708c6691faf08ecaa887da02f95277e858b384bed7d4a2fbca0c24adf1d16c0929ca965163bbd5c73cea5251d4b834b221a65313760f89c + languageName: node + linkType: hard + +"react-clientside-effect@npm:^1.2.6": + version: 1.2.6 + resolution: "react-clientside-effect@npm:1.2.6" + dependencies: + "@babel/runtime": "npm:^7.12.13" + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 10/45411b2e1d5e77ce8586ef0fa6cef2d394da4660af90a2c0f044a2170a0b601ac023ac2bc62d6109201969329a8dbd13bd1a4bd4027be3980e4fde7c6a48bee3 + languageName: node + linkType: hard + "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -27679,6 +31577,33 @@ __metadata: languageName: node linkType: hard +"react-fast-compare@npm:3.2.2": + version: 3.2.2 + resolution: "react-fast-compare@npm:3.2.2" + checksum: 10/a6826180ba75cefba1c8d3ac539735f9b627ca05d3d307fe155487f5d0228d376dac6c9708d04a283a7b9f9aee599b637446635b79c8c8753d0b4eece56c125c + languageName: node + linkType: hard + +"react-focus-lock@npm:^2.9.6": + version: 2.13.2 + resolution: "react-focus-lock@npm:2.13.2" + dependencies: + "@babel/runtime": "npm:^7.0.0" + focus-lock: "npm:^1.3.5" + prop-types: "npm:^15.6.2" + react-clientside-effect: "npm:^1.2.6" + use-callback-ref: "npm:^1.3.2" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/a169e060e2a2457062489fb5e48811f334823b3878a4599162878c93c683f47807407044009c3886da07f2adaa9d7325cbb4fafc104a7f8cd4d1dad7325304f8 + languageName: node + linkType: hard + "react-is@npm:18.1.0": version: 18.1.0 resolution: "react-is@npm:18.1.0" @@ -27686,7 +31611,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf @@ -27707,6 +31632,19 @@ __metadata: languageName: node linkType: hard +"react-native-webview@npm:^11.26.0": + version: 11.26.1 + resolution: "react-native-webview@npm:11.26.1" + dependencies: + escape-string-regexp: "npm:2.0.0" + invariant: "npm:2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/d64123c73e7795096434135a1bec2aef5caf71a4c1c95b1416cc528bc55f5c4a89df2d311ad3637594f120e864b5798e2c4ea4eb7153bf938ad167c54e7a7e61 + languageName: node + linkType: hard + "react-refresh@npm:^0.14.0": version: 0.14.2 resolution: "react-refresh@npm:0.14.2" @@ -27714,7 +31652,7 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll-bar@npm:^2.3.3": +"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.6": version: 2.3.6 resolution: "react-remove-scroll-bar@npm:2.3.6" dependencies: @@ -27749,6 +31687,59 @@ __metadata: languageName: node linkType: hard +"react-remove-scroll@npm:2.6.0, react-remove-scroll@npm:^2.5.7": + version: 2.6.0 + resolution: "react-remove-scroll@npm:2.6.0" + dependencies: + react-remove-scroll-bar: "npm:^2.3.6" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/9fac79e1c2ed2c85729bfe82f61ef4ae5ce51f478736a13892a9a11e05cbd4e9599f9f0e012cb5fc0719e18dc1dd687ab61f516193228615df636db8b851245e + languageName: node + linkType: hard + +"react-stately@npm:^3.32.2": + version: 3.33.0 + resolution: "react-stately@npm:3.33.0" + dependencies: + "@react-stately/calendar": "npm:^3.5.5" + "@react-stately/checkbox": "npm:^3.6.9" + "@react-stately/collections": "npm:^3.11.0" + "@react-stately/color": "npm:^3.8.0" + "@react-stately/combobox": "npm:^3.10.0" + "@react-stately/data": "npm:^3.11.7" + "@react-stately/datepicker": "npm:^3.10.3" + "@react-stately/dnd": "npm:^3.4.3" + "@react-stately/form": "npm:^3.0.6" + "@react-stately/list": "npm:^3.11.0" + "@react-stately/menu": "npm:^3.8.3" + "@react-stately/numberfield": "npm:^3.9.7" + "@react-stately/overlays": "npm:^3.6.11" + "@react-stately/radio": "npm:^3.10.8" + "@react-stately/searchfield": "npm:^3.5.7" + "@react-stately/select": "npm:^3.6.8" + "@react-stately/selection": "npm:^3.17.0" + "@react-stately/slider": "npm:^3.5.8" + "@react-stately/table": "npm:^3.12.3" + "@react-stately/tabs": "npm:^3.6.10" + "@react-stately/toggle": "npm:^3.7.8" + "@react-stately/tooltip": "npm:^3.4.13" + "@react-stately/tree": "npm:^3.8.5" + "@react-types/shared": "npm:^3.25.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + checksum: 10/69da664db3427d19aa8802fa0b7ca5fd49dad2f63e670ae00cefc2398b773568e5a72a0b909e51b64ea2a67dfd4e376ced324b096f159496bc571c5e6a2c0ec9 + languageName: node + linkType: hard + "react-style-singleton@npm:^2.2.1": version: 2.2.1 resolution: "react-style-singleton@npm:2.2.1" @@ -27820,6 +31811,16 @@ __metadata: languageName: node linkType: hard +"read-yaml-file@npm:2.1.0": + version: 2.1.0 + resolution: "read-yaml-file@npm:2.1.0" + dependencies: + js-yaml: "npm:^4.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10/52765eb183e79466f51eebeb19b933cc0f0e907052d062d67300b97e79910064a24b370cdb0b5dd8b05afff3d0ec57282670fd9070dc608e13b11820ac79183d + languageName: node + linkType: hard + "read-yaml-file@npm:^1.1.0": version: 1.1.0 resolution: "read-yaml-file@npm:1.1.0" @@ -27832,7 +31833,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.3.3, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -27862,7 +31863,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.0": +"readable-stream@npm:^3.1.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -27884,7 +31885,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.0.0": +"readable-stream@npm:^3.6.2 || ^4.4.2, readable-stream@npm:^4.0.0": version: 4.5.2 resolution: "readable-stream@npm:4.5.2" dependencies: @@ -27922,6 +31923,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 10/0ba1c440dc9b7777d35a97f755312bf236be0847249f76cc9789c5c08d141f5d80b8564888e6a94ed0253fabf597b6892f8502c4e5658fb98f88642633a39723 + languageName: node + linkType: hard + "real-require@npm:^0.2.0": version: 0.2.0 resolution: "real-require@npm:0.2.0" @@ -28223,13 +32231,6 @@ __metadata: languageName: node linkType: hard -"requireindex@npm:^1.1.0": - version: 1.2.0 - resolution: "requireindex@npm:1.2.0" - checksum: 10/266d1cb31f6cbc4b6cf2e898f5bbc45581f7919bcf61bba5c45d0adb69b722b9ff5a13727be3350cde4520d7cd37f39df45d58a29854baaa4552cd6b05ae4a1a - languageName: node - linkType: hard - "resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -28310,7 +32311,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -28365,7 +32366,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -28419,6 +32420,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "restore-cursor@npm:4.0.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10/5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af + languageName: node + linkType: hard + "retry-request@npm:^7.0.0": version: 7.0.2 resolution: "retry-request@npm:7.0.2" @@ -28843,6 +32854,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.1.0": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10/2697fa186c17c38c3ca5309637b4ac6de2f1c3d282da27cd5e1e3c88eca0fb1f9aea568a6aabdf284111592c8782b94ee07176f17126031be72ab1313ed46c5c + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.3.1": version: 2.4.3 resolution: "safe-stable-stringify@npm:2.4.3" @@ -28960,6 +32978,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.6.3, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + "semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.7.0": version: 5.7.1 resolution: "semver@npm:5.7.1" @@ -28998,15 +33025,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.1": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 - languageName: node - linkType: hard - "semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -29159,7 +33177,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -29359,6 +33377,13 @@ __metadata: languageName: node linkType: hard +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 10/2c41ec6fb1414cd9bba0fa6b1dd00e8be739e3fe85d079c69d4b09ca5f2f86eafd18d9ce611c0c0f686428638a36c272a6ac14799146a8295f259c10cc45cde4 + languageName: node + linkType: hard + "slice-ansi@npm:^3.0.0": version: 3.0.0 resolution: "slice-ansi@npm:3.0.0" @@ -29414,6 +33439,28 @@ __metadata: languageName: node linkType: hard +"socket.io-client@npm:^4.5.1": + version: 4.8.1 + resolution: "socket.io-client@npm:4.8.1" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.2" + engine.io-client: "npm:~6.6.1" + socket.io-parser: "npm:~4.2.4" + checksum: 10/7480cf1ab30eba371a96dd1ce2ce9018dcbeaf81035a066fb89d99df0d0a6388b05840c92d970317c739956b68b28b0f4833f3b18e460a24eef557b9bca127c1 + languageName: node + linkType: hard + +"socket.io-parser@npm:~4.2.4": + version: 4.2.4 + resolution: "socket.io-parser@npm:4.2.4" + dependencies: + "@socket.io/component-emitter": "npm:~3.1.0" + debug: "npm:~4.3.1" + checksum: 10/4be500a9ff7e79c50ec25af11048a3ed34b4c003a9500d656786a1e5bceae68421a8394cf3eb0aa9041f85f36c1a9a737617f4aee91a42ab4ce16ffb2aa0c89c + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -29682,6 +33729,15 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: 10/05351d9f44bac59b2a4ab42ee22bf81b8c3bbd22db20183d78d5f2067557eb623e0eaf93b2bc0f8417bee92ca372bc26e0d83e3bdb0ffebcc33738ac1c191876 + languageName: node + linkType: hard + "sonic-boom@npm:^3.7.0": version: 3.8.0 resolution: "sonic-boom@npm:3.8.0" @@ -29718,7 +33774,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0": +"source-map@npm:^0.5.0, source-map@npm:^0.5.7": version: 0.5.7 resolution: "source-map@npm:0.5.7" checksum: 10/9b4ac749ec5b5831cad1f8cc4c19c4298ebc7474b24a0acf293e2f040f03f8eeccb3d01f12aa0f90cf46d555c887e03912b83a042c627f419bda5152d89c5269 @@ -29799,6 +33855,13 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 10/16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -29892,6 +33955,20 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 + languageName: node + linkType: hard + +"stdin-discarder@npm:^0.2.1": + version: 0.2.2 + resolution: "stdin-discarder@npm:0.2.2" + checksum: 10/642ffd05bd5b100819d6b24a613d83c6e3857c6de74eb02fc51506fa61dc1b0034665163831873868157c4538d71e31762bcf319be86cea04c3aba5336470478 + languageName: node + linkType: hard + "stealthy-require@npm:^1.1.1": version: 1.1.1 resolution: "stealthy-require@npm:1.1.1" @@ -29973,6 +34050,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: 10/eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.1 resolution: "string-argv@npm:0.3.1" @@ -30051,6 +34135,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^7.0.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/42f9e82f61314904a81393f6ef75b832c39f39761797250de68c041d8ba4df2ef80db49ab6cd3a292923a6f0f409b8c9980d120f7d32c820b4a8a84a2598a295 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.11": version: 4.0.11 resolution: "string.prototype.matchall@npm:4.0.11" @@ -30233,6 +34328,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10/475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -30325,6 +34429,13 @@ __metadata: languageName: node linkType: hard +"stylis@npm:4.2.0": + version: 4.2.0 + resolution: "stylis@npm:4.2.0" + checksum: 10/58359185275ef1f39c339ae94e598168aa6bb789f6cf0d52e726c1e7087a94e9c17f0385a28d34483dec1ffc2c75670ec714dc5603d99c3124ec83bc2b0a0f42 + languageName: node + linkType: hard + "sucrase@npm:^3.32.0": version: 3.35.0 resolution: "sucrase@npm:3.35.0" @@ -30350,6 +34461,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^1.0.3": + version: 1.0.4 + resolution: "superstruct@npm:1.0.4" + checksum: 10/9b3fd70a08c5ad3ea78b5c6b7ab90d31dde71af10448208d296c3d29ba2e55dfd817dfef75957163ee032163d04c4b2e0cb2fddff30313516aa60f748c1a48da + languageName: node + linkType: hard + "superstruct@npm:^2.0.2": version: 2.0.2 resolution: "superstruct@npm:2.0.2" @@ -30479,6 +34597,50 @@ __metadata: languageName: node linkType: hard +"syncpack@npm:^13.0.0": + version: 13.0.0 + resolution: "syncpack@npm:13.0.0" + dependencies: + "@effect/schema": "npm:0.71.1" + chalk: "npm:5.3.0" + chalk-template: "npm:1.1.0" + commander: "npm:12.1.0" + cosmiconfig: "npm:9.0.0" + effect: "npm:3.6.5" + enquirer: "npm:2.4.1" + fast-check: "npm:3.21.0" + globby: "npm:14.0.2" + jsonc-parser: "npm:3.3.1" + minimatch: "npm:9.0.5" + npm-package-arg: "npm:11.0.3" + ora: "npm:8.0.1" + prompts: "npm:2.4.2" + read-yaml-file: "npm:2.1.0" + semver: "npm:7.6.3" + tightrope: "npm:0.2.0" + ts-toolbelt: "npm:9.6.0" + bin: + syncpack: dist/bin.js + syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js + syncpack-format: dist/bin-format/index.js + syncpack-lint: dist/bin-lint/index.js + syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js + syncpack-list: dist/bin-list/index.js + syncpack-list-mismatches: dist/bin-list-mismatches/index.js + syncpack-prompt: dist/bin-prompt/index.js + syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js + syncpack-update: dist/bin-update/index.js + checksum: 10/c80f60faaad640f38de4e1fb5e7daf5dac62963def211b7b3989186c503dec8800c197d3051798553998331c0b0e05ab4b96dd765cd51c7c6cd3651f87c559ed + languageName: node + linkType: hard + +"system-architecture@npm:^0.1.0": + version: 0.1.0 + resolution: "system-architecture@npm:0.1.0" + checksum: 10/ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 + languageName: node + linkType: hard + "tabbable@npm:^6.0.0": version: 6.2.0 resolution: "tabbable@npm:6.2.0" @@ -30557,6 +34719,13 @@ __metadata: languageName: node linkType: hard +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -30764,6 +34933,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: "npm:^0.1.0" + checksum: 10/ca0a4f5bf45db88b48b41af0299455eaa8f01dd3ef8279e7ba6909c295b3ab79ddf576b595cbbceb4dbdf4012b17c6449805092926163fcbf30ac1604cb595b1 + languageName: node + linkType: hard + "thread-stream@npm:^2.0.0": version: 2.4.1 resolution: "thread-stream@npm:2.4.1" @@ -30790,6 +34968,13 @@ __metadata: languageName: node linkType: hard +"tightrope@npm:0.2.0": + version: 0.2.0 + resolution: "tightrope@npm:0.2.0" + checksum: 10/b57a6dec1a83d1d9b9395bca21f0b2dc4ff84d97a2302f43af240d312573bc04327e8e40394b4c2ac7172993b76ba31b34d0295b79f4f8abe9195a051782bff6 + languageName: node + linkType: hard + "timed-out@npm:^4.0.0, timed-out@npm:^4.0.1": version: 4.0.1 resolution: "timed-out@npm:4.0.1" @@ -30804,6 +34989,20 @@ __metadata: languageName: node linkType: hard +"tiny-secp256k1@npm:^1.1.3": + version: 1.1.7 + resolution: "tiny-secp256k1@npm:1.1.7" + dependencies: + bindings: "npm:^1.3.0" + bn.js: "npm:^4.11.8" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.4.0" + nan: "npm:^2.13.2" + node-gyp: "npm:latest" + checksum: 10/588393c36df18b2819787fc91616e1fcb930509307eecc460ad45c7011f99f900eea28493a36eb203c3933ae76f737e6a1b978fa0b8a391fcc5dd7b64d57c572 + languageName: node + linkType: hard + "tinybench@npm:^2.5.1": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -30864,6 +35063,13 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: 10/9a0ed0ecbaac72b4944888dacd79fe0a55eeea76120a4c7e46b3bb3d85b24f086e90560bb22f5a965654a25ab43d79ec47dfdb3f1850ba740b14c5a50abc7040 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -30922,6 +35128,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.3.0": + version: 1.4.1 + resolution: "ts-api-utils@npm:1.4.1" + peerDependencies: + typescript: ">=4.2.0" + checksum: 10/2f32698ed1c06e57d934704ff2579a905895441ef0a29f732242d3d3f651abd5d09610f702c656e85b73457582a1ded43adeef82e9f6d665ae0fb66497cf39f6 + languageName: node + linkType: hard + "ts-command-line-args@npm:^2.2.0": version: 2.3.1 resolution: "ts-command-line-args@npm:2.3.1" @@ -31056,27 +35271,53 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": +"ts-toolbelt@npm:9.6.0": + version: 9.6.0 + resolution: "ts-toolbelt@npm:9.6.0" + checksum: 10/2c2dea2631dbd7372a79cccc6d09a377a6ca2f319f767fd239d2e312cd1d9165a90f8c1777a047227bfdcda6aeba3addbadce88fdfc7f43caf4534d385a43c82 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10/2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 + languageName: node + linkType: hard + +"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c +"tslib@npm:2, tslib@npm:^2.0.3": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:2.4.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: 10/d8379e68b36caf082c1905ec25d17df8261e1d68ddc1abfd6c91158a064f6e4402039ae7c02cf4c81d12e3a2a2c7cd8ea2f57b233eb80136a2e3e7279daf2911 languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.0.1": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c + languageName: node + linkType: hard + "tslib@npm:^2.2.0": version: 2.7.0 resolution: "tslib@npm:2.7.0" @@ -31098,17 +35339,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 - languageName: node - linkType: hard - "tsx@npm:^4.19.1": version: 4.19.1 resolution: "tsx@npm:4.19.1" @@ -31125,22 +35355,6 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.7.1": - version: 4.7.1 - resolution: "tsx@npm:4.7.1" - dependencies: - esbuild: "npm:~0.19.10" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.2" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10/3a462b595f31ae58b31f9c6e8c450577dc87660b1225012bd972b6b58d7d2f6c4034728763ebc53bb731acff68de8b0fa50586e4c1ec4c086226f1788ccf9b7d - languageName: node - linkType: hard - "tty-table@npm:^4.1.5": version: 4.2.3 resolution: "tty-table@npm:4.2.3" @@ -31473,6 +35687,13 @@ __metadata: languageName: node linkType: hard +"typeforce@npm:^1.11.5": + version: 1.18.0 + resolution: "typeforce@npm:1.18.0" + checksum: 10/dbf98c75b1d57e56e33c1e1271d5505e67981f4e6a2e2e6e8e31160b58777fea1726160810b6c606517db16476805b7dce315926ba2d4859b9a56cab05b7a41f + languageName: node + linkType: hard + "typescript@npm:5.3.3": version: 5.3.3 resolution: "typescript@npm:5.3.3" @@ -31514,6 +35735,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.37": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 10/dd4026b6ece8a34a0d39b6de5542154c4506077d8def8647a300a29e1b3ffa0e23f5c8eeeb8101df6162b7b3eb3597d0b4adb031ae6104cbdb730d6ebc07f3c0 + languageName: node + linkType: hard + "ufo@npm:^1.5.3, ufo@npm:^1.5.4": version: 1.5.4 resolution: "ufo@npm:1.5.4" @@ -31530,6 +35760,24 @@ __metadata: languageName: node linkType: hard +"uint8arrays@npm:3.1.0": + version: 3.1.0 + resolution: "uint8arrays@npm:3.1.0" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10/caf1cd6a1cdbd7c59d6c8698c06a6d603380942b5745b3fddcd1b16f7a84a4f351fb8c6ac41f4cb2c59c226bb6d954733a6e20a42dec6f3fd266a02270a5088d + languageName: node + linkType: hard + +"uint8arrays@npm:^3.0.0": + version: 3.1.1 + resolution: "uint8arrays@npm:3.1.1" + dependencies: + multiformats: "npm:^9.4.2" + checksum: 10/536e70273c040484aa7d522031a9dbca1fe8c06eb58a3ace1064ba68825b4e2764d4a0b604a1c451e7b8be0986dc94f23a419cfe9334bd116716074a2d29b33d + languageName: node + linkType: hard + "ultron@npm:~1.1.0": version: 1.1.1 resolution: "ultron@npm:1.1.1" @@ -31549,6 +35797,13 @@ __metadata: languageName: node linkType: hard +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 10/0020f74b0ce34723196d8982a73bb7f40cff455a41b8f88ae146b86885f4e66e41a1241fe80a887505c3bd2c7f07ed362b6ed041968370073c40a98496e6a737 + languageName: node + linkType: hard + "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -31579,6 +35834,19 @@ __metadata: languageName: node linkType: hard +"unenv@npm:^1.10.0": + version: 1.10.0 + resolution: "unenv@npm:1.10.0" + dependencies: + consola: "npm:^3.2.3" + defu: "npm:^6.1.4" + mime: "npm:^3.0.0" + node-fetch-native: "npm:^1.6.4" + pathe: "npm:^1.1.2" + checksum: 10/23198e150fd3b4db4d7abe444b75ee05a0d36768bd6d94a6aaf5dca830db82e707ccc0f6cca22671327b62c5cd85ada08d4665bf7652afec9de0bdc7a4546249 + languageName: node + linkType: hard + "unenv@npm:unenv-nightly@2.0.0-1724863496.70db6f1": version: 2.0.0-1724863496.70db6f1 resolution: "unenv-nightly@npm:2.0.0-1724863496.70db6f1" @@ -31629,6 +35897,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 10/9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -31717,6 +35992,65 @@ __metadata: languageName: node linkType: hard +"unstorage@npm:^1.9.0": + version: 1.13.1 + resolution: "unstorage@npm:1.13.1" + dependencies: + anymatch: "npm:^3.1.3" + chokidar: "npm:^3.6.0" + citty: "npm:^0.1.6" + destr: "npm:^2.0.3" + h3: "npm:^1.13.0" + listhen: "npm:^1.9.0" + lru-cache: "npm:^10.4.3" + node-fetch-native: "npm:^1.6.4" + ofetch: "npm:^1.4.1" + ufo: "npm:^1.5.4" + peerDependencies: + "@azure/app-configuration": ^1.7.0 + "@azure/cosmos": ^4.1.1 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.25.0 + "@capacitor/preferences": ^6.0.2 + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/kv": ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.4.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + checksum: 10/a5fea4f83189d222dcb95ce36d0de29b1ab2fa64122f4c4435b63e6dab8bacd630f6234b0599a505de620f719965ea3a3ce068ece759a96e19fd187e1fb9561c + languageName: node + linkType: hard + "untildify@npm:^4.0.0": version: 4.0.0 resolution: "untildify@npm:4.0.0" @@ -31724,6 +36058,19 @@ __metadata: languageName: node linkType: hard +"untun@npm:^0.1.3": + version: 0.1.3 + resolution: "untun@npm:0.1.3" + dependencies: + citty: "npm:^0.1.5" + consola: "npm:^3.2.3" + pathe: "npm:^1.1.1" + bin: + untun: bin/untun.mjs + checksum: 10/6a096002ca13b8442ad1d40840088888cfaa28626eefdd132cd0fd3d3b956af121a9733b7bda32647608e278fb13332d2b72e2c319a27dc55dbc8e709a2f61d4 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -31752,6 +36099,13 @@ __metadata: languageName: node linkType: hard +"uqr@npm:^0.1.2": + version: 0.1.2 + resolution: "uqr@npm:0.1.2" + checksum: 10/31f1fe7d7a8121a2670712234524763160985b053e7eb8af7925a131bcde0df11641e15129d988358032da603185456d08dd72b26b507897272eb9640273bfa6 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -31805,7 +36159,7 @@ __metadata: languageName: node linkType: hard -"use-callback-ref@npm:^1.3.0": +"use-callback-ref@npm:^1.3.0, use-callback-ref@npm:^1.3.2": version: 1.3.2 resolution: "use-callback-ref@npm:1.3.2" dependencies: @@ -31848,6 +36202,24 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/a676216affc203876bd47981103f201f28c2731361bb186367e12d287a7566763213a8816910c6eb88265eccd4c230426eb783d64c373c4a180905be8820ed8e + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.2": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/671e9c190aab9a8374a5d468c6ba17f52c38b6fae970110bc196fc1e2b57204149aea9619be49a1bb5207fb6e51d8afd19c3bcb94afe61813fed039821461dc0 + languageName: node + linkType: hard + "utf-8-validate@npm:5.0.7": version: 5.0.7 resolution: "utf-8-validate@npm:5.0.7" @@ -31909,6 +36281,13 @@ __metadata: languageName: node linkType: hard +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 10/a3c51463fc807ed04ccc8b5d0fa6e31f3dcd7a4cbd30ab4bc6d760ce5319dd493d95bf04244693daf316f97e9ab2a37741edfed8748ad38572a595398ad0fdaf + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -31987,6 +36366,31 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.1 + resolution: "validate-npm-package-name@npm:5.0.1" + checksum: 10/0d583a1af23aeffea7748742cf22b6802458736fb8b60323ba5949763824d46f796474b0e1b9206beb716f9d75269e19dbd7795d6b038b29d561be95dd827381 + languageName: node + linkType: hard + +"valtio@npm:1.11.2": + version: 1.11.2 + resolution: "valtio@npm:1.11.2" + dependencies: + proxy-compare: "npm:2.5.1" + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@types/react": ">=16.8" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: 10/a259f5af204b801668e019855813a8f702c9558961395bb5847f583119428b997efb9b0e6feb5d6e48a76a9b541173a10fdfdb1527a7bd14477a0e0c5beba914 + languageName: node + linkType: hard + "varint@npm:^5.0.0": version: 5.0.2 resolution: "varint@npm:5.0.2" @@ -32012,17 +36416,17 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.21.40": - version: 2.21.41 - resolution: "viem@npm:2.21.41" +"viem@npm:^2.1.1, viem@npm:^2.21.45": + version: 2.21.45 + resolution: "viem@npm:2.21.45" dependencies: - "@adraffy/ens-normalize": "npm:1.11.0" "@noble/curves": "npm:1.6.0" "@noble/hashes": "npm:1.5.0" "@scure/bip32": "npm:1.5.0" "@scure/bip39": "npm:1.4.0" abitype: "npm:1.0.6" isows: "npm:1.0.6" + ox: "npm:0.1.2" webauthn-p256: "npm:0.0.10" ws: "npm:8.18.0" peerDependencies: @@ -32030,7 +36434,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/bd3d1426584eb319c6ab69949c188d7142f6fa14b38df5ed54c967c5d5246e4eb98a9412ab7d053ff3d649df3d0174fc57f8a1e6f2803ce3aa97be2e010500b9 + checksum: 10/93428588882620de5ed442a5a568367762d39660bdb4ff9c430d5409da1dca085a3648bf0afedb6631bb219b410e58ccabf600ed26228ab9ae73a77a1031c576 languageName: node linkType: hard @@ -32182,6 +36586,25 @@ __metadata: languageName: node linkType: hard +"wagmi@npm:^2.12.26": + version: 2.12.32 + resolution: "wagmi@npm:2.12.32" + dependencies: + "@wagmi/connectors": "npm:5.3.10" + "@wagmi/core": "npm:2.14.6" + use-sync-external-store: "npm:1.2.0" + peerDependencies: + "@tanstack/react-query": ">=5.0.0" + react: ">=18" + typescript: ">=5.0.4" + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/6456d32df5c7a6ed1bdde1c4512fccf6a4bc45f1cf78e44cc44f952e3a8016f7b413197e431bd4b3bfb5faab78ae79f7bab402f323e12bcaddd67cb3f5cd5c6a + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -32619,6 +37042,20 @@ __metadata: languageName: node linkType: hard +"webextension-polyfill@npm:>=0.10.0 <1.0": + version: 0.12.0 + resolution: "webextension-polyfill@npm:0.12.0" + checksum: 10/77e648b958b573ef075e75a0c180e2bbd74dee17b3145e86d21fcbb168c4999e4a311654fe634b8178997bee9b35ea5808d8d3d3e5ff2ad138f197f4f0ea75d9 + languageName: node + linkType: hard + +"webextension-polyfill@npm:^0.10.0": + version: 0.10.0 + resolution: "webextension-polyfill@npm:0.10.0" + checksum: 10/51ff30ebed4b1aa802b7f0347f05021b2fe492078bb1a597223d43995fcee96e2da8f914a2f6e36f988c1877ed5ab36ca7077f2f3ab828955151a59e4c01bf7e + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -32834,6 +37271,15 @@ __metadata: languageName: node linkType: hard +"wif@npm:^2.0.6": + version: 2.0.6 + resolution: "wif@npm:2.0.6" + dependencies: + bs58check: "npm:<3.0.0" + checksum: 10/c8d7581664532d9ab6d163ee5194a9bec71b089a6e50d54d6ec57a9bd714fcf84bc8d9f22f4cfc7c297fc6ad10b973b8e83eca5c41240163fc61f44b5154b7da + languageName: node + linkType: hard + "word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -32951,7 +37397,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": +"wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: @@ -33081,7 +37527,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.5.10": +"ws@npm:^7.5.1, ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -33111,6 +37557,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:~8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d + languageName: node + linkType: hard + "xhr-request-promise@npm:^0.1.2": version: 0.1.3 resolution: "xhr-request-promise@npm:0.1.3" @@ -33147,6 +37608,13 @@ __metadata: languageName: node linkType: hard +"xmlhttprequest-ssl@npm:~2.1.1": + version: 2.1.2 + resolution: "xmlhttprequest-ssl@npm:2.1.2" + checksum: 10/708a177fe41c6c8cd4ec7c04d965b4c01801d87f44383ec639be58bdc14418142969841659e0850db44feee8bec0a3d3e7d33fed22519415f3d0daab04d3f160 + languageName: node + linkType: hard + "xmlhttprequest@npm:1.8.0": version: 1.8.0 resolution: "xmlhttprequest@npm:1.8.0" @@ -33229,7 +37697,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.2": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10/e088b37b4d4885b70b50c9fa1b7e54bd2e27f5c87205f9deaffd1fb293ab263d9c964feadb9817a7b129a5bf30a06582cb08750f810568ecc14f3cdbabb79cb3 @@ -33342,7 +37810,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.1.0": +"yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" dependencies: @@ -33457,6 +37925,47 @@ __metadata: languageName: node linkType: hard +"zustand@npm:5.0.0": + version: 5.0.0 + resolution: "zustand@npm:5.0.0" + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + checksum: 10/be75ef4d1b218b143314467bb9e23641231043cad2d5c3a4b2219c46d1609ee799cd8dc9acec9b23d55ec3a2a619a06616e593aea4049f3b7323938af9a33bfe + languageName: node + linkType: hard + +"zustand@npm:^4.5.5": + version: 4.5.5 + resolution: "zustand@npm:4.5.5" + dependencies: + use-sync-external-store: "npm:1.2.2" + peerDependencies: + "@types/react": ">=16.8" + immer: ">=9.0.6" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + checksum: 10/481b8210187b69678074a1ca51107654c2379688e90407bfcb7961e0803a259742bfd0d77171c3f07e290896ad55fe9659b3863f30d34cb2572650ead1249f25 + languageName: node + linkType: hard + "zx@npm:^8.1.4": version: 8.1.4 resolution: "zx@npm:8.1.4" From 92115c029a9917f0f41d8ad1b1576f04d60b9651 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:33:53 +0330 Subject: [PATCH 33/45] fix: update getWarpCoreConfigOrExit import on MultiChainResolver --- .../cli/src/context/strategies/chain/MultiChainResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index ec0d6e3e47..c6d96b5dc5 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -14,7 +14,7 @@ import { readYamlOrJson, runFileSelectionStep, } from '../../../utils/files.js'; -import { getWarpCoreConfigOrExit } from '../../../utils/input.js'; +import { getWarpCoreConfigOrExit } from '../../../utils/warp.js'; import { ChainResolver } from './types.js'; From ccc7df69438b031632d1dae96bd3bac5e19ca6d7 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:51:02 +0330 Subject: [PATCH 34/45] fix: no-unused-vars linting issues --- typescript/cli/src/config/strategy.ts | 4 ++-- typescript/utils/src/addresses.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index d9cee7101d..6900df2738 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -78,7 +78,7 @@ export async function createStrategyConfig({ try { const strategyObj = await readYamlOrJson(outPath); strategy = ChainSubmissionStrategySchema.parse(strategyObj); - } catch (e) { + } catch (_) { strategy = writeYamlOrJson(outPath, {}, 'yaml'); } @@ -177,7 +177,7 @@ export async function createStrategyConfig({ writeYamlOrJson(outPath, strategyConfig); logGreen('✅ Successfully created a new strategy configuration.'); - } catch (e) { + } catch (_) { // don't log error since it may contain sensitive data errorRed( `The strategy configuration is invalid. Please review the submitter settings.`, diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index 93426071ef..e3a91230ad 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -384,7 +384,7 @@ export function strip0x(hexstr: string) { export function isPrivateKeyEvm(privateKey: string): boolean { try { return new Wallet(privateKey).privateKey === privateKey; - } catch (e) { + } catch (_) { throw new Error('Provided Private Key is not EVM compatible!'); } } From bdf01071854bf35278dfed1082e36e1f6ed7de5d Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:00:45 +0330 Subject: [PATCH 35/45] minor: remove catch unused param --- typescript/cli/src/config/strategy.ts | 4 ++-- typescript/utils/src/addresses.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts index 6900df2738..f57c7d3378 100644 --- a/typescript/cli/src/config/strategy.ts +++ b/typescript/cli/src/config/strategy.ts @@ -78,7 +78,7 @@ export async function createStrategyConfig({ try { const strategyObj = await readYamlOrJson(outPath); strategy = ChainSubmissionStrategySchema.parse(strategyObj); - } catch (_) { + } catch { strategy = writeYamlOrJson(outPath, {}, 'yaml'); } @@ -177,7 +177,7 @@ export async function createStrategyConfig({ writeYamlOrJson(outPath, strategyConfig); logGreen('✅ Successfully created a new strategy configuration.'); - } catch (_) { + } catch { // don't log error since it may contain sensitive data errorRed( `The strategy configuration is invalid. Please review the submitter settings.`, diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index e3a91230ad..a244c810ba 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -384,7 +384,7 @@ export function strip0x(hexstr: string) { export function isPrivateKeyEvm(privateKey: string): boolean { try { return new Wallet(privateKey).privateKey === privateKey; - } catch (_) { + } catch { throw new Error('Provided Private Key is not EVM compatible!'); } } From dd870348fe48a32997fb4be04c3e629a88b21353 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:01:05 +0330 Subject: [PATCH 36/45] docs(changeset): Added ZKSync signer support using zksync-ethers package --- .changeset/ten-spiders-trade.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ten-spiders-trade.md diff --git a/.changeset/ten-spiders-trade.md b/.changeset/ten-spiders-trade.md new file mode 100644 index 0000000000..91eebf52f7 --- /dev/null +++ b/.changeset/ten-spiders-trade.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': patch +--- + +Added ZKSync signer support using zksync-ethers package From 21758afb91326cb383837283e15eaf7e05f605e6 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Fri, 29 Nov 2024 19:55:27 +0330 Subject: [PATCH 37/45] fix: read multiProtocolSigner from sginer middleware on warp init --- typescript/cli/src/commands/warp.ts | 5 ++++- typescript/cli/src/config/warp.ts | 20 +++----------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index 3cd99fe6a0..f7a90e685a 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -8,6 +8,7 @@ import { createWarpRouteDeployConfig, readWarpRouteDeployConfig, } from '../config/warp.js'; +import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandModuleWithContext, CommandModuleWithWriteContext, @@ -154,6 +155,7 @@ export const deploy: CommandModuleWithWriteContext<{ export const init: CommandModuleWithContext<{ advanced: boolean; out: string; + multiProtocolSigner?: MultiProtocolSignerManager; }> = { command: 'init', describe: 'Create a warp route configuration.', @@ -165,13 +167,14 @@ export const init: CommandModuleWithContext<{ }, out: outputFileCommandOption(DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH), }, - handler: async ({ context, advanced, out }) => { + handler: async ({ context, advanced, out, multiProtocolSigner }) => { logCommandHeader('Hyperlane Warp Configure'); await createWarpRouteDeployConfig({ context, outPath: out, advanced, + multiProtocolSigner, }); process.exit(0); }, diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index a2cd19d57c..1c315ee625 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -21,7 +21,6 @@ import { promiseObjAll, } from '@hyperlane-xyz/utils'; -import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext } from '../context/types.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; @@ -37,7 +36,6 @@ import { } from '../utils/input.js'; import { createAdvancedIsmConfig } from './ism.js'; -import { readChainSubmissionStrategyConfig } from './strategy.js'; const TYPE_DESCRIPTIONS: Record = { [TokenType.synthetic]: 'A new ERC20 with remote transfer functionality', @@ -118,10 +116,12 @@ export async function createWarpRouteDeployConfig({ context, outPath, advanced = false, + multiProtocolSigner, }: { context: CommandContext; outPath: string; advanced: boolean; + multiProtocolSigner?: MultiProtocolSignerManager; }) { logBlue('Creating a new warp route deployment config...'); @@ -134,26 +134,12 @@ export async function createWarpRouteDeployConfig({ requiresConfirmation: !context.skipConfirmation, }); - const strategyConfig = await readChainSubmissionStrategyConfig( - context.strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, - ); - - const multiProtocolSigner = new MultiProtocolSignerManager( - strategyConfig, - warpChains, - context.multiProvider, - { key: context.key }, - ); - - const multiProviderWithSigners = await multiProtocolSigner.getMultiProvider(); - const result: WarpRouteDeployConfig = {}; let typeChoices = TYPE_CHOICES; for (const chain of warpChains) { logBlue(`${chain}: Configuring warp route...`); - const owner = await detectAndConfirmOrPrompt( - async () => multiProviderWithSigners.getSigner(chain).getAddress(), + async () => (await multiProtocolSigner?.initSigner(chain))?.getAddress(), 'Enter the desired', 'owner address', 'signer', From 38310f82917abbeaca1d6db7f6a5f1b75cc29d5f Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:47:08 +0330 Subject: [PATCH 38/45] refactor: standardize signer address handling on context --- typescript/cli/src/config/core.ts | 4 ++-- typescript/cli/src/config/hooks.ts | 6 +++--- typescript/cli/src/config/ism.ts | 6 +++--- typescript/cli/src/config/warp.ts | 4 ++-- typescript/cli/src/context/context.ts | 13 +++++++++++-- .../context/strategies/chain/MultiChainResolver.ts | 4 ++-- typescript/cli/src/context/types.ts | 3 ++- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/typescript/cli/src/config/core.ts b/typescript/cli/src/config/core.ts index 92e6fc6882..7088ca2246 100644 --- a/typescript/cli/src/config/core.ts +++ b/typescript/cli/src/config/core.ts @@ -38,7 +38,7 @@ export async function createCoreDeployConfig({ logBlue('Creating a new core deployment config...'); const owner = await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), + async () => context.signerAddress, ENTER_DESIRED_VALUE_MSG, 'owner address', SIGNER_PROMPT_LABEL, @@ -63,7 +63,7 @@ export async function createCoreDeployConfig({ }); proxyAdmin = { owner: await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), + async () => context.signerAddress, ENTER_DESIRED_VALUE_MSG, 'ProxyAdmin owner address', SIGNER_PROMPT_LABEL, diff --git a/typescript/cli/src/config/hooks.ts b/typescript/cli/src/config/hooks.ts index e8df64dc00..5ad005dc24 100644 --- a/typescript/cli/src/config/hooks.ts +++ b/typescript/cli/src/config/hooks.ts @@ -243,10 +243,10 @@ async function getOwnerAndBeneficiary( advanced: boolean, ) { const unnormalizedOwner = - !advanced && context.signer - ? await context.signer.getAddress() + !advanced && context.signerAddress + ? context.signerAddress : await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), + async () => context.signerAddress, `For ${module}, enter`, 'owner address', 'signer', diff --git a/typescript/cli/src/config/ism.ts b/typescript/cli/src/config/ism.ts index f7f6bab9ad..81440e96eb 100644 --- a/typescript/cli/src/config/ism.ts +++ b/typescript/cli/src/config/ism.ts @@ -163,10 +163,10 @@ export const createTrustedRelayerConfig = callWithConfigCreationLogs( advanced: boolean = false, ): Promise => { const relayer = - !advanced && context.signer - ? await context.signer.getAddress() + !advanced && context.signerAddress + ? context.signerAddress : await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), + async () => context.signerAddress, 'For trusted relayer ISM, enter', 'relayer address', 'signer', diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index 1c315ee625..cce88ae989 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -83,7 +83,7 @@ async function fillDefaults( let owner = config.owner; if (!owner) { owner = - (await context.signer?.getAddress()) ?? + context.signerAddress ?? (await context.multiProvider.getSignerAddress(chain)); } return { @@ -139,7 +139,7 @@ export async function createWarpRouteDeployConfig({ for (const chain of warpChains) { logBlue(`${chain}: Configuring warp route...`); const owner = await detectAndConfirmOrPrompt( - async () => (await multiProtocolSigner?.initSigner(chain))?.getAddress(), + async () => context.signerAddress, 'Enter the desired', 'owner address', 'signer', diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 0d1084fcc6..0e0f3b2034 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -24,7 +24,7 @@ import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; -import { getImpersonatedSigner } from '../utils/keys.js'; +import { getImpersonatedSigner, getSigner } from '../utils/keys.js'; import { ChainResolverFactory } from './strategies/chain/ChainResolverFactory.js'; import { MultiProtocolSignerManager } from './strategies/signer/MultiProtocolSignerManager.js'; @@ -60,7 +60,7 @@ export async function contextMiddleware(argv: Record) { export async function signerMiddleware(argv: Record) { const { key, requiresKey, multiProvider, strategyPath } = argv.context; - if (!requiresKey && !key) return argv; + if (!requiresKey) return argv; const strategyConfig = await safeReadChainSubmissionStrategyConfig( strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, @@ -109,6 +109,14 @@ export async function getContext({ }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); + //Just for backward compability + let signerAddress: string | undefined = undefined; + if (key) { + let signer; + ({ key, signer } = await getSigner({ key, skipConfirmation })); + signerAddress = await signer.getAddress(); + } + const multiProvider = await getMultiProvider(registry); return { @@ -118,6 +126,7 @@ export async function getContext({ multiProvider, key, skipConfirmation: !!skipConfirmation, + signerAddress, } as CommandContext; } diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts index c6d96b5dc5..b61b27a5d8 100644 --- a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -3,7 +3,7 @@ import { assert } from '@hyperlane-xyz/utils'; import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; import { readChainSubmissionStrategyConfig } from '../../../config/strategy.js'; -import { logRed } from '../../../logger.js'; +import { log } from '../../../logger.js'; import { extractChainsFromObj, runMultiChainSelectionStep, @@ -156,7 +156,7 @@ export class MultiChainResolver implements ChainResolver { 'warp', ); } else { - logRed(`Using warp route deployment config at ${configPath}`); + log(`Using warp route deployment config at ${configPath}`); } // Alternative to readWarpRouteDeployConfig that doesn't use context for signer and zod validation diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 7837972893..557fe750ce 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -26,7 +26,8 @@ export interface CommandContext { multiProvider: MultiProvider; skipConfirmation: boolean; key?: string; - signer?: ethers.Signer; + // just for evm chains backward compability + signerAddress?: string; warpCoreConfig?: WarpCoreConfig; strategyPath?: string; } From 6e437c7fb9344dfd431b8a58ff0eee9961926158 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 4 Dec 2024 18:20:56 +0330 Subject: [PATCH 39/45] feat(cli): Add 'check' command to SIGN_COMMANDS and use signer for context multiprovider --- typescript/cli/src/commands/signCommands.ts | 1 + typescript/cli/src/context/context.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 6bd617302b..235f9c00b0 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -8,6 +8,7 @@ export const SIGN_COMMANDS = [ 'status', 'submit', 'relayer', + 'check', ]; export function isSignCommand(argv: any): boolean { diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 0e0f3b2034..77e20b1afb 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -1,5 +1,5 @@ import { confirm } from '@inquirer/prompts'; -import { ethers } from 'ethers'; +import { Signer, ethers } from 'ethers'; import { DEFAULT_GITHUB_REGISTRY, @@ -111,13 +111,13 @@ export async function getContext({ //Just for backward compability let signerAddress: string | undefined = undefined; + let signer: Signer | undefined; if (key) { - let signer; ({ key, signer } = await getSigner({ key, skipConfirmation })); signerAddress = await signer.getAddress(); } - const multiProvider = await getMultiProvider(registry); + const multiProvider = await getMultiProvider(registry, signer); return { registry, From 4820623f230b509d06dadadf063ca367d4b36b1e Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 4 Dec 2024 19:25:48 +0330 Subject: [PATCH 40/45] fix: handle warp check as a sign command on signer strategies --- typescript/cli/src/commands/signCommands.ts | 1 + typescript/cli/src/context/context.ts | 4 ++-- .../cli/src/context/strategies/chain/ChainResolverFactory.ts | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 235f9c00b0..0316211842 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -23,6 +23,7 @@ export enum CommandType { WARP_SEND = 'warp:send', WARP_APPLY = 'warp:apply', WARP_READ = 'warp:read', + WARP_CHECK = 'warp:check', SEND_MESSAGE = 'send:message', AGENT_KURTOSIS = 'deploy:kurtosis-agents', STATUS = 'status:', diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 77e20b1afb..a9f3e47bf5 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -111,13 +111,13 @@ export async function getContext({ //Just for backward compability let signerAddress: string | undefined = undefined; - let signer: Signer | undefined; if (key) { + let signer: Signer | undefined; ({ key, signer } = await getSigner({ key, skipConfirmation })); signerAddress = await signer.getAddress(); } - const multiProvider = await getMultiProvider(registry, signer); + const multiProvider = await getMultiProvider(registry); return { registry, diff --git a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts index eb9fa135aa..fa62038a61 100644 --- a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts +++ b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts @@ -14,6 +14,7 @@ export class ChainResolverFactory { [CommandType.WARP_SEND, () => MultiChainResolver.forOriginDestination()], [CommandType.WARP_APPLY, () => MultiChainResolver.forWarpRouteConfig()], [CommandType.WARP_READ, () => MultiChainResolver.forWarpCoreConfig()], + [CommandType.WARP_CHECK, () => MultiChainResolver.forWarpCoreConfig()], [CommandType.SEND_MESSAGE, () => MultiChainResolver.forOriginDestination()], [CommandType.AGENT_KURTOSIS, () => MultiChainResolver.forAgentKurtosis()], [CommandType.STATUS, () => MultiChainResolver.forOriginDestination()], From 3146e9314b9c41d35b6c77cbcb993c0e3da94d29 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:02:07 +0330 Subject: [PATCH 41/45] fix: handle warp read and warp check as sign command temporary --- typescript/cli/src/commands/signCommands.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 0316211842..d9fa5391d1 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -8,13 +8,16 @@ export const SIGN_COMMANDS = [ 'status', 'submit', 'relayer', - 'check', ]; export function isSignCommand(argv: any): boolean { + //TODO: fix reading and checking warp without signer, and remove this + const temporarySignCommandsCheck = + argv._[0] === 'warp' && (argv._[1] === 'read' || argv._[1] === 'check'); return ( SIGN_COMMANDS.includes(argv._[0]) || - (argv._.length > 1 && SIGN_COMMANDS.includes(argv._[1])) + (argv._.length > 1 && SIGN_COMMANDS.includes(argv._[1])) || + temporarySignCommandsCheck ); } From fa2b0e8517ad2ff586e0cf989c512fcf0dba9a79 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:45:26 +0330 Subject: [PATCH 42/45] chore: fix typo --- typescript/cli/src/context/context.ts | 2 +- typescript/cli/src/context/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index a9f3e47bf5..7c1fcb747d 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -109,7 +109,7 @@ export async function getContext({ }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); - //Just for backward compability + //Just for backward compatibility let signerAddress: string | undefined = undefined; if (key) { let signer: Signer | undefined; diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 557fe750ce..c320ff3cac 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -26,7 +26,7 @@ export interface CommandContext { multiProvider: MultiProvider; skipConfirmation: boolean; key?: string; - // just for evm chains backward compability + // just for evm chains backward compatibility signerAddress?: string; warpCoreConfig?: WarpCoreConfig; strategyPath?: string; From 4e3b65cb36f6c141d06d5ebc10d65aaad241dd73 Mon Sep 17 00:00:00 2001 From: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:36:48 +0330 Subject: [PATCH 43/45] chore: modify type of signer on context --- typescript/cli/src/context/context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index 7c1fcb747d..570b233cde 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -112,7 +112,7 @@ export async function getContext({ //Just for backward compatibility let signerAddress: string | undefined = undefined; if (key) { - let signer: Signer | undefined; + let signer: Signer; ({ key, signer } = await getSigner({ key, skipConfirmation })); signerAddress = await signer.getAddress(); } From 394055fa38c9ac42fe3e37e0d83cbc54577323ab Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 11 Dec 2024 11:46:59 +0100 Subject: [PATCH 44/45] feat: replace Ethers Wallet with ZKSync-specific wallet implementation for ZKSync signer strategy --- .../context/strategies/signer/MultiProtocolSignerFactory.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts index 030f11b5f4..d6f83572fb 100644 --- a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -1,5 +1,6 @@ import { password } from '@inquirer/prompts'; import { Signer, Wallet } from 'ethers'; +import { Wallet as ZKSyncWallet } from 'zksync-ethers'; import { ChainName, @@ -57,7 +58,6 @@ class EthereumSignerStrategy extends BaseMultiProtocolSigner { } // 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean -// TODO: import ZKSync signer class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { async getSignerConfig(chain: ChainName): Promise { const submitter = this.config[chain]?.submitter as { @@ -74,6 +74,6 @@ class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { } getSigner(config: SignerConfig): Signer { - return new Wallet(config.privateKey); + return new ZKSyncWallet(config.privateKey); } } From b58434ec2925831b4df5740714c419d04ab34ccc Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Wed, 11 Dec 2024 12:51:42 +0100 Subject: [PATCH 45/45] refactor(cli): remove unused multiProtocolSigner from warp init command --- typescript/cli/src/commands/warp.ts | 5 +---- typescript/cli/src/config/warp.ts | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index f7a90e685a..3cd99fe6a0 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -8,7 +8,6 @@ import { createWarpRouteDeployConfig, readWarpRouteDeployConfig, } from '../config/warp.js'; -import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandModuleWithContext, CommandModuleWithWriteContext, @@ -155,7 +154,6 @@ export const deploy: CommandModuleWithWriteContext<{ export const init: CommandModuleWithContext<{ advanced: boolean; out: string; - multiProtocolSigner?: MultiProtocolSignerManager; }> = { command: 'init', describe: 'Create a warp route configuration.', @@ -167,14 +165,13 @@ export const init: CommandModuleWithContext<{ }, out: outputFileCommandOption(DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH), }, - handler: async ({ context, advanced, out, multiProtocolSigner }) => { + handler: async ({ context, advanced, out }) => { logCommandHeader('Hyperlane Warp Configure'); await createWarpRouteDeployConfig({ context, outPath: out, advanced, - multiProtocolSigner, }); process.exit(0); }, diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index cce88ae989..f31069e091 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -21,7 +21,6 @@ import { promiseObjAll, } from '@hyperlane-xyz/utils'; -import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext } from '../context/types.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; import { runMultiChainSelectionStep } from '../utils/chains.js'; @@ -116,12 +115,10 @@ export async function createWarpRouteDeployConfig({ context, outPath, advanced = false, - multiProtocolSigner, }: { context: CommandContext; outPath: string; advanced: boolean; - multiProtocolSigner?: MultiProtocolSignerManager; }) { logBlue('Creating a new warp route deployment config...');