Merge branch 'main' into hook-metadata-improvements

pull/2953/head
Yorke Rhodes 1 year ago committed by GitHub
commit 6044fb89f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      .changeset/shy-apes-provide.md
  2. 2
      .github/workflows/release.yml
  3. 1
      package.json
  4. 2
      solidity/package.json
  5. 8
      typescript/cli/.mocharc.json
  6. 6
      typescript/cli/cli.ts
  7. 6
      typescript/cli/examples/chain-config.yaml
  8. 1
      typescript/cli/logger.ts
  9. 12
      typescript/cli/package.json
  10. 18
      typescript/cli/src/config/chain.test.ts
  11. 29
      typescript/cli/src/config/chain.ts
  12. 2
      typescript/cli/src/config/warp.ts
  13. 2
      typescript/cli/src/deploy/core.ts
  14. 24
      typescript/cli/src/deploy/warp.ts
  15. 21
      typescript/cli/src/utils/chains.ts
  16. 20
      typescript/cli/src/utils/files.ts
  17. 10
      typescript/cli/src/utils/time.test.ts
  18. 12
      typescript/cli/src/utils/time.ts
  19. 3
      typescript/helloworld/package.json
  20. 4
      typescript/infra/package.json
  21. 3
      typescript/sdk/package.json
  22. 7
      typescript/utils/package.json
  23. 110
      yarn.lock

@ -0,0 +1,5 @@
---
'@hyperlane-xyz/cli': patch
---
Various user experience improvements

@ -33,7 +33,7 @@ jobs:
id: changesets id: changesets
uses: changesets/action@v1 uses: changesets/action@v1
with: with:
publish: yarn build && yarn publish:all publish: yarn release
env: env:
NPM_CONFIG_PROVENANCE: true NPM_CONFIG_PROVENANCE: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

