diff --git a/.gitignore b/.gitignore index eec0f302..43c99dbb 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,6 @@ context/*.config.json tmp/ dist/ node_modules/ -wasm_codes.zip \ No newline at end of file +wasm_codes.zip + +.yarn/install-state.gz diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz deleted file mode 100644 index f1ef3b48..00000000 Binary files a/.yarn/install-state.gz and /dev/null differ diff --git a/config.example.yaml b/config.example.yaml index 16ea0530..1ff49ded 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -1,6 +1,7 @@ networks: - id: 'localwasmd' hrp: 'uwasm' + signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef endpoint: rpc: 'http://localhost:26657' rest: 'http://localhost:1317' @@ -12,6 +13,7 @@ networks: - id: 'localosmosis' hrp: 'osmo' + signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef endpoint: rpc: 'http://localhost:26657' rest: 'http://localhost:1317' @@ -23,6 +25,7 @@ networks: - id: 'localneutron' hrp: 'neutron' + signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef endpoint: rpc: 'http://localhost:26657' rest: 'http://localhost:1317' @@ -32,23 +35,30 @@ networks: denom: 'untrn' domain: 1302 + - id: 'cradle-neutron-chain' + hrp: 'neutron' + signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef + is_cradle: true + cradle_session_id: '{{cradle_session_id}}' + gas: + price: 0.025 + denom: untrn + domain: 1853125230 + # Networks that already have hyperlane deployments # but might require new warp route connections evm_networks: - name: 'mantasepolia' + signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef chain_id: 3441006 - rpc_endpoint: "http://localhost:8545" + rpc_endpoint: 'http://localhost:8545' network: 'sepolia' nativeCurrency: name: 'Sepolia Ether' symbol: 'ETH' decimals: 18 - mailbox_address: "0x123..." - multisig_ism_factory_address: "0x123..." - - - -signer: deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef + mailbox_address: '0x123...' + multisig_ism_factory_address: '0x123...' deploy: ism: diff --git a/example/src/recipient.ts b/example/src/recipient.ts index 55164d24..a6aed5d2 100644 --- a/example/src/recipient.ts +++ b/example/src/recipient.ts @@ -10,15 +10,15 @@ import { expectNextContractAddr, logTx } from './utils'; export const recipientCmd = new Command('deploy-test-recipient') .option('--validator-address ', 'validator address to use') - .action( - deployTestRecipient, -); + .action(deployTestRecipient); type DeployTestRecipientArgs = { - validatorAddress?: `0x{string}` -} + validatorAddress?: `0x{string}`; +}; -async function deployTestRecipient({validatorAddress}: DeployTestRecipientArgs) { +async function deployTestRecipient({ + validatorAddress, +}: DeployTestRecipientArgs) { const { account, provider: { query, exec }, diff --git a/example/src/warp.ts b/example/src/warp.ts index 0c244c07..9ff42b4d 100644 --- a/example/src/warp.ts +++ b/example/src/warp.ts @@ -1,8 +1,8 @@ -import { - HypERC20__factory, +import { + HypERC20__factory, StaticMessageIdMultisigIsmFactory__factory, } from '@hyperlane-xyz/core'; -import { Command, Option} from 'commander'; +import { Command, Option } from 'commander'; import { isAddress } from 'viem'; import { HYP_MAILBOX, HYP_MULTSIG_ISM_FACTORY } from './constants'; @@ -15,28 +15,25 @@ import { const warpCmd = new Command('warp'); -warpCmd.command('deploy') +warpCmd + .command('deploy') .option( - '--contract-name ', + '--contract-name ', 'Warp contract name e.g. Hyperlane Bridged TIA', - 'Hyperlane Bridged Osmo' - ) - .option( - '--asset-name ', - 'Warp route asset name e.g. TIA', - 'TIA' + 'Hyperlane Bridged Osmo', ) + .option('--asset-name ', 'Warp route asset name e.g. TIA', 'TIA') .option( - '--create-new-ism', + '--create-new-ism', 'Option to create a new ISM for the the warp route', - false + false, ) .option( - '--warp-ism-address ', - 'ISM to set on the warp route recipient' + '--warp-ism-address ', + 'ISM to set on the warp route recipient', ) .option( - '--ism-validator-address ', + '--ism-validator-address ', 'Validator address on the ism', ) .action(deployWarpRoute); @@ -58,11 +55,11 @@ warpCmd export { warpCmd }; type DeployWarpRouteArgs = { - contractName: string, - assetName: string, - createNewIsm?: boolean, - warpIsmAddress?: `0x${string}`, - ismValidatorAddress?: `0x${string}`, + contractName: string; + assetName: string; + createNewIsm?: boolean; + warpIsmAddress?: `0x${string}`; + ismValidatorAddress?: `0x${string}`; }; async function deployWarpRoute({ @@ -78,7 +75,9 @@ async function deployWarpRoute({ } = CONTAINER.get(Dependencies); if (createNewIsm && warpIsmAddress !== undefined) { - throw new Error("invalid options: cannot create a new ISM and pass a custom ISM address at the same time") + throw new Error( + 'invalid options: cannot create a new ISM and pass a custom ISM address at the same time', + ); } // deploy hyp erc20 (implementation) @@ -100,7 +99,11 @@ async function deployWarpRoute({ abi: HypERC20__factory.abi, address: hypErc20Addr, functionName: 'initialize', - args: [0n, contractName ? contractName : 'Hyperlane Bridged OSMO', assetName ? assetName : 'OSMO'], + args: [ + 0n, + contractName ? contractName : 'Hyperlane Bridged OSMO', + assetName ? assetName : 'OSMO', + ], }); logTx('Initialize HypERC20', tx); await query.waitForTransactionReceipt({ hash: tx }); @@ -108,7 +111,9 @@ async function deployWarpRoute({ // If the option was specifed to create a new ISM, deploy the multisig ISM contract if (createNewIsm) { - ismValidatorAddress = ismValidatorAddress ? ismValidatorAddress : account.address + ismValidatorAddress = ismValidatorAddress + ? ismValidatorAddress + : account.address; const multisigIsmAddr = await query.readContract({ abi: StaticMessageIdMultisigIsmFactory__factory.abi, @@ -117,7 +122,7 @@ async function deployWarpRoute({ args: [[ismValidatorAddress], 1], }); console.log(`Deploying multisigIsm at "${multisigIsmAddr.green}"...`); - + { const tx = await exec.writeContract({ abi: StaticMessageIdMultisigIsmFactory__factory.abi, @@ -129,9 +134,9 @@ async function deployWarpRoute({ await query.waitForTransactionReceipt({ hash: tx }); } - warpIsmAddress = multisigIsmAddr + warpIsmAddress = multisigIsmAddr; } - + // If a custom ISM address was specified or if a new ISM was created, // register that address in the warp contract // Otherwise, the default ISM will be used diff --git a/package.json b/package.json index 97634828..e1b08f7b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "eslint . --ext ts", - "prettier": "prettier ./script ./example ./codegen.ts --write", + "prettier": "prettier ./script ./example ./tests ./codegen.ts --write", "build": "yarn clean && esbuild ./script --bundle --outfile=./dist/index.js --platform=node", "start": "yarn build && node ./dist/index.js", "cw-hpl": "yarn start", @@ -29,8 +29,10 @@ "axios": "^1.6.7", "colors": "^1.4.0", "commander": "^11.1.0", + "cosmjs-types": "^0.9.0", "decompress": "^4.2.1", "inversify": "^6.0.1", + "lodash": "^4.17.21", "readline": "^1.3.0", "reflect-metadata": "^0.1.13" }, @@ -40,6 +42,7 @@ "@types/decompress": "^4.2.7", "@types/eslint": "^8", "@types/js-yaml": "^4.0.8", + "@types/lodash": "^4.17.4", "@types/node": "^20.11.20", "@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/parser": "^7.1.1", diff --git a/script/commands/evm.ts b/script/commands/evm.ts index b5b58efe..470dd053 100644 --- a/script/commands/evm.ts +++ b/script/commands/evm.ts @@ -1,5 +1,5 @@ -import { - HypERC20__factory, +import { + HypERC20__factory, StaticMessageIdMultisigIsmFactory__factory, } from '@hyperlane-xyz/core'; import { Command, Option } from 'commander'; @@ -12,65 +12,65 @@ import { http, } from 'viem'; import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts'; + +import { expectNextContractAddr, logTx } from '../../example/src/utils'; import { config, getEvmNetwork } from '../shared/config'; -import { - expectNextContractAddr, - logTx, -} from '../../example/src/utils'; -const evmCmd = new Command('evm') +const evmCmd = new Command('evm'); -evmCmd.command('deploy-ism') +evmCmd + .command('deploy-ism') .addOption( new Option( '--evm-network-name ', 'specify the EVM network name', ) - .choices(config.evm_networks ? config.evm_networks.map((v) => v.name) : []) - .makeOptionMandatory() + .choices( + config.evm_networks ? config.evm_networks.map((v) => v.name) : [], + ) + .makeOptionMandatory(), ) .option( - '--validator-addresses ', + '--validator-addresses ', 'Comma separated list of validator address on the ism', ) .option( - '--threshold ', + '--threshold ', 'Threshold for the number of validators in the ISM', - "1", + '1', ) .action(deployIsm); -evmCmd.command('deploy-warp') +evmCmd + .command('deploy-warp') .addOption( new Option( '--evm-network-name ', 'specify the EVM network name', ) - .choices(config.evm_networks ? config.evm_networks.map((v) => v.name) : []) - .makeOptionMandatory() + .choices( + config.evm_networks ? config.evm_networks.map((v) => v.name) : [], + ) + .makeOptionMandatory(), ) .option( - '--contract-name ', + '--contract-name ', 'Warp contract name e.g. Hyperlane Bridged TIA', - 'Hyperlane Bridged Osmo' + 'Hyperlane Bridged Osmo', ) + .option('--asset-name ', 'Warp route asset name e.g. TIA', 'TIA') .option( - '--asset-name ', - 'Warp route asset name e.g. TIA', - 'TIA' - ) - .option( - '--ism-address ', - 'ISM to set on the warp route recipient' + '--ism-address ', + 'ISM to set on the warp route recipient', ) .action(deployWarpRoute); export { evmCmd }; type DeployIsmArgs = { - evmNetworkName: string, - validatorAddresses?: `0x${string}`, - threshold?: number, + evmNetworkName: string; + validatorAddresses?: `0x${string}`; + threshold?: number; }; async function deployIsm({ @@ -78,13 +78,16 @@ async function deployIsm({ validatorAddresses, threshold, }: DeployIsmArgs) { - const { signer } = config; - const evmNetwork = getEvmNetwork(evmNetworkName) - + const evmNetwork = getEvmNetwork(evmNetworkName); + const account: Account = - signer.split(' ').length > 1 - ? mnemonicToAccount(signer) - : privateKeyToAccount(`0x${signer}` as Hex); + evmNetwork.signer.split(' ').length > 1 + ? mnemonicToAccount(evmNetwork.signer) + : privateKeyToAccount( + (evmNetwork.signer.startsWith('0x') + ? evmNetwork.signer + : `0x${evmNetwork.signer}`) as Hex, + ); const chain: Chain = { id: evmNetwork.chain_id, @@ -99,12 +102,12 @@ async function deployIsm({ http: [evmNetwork.rpc_endpoint], }, }, - } + }; const query = createPublicClient({ chain: chain, transport: http(evmNetwork.rpc_endpoint), - }) + }); const exec = createWalletClient({ chain: chain, @@ -112,8 +115,12 @@ async function deployIsm({ transport: http(evmNetwork.rpc_endpoint), }); - const validatorAddressesString = validatorAddresses ? validatorAddresses : account.address - const validatorAddressesList = validatorAddressesString.split(",").map(address => address as `0x${string}`) + const validatorAddressesString = validatorAddresses + ? validatorAddresses + : account.address; + const validatorAddressesList = validatorAddressesString + .split(',') + .map((address) => address as `0x${string}`); const multisigIsmAddr = await query.readContract({ abi: StaticMessageIdMultisigIsmFactory__factory.abi, @@ -121,7 +128,9 @@ async function deployIsm({ functionName: 'getAddress', args: [validatorAddressesList, Number(threshold)], }); - console.log(`Multisig ISM Address to be deployed at: ${multisigIsmAddr.green}`); + console.log( + `Multisig ISM Address to be deployed at: ${multisigIsmAddr.green}`, + ); { const tx = await exec.writeContract({ @@ -137,12 +146,11 @@ async function deployIsm({ console.log(`\nMultisig ISM Address: ${multisigIsmAddr.blue}`); } - type DeployWarpRouteArgs = { - evmNetworkName: string, - contractName: string, - assetName: string, - ismAddress?: `0x${string}`, + evmNetworkName: string; + contractName: string; + assetName: string; + ismAddress?: `0x${string}`; }; async function deployWarpRoute({ @@ -151,13 +159,16 @@ async function deployWarpRoute({ assetName, ismAddress, }: DeployWarpRouteArgs) { - const { signer } = config; - const evmNetwork = getEvmNetwork(evmNetworkName) - + const evmNetwork = getEvmNetwork(evmNetworkName); + const account: Account = - signer.split(' ').length > 1 - ? mnemonicToAccount(signer) - : privateKeyToAccount(`0x${signer}` as Hex); + evmNetwork.signer.split(' ').length > 1 + ? mnemonicToAccount(evmNetwork.signer) + : privateKeyToAccount( + (evmNetwork.signer.startsWith('0x') + ? evmNetwork.signer + : `0x${evmNetwork.signer}`) as Hex, + ); const chain: Chain = { id: evmNetwork.chain_id, @@ -172,12 +183,12 @@ async function deployWarpRoute({ http: [evmNetwork.rpc_endpoint], }, }, - } + }; const query = createPublicClient({ chain: chain, transport: http(evmNetwork.rpc_endpoint), - }) + }); const exec = createWalletClient({ chain: chain, @@ -204,12 +215,16 @@ async function deployWarpRoute({ abi: HypERC20__factory.abi, address: hypErc20Addr, functionName: 'initialize', - args: [0n, contractName ? contractName : 'Hyperlane Bridged OSMO', assetName ? assetName : 'OSMO'], + args: [ + 0n, + contractName ? contractName : 'Hyperlane Bridged OSMO', + assetName ? assetName : 'OSMO', + ], }); logTx('Initialize HypERC20', tx); await query.waitForTransactionReceipt({ hash: tx }); } - + // If a custom ISM address was specified, register that address in the warp contract // Otherwise, the default ISM will be used if (ismAddress !== undefined) { @@ -222,6 +237,6 @@ async function deployWarpRoute({ logTx('Set ism for warp route', tx); await query.waitForTransactionReceipt({ hash: tx }); } - + console.log(`\nWarp ERC20: ${hypErc20Addr.blue}`); } diff --git a/script/commands/update.ts b/script/commands/update.ts index b6a53fa4..cc7958ae 100644 --- a/script/commands/update.ts +++ b/script/commands/update.ts @@ -1,14 +1,13 @@ import { Command } from 'commander'; import { IgpHookType, config } from '../shared/config'; -import { typed, ContextHook } from '../shared/context'; +import { ContextHook, typed } from '../shared/context'; import { executeMultiMsg } from '../shared/contract'; import { CONTAINER, Dependencies } from '../shared/ioc'; export const updateCmd = new Command('update') .description('Register new chain to existing contracts') - .configureHelp({ showGlobalOptions: true }) -; + .configureHelp({ showGlobalOptions: true }); updateCmd.command('igp-oracle').action(handleRegisterIgpOracle); updateCmd.command('ism-multisig').action(handleRegisterIsm); @@ -24,7 +23,7 @@ function isIgpHookType(hook: ContextHook): hook is IgpHook { } function getIsmsMultisigConfig() { - if (!config.deploy.ism || config.deploy.ism.type != "multisig") { + if (!config.deploy.ism || config.deploy.ism.type != 'multisig') { throw new Error('Ism multisig config not found'); } return config.deploy.ism; @@ -34,7 +33,7 @@ function findIgpHookInAggregate() { const defaultHook = config.deploy.hooks?.default; if (defaultHook && defaultHook.type === 'aggregate') { const igpHook = defaultHook.hooks.find( - (hook): hook is IgpHookType => hook.type === 'igp' + (hook): hook is IgpHookType => hook.type === 'igp', ); if (!igpHook) { throw new Error('igpHook not found under aggregate hook'); @@ -47,32 +46,37 @@ function findIgpHookInAggregate() { async function handleRegisterIsm(_: object, cmd: Command) { const { ctx, client } = CONTAINER.get(Dependencies); - if (!ctx.deployments.isms || ctx.deployments.isms.type != "hpl_ism_multisig") { + if ( + !ctx.deployments.isms || + ctx.deployments.isms.type != 'hpl_ism_multisig' + ) { throw new Error('Ism multisig context not found'); } - const ismMultisigAddress = ctx.deployments.isms.address + const ismMultisigAddress = ctx.deployments.isms.address; const ismsConfig = getIsmsMultisigConfig(); const multisig = { type: 'hpl_ism_multisig', address: ismMultisigAddress as string, - }; + }; await executeMultiMsg( client, - Object.entries(ismsConfig.validators).map(([domain, { addrs, threshold }]) => ({ - contract: multisig, - msg: { - set_validators: { - domain: Number(domain), - threshold, - validators: addrs.map((v) => - v === '' ? client.signer_addr : v - ), + Object.entries(ismsConfig.validators).map( + ([domain, { addrs, threshold }]) => ({ + contract: multisig, + msg: { + set_validators: { + domain: Number(domain), + threshold, + validators: addrs.map((v) => + v === '' ? client.signer_addr : v, + ), + }, }, - }, - })) + }), + ), ); - } +} async function handleRegisterIgpOracle(_: object, cmd: Command) { const { ctx, client } = CONTAINER.get(Dependencies); @@ -97,7 +101,7 @@ async function handleRegisterIgpOracle(_: object, cmd: Command) { } const igpType: IgpHook | undefined = aggregateHook?.hooks.find( - (hook): hook is IgpHook => hook.type === 'hpl_igp' + (hook): hook is IgpHook => hook.type === 'hpl_igp', ); if (!igpType) { throw new Error('igpType is undefined'); diff --git a/script/commands/upload.ts b/script/commands/upload.ts index fc8ee31d..b4d777f0 100644 --- a/script/commands/upload.ts +++ b/script/commands/upload.ts @@ -8,8 +8,8 @@ * - list available releases from github (check `../common/github.ts` to see how it works) */ import { CodeDetails } from '@cosmjs/cosmwasm-stargate'; -import { AccessConfig, AccessType } from "cosmjs-types/cosmwasm/wasm/v1/types"; import { Command } from 'commander'; +import { AccessConfig, AccessType } from 'cosmjs-types/cosmwasm/wasm/v1/types'; import * as fs from 'fs'; import { @@ -36,7 +36,10 @@ uploadCmd .command('local') .description('upload artifacts from local') .option('-a --artifacts ', 'artifacts', defaultArtifactPath) - .option('--set-instantiate-admin', 'Sets instantiate permissions to be admin address only') + .option( + '--set-instantiate-admin', + 'Sets instantiate permissions to be admin address only', + ) .action(async (_, cmd) => upload(cmd.optsWithGlobals())); uploadCmd @@ -44,7 +47,10 @@ uploadCmd .description('upload artifacts from remote') .argument('', `name of release tag. min: ${REMOTE_MIN_VERSION}`) .option('-o --out ', 'artifact output directory', defaultTmpDir) - .option('--set-instantiate-admin', 'Sets instantiate permissions to be admin address only') + .option( + '--set-instantiate-admin', + 'Sets instantiate permissions to be admin address only', + ) .action(handleRemote); uploadCmd @@ -61,7 +67,11 @@ async function handleRemote( _: object, cmd: Command, ): Promise { - const opts = cmd.optsWithGlobals() as { networkId: string; out: string; setInstantiateAdmin?: boolean }; + const opts = cmd.optsWithGlobals() as { + networkId: string; + out: string; + setInstantiateAdmin?: boolean; + }; if (tagName < REMOTE_MIN_VERSION) throw new Error(`${tagName} < ${REMOTE_MIN_VERSION}`); @@ -80,7 +90,11 @@ async function handleRemote( console.log('Downloaded artifacts to', artifactPath.green); - return upload({ ...opts, artifacts: artifactPath, setInstantiateAdmin: opts.setInstantiateAdmin }); + return upload({ + ...opts, + artifacts: artifactPath, + setInstantiateAdmin: opts.setInstantiateAdmin, + }); } async function handleRemoteList() { @@ -177,9 +191,9 @@ async function upload({ console.log('Proceeding to upload...'); const restrictedInstantiationPermissions: AccessConfig = { - permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES, - address: "", // - addresses: [client.signer] + permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES, + address: '', // + addresses: [client.signer], }; let okCount = 0; diff --git a/script/commands/wallet.ts b/script/commands/wallet.ts index e6ed6617..0f56fb5d 100644 --- a/script/commands/wallet.ts +++ b/script/commands/wallet.ts @@ -77,8 +77,13 @@ walletCmd walletCmd .command('convert-cosmos-to-eth') - .argument('address', 'converts a bech32 cosmos address to a 64 byte length eth address') + .argument( + 'address', + 'converts a bech32 cosmos address to a 64 byte length eth address', + ) .description('zero pads an ETH address to length 64 bytes') - .action((address: string) => console.log(`0x${extractByte32AddrFromBech32(address)}`)); + .action((address: string) => + console.log(`0x${extractByte32AddrFromBech32(address)}`), + ); export { walletCmd }; diff --git a/script/commands/warp.ts b/script/commands/warp.ts index a232b030..c99ab806 100644 --- a/script/commands/warp.ts +++ b/script/commands/warp.ts @@ -22,8 +22,8 @@ warpCmd .addOption( new Option( '--ism ', - 'ISM to set on warp route (in bech32 format)', - ) + 'ISM to set on warp route (in bech32 format)', + ), ) .action(handleCreate); @@ -81,24 +81,9 @@ warpCmd 'target domain id to link', ).makeOptionMandatory(), ) - .addOption( - new Option( - '--amount ', - 'amount to send', - ) - ) - .addOption( - new Option( - '--bridged-denom ', - 'denom to transfer' - ) - ) - .addOption( - new Option( - '--fee-denom ', - 'fee denom' - ) - ) + .addOption(new Option('--amount ', 'amount to send')) + .addOption(new Option('--bridged-denom ', 'denom to transfer')) + .addOption(new Option('--fee-denom ', 'fee denom')) .action(handleTransfer); export { warpCmd }; @@ -143,10 +128,10 @@ async function handleCreate(configFile: string, _: object, cmd: Command) { }; type WarpContract = { - type: string, - address: string, - hexed: string - } + type: string; + address: string; + hexed: string; + }; let newWarp: WarpContract; switch (warpType) { @@ -187,18 +172,14 @@ async function handleCreate(configFile: string, _: object, cmd: Command) { } if (opts.ismAddress) { - console.log(`Setting ISM address to ${opts.ismAddress}`) - const response = await executeContract( - deps.client, - newWarp, - { - connection: { - set_ism: { - ism: opts.ismAddress - } - } - } - ); + console.log(`Setting ISM address to ${opts.ismAddress}`); + const response = await executeContract(deps.client, newWarp, { + connection: { + set_ism: { + ism: opts.ismAddress, + }, + }, + }); console.log(`Code: ${response.code}, Hash: ${response.hash}`); } @@ -306,11 +287,11 @@ async function handleTransfer(_: object, cmd: Command) { [ { amount: opts.amount ? `${opts.amount}` : `${1_000_000n}`, - denom: opts.bridgedDenom || 'uosmo' + denom: opts.bridgedDenom || 'uosmo', }, { amount: `${50n}`, - denom: opts.feeDenom || 'uosmo' + denom: opts.feeDenom || 'uosmo', }, ], ); diff --git a/script/deploy/igp.ts b/script/deploy/igp.ts index a914117d..6cae8256 100644 --- a/script/deploy/igp.ts +++ b/script/deploy/igp.ts @@ -51,10 +51,9 @@ export const deployIgp = async ( }, }, }, - } - ], - ); - }; + }, + ]); + } return { ...igp, oracle: igpOracle }; }; diff --git a/script/deploy/ism.ts b/script/deploy/ism.ts index 3c9bff92..7d5abadb 100644 --- a/script/deploy/ism.ts +++ b/script/deploy/ism.ts @@ -41,25 +41,25 @@ export async function deployIsm( owner: ism.owner === '' ? client.signer : ism.owner, }); - if (ism.validators != undefined) { - await executeMultiMsg( - client, - Object.entries(ism.validators).map( - ([domain, { addrs, threshold }]) => ({ - contract: multisig, - msg: { - set_validators: { - domain: Number(domain), - threshold, - validators: addrs.map((v) => - v === '' ? client.signer_addr : v, - ), + if (ism.validators != undefined) { + await executeMultiMsg( + client, + Object.entries(ism.validators).map( + ([domain, { addrs, threshold }]) => ({ + contract: multisig, + msg: { + set_validators: { + domain: Number(domain), + threshold, + validators: addrs.map((v) => + v === '' ? client.signer_addr : v, + ), + }, }, - }, - }), - ), - ); - }; + }), + ), + ); + } return multisig; } diff --git a/script/index.ts b/script/index.ts index febaffe1..8cadf823 100644 --- a/script/index.ts +++ b/script/index.ts @@ -6,17 +6,17 @@ import { version } from '../package.json'; import { contextCmd, contractCmd, - evmCmd, deployCmd, + evmCmd, migrateCmd, uploadCmd, walletCmd, warpCmd, } from './commands'; +import { updateCmd } from './commands/update'; import { config, getNetwork, getSigningClient } from './shared/config'; import { loadContext } from './shared/context'; import { CONTAINER, Dependencies } from './shared/ioc'; -import { updateCmd } from './commands/update'; colors.enable(); @@ -51,7 +51,7 @@ cli.parseAsync(process.argv).catch(console.error); async function injectDependencies(cmd: Command): Promise { const { networkId } = cmd.optsWithGlobals(); - const client = await getSigningClient(networkId, config); + const client = await getSigningClient(networkId); const ctx = loadContext(networkId); const network = getNetwork(networkId); diff --git a/script/shared/config.ts b/script/shared/config.ts index c283ec63..442ba8da 100644 --- a/script/shared/config.ts +++ b/script/shared/config.ts @@ -5,15 +5,14 @@ import { DirectSecp256k1Wallet, } from '@cosmjs/proto-signing'; import { GasPrice, SigningStargateClient } from '@cosmjs/stargate'; -import { - Comet38Client, - CometClient, - Tendermint34Client, - Tendermint37Client, -} from '@cosmjs/tendermint-rpc'; import { readFileSync } from 'fs'; import yaml from 'js-yaml'; +import { + DEFAULT_CRADLE_GRPC_BASE_URL, + DEFAULT_CRADLE_RPC_BASE_URL, +} from './constants'; + export type IsmType = | { type: 'multisig'; @@ -100,24 +99,36 @@ export type HookType = | RoutingFallbackHookType; export type Config = { - networks: { + networks: ({ id: string; + signer: string; hrp: string; - endpoint: { - rpc: string; - rest: string; - grpc: string; - }; gas: { price: string; denom: string; }; domain: number; - tm_version?: '34' | '37' | '38'; - }[]; + } & ( + | { + is_cradle: undefined | false; + endpoint: { + rpc: string; + rest: string; + grpc: string; + }; + } + | { + is_cradle: true; + cradle_rpc_base_url?: string; + cradle_rest_base_url?: string; + cradle_grpc_base_url?: string; + cradle_session_id: string; + } + ))[]; evm_networks: { name: string; + signer: string; chain_id: number; rpc_endpoint: string; network: string; @@ -130,8 +141,6 @@ export type Config = { multisig_ism_factory_address: `0x${string}`; }[]; - signer: string; - deploy: { ism?: IsmType; hooks?: { @@ -160,18 +169,32 @@ export const getNetwork = (networkId: string): Config['networks'][number] => { export const config = yaml.load(readFileSync(path, 'utf-8')) as Config; -export const getEvmNetwork = (networkName: string): Config['evm_networks'][number] => { +export const getEvmNetwork = ( + networkName: string, +): Config['evm_networks'][number] => { const ret = config.evm_networks.find((v) => v.name === networkName); if (!ret) throw new Error(`EVM Network ${networkName} not found in the config file`); return ret; -} +}; + +export async function getSigningClient(networkId: string): Promise { + const networkConfig = getNetwork(networkId); + + const { signer, hrp, gas } = networkConfig; + + const endpoint = (() => + networkConfig.is_cradle + ? { + rpc: ( + networkConfig.cradle_rpc_base_url || DEFAULT_CRADLE_RPC_BASE_URL + ).replaceAll('{session_id}', networkConfig.cradle_session_id), -export async function getSigningClient( - networkId: string, - { signer }: Config, -): Promise { - const { tm_version, hrp, gas, endpoint } = getNetwork(networkId); + grpc: ( + networkConfig.cradle_grpc_base_url || DEFAULT_CRADLE_GRPC_BASE_URL + ).replaceAll('{session_id}', networkConfig.cradle_session_id), + } + : networkConfig.endpoint)(); const wallet = signer.split(' ').length > 1 @@ -181,27 +204,13 @@ export async function getSigningClient( const [account] = await wallet.getAccounts(); const gasPrice = GasPrice.fromString(`${gas.price}${gas.denom}`); - let clientBase: CometClient; - - switch (tm_version || '38') { - case '34': - clientBase = await Tendermint34Client.connect(endpoint.rpc); - break; - case '37': - clientBase = await Tendermint37Client.connect(endpoint.rpc); - break; - case '38': - clientBase = await Comet38Client.connect(endpoint.rpc); - break; - } - - const wasm = await SigningCosmWasmClient.createWithSigner( - clientBase, + const wasm = await SigningCosmWasmClient.connectWithSigner( + endpoint.rpc, wallet, { gasPrice }, ); - const stargate = await SigningStargateClient.createWithSigner( - clientBase, + const stargate = await SigningStargateClient.connectWithSigner( + endpoint.rpc, wallet, { gasPrice }, ); diff --git a/script/shared/constants.ts b/script/shared/constants.ts index d867ce56..f2bc118c 100644 --- a/script/shared/constants.ts +++ b/script/shared/constants.ts @@ -33,3 +33,10 @@ export const REMOTE_MIN_VERSION = 'v0.0.6-rc8'; export const RELEASE_API_URL = `https://api.github.com/repos/${REMOTE_REPO_NAME}/releases`; export const RELEASE_ARTIFACT_URL = (tag: string) => `https://github.com/${REMOTE_REPO_NAME}/releases/download/${tag}/cw-hyperlane-${tag}.zip`; + +export const DEFAULT_CRADLE_RPC_BASE_URL = + 'https://cradle-manager.ec1-prod.newmetric.xyz/cradle/proxy/{session_id}'; +export const DEFAULT_CRADLE_REST_BASE_URL = + 'https://cradle-manager.ec1-prod.newmetric.xyz/cradle/proxy/{session_id}'; +export const DEFAULT_CRADLE_GRPC_BASE_URL = + '{session_id}.cradle-grpc.ec1-prod.newmetric.xyz:80'; diff --git a/script/shared/wasm.ts b/script/shared/wasm.ts index e6765501..a77aac45 100644 --- a/script/shared/wasm.ts +++ b/script/shared/wasm.ts @@ -2,7 +2,12 @@ import fs from 'fs'; import path from 'path'; import { Config } from './config'; -import { defaultArtifactPath } from './constants'; +import { + DEFAULT_CRADLE_GRPC_BASE_URL, + DEFAULT_CRADLE_REST_BASE_URL, + DEFAULT_CRADLE_RPC_BASE_URL, + defaultArtifactPath, +} from './constants'; import { generateSha256 } from './utils'; function getWasmFilesPath( @@ -65,8 +70,24 @@ export async function getContractInfo( addr: string, ): Promise { try { + // FIXME: refactor this + const endpoint = (() => + network.is_cradle + ? { + rpc: ( + network.cradle_rpc_base_url || DEFAULT_CRADLE_RPC_BASE_URL + ).replaceAll('{session_id}', network.cradle_session_id), + rest: ( + network.cradle_rest_base_url || DEFAULT_CRADLE_REST_BASE_URL + ).replaceAll('{session_id}', network.cradle_session_id), + grpc: ( + network.cradle_grpc_base_url || DEFAULT_CRADLE_GRPC_BASE_URL + ).replaceAll('{session_id}', network.cradle_session_id), + } + : network.endpoint)(); + const res = await fetch( - path.join(network.endpoint.rest, '/cosmwasm/wasm/v1/contract/', addr), + path.join(endpoint.rest, '/cosmwasm/wasm/v1/contract/', addr), ); const body = await res.json(); diff --git a/tests/neutron-migration/0-init.ts b/tests/neutron-migration/0-init.ts new file mode 100644 index 00000000..700b089c --- /dev/null +++ b/tests/neutron-migration/0-init.ts @@ -0,0 +1,40 @@ +import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { MsgSendEncodeObject, StargateClient } from '@cosmjs/stargate'; + +import { + MULTISIG_MEMBERS, + NEUTRON_WHALE, + RUNNER, + TIA_WHALE, + denom, + endpoint, +} from './deps'; +import { sendTx } from './shared'; + +async function main() { + const initialAccounts = [RUNNER, TIA_WHALE, ...MULTISIG_MEMBERS]; + + const client = { + wasm: await CosmWasmClient.connect(endpoint.rpc), + stargate: await StargateClient.connect(endpoint.rpc), + }; + + // initial funding + + const initFundingResp = await sendTx({ address: NEUTRON_WHALE, client }, [ + ...initialAccounts.map( + (toAddress) => + ({ + typeUrl: '/cosmos.bank.v1beta1.MsgSend', + value: { + fromAddress: NEUTRON_WHALE, + toAddress, + amount: [{ denom, amount: `${100_000_000}` }], + }, + }) as MsgSendEncodeObject, + ), + ]); + console.log('initial funding', initFundingResp.transactionHash); +} + +main().catch(console.error); diff --git a/tests/neutron-migration/1-save-query.ts b/tests/neutron-migration/1-save-query.ts new file mode 100644 index 00000000..931bbf5f --- /dev/null +++ b/tests/neutron-migration/1-save-query.ts @@ -0,0 +1,28 @@ +import { CosmWasmClient, setupWasmExtension } from '@cosmjs/cosmwasm-stargate'; +import { QueryClient, StargateClient } from '@cosmjs/stargate'; +import { connectComet } from '@cosmjs/tendermint-rpc'; +import { writeFileSync } from 'fs'; + +import { endpoint } from './deps'; +import { makeSnapshot, resultPath } from './shared'; + +async function main() { + const client = { + wasm: await CosmWasmClient.connect(endpoint.rpc), + stargate: await StargateClient.connect(endpoint.rpc), + stateClient: QueryClient.withExtensions( + await connectComet(endpoint.rpc), + setupWasmExtension, + ), + }; + + const snapshot = await makeSnapshot(client); + + writeFileSync( + resultPath('snapshot-prev.json'), + JSON.stringify(snapshot, null, 2), + ); + console.log(`Snapshot saved to ${resultPath('snapshot-prev.json')}`); +} + +main().catch(console.error); diff --git a/tests/neutron-migration/2-migrate.ts b/tests/neutron-migration/2-migrate.ts new file mode 100644 index 00000000..a1d64f61 --- /dev/null +++ b/tests/neutron-migration/2-migrate.ts @@ -0,0 +1,90 @@ +import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { StargateClient } from '@cosmjs/stargate'; +import { existsSync, readFileSync, readdirSync, writeFileSync } from 'fs'; + +import { + MULTISIG, + MULTISIG_MEMBERS, + MULTISIG_PRE_PROP, + MULTISIG_PROP_MODULE, + RUNNER, + endpoint, +} from './deps'; +import { migrationTargets } from './migration'; +import { Multisig } from './multisig'; +import { makeMember, resultPath, uploadContract } from './shared'; + +function loadArtifacts(): string[] { + return readdirSync(`${process.cwd()}/artifacts`).filter((v) => + v.endsWith('.wasm'), + ); +} + +async function main() { + const client = { + wasm: await CosmWasmClient.connect(endpoint.rpc), + stargate: await StargateClient.connect(endpoint.rpc), + }; + + const runner = await makeMember(client, RUNNER); + + const multisig = await Multisig.create({ + address: { + hub: MULTISIG, + prop: MULTISIG_PROP_MODULE, + preProp: MULTISIG_PRE_PROP, + }, + members: MULTISIG_MEMBERS, + client, + }); + + // upload new contract codes + + let codes: { name: string; codeId: number }[] = []; + + if (existsSync(resultPath('uploaded.json'))) { + codes = JSON.parse(readFileSync(resultPath('uploaded.json'), 'utf-8')); + console.log( + `loaded uploaded contracts from ${resultPath('uploaded.json')}`, + ); + } else { + for (const artifact of loadArtifacts()) { + const resp = await uploadContract( + runner, + `${process.cwd()}/artifacts/${artifact}`, + ); + + const codeId = Number( + resp.events + .filter((v) => v.type === 'store_code')[0] + .attributes.find((v) => v.key === 'code_id')!.value, + ); + + console.log(`code uploaded. ${resp.hash} ${codeId} ${artifact}`); + codes.push({ name: artifact.replace('.wasm', ''), codeId }); + } + + writeFileSync(resultPath('uploaded.json'), JSON.stringify(codes, null, 2)); + console.log( + `uploaded all contracts => exported to ${resultPath('uploaded.json')}`, + ); + } + + // run migration + + await multisig.run( + migrationTargets.flatMap((info) => + info.address.map((addr) => ({ + wasm: { + migrate: { + contract_addr: addr, + new_code_id: codes.find((c) => c.name === info.name)?.codeId, + msg: Buffer.from(JSON.stringify({})).toString('base64'), + }, + }, + })), + ), + ); +} + +main().catch(console.error); diff --git a/tests/neutron-migration/3-compare-query.ts b/tests/neutron-migration/3-compare-query.ts new file mode 100644 index 00000000..3e3d167b --- /dev/null +++ b/tests/neutron-migration/3-compare-query.ts @@ -0,0 +1,124 @@ +import { CosmWasmClient, setupWasmExtension } from '@cosmjs/cosmwasm-stargate'; +import { QueryClient, StargateClient } from '@cosmjs/stargate'; +import { connectComet } from '@cosmjs/tendermint-rpc'; +import { readFileSync, writeFileSync } from 'fs'; +import _ from 'lodash'; + +import { endpoint } from './deps'; +import { Snapshot, makeSnapshot, resultPath } from './shared'; + +function loadPrevSnapshot(): Snapshot { + return JSON.parse(readFileSync(resultPath('snapshot-prev.json'), 'utf-8')); +} + +function loadNewSnapshot(): Snapshot { + return JSON.parse(readFileSync(resultPath('snapshot-new.json'), 'utf-8')); +} + +async function main() { + const client = { + wasm: await CosmWasmClient.connect(endpoint.rpc), + stargate: await StargateClient.connect(endpoint.rpc), + stateClient: QueryClient.withExtensions( + await connectComet(endpoint.rpc), + setupWasmExtension, + ), + }; + + writeFileSync( + resultPath('snapshot-new.json'), + JSON.stringify(await makeSnapshot(client), null, 2), + ); + console.log(`Snapshot saved to ${resultPath('snapshot-new.json')}`); + + const prevSnapshot = loadPrevSnapshot(); + const newSnapshot = loadNewSnapshot(); + + console.log('Comparing snapshots...'); + + const compareResults = []; + const compareState = []; + + for (const { contract, address, results, state } of newSnapshot) { + const compareTarget = prevSnapshot.find( + (v) => v.contract === contract && v.address === address, + ); + if (!compareTarget) + throw Error(`No previous snapshot found for ${contract} at ${address}`); + + for (const result of results) { + const prevResult = compareTarget.results.find((v) => v.id === result.id); + if (!prevResult) + throw Error(`No previous prevResult found for ${result.id}`); + + compareResults.push({ + id: result.id, + contract, + address, + query: JSON.stringify(result.query), + diff: !_.isEqual(result, prevResult) + ? { + prev: prevResult, + new: result, + } + : undefined, + }); + } + + for (const state_kv of state) { + const prevStateKv = compareTarget.state.find( + (kv) => kv.key === state_kv.key, + ); + if (!prevStateKv) + throw Error(`No previous prevStateKv found for ${state_kv.key}`); + + compareState.push({ + key: prevStateKv.key, + contract, + address, + state_diff: !_.isEqual(state_kv, prevStateKv) + ? { + prev: prevStateKv, + new: state_kv, + } + : undefined, + }); + } + } + + writeFileSync( + resultPath('compare-results.json'), + JSON.stringify(compareResults, null, 2), + ); + console.log(`Compare results saved to ${resultPath('compare-results.json')}`); + + writeFileSync( + resultPath('compare-results.diff.json'), + JSON.stringify( + compareResults.filter((v) => v.diff !== undefined), + null, + 2, + ), + ); + console.log( + `Diff results saved to ${resultPath('compare-results.diff.json')}`, + ); + + writeFileSync( + resultPath('compare-state.json'), + JSON.stringify(compareState, null, 2), + ); + console.log(`Compare state saved to ${resultPath('compare-state.json')}`); + + writeFileSync( + resultPath('compare-state.diff.json'), + JSON.stringify( + compareState.filter((v) => v.state_diff !== undefined), + null, + 2, + ), + ); + console.log(`Diff state saved to ${resultPath('compare-state.diff.json')}`); +} + +main().catch(console.error); diff --git a/tests/neutron-migration/4-test.ts b/tests/neutron-migration/4-test.ts new file mode 100644 index 00000000..e8b4bca8 --- /dev/null +++ b/tests/neutron-migration/4-test.ts @@ -0,0 +1,54 @@ +import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { StargateClient } from '@cosmjs/stargate'; + +import { TIA_WHALE, endpoint } from './deps'; +import { executeContract } from './shared'; + +async function main() { + const client = { + wasm: await CosmWasmClient.connect(endpoint.rpc), + stargate: await StargateClient.connect(endpoint.rpc), + }; + + const resp = await executeContract( + { address: TIA_WHALE, client }, + 'neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq', + { + transfer_remote: { + amount: `${1_000_000}`, + dest_domain: 42161, // arbitrum + recipient: + '0000000000000000000000004264c2ebd0af02798259ffeb2691d19190dd1bcb', + }, + }, + [ + { + denom: + 'ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7', + amount: `${1_270_000}`, + }, + ], + ); + if (resp.code !== 0) throw new Error(`Tx failed: ${resp.rawLog}`); + + const queue = [ + 'wasm-hpl_warp_native::transfer-remote', + 'wasm-mailbox_dispatch_id', + 'wasm-mailbox_dispatch', + 'wasm-igp-core-pay-for-gas', + 'wasm-igp-core-post-dispatch', + 'wasm-hpl_hook_merkle::post_dispatch', + 'wasm-hpl_hook_merkle::inserted_into_tree', + ]; + resp.events.forEach((evt) => queue[0] === evt.type && queue.shift()); + + if (queue.length > 0) { + console.log('Expected events not flushed'); + console.log(`=> left: ${queue}`); + throw Error('Transfer failed'); + } + + console.log('Transfer completed'); +} + +main().catch(console.error); diff --git a/tests/neutron-migration/README.md b/tests/neutron-migration/README.md new file mode 100644 index 00000000..2366f5eb --- /dev/null +++ b/tests/neutron-migration/README.md @@ -0,0 +1,57 @@ +# Neutron Contract Migration Tests + +This directory contains tests for the Neutron contract migration. + +> Migration target contracts must be after [this commit](https://github.com/many-things/cw-hyperlane/commit/00f64a9e8df5b384c2648d3f0f38baa549f204b3) which enables semver based migration and applies to the migration logic. + Some of the contracts does not have the migration logic yet on the v0.0.6 release. + +## Before running tests + +1. Need to create Cradle account to make forknet of the Neutron Mainnet. () +2. Need to build this project and make sure the whole contracts are stored in the 'artifacts' directory by running `make optimize` in the root directory. + - Or you can download the artifacts from the [release page](https://github.com/many-things/cw-hyperlane/releases/tag/v0.0.6) + +## Running tests + +1. Add the Neutron forknet info to `config.yaml` file. + + ```yaml + - id: neutron-1-fork + hrp: neutron + is_cradle: true + cradle_session_id: { { cradle_session_id } } # replace me + gas: + price: 0.025 + denom: untrn + domain: 1853125230 + ``` + +2. Remove the pre-existing results of the migration test in the `results` directory. + +3. Run the scripts one by one. + + ```bash + yarn tsx ./tests/neutron-migration/0-init.ts + + yarn tsx ./tests/neutron-migration/1-save-query.ts + + yarn tsx ./tests/neutron-migration/2-migrate.ts + + yarn tsx ./tests/neutron-migration/3-compare-query.ts + + yarn tsx ./tests/neutron-migration/4-test.ts + ``` + + 1. Step 1. Initialize the test environment. + - This script will sends tokens that are required for the migration test to the test account. + 2. Step 2. Query as much as possible and save the results. + + 3. Step 3. Migrate the Neutron contracts. + + - This script mimics the Neutron multisig contract account. + + 4. Step 4. Compare the query results before and after the migration. + +## After Running tests + +- Check the results in the `results` directory. Specifically, check the `compare-results.diff.json` file to see if there are any differences between the query results before and after the migration. + - It should be contains only the diff about the `hpl_merkle_hook` contract which is the `ownable` logic removed. diff --git a/tests/neutron-migration/deps.ts b/tests/neutron-migration/deps.ts new file mode 100644 index 00000000..61569d48 --- /dev/null +++ b/tests/neutron-migration/deps.ts @@ -0,0 +1,50 @@ +import { wasmTypes } from '@cosmjs/cosmwasm-stargate'; +import { Registry } from '@cosmjs/proto-signing'; +import { bankTypes } from '@cosmjs/stargate/build/modules'; + +import { getNetwork } from '../../script/shared/config'; +import { + DEFAULT_CRADLE_GRPC_BASE_URL, + DEFAULT_CRADLE_RPC_BASE_URL, +} from '../../script/shared/constants'; +import { loadContext } from '../../script/shared/context'; + +export const RUNNER = 'neutron1rdrfmxtu7jes96r9ta2ykf922ejwd9cw0wazhw'; + +export const MULTISIG = + 'neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7'; +export const MULTISIG_PRE_PROP = + 'neutron16vvgmn9734g806a48uw9qawjk6sy709jlp7xlxtpelpvffjxl2lqykqklw'; +export const MULTISIG_PROP_MODULE = + 'neutron1r5zzzm4wmwqk897rff6ppv4d7snfmyzjnzmzydlfdff5xl9qczzqy9cdrt'; +export const MULTISIG_MEMBERS = [ + 'neutron1plh8l930u0x298cndmjfhxr20wg8xrxj0x70qr', + 'neutron1tkavhfqt8358vl74z7r5kdkdy05s98yka0gl0t', + 'neutron1rdrfmxtu7jes96r9ta2ykf922ejwd9cw0wazhw', + 'neutron16q4u9swh27fs0y7w733qnaxk9qr7zrkgdf696n', +]; + +export const TIA_WHALE = 'neutron1r2xujqn6ud8g29pppz02e0jpk500rctxxfa622'; +export const NEUTRON_WHALE = 'neutron1p3ucd3ptpw902fluyjzhq3ffgq4ntddau6elth'; + +export const networkId = 'neutron-1-fork'; +export const denom = 'untrn'; +export const hrp = 'neutron'; + +export const ctx = loadContext(networkId); +export const reg = new Registry([...bankTypes, ...wasmTypes]); + +export const networkConfig = getNetwork(networkId); + +export const endpoint = (() => + networkConfig.is_cradle + ? { + rpc: ( + networkConfig.cradle_rpc_base_url || DEFAULT_CRADLE_RPC_BASE_URL + ).replaceAll('{session_id}', networkConfig.cradle_session_id), + + grpc: ( + networkConfig.cradle_grpc_base_url || DEFAULT_CRADLE_GRPC_BASE_URL + ).replaceAll('{session_id}', networkConfig.cradle_session_id), + } + : networkConfig.endpoint)(); diff --git a/tests/neutron-migration/migration.ts b/tests/neutron-migration/migration.ts new file mode 100644 index 00000000..ac390b78 --- /dev/null +++ b/tests/neutron-migration/migration.ts @@ -0,0 +1,46 @@ +export const migrationTargets = [ + { + name: 'hpl_mailbox', + address: [ + 'neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4', + ], + }, + { + name: 'hpl_validator_announce', + address: [ + 'neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8', + ], + }, + { + name: 'hpl_ism_multisig', + address: [ + 'neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg', + 'neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc', + ], + }, + { + name: 'hpl_hook_merkle', + address: [ + 'neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk', + ], + }, + { + name: 'hpl_igp', + address: [ + 'neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e', + ], + }, + { + name: 'hpl_igp_oracle', + address: [ + 'neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus', + ], + }, + { + name: 'hpl_warp_native', + address: [ + 'neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq', + 'neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa', + ], + }, +]; diff --git a/tests/neutron-migration/multisig.ts b/tests/neutron-migration/multisig.ts new file mode 100644 index 00000000..4eff8515 --- /dev/null +++ b/tests/neutron-migration/multisig.ts @@ -0,0 +1,99 @@ +import { encodePubkey } from '@cosmjs/proto-signing'; + +import { MULTISIG_MEMBERS } from './deps'; +import { executeContract } from './shared'; +import { ClientSet, Member } from './types'; + +export type MultisigAddress = { + hub: string; + prop: string; + preProp: string; +}; + +type CreateMultisigOptions = { + address: MultisigAddress; + members: string[]; + client: ClientSet; +}; + +export class Multisig { + private constructor( + public readonly address: MultisigAddress, + public readonly members: Member[], + ) {} + + async run(msgs: object) { + const [runner] = this.members; + + const { proposalId, resp: proposeResp } = await this.propose(runner, msgs); + console.log(`Proposal ID: ${proposalId}. txHash: ${proposeResp.hash}`); + + await Promise.all(this.members.map((v) => this.vote(v, proposalId, 'yes'))); + console.log('Executing proposal...'); + + const execResp = await this.exec(runner, proposalId); + console.log(`Proposal executed! txHash: ${execResp.hash}`); + } + + async exec(member: Member, proposalId: number) { + return executeContract(member, this.address.prop, { + execute: { + proposal_id: proposalId, + }, + }); + } + + async vote(member: Member, proposalId: number, vote: 'yes' | 'no') { + return executeContract(member, this.address.prop, { + vote: { + proposal_id: proposalId, + vote, + }, + }); + } + + async propose(member: Member, msgs: object) { + const proposalId = await member.client.wasm.queryContractSmart( + this.address.prop, + { + proposal_count: {}, + }, + ); + const nextProposalId = Number(proposalId) + 1; + + const resp = await executeContract(member, this.address.preProp, { + propose: { + msg: { + propose: { + title: 'title', + description: 'description', + msgs, + }, + }, + }, + }); + + return { proposalId: nextProposalId, resp }; + } + + static async create(opts: CreateMultisigOptions): Promise { + const members = await Promise.all( + MULTISIG_MEMBERS.map(async (v) => { + const account = await opts.client.stargate.getAccount(v); + if (!account) throw new Error(`Account ${v} not found`); + if (!account.pubkey) throw new Error(`Account ${v} has no pubkey`); + + return { + address: v, + pubkey: encodePubkey({ + type: 'tendermint/PubKeySecp256k1', + value: account.pubkey.value, + }), + client: opts.client, + }; + }), + ); + + return new Multisig(opts.address, members); + } +} diff --git a/tests/neutron-migration/queries/connection.ts b/tests/neutron-migration/queries/connection.ts new file mode 100644 index 00000000..93a1606f --- /dev/null +++ b/tests/neutron-migration/queries/connection.ts @@ -0,0 +1,6 @@ +import { wrapMany } from '.'; + +export const ConnectionQueryMsgs = wrapMany( + [{ get_mailbox: {} }, { get_hook: {} }, { get_ism: {} }], + 'connection', +); diff --git a/tests/neutron-migration/queries/hook.ts b/tests/neutron-migration/queries/hook.ts new file mode 100644 index 00000000..b426d6ce --- /dev/null +++ b/tests/neutron-migration/queries/hook.ts @@ -0,0 +1,21 @@ +import { wrapMany } from '.'; + +export const HookQueryMsgs = ({ + quote_dispatch, +}: { + quote_dispatch: { metadata: string; message: string }[]; +}) => + wrapMany( + [ + ...quote_dispatch.map((v) => ({ + quote_dispatch: { + metadata: v.metadata, + message: v.message, + }, + })), + { + mailbox: {}, + }, + ], + 'hook', + ); diff --git a/tests/neutron-migration/queries/hpl_hook_merkle.ts b/tests/neutron-migration/queries/hpl_hook_merkle.ts new file mode 100644 index 00000000..32fa2cba --- /dev/null +++ b/tests/neutron-migration/queries/hpl_hook_merkle.ts @@ -0,0 +1,28 @@ +import { toNamedQueries, wrapMany } from '.'; +import { HookQueryMsgs } from './hook'; +import { OwnableQueryMsgs } from './ownable'; + +export const QUERIES = toNamedQueries('hpl_hook_merkle', [ + ...OwnableQueryMsgs, + ...HookQueryMsgs({ quote_dispatch: [] }), // TODO + ...wrapMany( + [ + { + count: {}, + }, + { + root: {}, + }, + { + branch: {}, + }, + { + tree: {}, + }, + { + check_point: {}, + }, + ], + 'merkle_hook', + ), +]); diff --git a/tests/neutron-migration/queries/hpl_igp.ts b/tests/neutron-migration/queries/hpl_igp.ts new file mode 100644 index 00000000..56495c99 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_igp.ts @@ -0,0 +1,41 @@ +import { toNamedQueries, wrapMany } from '.'; +import { HookQueryMsgs } from './hook'; +import { OwnableQueryMsgs } from './ownable'; +import { RouterQueryMsgs } from './router'; + +export const QUERIES = toNamedQueries('hpl_igp', [ + ...OwnableQueryMsgs, + ...HookQueryMsgs({ quote_dispatch: [] }), // TODO + ...RouterQueryMsgs({ get_route: { domains: [] } }), + ...wrapMany( + [169, 42161].map((domain) => ({ + get_exchange_rate_and_gas_price: { + dest_domain: domain, + }, + })), + 'oracle', + ), + ...wrapMany( + [ + { + default_gas: {}, + }, + { + gas_for_domain: { + domains: [], + }, + }, + { + list_gas_for_domains: {}, + }, + { beneficiary: {} }, + ...[169, 42161].map((domain) => ({ + quote_gas_payment: { + dest_domain: domain, + gas_amount: `${300_000}`, + }, + })), + ], + 'igp', + ), +]); diff --git a/tests/neutron-migration/queries/hpl_igp_oracle.ts b/tests/neutron-migration/queries/hpl_igp_oracle.ts new file mode 100644 index 00000000..1d34bb44 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_igp_oracle.ts @@ -0,0 +1,14 @@ +import { toNamedQueries, wrapMany } from '.'; +import { OwnableQueryMsgs } from './ownable'; + +export const QUERIES = toNamedQueries('hpl_igp_oracle', [ + ...OwnableQueryMsgs, + ...wrapMany( + [169, 42161].map((domain) => ({ + get_exchange_rate_and_gas_price: { + dest_domain: domain, + }, + })), + 'oracle', + ), +]); diff --git a/tests/neutron-migration/queries/hpl_ism_multisig.ts b/tests/neutron-migration/queries/hpl_ism_multisig.ts new file mode 100644 index 00000000..630da228 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_ism_multisig.ts @@ -0,0 +1,16 @@ +import { toNamedQueries, wrapMany } from '.'; +import { IsmQueryMsgs } from './ism'; +import { OwnableQueryMsgs } from './ownable'; + +export const QUERIES = toNamedQueries('hpl_ism_multisig', [ + ...OwnableQueryMsgs, + ...IsmQueryMsgs, + ...wrapMany( + [169, 42161].map((domain) => ({ + enrolled_validators: { + domain, + }, + })), + 'multisig_ism', + ), +]); diff --git a/tests/neutron-migration/queries/hpl_mailbox.ts b/tests/neutron-migration/queries/hpl_mailbox.ts new file mode 100644 index 00000000..add74178 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_mailbox.ts @@ -0,0 +1,57 @@ +import { toNamedQueries, wrapMany } from '.'; +import { OwnableQueryMsgs } from './ownable'; + +export const QUERIES = toNamedQueries('hpl_mailbox', [ + ...OwnableQueryMsgs, + // ...wrapMany( + // [ + // { + // quote_dispatch: { + // dest_domain: 169, + // recipient_addr: + // '0000000000000000000000005060eCD5dFAD300A90592C04e504600A7cdcF70b', + // msg_body: Buffer.from('hello').toString('hex'), + // }, + // }, + // ], + // 'hook', + // ), + ...wrapMany( + [ + { + hrp: {}, + }, + { + local_domain: {}, + }, + { + message_delivered: { + id: '', + }, + }, + { + default_ism: {}, + }, + { + default_hook: {}, + }, + { + required_hook: {}, + }, + { + nonce: {}, + }, + { + recipient_ism: { + recipient_addr: + // test mock receiver + 'neutron1v0t8nztzhdsan2cv23x66xjrak9844zz9hq7gkz0w4j6xl4lmpzq89kt5g', + }, + }, + { + latest_dispatch_id: {}, + }, + ], + 'mailbox', + ), +]); diff --git a/tests/neutron-migration/queries/hpl_va.ts b/tests/neutron-migration/queries/hpl_va.ts new file mode 100644 index 00000000..0beb82b4 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_va.ts @@ -0,0 +1,28 @@ +import { toNamedQueries } from '.'; + +export const QUERIES = toNamedQueries('hpl_validator_announce', [ + { + query: { + get_announce_storage_locations: { + validators: [ + '26fa235bc3f9e1b00ac3a0db4d84abb6f34244da', + '42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', + '42fa752defe92459370a052b6387a87f7de9b80c', + '47aa126e05933b95c5eb90b26e6b668d84f4b25a', + '54b2cca5091b098a1a993dec03c4d1ee9af65999', + '60e890b34cb44ce3fa52f38684f613f31b47a1a6', + '7885fae56dbcf5176657f54adbbd881dc6714132', + 'a9b8c1f4998f781f958c63cfcd1708d02f004ff0', + 'b65438a014fb05fbadcfe35bc6e25d372b6ba460', + 'c79503a3e3011535a9c60f6d21f76f59823a38bd', + 'e000fa4e466831db288290dd97e66560fb3d7d28', + ], + }, + }, + }, + { + query: { + get_announced_validators: {}, + }, + }, +]); diff --git a/tests/neutron-migration/queries/hpl_warp_native.ts b/tests/neutron-migration/queries/hpl_warp_native.ts new file mode 100644 index 00000000..b22d82d1 --- /dev/null +++ b/tests/neutron-migration/queries/hpl_warp_native.ts @@ -0,0 +1,29 @@ +import { toNamedQueries, wrapMany } from '.'; +import { ConnectionQueryMsgs } from './connection'; +import { OwnableQueryMsgs } from './ownable'; +import { RouterQueryMsgs } from './router'; + +export const QUERIES = toNamedQueries('hpl_warp_native', [ + ...OwnableQueryMsgs, + ...RouterQueryMsgs({ get_route: { domains: [] } }), + ...ConnectionQueryMsgs, + ...wrapMany( + [ + { + token_type: {}, + }, + { + token_mode: {}, + }, + ], + 'token_default', + ), + ...wrapMany( + [ + { + interchain_security_module: [], + }, + ], + 'ism_specifier', + ), +]); diff --git a/tests/neutron-migration/queries/index.ts b/tests/neutron-migration/queries/index.ts new file mode 100644 index 00000000..fd416c30 --- /dev/null +++ b/tests/neutron-migration/queries/index.ts @@ -0,0 +1,29 @@ +import { QUERIES as HplHookMerkleQuery } from './hpl_hook_merkle'; +import { QUERIES as HplIgpQuery } from './hpl_igp'; +import { QUERIES as HplIgpOracleQuery } from './hpl_igp_oracle'; +import { QUERIES as HplIsmMultisigQuery } from './hpl_ism_multisig'; +import { QUERIES as HplMailboxQuery } from './hpl_mailbox'; +import { QUERIES as HplValidatorAnnounceQuery } from './hpl_va'; +import { QUERIES as HplWrapNativeQuery } from './hpl_warp_native'; + +export function toNamedQueries(contract: string, queries: { query: object }[]) { + return { contract, queries: queries.map((v) => v.query) }; +} + +export function wrap(query: object, name: string) { + return { query: { [name]: query } }; +} + +export function wrapMany(queries: object[], name: string) { + return queries.map((q) => wrap(q, name)); +} + +export const QUERIES = [ + HplHookMerkleQuery, + HplIgpQuery, + HplIgpOracleQuery, + HplIsmMultisigQuery, + HplMailboxQuery, + HplValidatorAnnounceQuery, + HplWrapNativeQuery, +]; diff --git a/tests/neutron-migration/queries/ism.ts b/tests/neutron-migration/queries/ism.ts new file mode 100644 index 00000000..c9d43135 --- /dev/null +++ b/tests/neutron-migration/queries/ism.ts @@ -0,0 +1,23 @@ +import { wrapMany } from '.'; + +export const IsmQueryMsgs = wrapMany( + [ + { + module_type: {}, + }, + + // { + // verify: { + // metadata: '', + // message: '', + // }, + // }, + + // { + // verify_info: { + // message: '', + // }, + // }, + ], + 'ism', +); diff --git a/tests/neutron-migration/queries/ownable.ts b/tests/neutron-migration/queries/ownable.ts new file mode 100644 index 00000000..8cd95277 --- /dev/null +++ b/tests/neutron-migration/queries/ownable.ts @@ -0,0 +1,14 @@ +import { wrapMany } from '.'; + +export const OwnableQueryMsgs = wrapMany( + [ + { + get_owner: {}, + }, + + { + get_pending_owner: {}, + }, + ], + 'ownable', +); diff --git a/tests/neutron-migration/queries/router.ts b/tests/neutron-migration/queries/router.ts new file mode 100644 index 00000000..5ce7b32b --- /dev/null +++ b/tests/neutron-migration/queries/router.ts @@ -0,0 +1,19 @@ +import { wrapMany } from '.'; + +export const RouterQueryMsgs = ({ + get_route, +}: { + get_route: { + domains: number[]; + }; +}) => + wrapMany( + [ + { + domains: {}, + }, + ...get_route.domains.map((v) => ({ get_route: { domain: v } })), + { list_routes: {} }, + ], + 'router', + ); diff --git a/tests/neutron-migration/results/compare-results.diff.json b/tests/neutron-migration/results/compare-results.diff.json new file mode 100644 index 00000000..d2c89129 --- /dev/null +++ b/tests/neutron-migration/results/compare-results.diff.json @@ -0,0 +1,58 @@ +[ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"ownable\":{\"get_owner\":{}}}", + "diff": { + "prev": { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + "new": { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "error": {} + } + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}", + "diff": { + "prev": { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + "new": { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "error": {} + } + } + } +] \ No newline at end of file diff --git a/tests/neutron-migration/results/compare-results.json b/tests/neutron-migration/results/compare-results.json new file mode 100644 index 00000000..9bba259f --- /dev/null +++ b/tests/neutron-migration/results/compare-results.json @@ -0,0 +1,454 @@ +[ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "36fc5daf3000e5e1e2d8723262306578fed7bae166e1b2eb52335bc3c6c77e59", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"hrp\":{}}}" + }, + { + "id": "fbc92948a20cbd7837e65705eeb33d5e45537c8d742c7323c514de50e2dc4f83", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"local_domain\":{}}}" + }, + { + "id": "14e8f25b379e3f1c33fe293523ab032efe325ef28bfe56aabf5addd53bc6da54", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"message_delivered\":{\"id\":\"\"}}}" + }, + { + "id": "dfe3cc2db258b3604bf9bbe7b2f4c28f7141e5b3ded79d1d9eec8af29da60418", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"default_ism\":{}}}" + }, + { + "id": "13063792b0f32b73d6fce54effd180ded2cc41c547f2a666e9a783a92a3b7287", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"default_hook\":{}}}" + }, + { + "id": "99d94778f572f135cbc470e9995e7e04a8eaed0b757c4bc08cdedc6a05d111aa", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"required_hook\":{}}}" + }, + { + "id": "360f386c4d59cd711ea584dc5a091a283f6297c89b38f8cd66e1e556fc7f302a", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"nonce\":{}}}" + }, + { + "id": "e76ea74b792ee57b345d450c6d8397d9e14bbc1f7b1fbbcba034419f6a1ce7c6", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"recipient_ism\":{\"recipient_addr\":\"neutron1v0t8nztzhdsan2cv23x66xjrak9844zz9hq7gkz0w4j6xl4lmpzq89kt5g\"}}}" + }, + { + "id": "3edddeb1c7ca55d50badf4fdda08c4a756f4a7e66b4ebfa602e4a7fda39d911b", + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "query": "{\"mailbox\":{\"latest_dispatch_id\":{}}}" + }, + { + "id": "ac9c408207c750546823983c3aff74ec8aee15a10c4bf69df0a04f5bb4f665f6", + "contract": "hpl_validator_announce", + "address": "neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8", + "query": "{\"get_announce_storage_locations\":{\"validators\":[\"26fa235bc3f9e1b00ac3a0db4d84abb6f34244da\",\"42b6de2edbaa62c2ea2309ad85d20b3e37d38acf\",\"42fa752defe92459370a052b6387a87f7de9b80c\",\"47aa126e05933b95c5eb90b26e6b668d84f4b25a\",\"54b2cca5091b098a1a993dec03c4d1ee9af65999\",\"60e890b34cb44ce3fa52f38684f613f31b47a1a6\",\"7885fae56dbcf5176657f54adbbd881dc6714132\",\"a9b8c1f4998f781f958c63cfcd1708d02f004ff0\",\"b65438a014fb05fbadcfe35bc6e25d372b6ba460\",\"c79503a3e3011535a9c60f6d21f76f59823a38bd\",\"e000fa4e466831db288290dd97e66560fb3d7d28\"]}}" + }, + { + "id": "4d558270d60bbdb4c2421812e47d08deab4ab9347e02d9468b0b43e0dea6745e", + "contract": "hpl_validator_announce", + "address": "neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8", + "query": "{\"get_announced_validators\":{}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "query": "{\"ism\":{\"module_type\":{}}}" + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "query": "{\"multisig_ism\":{\"enrolled_validators\":{\"domain\":169}}}" + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "query": "{\"multisig_ism\":{\"enrolled_validators\":{\"domain\":42161}}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "query": "{\"ism\":{\"module_type\":{}}}" + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "query": "{\"multisig_ism\":{\"enrolled_validators\":{\"domain\":169}}}" + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "query": "{\"multisig_ism\":{\"enrolled_validators\":{\"domain\":42161}}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"ownable\":{\"get_owner\":{}}}", + "diff": { + "prev": { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + "new": { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "error": {} + } + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}", + "diff": { + "prev": { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + "new": { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "error": {} + } + } + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"hook\":{\"mailbox\":{}}}" + }, + { + "id": "5d985521e2e5ec887015db42c3cf3dfd7427f53d200dc51313c3a8e7263653a9", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"merkle_hook\":{\"count\":{}}}" + }, + { + "id": "6c6a245a5dfe4f4678a4877f714f0994096e3758c4dc4efb11d77eb9fb88aac1", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"merkle_hook\":{\"root\":{}}}" + }, + { + "id": "9f4518b8667a69e28048d921a6bc236cef1afaa1cfed19db6f4c1eb2bc411305", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"merkle_hook\":{\"branch\":{}}}" + }, + { + "id": "1212f36f084aeebd7bee6db10ca634c6e6456630546bf14af471e6b3b2f7ccd7", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"merkle_hook\":{\"tree\":{}}}" + }, + { + "id": "a40494962312b962b3d80a3f25744e5341507df514e28da089f0041d525bb902", + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "query": "{\"merkle_hook\":{\"check_point\":{}}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"hook\":{\"mailbox\":{}}}" + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"router\":{\"domains\":{}}}" + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"router\":{\"list_routes\":{}}}" + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"oracle\":{\"get_exchange_rate_and_gas_price\":{\"dest_domain\":169}}}" + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"oracle\":{\"get_exchange_rate_and_gas_price\":{\"dest_domain\":42161}}}" + }, + { + "id": "b5afef84c49f3d03b711533a5da5fda71f429303ee64f0c7f677062b32563ddb", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"default_gas\":{}}}" + }, + { + "id": "33406de699e77578553c89170c5e23e5368df0c5b266811ec3e623f622946cdb", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"gas_for_domain\":{\"domains\":[]}}}" + }, + { + "id": "c759691d3aecb35ff66bb1b47d1ad0bb54ecda231ee4ac3d2a1a4c62a2745dcb", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"list_gas_for_domains\":{}}}" + }, + { + "id": "5def1d58cf3055cd1620d7359a5148ca7c69b8f2feb631c7b7eef45b3daa5e80", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"beneficiary\":{}}}" + }, + { + "id": "e70871c0d57b7832c436c00c38a9a0ccb7d65dd71a2aae8bb5746c31ac3ad933", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"quote_gas_payment\":{\"dest_domain\":169,\"gas_amount\":\"300000\"}}}" + }, + { + "id": "e8b7d911dd3005aff08d4389c3e36380f86dd3a53ecab812d1899df5233e3707", + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "query": "{\"igp\":{\"quote_gas_payment\":{\"dest_domain\":42161,\"gas_amount\":\"300000\"}}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "query": "{\"oracle\":{\"get_exchange_rate_and_gas_price\":{\"dest_domain\":169}}}" + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "query": "{\"oracle\":{\"get_exchange_rate_and_gas_price\":{\"dest_domain\":42161}}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"router\":{\"domains\":{}}}" + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"router\":{\"list_routes\":{}}}" + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"connection\":{\"get_mailbox\":{}}}" + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"connection\":{\"get_hook\":{}}}" + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"connection\":{\"get_ism\":{}}}" + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"token_default\":{\"token_type\":{}}}" + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"token_default\":{\"token_mode\":{}}}" + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "query": "{\"ism_specifier\":{\"interchain_security_module\":[]}}" + }, + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"ownable\":{\"get_owner\":{}}}" + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"ownable\":{\"get_pending_owner\":{}}}" + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"router\":{\"domains\":{}}}" + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"router\":{\"list_routes\":{}}}" + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"connection\":{\"get_mailbox\":{}}}" + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"connection\":{\"get_hook\":{}}}" + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"connection\":{\"get_ism\":{}}}" + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"token_default\":{\"token_type\":{}}}" + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"token_default\":{\"token_mode\":{}}}" + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "query": "{\"ism_specifier\":{\"interchain_security_module\":[]}}" + } +] \ No newline at end of file diff --git a/tests/neutron-migration/results/snapshot-new.json b/tests/neutron-migration/results/snapshot-new.json new file mode 100644 index 00000000..cf7431ba --- /dev/null +++ b/tests/neutron-migration/results/snapshot-new.json @@ -0,0 +1,1039 @@ +[ + { + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "36fc5daf3000e5e1e2d8723262306578fed7bae166e1b2eb52335bc3c6c77e59", + "query": { + "mailbox": { + "hrp": {} + } + }, + "response": { + "hrp": "neutron" + } + }, + { + "id": "fbc92948a20cbd7837e65705eeb33d5e45537c8d742c7323c514de50e2dc4f83", + "query": { + "mailbox": { + "local_domain": {} + } + }, + "response": { + "local_domain": 1853125230 + } + }, + { + "id": "14e8f25b379e3f1c33fe293523ab032efe325ef28bfe56aabf5addd53bc6da54", + "query": { + "mailbox": { + "message_delivered": { + "id": "" + } + } + }, + "response": { + "delivered": false + } + }, + { + "id": "dfe3cc2db258b3604bf9bbe7b2f4c28f7141e5b3ded79d1d9eec8af29da60418", + "query": { + "mailbox": { + "default_ism": {} + } + }, + "response": { + "default_ism": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg" + } + }, + { + "id": "13063792b0f32b73d6fce54effd180ded2cc41c547f2a666e9a783a92a3b7287", + "query": { + "mailbox": { + "default_hook": {} + } + }, + "response": { + "default_hook": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk" + } + }, + { + "id": "99d94778f572f135cbc470e9995e7e04a8eaed0b757c4bc08cdedc6a05d111aa", + "query": { + "mailbox": { + "required_hook": {} + } + }, + "response": { + "required_hook": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e" + } + }, + { + "id": "360f386c4d59cd711ea584dc5a091a283f6297c89b38f8cd66e1e556fc7f302a", + "query": { + "mailbox": { + "nonce": {} + } + }, + "response": { + "nonce": 294639 + } + }, + { + "id": "e76ea74b792ee57b345d450c6d8397d9e14bbc1f7b1fbbcba034419f6a1ce7c6", + "query": { + "mailbox": { + "recipient_ism": { + "recipient_addr": "neutron1v0t8nztzhdsan2cv23x66xjrak9844zz9hq7gkz0w4j6xl4lmpzq89kt5g" + } + } + }, + "response": { + "ism": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg" + } + }, + { + "id": "3edddeb1c7ca55d50badf4fdda08c4a756f4a7e66b4ebfa602e4a7fda39d911b", + "query": { + "mailbox": { + "latest_dispatch_id": {} + } + }, + "response": { + "message_id": "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569" + } + } + ] + }, + { + "contract": "hpl_validator_announce", + "address": "neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8", + "results": [ + { + "id": "ac9c408207c750546823983c3aff74ec8aee15a10c4bf69df0a04f5bb4f665f6", + "query": { + "get_announce_storage_locations": { + "validators": [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "42fa752defe92459370a052b6387a87f7de9b80c", + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + "7885fae56dbcf5176657f54adbbd881dc6714132", + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + "e000fa4e466831db288290dd97e66560fb3d7d28" + ] + } + }, + "response": { + "storage_locations": [ + [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + [ + "s3://hyperlane-validator-signatures-imperator-neutron/eu-north-1" + ] + ], + [ + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + [ + "s3://hyperlane-validator-signatures-sg-1-celestia/us-east-1", + "s3://hyperlane-validator-signatures-sg-1-manta/us-east-1" + ] + ], + [ + "42fa752defe92459370a052b6387a87f7de9b80c", + [ + "s3://hyperlane-p2p-org/eu-west-3/h1" + ] + ], + [ + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + [ + "s3://dsrv-hyperlane-v3-validator-signatures-validator11-neutron/eu-central-1" + ] + ], + [ + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + [ + "s3://hyperlane-validator-signatures-sspaces1-neutron/eu-north-1" + ] + ], + [ + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + [ + "s3://hyperlane-mainnet3-neutron-validator-1/us-east-1" + ] + ], + [ + "7885fae56dbcf5176657f54adbbd881dc6714132", + [ + "s3://hyperlane-mainnet3-neutron-validator-2/us-east-1" + ] + ], + [ + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + [ + "s3://hyperlane-mainnet3-neutron-validator-0/us-east-1" + ] + ], + [ + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + [ + "s3://hyperlane-validator-signatures-cosmostation-neutron/ca-central-1" + ] + ], + [ + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + [ + "s3://hyperlane-validator-signatures-neutron/eu-central-1" + ] + ], + [ + "e000fa4e466831db288290dd97e66560fb3d7d28", + [ + "file://./neutron_validator_sigs" + ] + ] + ] + } + }, + { + "id": "4d558270d60bbdb4c2421812e47d08deab4ab9347e02d9468b0b43e0dea6745e", + "query": { + "get_announced_validators": {} + }, + "response": { + "validators": [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "42fa752defe92459370a052b6387a87f7de9b80c", + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + "7885fae56dbcf5176657f54adbbd881dc6714132", + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + "e000fa4e466831db288290dd97e66560fb3d7d28" + ] + } + } + ] + }, + { + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "query": { + "ism": { + "module_type": {} + } + }, + "response": { + "type": "message_id_multisig" + } + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 169 + } + } + }, + "response": { + "validators": [ + "14025fe092f5f8a401dd9819704d9072196d2125", + "25b9a0961c51e74fd83295293bc029131bf1e05a", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "a0ee95e280d46c14921e524b075d0c341e7ad1c8", + "cc9a0b6de7fe314bd99223687d784730a75bb957" + ], + "threshold": 5 + } + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 42161 + } + } + }, + "error": {} + } + ] + }, + { + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "query": { + "ism": { + "module_type": {} + } + }, + "response": { + "type": "message_id_multisig" + } + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 169 + } + } + }, + "error": {} + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 42161 + } + } + }, + "response": { + "validators": [ + "092e1c19da58e87ea65198785ee83867fe4bb418", + "4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "5450447aee7b544c462c9352bef7cad049b0c2dc", + "ec68258a7c882ac2fc46b81ce80380054ffb4ef2" + ], + "threshold": 3 + } + } + ] + }, + { + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "error": {} + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "error": {} + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "query": { + "hook": { + "mailbox": {} + } + }, + "response": { + "mailbox": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4" + } + }, + { + "id": "5d985521e2e5ec887015db42c3cf3dfd7427f53d200dc51313c3a8e7263653a9", + "query": { + "merkle_hook": { + "count": {} + } + }, + "response": { + "count": 294639 + } + }, + { + "id": "6c6a245a5dfe4f4678a4877f714f0994096e3758c4dc4efb11d77eb9fb88aac1", + "query": { + "merkle_hook": { + "root": {} + } + }, + "response": { + "root": "36ba4afef453a46ed853250ae668b0af401aa082241a586783664b80f777507e" + } + }, + { + "id": "9f4518b8667a69e28048d921a6bc236cef1afaa1cfed19db6f4c1eb2bc411305", + "query": { + "merkle_hook": { + "branch": {} + } + }, + "response": { + "branch": [ + "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569", + "e27f4961218f8079c0d4066539da5e795bdbea12ed8a02f17c611170c0954037", + "5a834704b125cc4ff22639770fd7893be81fcd4f0f452e6b1fe934bb43a2d72d", + "a6f29b814f621f766df1a0b42bd6ed3f51135268d10654ab07b2244e0620bc01", + "75224f21cb145c739072a029a08b38a34702a72a9197258c6807dc7bae577faf", + "fb07e4e02a9b91f7077e56a59900a9f150b209acd20cde4f0c84ce0dda1060b7", + "de3987540dd1026837969f664fc5bc80717c117309ba1c0d50cf2b85111073c3", + "d56ea29c3f8626fc4481a4c919bc2f92d4259073724a9a43be17223155ca134c", + "52036fbc44bc40b0359aa513a74ae20e4b2fd7d01e7fbe1021cc8f557fe25898", + "674766cc4e42b3fec0d1a2793a07e2d301e31b0b3d85ddd1781763566ada0c93", + "7a6f711ca6c754accec81f0afd066bbaf939504d91ceede3f584afd9faa16832", + "bf3ca9717a0e297fc31a4040e81b8063f82b739d856da71cb810e7d6ba73d335", + "49480dc1bb213d84664e7434a5c81aca6fd17a818c7244cd8a4ae49297c2571c", + "dd94a842126a3226e9ec0b832b0f1918be3f2cf651ab29ce864d34643a15151d", + "9c0dc5648532313009dfc9bdc087d55c97018664d0103219e2117a22938a8d13", + "b6e4c9a7bfdb359bb05e13d0aff4ff07d4ec5139be205e37f6587cb80d355390", + "4d8215cf8f597d146a408c592c08326235f5ec254e9403ad312841620a12fdce", + "901a52f44079bb3a3d68dd39cf01ed932417efe1d10492287fd213ee40d24b40", + "f37ca0d2ad7cc187a54c59b40223e414677323510ef621f33770be94505ee789", + "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ] + } + }, + { + "id": "1212f36f084aeebd7bee6db10ca634c6e6456630546bf14af471e6b3b2f7ccd7", + "query": { + "merkle_hook": { + "tree": {} + } + }, + "response": { + "branch": [ + "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569", + "e27f4961218f8079c0d4066539da5e795bdbea12ed8a02f17c611170c0954037", + "5a834704b125cc4ff22639770fd7893be81fcd4f0f452e6b1fe934bb43a2d72d", + "a6f29b814f621f766df1a0b42bd6ed3f51135268d10654ab07b2244e0620bc01", + "75224f21cb145c739072a029a08b38a34702a72a9197258c6807dc7bae577faf", + "fb07e4e02a9b91f7077e56a59900a9f150b209acd20cde4f0c84ce0dda1060b7", + "de3987540dd1026837969f664fc5bc80717c117309ba1c0d50cf2b85111073c3", + "d56ea29c3f8626fc4481a4c919bc2f92d4259073724a9a43be17223155ca134c", + "52036fbc44bc40b0359aa513a74ae20e4b2fd7d01e7fbe1021cc8f557fe25898", + "674766cc4e42b3fec0d1a2793a07e2d301e31b0b3d85ddd1781763566ada0c93", + "7a6f711ca6c754accec81f0afd066bbaf939504d91ceede3f584afd9faa16832", + "bf3ca9717a0e297fc31a4040e81b8063f82b739d856da71cb810e7d6ba73d335", + "49480dc1bb213d84664e7434a5c81aca6fd17a818c7244cd8a4ae49297c2571c", + "dd94a842126a3226e9ec0b832b0f1918be3f2cf651ab29ce864d34643a15151d", + "9c0dc5648532313009dfc9bdc087d55c97018664d0103219e2117a22938a8d13", + "b6e4c9a7bfdb359bb05e13d0aff4ff07d4ec5139be205e37f6587cb80d355390", + "4d8215cf8f597d146a408c592c08326235f5ec254e9403ad312841620a12fdce", + "901a52f44079bb3a3d68dd39cf01ed932417efe1d10492287fd213ee40d24b40", + "f37ca0d2ad7cc187a54c59b40223e414677323510ef621f33770be94505ee789", + "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "count": 294639 + } + }, + { + "id": "a40494962312b962b3d80a3f25744e5341507df514e28da089f0041d525bb902", + "query": { + "merkle_hook": { + "check_point": {} + } + }, + "response": { + "root": "36ba4afef453a46ed853250ae668b0af401aa082241a586783664b80f777507e", + "count": 294638 + } + } + ] + }, + { + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "query": { + "hook": { + "mailbox": {} + } + }, + "response": { + "mailbox": "unrestricted" + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 169, + 42161 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 169, + "route": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus" + }, + { + "domain": 42161, + "route": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus" + } + ] + } + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 169 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 42161 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "b5afef84c49f3d03b711533a5da5fda71f429303ee64f0c7f677062b32563ddb", + "query": { + "igp": { + "default_gas": {} + } + }, + "response": { + "gas": "3000000" + } + }, + { + "id": "33406de699e77578553c89170c5e23e5368df0c5b266811ec3e623f622946cdb", + "query": { + "igp": { + "gas_for_domain": { + "domains": [] + } + } + }, + "response": { + "gas": [] + } + }, + { + "id": "c759691d3aecb35ff66bb1b47d1ad0bb54ecda231ee4ac3d2a1a4c62a2745dcb", + "query": { + "igp": { + "list_gas_for_domains": {} + } + }, + "response": { + "gas": [] + } + }, + { + "id": "5def1d58cf3055cd1620d7359a5148ca7c69b8f2feb631c7b7eef45b3daa5e80", + "query": { + "igp": { + "beneficiary": {} + } + }, + "response": { + "beneficiary": "neutron1l5y24mk3s37ks35alsmq83cljhd7c7hsam3ag2" + } + }, + { + "id": "e70871c0d57b7832c436c00c38a9a0ccb7d65dd71a2aae8bb5746c31ac3ad933", + "query": { + "igp": { + "quote_gas_payment": { + "dest_domain": 169, + "gas_amount": "300000" + } + } + }, + "response": { + "gas_needed": "27000" + } + }, + { + "id": "e8b7d911dd3005aff08d4389c3e36380f86dd3a53ecab812d1899df5233e3707", + "query": { + "igp": { + "quote_gas_payment": { + "dest_domain": 42161, + "gas_amount": "300000" + } + } + }, + "response": { + "gas_needed": "27000" + } + } + ] + }, + { + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 169 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 42161 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + } + ] + }, + { + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 42161 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 42161, + "route": "000000000000000000000000d56734d7f9979dd94fae3d67c7e928234e71cd4c" + } + ] + } + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "query": { + "connection": { + "get_mailbox": {} + } + }, + "response": { + "mailbox": null + } + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "query": { + "connection": { + "get_hook": {} + } + }, + "response": { + "hook": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk" + } + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "query": { + "connection": { + "get_ism": {} + } + }, + "response": { + "ism": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc" + } + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "query": { + "token_default": { + "token_type": {} + } + }, + "response": { + "type": { + "native": { + "fungible": { + "denom": "ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7" + } + } + } + } + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "query": { + "token_default": { + "token_mode": {} + } + }, + "response": { + "mode": "collateral" + } + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "query": { + "ism_specifier": { + "interchain_security_module": [] + } + }, + "response": { + "ism": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc" + } + } + ] + }, + { + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 169 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 169, + "route": "0000000000000000000000006fae4d9935e2fcb11fc79a64e917fb2bf14dafaa" + } + ] + } + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "query": { + "connection": { + "get_mailbox": {} + } + }, + "response": { + "mailbox": null + } + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "query": { + "connection": { + "get_hook": {} + } + }, + "response": { + "hook": null + } + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "query": { + "connection": { + "get_ism": {} + } + }, + "response": { + "ism": null + } + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "query": { + "token_default": { + "token_type": {} + } + }, + "response": { + "type": { + "native": { + "fungible": { + "denom": "ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7" + } + } + } + } + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "query": { + "token_default": { + "token_mode": {} + } + }, + "response": { + "mode": "collateral" + } + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "query": { + "ism_specifier": { + "interchain_security_module": [] + } + }, + "response": { + "ism": null + } + } + ] + } +] \ No newline at end of file diff --git a/tests/neutron-migration/results/snapshot-prev.json b/tests/neutron-migration/results/snapshot-prev.json new file mode 100644 index 00000000..019ac16b --- /dev/null +++ b/tests/neutron-migration/results/snapshot-prev.json @@ -0,0 +1,1043 @@ +[ + { + "contract": "hpl_mailbox", + "address": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "36fc5daf3000e5e1e2d8723262306578fed7bae166e1b2eb52335bc3c6c77e59", + "query": { + "mailbox": { + "hrp": {} + } + }, + "response": { + "hrp": "neutron" + } + }, + { + "id": "fbc92948a20cbd7837e65705eeb33d5e45537c8d742c7323c514de50e2dc4f83", + "query": { + "mailbox": { + "local_domain": {} + } + }, + "response": { + "local_domain": 1853125230 + } + }, + { + "id": "14e8f25b379e3f1c33fe293523ab032efe325ef28bfe56aabf5addd53bc6da54", + "query": { + "mailbox": { + "message_delivered": { + "id": "" + } + } + }, + "response": { + "delivered": false + } + }, + { + "id": "dfe3cc2db258b3604bf9bbe7b2f4c28f7141e5b3ded79d1d9eec8af29da60418", + "query": { + "mailbox": { + "default_ism": {} + } + }, + "response": { + "default_ism": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg" + } + }, + { + "id": "13063792b0f32b73d6fce54effd180ded2cc41c547f2a666e9a783a92a3b7287", + "query": { + "mailbox": { + "default_hook": {} + } + }, + "response": { + "default_hook": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk" + } + }, + { + "id": "99d94778f572f135cbc470e9995e7e04a8eaed0b757c4bc08cdedc6a05d111aa", + "query": { + "mailbox": { + "required_hook": {} + } + }, + "response": { + "required_hook": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e" + } + }, + { + "id": "360f386c4d59cd711ea584dc5a091a283f6297c89b38f8cd66e1e556fc7f302a", + "query": { + "mailbox": { + "nonce": {} + } + }, + "response": { + "nonce": 294639 + } + }, + { + "id": "e76ea74b792ee57b345d450c6d8397d9e14bbc1f7b1fbbcba034419f6a1ce7c6", + "query": { + "mailbox": { + "recipient_ism": { + "recipient_addr": "neutron1v0t8nztzhdsan2cv23x66xjrak9844zz9hq7gkz0w4j6xl4lmpzq89kt5g" + } + } + }, + "response": { + "ism": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg" + } + }, + { + "id": "3edddeb1c7ca55d50badf4fdda08c4a756f4a7e66b4ebfa602e4a7fda39d911b", + "query": { + "mailbox": { + "latest_dispatch_id": {} + } + }, + "response": { + "message_id": "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569" + } + } + ] + }, + { + "contract": "hpl_validator_announce", + "address": "neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8", + "results": [ + { + "id": "ac9c408207c750546823983c3aff74ec8aee15a10c4bf69df0a04f5bb4f665f6", + "query": { + "get_announce_storage_locations": { + "validators": [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "42fa752defe92459370a052b6387a87f7de9b80c", + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + "7885fae56dbcf5176657f54adbbd881dc6714132", + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + "e000fa4e466831db288290dd97e66560fb3d7d28" + ] + } + }, + "response": { + "storage_locations": [ + [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + [ + "s3://hyperlane-validator-signatures-imperator-neutron/eu-north-1" + ] + ], + [ + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + [ + "s3://hyperlane-validator-signatures-sg-1-celestia/us-east-1", + "s3://hyperlane-validator-signatures-sg-1-manta/us-east-1" + ] + ], + [ + "42fa752defe92459370a052b6387a87f7de9b80c", + [ + "s3://hyperlane-p2p-org/eu-west-3/h1" + ] + ], + [ + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + [ + "s3://dsrv-hyperlane-v3-validator-signatures-validator11-neutron/eu-central-1" + ] + ], + [ + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + [ + "s3://hyperlane-validator-signatures-sspaces1-neutron/eu-north-1" + ] + ], + [ + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + [ + "s3://hyperlane-mainnet3-neutron-validator-1/us-east-1" + ] + ], + [ + "7885fae56dbcf5176657f54adbbd881dc6714132", + [ + "s3://hyperlane-mainnet3-neutron-validator-2/us-east-1" + ] + ], + [ + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + [ + "s3://hyperlane-mainnet3-neutron-validator-0/us-east-1" + ] + ], + [ + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + [ + "s3://hyperlane-validator-signatures-cosmostation-neutron/ca-central-1" + ] + ], + [ + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + [ + "s3://hyperlane-validator-signatures-neutron/eu-central-1" + ] + ], + [ + "e000fa4e466831db288290dd97e66560fb3d7d28", + [ + "file://./neutron_validator_sigs" + ] + ] + ] + } + }, + { + "id": "4d558270d60bbdb4c2421812e47d08deab4ab9347e02d9468b0b43e0dea6745e", + "query": { + "get_announced_validators": {} + }, + "response": { + "validators": [ + "26fa235bc3f9e1b00ac3a0db4d84abb6f34244da", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "42fa752defe92459370a052b6387a87f7de9b80c", + "47aa126e05933b95c5eb90b26e6b668d84f4b25a", + "54b2cca5091b098a1a993dec03c4d1ee9af65999", + "60e890b34cb44ce3fa52f38684f613f31b47a1a6", + "7885fae56dbcf5176657f54adbbd881dc6714132", + "a9b8c1f4998f781f958c63cfcd1708d02f004ff0", + "b65438a014fb05fbadcfe35bc6e25d372b6ba460", + "c79503a3e3011535a9c60f6d21f76f59823a38bd", + "e000fa4e466831db288290dd97e66560fb3d7d28" + ] + } + } + ] + }, + { + "contract": "hpl_ism_multisig", + "address": "neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "query": { + "ism": { + "module_type": {} + } + }, + "response": { + "type": "message_id_multisig" + } + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 169 + } + } + }, + "response": { + "validators": [ + "14025fe092f5f8a401dd9819704d9072196d2125", + "25b9a0961c51e74fd83295293bc029131bf1e05a", + "42b6de2edbaa62c2ea2309ad85d20b3e37d38acf", + "521a3e6bf8d24809fde1c1fd3494a859a16f132c", + "8e668c97ad76d0e28375275c41ece4972ab8a5bc", + "a0ee95e280d46c14921e524b075d0c341e7ad1c8", + "cc9a0b6de7fe314bd99223687d784730a75bb957" + ], + "threshold": 5 + } + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 42161 + } + } + }, + "error": {} + } + ] + }, + { + "contract": "hpl_ism_multisig", + "address": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "c2bb642d92e74db6c488d002dbdae9bedee09115196df365d42d0f15dc22bc01", + "query": { + "ism": { + "module_type": {} + } + }, + "response": { + "type": "message_id_multisig" + } + }, + { + "id": "3f11e9be78e8f85d4546d67a54df73ddc202b7d7eecfe1fe6c1952a14833079e", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 169 + } + } + }, + "error": {} + }, + { + "id": "e1038850b9b771b466574402b4be6a8388fe0e29d674ab4ce68340cad3539c19", + "query": { + "multisig_ism": { + "enrolled_validators": { + "domain": 42161 + } + } + }, + "response": { + "validators": [ + "092e1c19da58e87ea65198785ee83867fe4bb418", + "4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1", + "5450447aee7b544c462c9352bef7cad049b0c2dc", + "ec68258a7c882ac2fc46b81ce80380054ffb4ef2" + ], + "threshold": 3 + } + } + ] + }, + { + "contract": "hpl_hook_merkle", + "address": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "query": { + "hook": { + "mailbox": {} + } + }, + "response": { + "mailbox": "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4" + } + }, + { + "id": "5d985521e2e5ec887015db42c3cf3dfd7427f53d200dc51313c3a8e7263653a9", + "query": { + "merkle_hook": { + "count": {} + } + }, + "response": { + "count": 294639 + } + }, + { + "id": "6c6a245a5dfe4f4678a4877f714f0994096e3758c4dc4efb11d77eb9fb88aac1", + "query": { + "merkle_hook": { + "root": {} + } + }, + "response": { + "root": "36ba4afef453a46ed853250ae668b0af401aa082241a586783664b80f777507e" + } + }, + { + "id": "9f4518b8667a69e28048d921a6bc236cef1afaa1cfed19db6f4c1eb2bc411305", + "query": { + "merkle_hook": { + "branch": {} + } + }, + "response": { + "branch": [ + "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569", + "e27f4961218f8079c0d4066539da5e795bdbea12ed8a02f17c611170c0954037", + "5a834704b125cc4ff22639770fd7893be81fcd4f0f452e6b1fe934bb43a2d72d", + "a6f29b814f621f766df1a0b42bd6ed3f51135268d10654ab07b2244e0620bc01", + "75224f21cb145c739072a029a08b38a34702a72a9197258c6807dc7bae577faf", + "fb07e4e02a9b91f7077e56a59900a9f150b209acd20cde4f0c84ce0dda1060b7", + "de3987540dd1026837969f664fc5bc80717c117309ba1c0d50cf2b85111073c3", + "d56ea29c3f8626fc4481a4c919bc2f92d4259073724a9a43be17223155ca134c", + "52036fbc44bc40b0359aa513a74ae20e4b2fd7d01e7fbe1021cc8f557fe25898", + "674766cc4e42b3fec0d1a2793a07e2d301e31b0b3d85ddd1781763566ada0c93", + "7a6f711ca6c754accec81f0afd066bbaf939504d91ceede3f584afd9faa16832", + "bf3ca9717a0e297fc31a4040e81b8063f82b739d856da71cb810e7d6ba73d335", + "49480dc1bb213d84664e7434a5c81aca6fd17a818c7244cd8a4ae49297c2571c", + "dd94a842126a3226e9ec0b832b0f1918be3f2cf651ab29ce864d34643a15151d", + "9c0dc5648532313009dfc9bdc087d55c97018664d0103219e2117a22938a8d13", + "b6e4c9a7bfdb359bb05e13d0aff4ff07d4ec5139be205e37f6587cb80d355390", + "4d8215cf8f597d146a408c592c08326235f5ec254e9403ad312841620a12fdce", + "901a52f44079bb3a3d68dd39cf01ed932417efe1d10492287fd213ee40d24b40", + "f37ca0d2ad7cc187a54c59b40223e414677323510ef621f33770be94505ee789", + "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ] + } + }, + { + "id": "1212f36f084aeebd7bee6db10ca634c6e6456630546bf14af471e6b3b2f7ccd7", + "query": { + "merkle_hook": { + "tree": {} + } + }, + "response": { + "branch": [ + "880a6a3c84d485ac84671b795fabde119e370706d16a68a08d9b73ba97098569", + "e27f4961218f8079c0d4066539da5e795bdbea12ed8a02f17c611170c0954037", + "5a834704b125cc4ff22639770fd7893be81fcd4f0f452e6b1fe934bb43a2d72d", + "a6f29b814f621f766df1a0b42bd6ed3f51135268d10654ab07b2244e0620bc01", + "75224f21cb145c739072a029a08b38a34702a72a9197258c6807dc7bae577faf", + "fb07e4e02a9b91f7077e56a59900a9f150b209acd20cde4f0c84ce0dda1060b7", + "de3987540dd1026837969f664fc5bc80717c117309ba1c0d50cf2b85111073c3", + "d56ea29c3f8626fc4481a4c919bc2f92d4259073724a9a43be17223155ca134c", + "52036fbc44bc40b0359aa513a74ae20e4b2fd7d01e7fbe1021cc8f557fe25898", + "674766cc4e42b3fec0d1a2793a07e2d301e31b0b3d85ddd1781763566ada0c93", + "7a6f711ca6c754accec81f0afd066bbaf939504d91ceede3f584afd9faa16832", + "bf3ca9717a0e297fc31a4040e81b8063f82b739d856da71cb810e7d6ba73d335", + "49480dc1bb213d84664e7434a5c81aca6fd17a818c7244cd8a4ae49297c2571c", + "dd94a842126a3226e9ec0b832b0f1918be3f2cf651ab29ce864d34643a15151d", + "9c0dc5648532313009dfc9bdc087d55c97018664d0103219e2117a22938a8d13", + "b6e4c9a7bfdb359bb05e13d0aff4ff07d4ec5139be205e37f6587cb80d355390", + "4d8215cf8f597d146a408c592c08326235f5ec254e9403ad312841620a12fdce", + "901a52f44079bb3a3d68dd39cf01ed932417efe1d10492287fd213ee40d24b40", + "f37ca0d2ad7cc187a54c59b40223e414677323510ef621f33770be94505ee789", + "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "count": 294639 + } + }, + { + "id": "a40494962312b962b3d80a3f25744e5341507df514e28da089f0041d525bb902", + "query": { + "merkle_hook": { + "check_point": {} + } + }, + "response": { + "root": "36ba4afef453a46ed853250ae668b0af401aa082241a586783664b80f777507e", + "count": 294638 + } + } + ] + }, + { + "contract": "hpl_igp", + "address": "neutron1ww9yg48qvmpmedyvkrcrmjsudxeu840l5n6ywqykpqlsdq9pdxkqg2zq7e", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "d312859468f2875fd187f408c450316ca233790c4517b04918204acb7e3ac183", + "query": { + "hook": { + "mailbox": {} + } + }, + "response": { + "mailbox": "unrestricted" + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 169, + 42161 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 169, + "route": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus" + }, + { + "domain": 42161, + "route": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus" + } + ] + } + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 169 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 42161 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "b5afef84c49f3d03b711533a5da5fda71f429303ee64f0c7f677062b32563ddb", + "query": { + "igp": { + "default_gas": {} + } + }, + "response": { + "gas": "3000000" + } + }, + { + "id": "33406de699e77578553c89170c5e23e5368df0c5b266811ec3e623f622946cdb", + "query": { + "igp": { + "gas_for_domain": { + "domains": [] + } + } + }, + "response": { + "gas": [] + } + }, + { + "id": "c759691d3aecb35ff66bb1b47d1ad0bb54ecda231ee4ac3d2a1a4c62a2745dcb", + "query": { + "igp": { + "list_gas_for_domains": {} + } + }, + "response": { + "gas": [] + } + }, + { + "id": "5def1d58cf3055cd1620d7359a5148ca7c69b8f2feb631c7b7eef45b3daa5e80", + "query": { + "igp": { + "beneficiary": {} + } + }, + "response": { + "beneficiary": "neutron1l5y24mk3s37ks35alsmq83cljhd7c7hsam3ag2" + } + }, + { + "id": "e70871c0d57b7832c436c00c38a9a0ccb7d65dd71a2aae8bb5746c31ac3ad933", + "query": { + "igp": { + "quote_gas_payment": { + "dest_domain": 169, + "gas_amount": "300000" + } + } + }, + "response": { + "gas_needed": "27000" + } + }, + { + "id": "e8b7d911dd3005aff08d4389c3e36380f86dd3a53ecab812d1899df5233e3707", + "query": { + "igp": { + "quote_gas_payment": { + "dest_domain": 42161, + "gas_amount": "300000" + } + } + }, + "response": { + "gas_needed": "27000" + } + } + ] + }, + { + "contract": "hpl_igp_oracle", + "address": "neutron1sjxus3rynpwq0ncnm0m0dfun9x3flwmalsmveh4kuml0650wsq4q8n4mus", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "215488671aefcbbe71bbf8f3b4e8a81fd93aeca3274e935354a4a2c51fc56aa1", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 169 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + }, + { + "id": "d8259a4cbec72905336fadeddb05ac886396415e15af1b554a71e26ef4c573cb", + "query": { + "oracle": { + "get_exchange_rate_and_gas_price": { + "dest_domain": 42161 + } + } + }, + "response": { + "gas_price": "100000000", + "exchange_rate": "9" + } + } + ] + }, + { + "contract": "hpl_warp_native", + "address": "neutron1jyyjd3x0jhgswgm6nnctxvzla8ypx50tew3ayxxwkrjfxhvje6kqzvzudq", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 42161 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 42161, + "route": "000000000000000000000000d56734d7f9979dd94fae3d67c7e928234e71cd4c" + } + ] + } + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "query": { + "connection": { + "get_mailbox": {} + } + }, + "response": { + "mailbox": null + } + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "query": { + "connection": { + "get_hook": {} + } + }, + "response": { + "hook": "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk" + } + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "query": { + "connection": { + "get_ism": {} + } + }, + "response": { + "ism": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc" + } + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "query": { + "token_default": { + "token_type": {} + } + }, + "response": { + "type": { + "native": { + "fungible": { + "denom": "ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7" + } + } + } + } + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "query": { + "token_default": { + "token_mode": {} + } + }, + "response": { + "mode": "collateral" + } + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "query": { + "ism_specifier": { + "interchain_security_module": [] + } + }, + "response": { + "ism": "neutron13uk6ydlx22kdtlkgs6p72ddhefzm2acxntp28adc0gs87we56neqz4smjc" + } + } + ] + }, + { + "contract": "hpl_warp_native", + "address": "neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa", + "results": [ + { + "id": "9b460364ed9a1f946f7c0571bb5e058bec4b6189ff3efcf8946b4e347e32869b", + "query": { + "ownable": { + "get_owner": {} + } + }, + "response": { + "owner": "neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7" + } + }, + { + "id": "2fd20a9fe342c1533d48d2a1c486099f1478b988fcfe912d1967b8c9be35757b", + "query": { + "ownable": { + "get_pending_owner": {} + } + }, + "response": { + "pending_owner": null + } + }, + { + "id": "05da99983807c4d773058eed27b4307b03542be927a8cb9fe4eba2ad59ea70cb", + "query": { + "router": { + "domains": {} + } + }, + "response": { + "domains": [ + 169 + ] + } + }, + { + "id": "c80f327fc2f9dc0d41f348008c4ad7a35efa4326ec9b3819804f04fcbbd9ea4f", + "query": { + "router": { + "list_routes": {} + } + }, + "response": { + "routes": [ + { + "domain": 169, + "route": "0000000000000000000000006fae4d9935e2fcb11fc79a64e917fb2bf14dafaa" + } + ] + } + }, + { + "id": "9af57d56545e574ff9d7966459c924479e7f2a026ee4f5d7af46e8f92b7c2e88", + "query": { + "connection": { + "get_mailbox": {} + } + }, + "response": { + "mailbox": null + } + }, + { + "id": "d55bdddfe980e439be1462656d5cca6d22dde08b084c41d688424326a9a5d2d6", + "query": { + "connection": { + "get_hook": {} + } + }, + "response": { + "hook": null + } + }, + { + "id": "b2c31e359408d89a258441650c71c54b909aabb6126281e220fba6f0ca105d5d", + "query": { + "connection": { + "get_ism": {} + } + }, + "response": { + "ism": null + } + }, + { + "id": "0b26e3f6b659e8ef1f6b5dbf563b317e9c5ca78b2f0301c1fa2bff219edea6fa", + "query": { + "token_default": { + "token_type": {} + } + }, + "response": { + "type": { + "native": { + "fungible": { + "denom": "ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7" + } + } + } + } + }, + { + "id": "2cf6e2438d95b8542d4d133ffdcdf2bd402449ef183c20dfd453722a007a2ffd", + "query": { + "token_default": { + "token_mode": {} + } + }, + "response": { + "mode": "collateral" + } + }, + { + "id": "cc6cbb6d5e07d1d91921bb535721cff70b736e77ef2f94dfc146c5d6af8d0362", + "query": { + "ism_specifier": { + "interchain_security_module": [] + } + }, + "response": { + "ism": null + } + } + ] + } +] \ No newline at end of file diff --git a/tests/neutron-migration/results/uploaded.json b/tests/neutron-migration/results/uploaded.json new file mode 100644 index 00000000..bbaf9be9 --- /dev/null +++ b/tests/neutron-migration/results/uploaded.json @@ -0,0 +1,82 @@ +[ + { + "name": "hpl_hook_aggregate", + "codeId": 1271 + }, + { + "name": "hpl_hook_fee", + "codeId": 1272 + }, + { + "name": "hpl_hook_merkle", + "codeId": 1273 + }, + { + "name": "hpl_hook_pausable", + "codeId": 1274 + }, + { + "name": "hpl_hook_routing", + "codeId": 1275 + }, + { + "name": "hpl_hook_routing_custom", + "codeId": 1276 + }, + { + "name": "hpl_hook_routing_fallback", + "codeId": 1277 + }, + { + "name": "hpl_igp", + "codeId": 1278 + }, + { + "name": "hpl_igp_oracle", + "codeId": 1279 + }, + { + "name": "hpl_ism_aggregate", + "codeId": 1280 + }, + { + "name": "hpl_ism_multisig", + "codeId": 1281 + }, + { + "name": "hpl_ism_pausable", + "codeId": 1282 + }, + { + "name": "hpl_ism_routing", + "codeId": 1283 + }, + { + "name": "hpl_mailbox", + "codeId": 1284 + }, + { + "name": "hpl_test_mock_hook", + "codeId": 1285 + }, + { + "name": "hpl_test_mock_ism", + "codeId": 1286 + }, + { + "name": "hpl_test_mock_msg_receiver", + "codeId": 1287 + }, + { + "name": "hpl_validator_announce", + "codeId": 1288 + }, + { + "name": "hpl_warp_cw20", + "codeId": 1289 + }, + { + "name": "hpl_warp_native", + "codeId": 1290 + } +] \ No newline at end of file diff --git a/tests/neutron-migration/shared.ts b/tests/neutron-migration/shared.ts new file mode 100644 index 00000000..80ac17df --- /dev/null +++ b/tests/neutron-migration/shared.ts @@ -0,0 +1,244 @@ +import { + CosmWasmClient, + MsgExecuteContractEncodeObject, + MsgInstantiateContractEncodeObject, + MsgStoreCodeEncodeObject, + WasmExtension, +} from '@cosmjs/cosmwasm-stargate'; +import { keccak256 } from '@cosmjs/crypto'; +import { + Coin, + EncodeObject, + encodePubkey, + makeAuthInfoBytes, +} from '@cosmjs/proto-signing'; +import { + DeliverTxResponse, + QueryClient, + StargateClient, +} from '@cosmjs/stargate'; +import { TxRaw } from 'cosmjs-types/cosmos/tx/v1beta1/tx'; +import { Model } from 'cosmjs-types/cosmwasm/wasm/v1/types'; +import { base64FromBytes } from 'cosmjs-types/helpers'; +import { readFileSync } from 'fs'; +import { join } from 'path'; + +import { waitTx } from '../../script/shared/utils'; +import { denom, reg } from './deps'; +import { migrationTargets } from './migration'; +import { QUERIES } from './queries'; +import { ClientSet, Member } from './types'; + +export function resultPath(name: string): string { + return join(__dirname, 'results', name); +} + +export async function makeMember( + client: ClientSet, + address: string, +): Promise { + const account = await client.stargate.getAccount(address); + if (!account?.pubkey) throw new Error(`Account ${address} has no pubkey`); + + return { + address, + pubkey: encodePubkey({ + type: 'tendermint/PubKeySecp256k1', + value: account.pubkey.value, + }), + client, + }; +} + +export async function initContract( + member: Member, + codeId: bigint, + msg: object, + label: string = 'contract', +) { + const resp = await sendTx(member, [ + { + typeUrl: '/cosmwasm.wasm.v1.MsgInstantiateContract', + value: { + sender: member.address, + codeId, + msg: Buffer.from(JSON.stringify(msg)), + label, + }, + } as MsgInstantiateContractEncodeObject, + ]); + + const waitResp = await waitTx(resp.transactionHash, member.client.stargate); + if (waitResp.code !== 0) throw new Error(`Tx failed: ${waitResp.rawLog}`); + return waitResp; +} + +export async function uploadContract(member: Member, contractPath: string) { + const resp = await sendTx(member, [ + { + typeUrl: '/cosmwasm.wasm.v1.MsgStoreCode', + value: { + sender: member.address, + wasmByteCode: readFileSync(contractPath), + }, + } as MsgStoreCodeEncodeObject, + ]); + + const waitResp = await waitTx(resp.transactionHash, member.client.stargate); + if (waitResp.code !== 0) throw new Error(`Tx failed: ${waitResp.rawLog}`); + return waitResp; +} + +export async function executeContract( + member: Member, + contract: string, + msg: object, + funds?: Coin[], +) { + const resp = await sendTx(member, [ + { + typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract', + value: { + sender: member.address, + contract: contract, + msg: Buffer.from(JSON.stringify(msg)), + funds, + }, + } as MsgExecuteContractEncodeObject, + ]); + + const waitResp = await waitTx(resp.transactionHash, member.client.stargate); + if (waitResp.code !== 0) throw new Error(`Tx failed: ${waitResp.rawLog}`); + return waitResp; +} + +export async function sendTx( + from: Member, + messages: EncodeObject[], +): Promise { + const txBodyFields = { + typeUrl: '/cosmos.tx.v1beta1.TxBody', + value: { messages }, + }; + + const feeAmount = [ + { + amount: `${1_000_000}`, + denom, + }, + ]; + + const txBodyBytes = reg.encode(txBodyFields); + + if (!from.pubkey) from = await makeMember(from.client, from.address); + + const gasLimit = 2_000_000; + const authInfoBytes = makeAuthInfoBytes( + [{ pubkey: from.pubkey!, sequence: 0 }], + feeAmount, + gasLimit, + undefined, + undefined, + ); + + const txRawBytes = Uint8Array.from( + TxRaw.encode( + TxRaw.fromPartial({ + bodyBytes: txBodyBytes, + authInfoBytes: authInfoBytes, + signatures: [], + }), + ).finish(), + ); + + return from.client.stargate.broadcastTx(txRawBytes); +} + +export type Snapshot = { + contract: string; + address: string; + results: { + id: string; + query: object; + response?: object; + error?: unknown; + }[]; + state: { + key: string; + value: string; + }[]; +}[]; + +export async function makeSnapshot(client: { + wasm: CosmWasmClient; + stargate: StargateClient; + stateClient: QueryClient & WasmExtension; +}): Promise { + const snapshot = []; + + console.log('Generating snapshot...'); + + for (const contract of migrationTargets) { + const found = QUERIES.find((v) => v.contract === contract.name); + if (!found) throw new Error(`No queries found for ${contract.name}`); + + console.log(`Processing ${contract.name}...`); + + for (const target of contract.address) { + console.log(`=> CONTRACT: ${target}`); + + const results: Snapshot[0]['results'] = []; + + for (const query of found.queries) { + console.log(`==> QUERING: ${JSON.stringify(query)}`); + + const queryIdRaw = keccak256(Buffer.from(JSON.stringify(query))); + const queryId = Buffer.from(queryIdRaw).toString('hex'); + + try { + const resp = await client.wasm.queryContractSmart(target, query); + console.log(JSON.stringify(resp)); + + results.push({ + id: queryId, + query, + response: resp, + }); + } catch (e) { + console.error(e); + results.push({ id: queryId, query, error: e }); + } + } + + const contractState: Snapshot[0]['state'] = []; + let paginationKey = undefined; + const decoder = new TextDecoder(); + while (true) { + const statePage = await client.stateClient.wasm.getAllContractState( + target, + paginationKey, + ); + statePage.models.forEach((model) => { + contractState.push({ + key: decoder.decode(model.key), + value: decoder.decode(model.value), + }); + }); + + paginationKey = statePage.pagination?.nextKey; + if (paginationKey === undefined || paginationKey.length === 0) { + break; + } + } + + snapshot.push({ + contract: contract.name, + address: target, + results, + state: contractState, + }); + } + } + + return snapshot; +} diff --git a/tests/neutron-migration/types.ts b/tests/neutron-migration/types.ts new file mode 100644 index 00000000..3afb7cc5 --- /dev/null +++ b/tests/neutron-migration/types.ts @@ -0,0 +1,14 @@ +import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { StargateClient } from '@cosmjs/stargate'; +import { Any } from 'cosmjs-types/google/protobuf/any'; + +export type ClientSet = { + wasm: CosmWasmClient; + stargate: StargateClient; +}; + +export type Member = { + address: string; + pubkey?: Any; + client: ClientSet; +}; diff --git a/tsconfig.json b/tsconfig.json index 4a3fbdb0..8690274c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,5 @@ "outDir": "dist", "declaration": true /* Skip type checking all .d.ts files. */ }, - "include": ["script/**/*.ts", "example/**/*.ts"] + "include": ["script/**/*.ts", "example/**/*.ts", "tests/**/*.ts"] } diff --git a/yarn.lock b/yarn.lock index 25e0d042..c8f10812 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2921,18 +2921,21 @@ __metadata: "@types/decompress": "npm:^4.2.7" "@types/eslint": "npm:^8" "@types/js-yaml": "npm:^4.0.8" + "@types/lodash": "npm:^4.17.4" "@types/node": "npm:^20.11.20" "@typescript-eslint/eslint-plugin": "npm:^7.1.1" "@typescript-eslint/parser": "npm:^7.1.1" axios: "npm:^1.6.7" colors: "npm:^1.4.0" commander: "npm:^11.1.0" + cosmjs-types: "npm:^0.9.0" decompress: "npm:^4.2.1" esbuild: "npm:^0.20.1" eslint: "npm:^8.57.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-prettier: "npm:^5.1.3" inversify: "npm:^6.0.1" + lodash: "npm:^4.17.21" prettier: "npm:^3.2.5" readline: "npm:^1.3.0" reflect-metadata: "npm:^0.1.13" @@ -3490,6 +3493,13 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4.17.4": + version: 4.17.4 + resolution: "@types/lodash@npm:4.17.4" + checksum: 10c0/0124c64cb9fe7a0f78b6777955abd05ef0d97844d49118652eae45f8fa57bfb7f5a7a9bccc0b5a84c0a6dc09631042e4590cb665acb9d58dfd5e6543c75341ec + languageName: node + linkType: hard + "@types/long@npm:^4.0.1": version: 4.0.2 resolution: "@types/long@npm:4.0.2"