@ -27,6 +27,7 @@
"version:prepare": "yarn changeset version", "version:prepare": "yarn changeset version",
"version:check": "yarn changeset status", "version:check": "yarn changeset status",
"publish:all": "yarn changeset publish", "publish:all": "yarn changeset publish",
"release": "yarn build && yarn publish:all",
"postinstall": "husky install" "postinstall": "husky install"
}, },
"workspaces": [ "workspaces": [

@ -13,7 +13,7 @@
"@nomiclabs/hardhat-waffle": "^2.0.6", "@nomiclabs/hardhat-waffle": "^2.0.6",
"@typechain/ethers-v5": "^10.0.0", "@typechain/ethers-v5": "^10.0.0",
"@typechain/hardhat": "^6.0.0", "@typechain/hardhat": "^6.0.0",
"chai": "^4.3.0", "chai": "^4.3.6",
"ethereum-waffle": "^4.0.10", "ethereum-waffle": "^4.0.10",
"ethers": "^5.7.2", "ethers": "^5.7.2",
"hardhat": "^2.19.0", "hardhat": "^2.19.0",

@ -0,0 +1,8 @@
{
"extensions": ["ts"],
"spec": ["src/**/*.test.*"],
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"
]
}

@ -8,6 +8,7 @@ import { configCommand } from './src/commands/config.js';
import { deployCommand } from './src/commands/deploy.js'; import { deployCommand } from './src/commands/deploy.js';
import { sendCommand } from './src/commands/send.js'; import { sendCommand } from './src/commands/send.js';
import { statusCommand } from './src/commands/status.js'; import { statusCommand } from './src/commands/status.js';
import { readJson } from './src/utils/files.js';
// From yargs code: // From yargs code:
const MISSING_PARAMS_ERROR = 'Not enough non-option arguments'; const MISSING_PARAMS_ERROR = 'Not enough non-option arguments';
@ -15,15 +16,16 @@ const MISSING_PARAMS_ERROR = 'Not enough non-option arguments';
console.log(chalk.blue('Hyperlane'), chalk.magentaBright('CLI')); console.log(chalk.blue('Hyperlane'), chalk.magentaBright('CLI'));
try { try {
const version = readJson<any>('./package.json').version;
await yargs(process.argv.slice(2)) await yargs(process.argv.slice(2))
.scriptName('hyperlane') .scriptName('hyperlane')
// TODO get version num from package.json
.version(false)
.command(chainsCommand) .command(chainsCommand)
.command(configCommand) .command(configCommand)
.command(deployCommand) .command(deployCommand)
.command(sendCommand) .command(sendCommand)
.command(statusCommand) .command(statusCommand)
.version(version)
.demandCommand() .demandCommand()
.strict() .strict()
.help() .help()

@ -2,6 +2,7 @@
# Consists of a map of chain names to metadata # Consists of a map of chain names to metadata
# Schema here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts # Schema here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts
--- ---
# You can define a full config for a new chain
mychainname: mychainname:
# Required fields: # Required fields:
chainId: 1234567890 # Number: Use EIP-155 for EVM chains chainId: 1234567890 # Number: Use EIP-155 for EVM chains
@ -42,3 +43,8 @@ mychainname:
estimateBlockTime: 15 # Number: Rough estimate of time per block in seconds estimateBlockTime: 15 # Number: Rough estimate of time per block in seconds
# transactionOverrides: # Object: Properties to include when forming transaction requests # transactionOverrides: # Object: Properties to include when forming transaction requests
# Any tx fields are allowed # Any tx fields are allowed
# Alternatively, you can extend a core chain config with only fields to be overridden
sepolia:
rpcUrls:
- http: https://mycustomrpc.com

@ -50,6 +50,7 @@ export const logPink = (...args: any) =>
export const logGray = (...args: any) => console.log(chalk.gray(...args)); export const logGray = (...args: any) => console.log(chalk.gray(...args));
export const logGreen = (...args: any) => console.log(chalk.green(...args)); export const logGreen = (...args: any) => console.log(chalk.green(...args));
export const logRed = (...args: any) => console.log(chalk.red(...args)); export const logRed = (...args: any) => console.log(chalk.red(...args));
export const logTip = (...args: any) => console.log(chalk.bgYellow(...args));
export const errorRed = (...args: any) => console.error(chalk.red(...args)); export const errorRed = (...args: any) => console.error(chalk.red(...args));
export const log = (...args: any) => console.log(...args); export const log = (...args: any) => console.log(...args);
export const logTable = (...args: any) => console.table(...args); export const logTable = (...args: any) => console.table(...args);

@ -4,6 +4,7 @@
"description": "A command-line utility for common Hyperlane operations", "description": "A command-line utility for common Hyperlane operations",
"dependencies": { "dependencies": {
"@hyperlane-xyz/sdk": "3.1.7", "@hyperlane-xyz/sdk": "3.1.7",
"@hyperlane-xyz/utils": "3.1.7",
"@inquirer/prompts": "^3.0.0", "@inquirer/prompts": "^3.0.0",
"bignumber.js": "^9.1.1", "bignumber.js": "^9.1.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
@ -14,26 +15,31 @@
"zod": "^3.21.2" "zod": "^3.21.2"
}, },
"devDependencies": { "devDependencies": {
"@types/mocha": "^10.0.1",
"@types/node": "^18.14.5", "@types/node": "^18.14.5",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/parser": "^5.62.0",
"chai": "^4.3.6",
"eslint": "^8.43.0", "eslint": "^8.43.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
"mocha": "^10.2.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"typescript": "^5.1.6" "typescript": "^5.1.6"
}, },
"scripts": { "scripts": {
"hyperlane": "node ./dist/cli.js", "hyperlane": "node ./dist/cli.js",
"build": "tsc", "build": "tsc",
"dev": "tsc --watch",
"clean": "rm -rf ./dist", "clean": "rm -rf ./dist",
"dev": "tsc --watch",
"lint": "eslint . --ext .ts", "lint": "eslint . --ext .ts",
"prettier": "prettier --write ./src ./examples" "prettier": "prettier --write ./src ./examples",
"test": "mocha --config .mocharc.json"
}, },
"files": [ "files": [
"./dist", "./dist",
"./examples" "./examples",
"package.json"
], ],
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",

@ -0,0 +1,18 @@
import { expect } from 'chai';
import { readChainConfigs } from './chain.js';
describe('readChainConfigs', () => {
const chainToMetadata = readChainConfigs('./examples/chain-config.yaml');
it('parses and validates correctly', () => {
expect(chainToMetadata.mychainname.chainId).to.equal(1234567890);
});
it('merges core configs', () => {
expect(chainToMetadata.sepolia.chainId).to.equal(11155111);
expect(chainToMetadata.sepolia.rpcUrls[0].http).to.equal(
'https://mycustomrpc.com',
);
});
});

@ -1,16 +1,21 @@
import { confirm, input, select } from '@inquirer/prompts'; import { confirm, input, select } from '@inquirer/prompts';
import fs from 'fs';
import { import {
ChainMap, ChainMap,
ChainMetadata, ChainMetadata,
ChainMetadataSchema, ChainMetadataSchema,
chainMetadata as coreChainMetadata,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { ProtocolType } from '@hyperlane-xyz/utils'; import { ProtocolType, objMerge } from '@hyperlane-xyz/utils';
import { errorRed, log, logBlue, logGreen } from '../../logger.js'; import { errorRed, log, logBlue, logGreen } from '../../logger.js';
import { getMultiProvider } from '../context.js'; import { getMultiProvider } from '../context.js';
import { FileFormat, mergeYamlOrJson, readYamlOrJson } from '../utils/files.js'; import {
FileFormat,
isFile,
mergeYamlOrJson,
readYamlOrJson,
} from '../utils/files.js';
export function readChainConfigs(filePath: string) { export function readChainConfigs(filePath: string) {
log(`Reading file configs in ${filePath}`); log(`Reading file configs in ${filePath}`);
@ -25,8 +30,16 @@ export function readChainConfigs(filePath: string) {
process.exit(1); process.exit(1);
} }
for (const [chain, metadata] of Object.entries(chainToMetadata)) { // Validate configs from file and merge in core configs as needed
const parseResult = ChainMetadataSchema.safeParse(metadata); for (const chain of Object.keys(chainToMetadata)) {
if (coreChainMetadata[chain]) {
// For core chains, merge in the default config to allow users to override only some fields
chainToMetadata[chain] = objMerge(
coreChainMetadata[chain],
chainToMetadata[chain],
);
}
const parseResult = ChainMetadataSchema.safeParse(chainToMetadata[chain]);
if (!parseResult.success) { if (!parseResult.success) {
errorRed( errorRed(
`Chain config for ${chain} is invalid, please see https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml for an example`, `Chain config for ${chain} is invalid, please see https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml for an example`,
@ -34,13 +47,13 @@ export function readChainConfigs(filePath: string) {
errorRed(JSON.stringify(parseResult.error.errors)); errorRed(JSON.stringify(parseResult.error.errors));
process.exit(1); process.exit(1);
} }
if (metadata.name !== chain) { if (chainToMetadata[chain].name !== chain) {
errorRed(`Chain ${chain} name does not match key`); errorRed(`Chain ${chain} name does not match key`);
process.exit(1); process.exit(1);
} }
} }
// Ensure multiprovider accepts this metadata // Ensure MultiProvider accepts this metadata
getMultiProvider(chainToMetadata); getMultiProvider(chainToMetadata);
logGreen(`All chain configs in ${filePath} are valid`); logGreen(`All chain configs in ${filePath} are valid`);
@ -48,7 +61,7 @@ export function readChainConfigs(filePath: string) {
} }
export function readChainConfigsIfExists(filePath: string) { export function readChainConfigsIfExists(filePath: string) {
if (!fs.existsSync(filePath)) { if (!isFile(filePath)) {
log('No chain config file provided'); log('No chain config file provided');
return {}; return {};
} else { } else {

@ -99,7 +99,7 @@ export async function createWarpConfig({
const syntheticChains = await runMultiChainSelectionStep( const syntheticChains = await runMultiChainSelectionStep(
customChains, customChains,
'Select the chains to which the base token will be connected', 'Select chains to which the base token will be connected',
); );
// TODO add more prompts here to support customizing the token metadata // TODO add more prompts here to support customizing the token metadata

@ -79,7 +79,7 @@ export async function runCoreDeploy({
if (!chains?.length) { if (!chains?.length) {
chains = await runMultiChainSelectionStep( chains = await runMultiChainSelectionStep(
customChains, customChains,
'Select chains to which core contacts will be deployed', 'Select chains to connect',
); );
} }
const artifacts = await runArtifactStep(chains, artifactsPath); const artifacts = await runArtifactStep(chains, artifactsPath);

@ -28,6 +28,7 @@ import {
getMergedContractAddresses, getMergedContractAddresses,
} from '../context.js'; } from '../context.js';
import { import {
isFile,
prepNewArtifactsFiles, prepNewArtifactsFiles,
runFileSelectionStep, runFileSelectionStep,
writeJson, writeJson,
@ -53,12 +54,14 @@ export async function runWarpDeploy({
}) { }) {
const { multiProvider, signer } = getContextWithSigner(key, chainConfigPath); const { multiProvider, signer } = getContextWithSigner(key, chainConfigPath);
if (!warpConfigPath) { if (!warpConfigPath || !isFile(warpConfigPath)) {
warpConfigPath = await runFileSelectionStep( warpConfigPath = await runFileSelectionStep(
'./configs', './configs',
'Warp config', 'Warp config',
'warp', 'warp',
); );
} else {
log(`Using warp config at ${warpConfigPath}`);
} }
const warpRouteConfig = readWarpRouteConfig(warpConfigPath); const warpRouteConfig = readWarpRouteConfig(warpConfigPath);
@ -115,11 +118,6 @@ async function runBuildConfigStep({
const mergedContractAddrs = getMergedContractAddresses(artifacts); const mergedContractAddrs = getMergedContractAddresses(artifacts);
logGray(
'Contract addresses from artifacts:\n',
JSON.stringify(mergedContractAddrs[baseChainName], null, 4),
);
// Create configs that coalesce together values from the config file, // Create configs that coalesce together values from the config file,
// the artifacts, and the SDK as a fallback // the artifacts, and the SDK as a fallback
const configMap: ChainMap<TokenConfig & RouterConfig> = { const configMap: ChainMap<TokenConfig & RouterConfig> = {
@ -130,12 +128,12 @@ async function runBuildConfigStep({
? base.address! ? base.address!
: ethers.constants.AddressZero, : ethers.constants.AddressZero,
owner, owner,
mailbox: base.mailbox || mergedContractAddrs[baseChainName].mailbox, mailbox: base.mailbox || mergedContractAddrs[baseChainName]?.mailbox,
interchainSecurityModule: interchainSecurityModule:
base.interchainSecurityModule || base.interchainSecurityModule ||
mergedContractAddrs[baseChainName].interchainSecurityModule || mergedContractAddrs[baseChainName]?.interchainSecurityModule ||
mergedContractAddrs[baseChainName].multisigIsm, mergedContractAddrs[baseChainName]?.multisigIsm,
// ismFactory: mergedContractAddrs[baseChainName].routingIsmFactory, // fix when updating from routingIsm // ismFactory: mergedContractAddrs[baseChainName].routingIsmFactory, // TODO fix when updating from routingIsm
foreignDeployment: base.foreignDeployment, foreignDeployment: base.foreignDeployment,
name: baseMetadata.name, name: baseMetadata.name,
symbol: baseMetadata.symbol, symbol: baseMetadata.symbol,
@ -154,9 +152,9 @@ async function runBuildConfigStep({
mailbox: synthetic.mailbox || mergedContractAddrs[sChainName].mailbox, mailbox: synthetic.mailbox || mergedContractAddrs[sChainName].mailbox,
interchainSecurityModule: interchainSecurityModule:
synthetic.interchainSecurityModule || synthetic.interchainSecurityModule ||
mergedContractAddrs[sChainName].interchainSecurityModule || mergedContractAddrs[sChainName]?.interchainSecurityModule ||
mergedContractAddrs[sChainName].multisigIsm, mergedContractAddrs[sChainName]?.multisigIsm,
// ismFactory: mergedContractAddrs[sChainName].routingIsmFactory, // fix // ismFactory: mergedContractAddrs[sChainName].routingIsmFactory, // TODO fix
foreignDeployment: synthetic.foreignDeployment, foreignDeployment: synthetic.foreignDeployment,
}; };
} }

@ -9,7 +9,7 @@ import {
testnetChainsMetadata, testnetChainsMetadata,
} from '@hyperlane-xyz/sdk'; } from '@hyperlane-xyz/sdk';
import { log, logBlue } from '../../logger.js'; import { log, logBlue, logRed, logTip } from '../../logger.js';
// A special value marker to indicate user selected // A special value marker to indicate user selected
// a new chain in the list // a new chain in the list
@ -34,14 +34,17 @@ export async function runMultiChainSelectionStep(
message = 'Select chains', message = 'Select chains',
) { ) {
const choices = getChainChoices(customChains); const choices = getChainChoices(customChains);
const chains = (await checkbox({ while (true) {
message, logTip('Use SPACE key to select chains, then press ENTER');
choices, const chains = (await checkbox({
pageSize: 20, message,
})) as string[]; choices,
handleNewChain(chains); pageSize: 20,
if (!chains?.length) throw new Error('No chains selected'); })) as string[];
return chains; handleNewChain(chains);
if (chains?.length >= 2) return chains;
else logRed('Please select at least 2 chains');
}
} }
function getChainChoices(customChains: ChainMap<ChainMetadata>) { function getChainChoices(customChains: ChainMap<ChainMetadata>) {

@ -6,14 +6,24 @@ import { parse as yamlParse, stringify as yamlStringify } from 'yaml';
import { objMerge } from '@hyperlane-xyz/utils'; import { objMerge } from '@hyperlane-xyz/utils';
import { logBlue } from '../../logger.js'; import { log, logBlue } from '../../logger.js';
import { getTimestampForFilename } from './time.js'; import { getTimestampForFilename } from './time.js';
export type FileFormat = 'yaml' | 'json'; export type FileFormat = 'yaml' | 'json';
export function isFile(filepath: string) {
if (!filepath) return false;
try {
return fs.existsSync(filepath) && fs.lstatSync(filepath).isFile();
} catch (error) {
log(`Error checking for file: ${filepath}`);
return false;
}
}
export function readFileAtPath(filepath: string) { export function readFileAtPath(filepath: string) {
if (!fs.existsSync(filepath)) { if (!isFile(filepath)) {
throw Error(`File doesn't exist at ${filepath}`); throw Error(`File doesn't exist at ${filepath}`);
} }
return fs.readFileSync(filepath, 'utf8'); return fs.readFileSync(filepath, 'utf8');
@ -21,7 +31,7 @@ export function readFileAtPath(filepath: string) {
export function writeFileAtPath(filepath: string, value: string) { export function writeFileAtPath(filepath: string, value: string) {
const dirname = path.dirname(filepath); const dirname = path.dirname(filepath);
if (!fs.existsSync(dirname)) { if (!isFile(dirname)) {
fs.mkdirSync(dirname, { recursive: true }); fs.mkdirSync(dirname, { recursive: true });
} }
fs.writeFileSync(filepath, value); fs.writeFileSync(filepath, value);
@ -47,7 +57,7 @@ export function mergeJson<T extends Record<string, any>>(
filepath: string, filepath: string,
obj: T, obj: T,
) { ) {
if (fs.existsSync(filepath)) { if (isFile(filepath)) {
const previous = readJson<T>(filepath); const previous = readJson<T>(filepath);
writeJson(filepath, objMerge(previous, obj)); writeJson(filepath, objMerge(previous, obj));
} else { } else {
@ -75,7 +85,7 @@ export function mergeYaml<T extends Record<string, any>>(
filepath: string, filepath: string,
obj: T, obj: T,
) { ) {
if (fs.existsSync(filepath)) { if (isFile(filepath)) {
const previous = readYaml<T>(filepath); const previous = readYaml<T>(filepath);
writeYaml(filepath, objMerge(previous, obj)); writeYaml(filepath, objMerge(previous, obj));
} else { } else {

@ -0,0 +1,10 @@
import { expect } from 'chai';
import { getTimestampForFilename } from './time.js';
describe('getTimestampForFilename', () => {
it('structures timestamp correctly', () => {
const filename = getTimestampForFilename();
expect(filename).to.match(/\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}/);
});
});

@ -1,6 +1,12 @@
export function getTimestampForFilename() { export function getTimestampForFilename() {
const pad = (n: number) =>
n.toLocaleString('en-US', { minimumIntegerDigits: 2, useGrouping: false });
const now = new Date(); const now = new Date();
return `${now.getFullYear()}-${ const year = now.getFullYear();
now.getMonth() + 1 const month = pad(now.getMonth() + 1);
}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}`; const date = pad(now.getDate());
const hours = pad(now.getHours());
const minutes = pad(now.getMinutes());
const seconds = pad(now.getSeconds());
return `${year}-${month}-${date}-${hours}-${minutes}-${seconds}`;
} }

@ -14,10 +14,9 @@
"@trivago/prettier-plugin-sort-imports": "^4.2.1", "@trivago/prettier-plugin-sort-imports": "^4.2.1",
"@typechain/ethers-v5": "^10.0.0", "@typechain/ethers-v5": "^10.0.0",
"@typechain/hardhat": "^6.0.0", "@typechain/hardhat": "^6.0.0",
"@types/mocha": "^9.1.0",
"@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/parser": "^5.62.0",
"chai": "^4.3.0", "chai": "^4.3.6",
"eslint": "^8.43.0", "eslint": "^8.43.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
"ethereum-waffle": "^4.0.10", "ethereum-waffle": "^4.0.10",

@ -29,12 +29,12 @@
"@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-ethers": "^2.2.1",
"@nomiclabs/hardhat-waffle": "^2.0.6", "@nomiclabs/hardhat-waffle": "^2.0.6",
"@types/chai": "^4.2.21", "@types/chai": "^4.2.21",
"@types/mocha": "^9.1.0", "@types/mocha": "^10.0.1",
"@types/node": "^16.9.1", "@types/node": "^16.9.1",
"@types/prompts": "^2.0.14", "@types/prompts": "^2.0.14",
"@types/sinon-chai": "^3.2.12", "@types/sinon-chai": "^3.2.12",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"chai": "^4.3.4", "chai": "^4.3.6",
"ethereum-waffle": "^4.0.10", "ethereum-waffle": "^4.0.10",
"ethers": "^5.7.2", "ethers": "^5.7.2",
"hardhat": "^2.19.0", "hardhat": "^2.19.0",

@ -24,6 +24,7 @@
"devDependencies": { "devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.2.1", "@nomiclabs/hardhat-ethers": "^2.2.1",
"@nomiclabs/hardhat-waffle": "^2.0.6", "@nomiclabs/hardhat-waffle": "^2.0.6",
"@types/mocha": "^10.0.1",
"@types/node": "^16.9.1", "@types/node": "^16.9.1",
"@types/sinon": "^17.0.1", "@types/sinon": "^17.0.1",
"@types/sinon-chai": "^3.2.12", "@types/sinon-chai": "^3.2.12",
@ -33,7 +34,7 @@
"eslint": "^8.43.0", "eslint": "^8.43.0",
"ethereum-waffle": "^4.0.10", "ethereum-waffle": "^4.0.10",
"hardhat": "^2.19.0", "hardhat": "^2.19.0",
"mocha": "^9.2.2", "mocha": "^10.2.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"sinon": "^13.0.2", "sinon": "^13.0.2",
"ts-node": "^10.8.0", "ts-node": "^10.8.0",

@ -6,11 +6,12 @@
"@cosmjs/encoding": "^0.31.3", "@cosmjs/encoding": "^0.31.3",
"@solana/web3.js": "^1.78.0", "@solana/web3.js": "^1.78.0",
"bignumber.js": "^9.1.1", "bignumber.js": "^9.1.1",
"ethers": "^5.7.2", "ethers": "^5.7.2"
"mocha": "^10.2.0"
}, },
"devDependencies": { "devDependencies": {
"chai": "^4.3.0", "@types/mocha": "^10.0.1",
"chai": "^4.3.6",
"mocha": "^10.2.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"typescript": "5.1.6" "typescript": "5.1.6"
}, },

@ -4233,16 +4233,20 @@ __metadata:
resolution: "@hyperlane-xyz/cli@workspace:typescript/cli" resolution: "@hyperlane-xyz/cli@workspace:typescript/cli"
dependencies: dependencies:
"@hyperlane-xyz/sdk": "npm:3.1.7" "@hyperlane-xyz/sdk": "npm:3.1.7"
"@hyperlane-xyz/utils": "npm:3.1.7"
"@inquirer/prompts": "npm:^3.0.0" "@inquirer/prompts": "npm:^3.0.0"
"@types/mocha": "npm:^10.0.1"
"@types/node": "npm:^18.14.5" "@types/node": "npm:^18.14.5"
"@types/yargs": "npm:^17.0.24" "@types/yargs": "npm:^17.0.24"
"@typescript-eslint/eslint-plugin": "npm:^5.62.0" "@typescript-eslint/eslint-plugin": "npm:^5.62.0"
"@typescript-eslint/parser": "npm:^5.62.0" "@typescript-eslint/parser": "npm:^5.62.0"
bignumber.js: "npm:^9.1.1" bignumber.js: "npm:^9.1.1"
chai: "npm:^4.3.6"
chalk: "npm:^5.3.0" chalk: "npm:^5.3.0"
eslint: "npm:^8.43.0" eslint: "npm:^8.43.0"
eslint-config-prettier: "npm:^8.8.0" eslint-config-prettier: "npm:^8.8.0"
ethers: "npm:^5.7.2" ethers: "npm:^5.7.2"
mocha: "npm:^10.2.0"
prettier: "npm:^2.8.8" prettier: "npm:^2.8.8"
terminal-link: "npm:^3.0.0" terminal-link: "npm:^3.0.0"
typescript: "npm:^5.1.6" typescript: "npm:^5.1.6"
@ -4266,7 +4270,7 @@ __metadata:
"@openzeppelin/contracts-upgradeable": "npm:^v4.9.3" "@openzeppelin/contracts-upgradeable": "npm:^v4.9.3"
"@typechain/ethers-v5": "npm:^10.0.0" "@typechain/ethers-v5": "npm:^10.0.0"
"@typechain/hardhat": "npm:^6.0.0" "@typechain/hardhat": "npm:^6.0.0"
chai: "npm:^4.3.0" chai: "npm:^4.3.6"
ethereum-waffle: "npm:^4.0.10" ethereum-waffle: "npm:^4.0.10"
ethers: "npm:^5.7.2" ethers: "npm:^5.7.2"
hardhat: "npm:^2.19.0" hardhat: "npm:^2.19.0"
@ -4298,10 +4302,9 @@ __metadata:
"@trivago/prettier-plugin-sort-imports": "npm:^4.2.1" "@trivago/prettier-plugin-sort-imports": "npm:^4.2.1"
"@typechain/ethers-v5": "npm:^10.0.0" "@typechain/ethers-v5": "npm:^10.0.0"
"@typechain/hardhat": "npm:^6.0.0" "@typechain/hardhat": "npm:^6.0.0"
"@types/mocha": "npm:^9.1.0"
"@typescript-eslint/eslint-plugin": "npm:^5.62.0" "@typescript-eslint/eslint-plugin": "npm:^5.62.0"
"@typescript-eslint/parser": "npm:^5.62.0" "@typescript-eslint/parser": "npm:^5.62.0"
chai: "npm:^4.3.0" chai: "npm:^4.3.6"
eslint: "npm:^8.43.0" eslint: "npm:^8.43.0"
eslint-config-prettier: "npm:^8.8.0" eslint-config-prettier: "npm:^8.8.0"
ethereum-waffle: "npm:^4.0.10" ethereum-waffle: "npm:^4.0.10"
@ -4346,14 +4349,14 @@ __metadata:
"@safe-global/protocol-kit": "npm:^1.2.0" "@safe-global/protocol-kit": "npm:^1.2.0"
"@solana/web3.js": "npm:^1.78.0" "@solana/web3.js": "npm:^1.78.0"
"@types/chai": "npm:^4.2.21" "@types/chai": "npm:^4.2.21"
"@types/mocha": "npm:^9.1.0" "@types/mocha": "npm:^10.0.1"
"@types/node": "npm:^16.9.1" "@types/node": "npm:^16.9.1"
"@types/prompts": "npm:^2.0.14" "@types/prompts": "npm:^2.0.14"
"@types/sinon-chai": "npm:^3.2.12" "@types/sinon-chai": "npm:^3.2.12"
"@types/yargs": "npm:^17.0.24" "@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" aws-kms-ethers-signer: "npm:^0.1.3"
chai: "npm:^4.3.4" chai: "npm:^4.3.6"
dotenv: "npm:^10.0.0" dotenv: "npm:^10.0.0"
ethereum-waffle: "npm:^4.0.10" ethereum-waffle: "npm:^4.0.10"
ethers: "npm:^5.7.2" ethers: "npm:^5.7.2"
@ -4400,6 +4403,7 @@ __metadata:
"@solana/web3.js": "npm:^1.78.0" "@solana/web3.js": "npm:^1.78.0"
"@types/coingecko-api": "npm:^1.0.10" "@types/coingecko-api": "npm:^1.0.10"
"@types/debug": "npm:^4.1.7" "@types/debug": "npm:^4.1.7"
"@types/mocha": "npm:^10.0.1"
"@types/node": "npm:^16.9.1" "@types/node": "npm:^16.9.1"
"@types/sinon": "npm:^17.0.1" "@types/sinon": "npm:^17.0.1"
"@types/sinon-chai": "npm:^3.2.12" "@types/sinon-chai": "npm:^3.2.12"
@ -4416,7 +4420,7 @@ __metadata:
ethereum-waffle: "npm:^4.0.10" ethereum-waffle: "npm:^4.0.10"
ethers: "npm:^5.7.2" ethers: "npm:^5.7.2"
hardhat: "npm:^2.19.0" hardhat: "npm:^2.19.0"
mocha: "npm:^9.2.2" mocha: "npm:^10.2.0"
prettier: "npm:^2.8.8" prettier: "npm:^2.8.8"
sinon: "npm:^13.0.2" sinon: "npm:^13.0.2"
ts-node: "npm:^10.8.0" ts-node: "npm:^10.8.0"
@ -4435,8 +4439,9 @@ __metadata:
dependencies: dependencies:
"@cosmjs/encoding": "npm:^0.31.3" "@cosmjs/encoding": "npm:^0.31.3"
"@solana/web3.js": "npm:^1.78.0" "@solana/web3.js": "npm:^1.78.0"
"@types/mocha": "npm:^10.0.1"
bignumber.js: "npm:^9.1.1" bignumber.js: "npm:^9.1.1"
chai: "npm:^4.3.0" chai: "npm:^4.3.6"
ethers: "npm:^5.7.2" ethers: "npm:^5.7.2"
mocha: "npm:^10.2.0" mocha: "npm:^10.2.0"
prettier: "npm:^2.8.8" prettier: "npm:^2.8.8"
@ -6209,10 +6214,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/mocha@npm:^9.1.0": "@types/mocha@npm:^10.0.1":
version: 9.1.1 version: 10.0.5
resolution: "@types/mocha@npm:9.1.1" resolution: "@types/mocha@npm:10.0.5"
checksum: cf8283e253f62b613d4cbac0d37fe4b88bc0aca72f3da4177cadeb86c989167613e2a23186ca1eba6bf17ce1e47b673875c4bd5a6fd0d3729a71d53f95e517f3 checksum: 522bef34c56d10957f396cf08838cc04eabfe8e77e6229bd668a1b7b61602bcedcab71ccb02cb9e10f42644de6c3fd51cdcf3f2817abcf9cc5f31e47647adc3c
languageName: node languageName: node
linkType: hard linkType: hard
@ -6599,13 +6604,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@ungap/promise-all-settled@npm:1.1.2":
version: 1.1.2
resolution: "@ungap/promise-all-settled@npm:1.1.2"
checksum: ee8fe811becd830f5e276ec63469ec66c22503eb140064580e712c9fccadfd54157c462188640ba6765d5c21f829e7120eb37afb5ead512684b9a1ab86d2db66
languageName: node
linkType: hard
"@wagmi/chains@npm:1.6.0": "@wagmi/chains@npm:1.6.0":
version: 1.6.0 version: 1.6.0
resolution: "@wagmi/chains@npm:1.6.0" resolution: "@wagmi/chains@npm:1.6.0"
@ -7878,7 +7876,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chai@npm:^4.3.0, chai@npm:^4.3.4, chai@npm:^4.3.6": "chai@npm:^4.3.4, chai@npm:^4.3.6":
version: 4.3.6 version: 4.3.6
resolution: "chai@npm:4.3.6" resolution: "chai@npm:4.3.6"
dependencies: dependencies:
@ -8646,18 +8644,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"debug@npm:4.3.3":
version: 4.3.3
resolution: "debug@npm:4.3.3"
dependencies:
ms: "npm:2.1.2"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 723a9570dcd15d146ea4992f0dca12467d1b00f534abb42473df166d36826fcae8bab045aef59ac2f407b47a23266110bc0e646df8ac82f7800c11384f82050e
languageName: node
linkType: hard
"debug@npm:^3.1.0": "debug@npm:^3.1.0":
version: 3.2.7 version: 3.2.7
resolution: "debug@npm:3.2.7" resolution: "debug@npm:3.2.7"
@ -13065,15 +13051,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minimatch@npm:4.2.1":
version: 4.2.1
resolution: "minimatch@npm:4.2.1"
dependencies:
brace-expansion: "npm:^1.1.7"
checksum: 27e49fb720116face9588c29634404edc0c6677e5448ba01b4ec6179002461cc4fabc842497a0537edc5aa87bc93e65cfb0fe6dc32b850563429a64836dd1d54
languageName: node
linkType: hard
"minimatch@npm:5.0.1": "minimatch@npm:5.0.1":
version: 5.0.1 version: 5.0.1
resolution: "minimatch@npm:5.0.1" resolution: "minimatch@npm:5.0.1"
@ -13364,41 +13341,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"mocha@npm:^9.2.2":
version: 9.2.2
resolution: "mocha@npm:9.2.2"
dependencies:
"@ungap/promise-all-settled": "npm:1.1.2"
ansi-colors: "npm:4.1.1"
browser-stdout: "npm:1.3.1"
chokidar: "npm:3.5.3"
debug: "npm:4.3.3"
diff: "npm:5.0.0"
escape-string-regexp: "npm:4.0.0"
find-up: "npm:5.0.0"
glob: "npm:7.2.0"
growl: "npm:1.10.5"
he: "npm:1.2.0"
js-yaml: "npm:4.1.0"
log-symbols: "npm:4.1.0"
minimatch: "npm:4.2.1"
ms: "npm:2.1.3"
nanoid: "npm:3.3.1"
serialize-javascript: "npm:6.0.0"
strip-json-comments: "npm:3.1.1"
supports-color: "npm:8.1.1"
which: "npm:2.0.2"
workerpool: "npm:6.2.0"
yargs: "npm:16.2.0"
yargs-parser: "npm:20.2.4"
yargs-unparser: "npm:2.0.0"
bin:
_mocha: bin/_mocha
mocha: bin/mocha
checksum: 8ee58bff8694ad4013fc0fbb5670c5ec6d8404c601df2d4ae798fad01dd03b5f9395347cf59167006b315a14813a6f839290d60dcbdee8ef4246afe43609d2dc
languageName: node
linkType: hard
"mock-fs@npm:^4.1.0": "mock-fs@npm:^4.1.0":
version: 4.14.0 version: 4.14.0
resolution: "mock-fs@npm:4.14.0" resolution: "mock-fs@npm:4.14.0"
@ -13514,15 +13456,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"nanoid@npm:3.3.1":
version: 3.3.1
resolution: "nanoid@npm:3.3.1"
bin:
nanoid: bin/nanoid.cjs
checksum: 306f2cb9e4dcfb94738b09de9dc63839a37db33626f66b24dbcc8f66d4b91784645794a7c4f250d629e4d66f5385164c6748c58ac5b7c95217e9e048590efbe4
languageName: node
linkType: hard
"nanoid@npm:3.3.3": "nanoid@npm:3.3.3":
version: 3.3.3 version: 3.3.3
resolution: "nanoid@npm:3.3.3" resolution: "nanoid@npm:3.3.3"
@ -17877,7 +17810,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": "which@npm:^2.0.1, which@npm:^2.0.2":
version: 2.0.2 version: 2.0.2
resolution: "which@npm:2.0.2" resolution: "which@npm:2.0.2"
dependencies: dependencies:
@ -17930,13 +17863,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"workerpool@npm:6.2.0":
version: 6.2.0
resolution: "workerpool@npm:6.2.0"
checksum: c7dce6eae02098d70fe9924503bd95688564a1316cbb96fe55600f7ede0e66f1f2fea4d18aaec71fcee32373d17eda0bf87ac4dac8e5823e90ca1524aac90bdc
languageName: node
linkType: hard
"workerpool@npm:6.2.1": "workerpool@npm:6.2.1":
version: 6.2.1 version: 6.2.1
resolution: "workerpool@npm:6.2.1" resolution: "workerpool@npm:6.2.1"

Loading…
Cancel
Save