From 7d4a6b5399ab1a017e431cea0e189a583d4de370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lz=2Esir=CE=94rthurmoney=28=29?= Date: Wed, 7 Feb 2024 17:37:24 -0800 Subject: [PATCH 1/3] Adding getEnforcedOptions task --- .changeset/big-zoos-pretend.md | 7 + packages/ua-devtools-evm-hardhat/package.json | 1 + .../src/constants/tasks.ts | 1 + .../src/tasks/oapp/enforced.options.get.ts | 136 ++++++++++++ .../src/tasks/oapp/index.ts | 1 + packages/ua-devtools/src/oapp/check.ts | 34 ++- pnpm-lock.yaml | 6 +- .../valid.multi.network.enforced.options.js | 201 ++++++++++++++++++ ...ulti.network.lzreceive.enforced.options.js | 118 ++++++++++ ...ti.network.one.pathway.enforced.options.js | 58 +++++ .../__snapshots__/config.check.test.ts.snap | 182 ++++++++++++++++ .../test/task/oapp/config.check.test.ts | 30 ++- 12 files changed, 770 insertions(+), 5 deletions(-) create mode 100644 .changeset/big-zoos-pretend.md create mode 100644 packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts create mode 100644 tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.enforced.options.js create mode 100644 tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js create mode 100644 tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.one.pathway.enforced.options.js diff --git a/.changeset/big-zoos-pretend.md b/.changeset/big-zoos-pretend.md new file mode 100644 index 000000000..9b4db328c --- /dev/null +++ b/.changeset/big-zoos-pretend.md @@ -0,0 +1,7 @@ +--- +"@layerzerolabs/ua-devtools-evm-hardhat-test": patch +"@layerzerolabs/ua-devtools-evm-hardhat": patch +"@layerzerolabs/ua-devtools": patch +--- + +Adding getEnforcedOptions task diff --git a/packages/ua-devtools-evm-hardhat/package.json b/packages/ua-devtools-evm-hardhat/package.json index dca7b507a..3d390c9f8 100644 --- a/packages/ua-devtools-evm-hardhat/package.json +++ b/packages/ua-devtools-evm-hardhat/package.json @@ -49,6 +49,7 @@ "@layerzerolabs/io-devtools": "~0.1.2", "@layerzerolabs/lz-definitions": "~2.1.4", "@layerzerolabs/lz-evm-messagelib-v2": "~2.1.4", + "@layerzerolabs/lz-v2-utilities": "~2.1.4", "@layerzerolabs/protocol-devtools": "~0.1.3", "@layerzerolabs/protocol-devtools-evm": "~0.1.3", "@layerzerolabs/ua-devtools": "~0.1.5", diff --git a/packages/ua-devtools-evm-hardhat/src/constants/tasks.ts b/packages/ua-devtools-evm-hardhat/src/constants/tasks.ts index d728be2b3..1f1806b79 100644 --- a/packages/ua-devtools-evm-hardhat/src/constants/tasks.ts +++ b/packages/ua-devtools-evm-hardhat/src/constants/tasks.ts @@ -6,6 +6,7 @@ export const TASK_LZ_OAPP_CONFIG_GET_DEFAULT = 'lz:oapp:config:get:default' export const TASK_LZ_OAPP_CONFIG_GET_EXECUTOR = 'lz:oapp:config:get:executor' export const TASK_LZ_OAPP_CONFIG_GET = 'lz:oapp:config:get' export const TASK_LZ_OAPP_CONFIG_CHECK = 'lz:oapp:config:check' +export const TASK_LZ_OAPP_ENFORCED_OPTIONS_GET = 'lz:oapp:enforced:options:get' export const TASK_LZ_OAPP_CONFIG_INIT = 'lz:oapp:config:init' export const SUBTASK_LZ_OAPP_WIRE_CONFIGURE = '::lz:oapp:wire:configure' diff --git a/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts new file mode 100644 index 000000000..a49c54996 --- /dev/null +++ b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts @@ -0,0 +1,136 @@ +import { ActionType } from 'hardhat/types' +import { task } from 'hardhat/config' +import { createLogger, printCrossTable, printRecord, setDefaultLogLevel } from '@layerzerolabs/io-devtools' +import { TASK_LZ_OAPP_ENFORCED_OPTIONS_GET } from '@/constants/tasks' +import { printLogo } from '@layerzerolabs/io-devtools/swag' +import { OAppOmniGraph } from '@layerzerolabs/ua-devtools' +import { createConnectedContractFactory, types } from '@layerzerolabs/devtools-evm-hardhat' +import { createOAppFactory } from '@layerzerolabs/ua-devtools-evm' +import { checkOAppEnforcedOptions } from '@layerzerolabs/ua-devtools' +import { validateAndTransformOappConfig } from '@/utils/taskHelpers' +import { getNetworkNameForEid } from '@layerzerolabs/devtools-evm-hardhat' +import { areVectorsEqual, isZero } from '@layerzerolabs/devtools' +import { Options } from '@layerzerolabs/lz-v2-utilities' + +interface TaskArgs { + oappConfig: string + logLevel?: string +} + +export const enforcedOptionsGet: ActionType = async ({ oappConfig: oappConfigPath, logLevel = 'info' }) => { + printLogo() + + // We'll set the global logging level to get as much info as needed + setDefaultLogLevel(logLevel) + + // And we'll create a logger for ourselves + const logger = createLogger() + const graph: OAppOmniGraph = await validateAndTransformOappConfig(oappConfigPath, logger) + + // need points for OApp Peer Matrix + const points = graph.contracts + .map(({ point }) => point) + .map((point) => ({ + ...point, + networkName: getNetworkNameForEid(point.eid), + })) + + // At this point we are ready read data from the OApp + const contractFactory = createConnectedContractFactory() + const oAppFactory = createOAppFactory(contractFactory) + + try { + const enforcedOptions = await checkOAppEnforcedOptions(graph, oAppFactory) + const peerNetworkMatrix = points.map((row) => { + /** + * for each point in the network (referred to as 'row'), create a row in the matrix + */ + const connectionsForCurrentRow = points.reduce((tableRow, column) => { + /** + * find a peer with a vector matching the connection from 'column' to 'row' + */ + const connection = enforcedOptions.find((peer) => { + return areVectorsEqual(peer.vector, { from: column, to: row }) + }) + /** + * update the row with a key-value pair indicating the connection status for the current column + */ + const enforcedOptsByMsgType = {} + if (connection?.enforcedOptions) { + connection.enforcedOptions.forEach((option) => { + let enforcedOpts = {} + if (!isZero(option.options)) { + enforcedOpts = updateEnforcedOptsFromOptions(enforcedOpts, option) + enforcedOptsByMsgType['msgType: ' + option.msgType] = enforcedOpts + } + }) + } + + return { + ...tableRow, + [column.networkName]: printRecord(enforcedOptsByMsgType), + } + }, {}) + + /** + * return the row representing connections for the current 'row' + */ + return connectionsForCurrentRow + }) + + console.log(printCrossTable(peerNetworkMatrix, ['from → to', ...points.map(({ networkName }) => networkName)])) + + return enforcedOptions + } catch (error) { + throw new Error(`An error occurred while getting the OApp configuration: ${error}`) + } +} + +task(TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, 'Outputs table of OApp enforced options using layerzero.config') + .addParam('oappConfig', 'Path to your LayerZero OApp config', './layerzero.config.js', types.string) + .addParam('logLevel', 'Logging level. One of: error, warn, info, verbose, debug, silly', 'info', types.logLevel) + .setAction(enforcedOptionsGet) + +/** + * Updates the enforced options object based on the provided encoded enforced options. + * @param enforcedOpts - The enforced options object to update. + * @param option - The encoded enforced options that needs to be decoded to extract enforced options. + * @returns The updated enforced options object. + */ +function updateEnforcedOptsFromOptions(enforcedOpts, option) { + const fromOptions = Options.fromOptions(option.options) + const lzReceiveOption = fromOptions.decodeExecutorLzReceiveOption() + const lzNativeDropOption = fromOptions.decodeExecutorNativeDropOption() + const lzComposeOption = fromOptions.decodeExecutorComposeOption() + const lzOrderedExecutionOption = fromOptions.decodeExecutorOrderedExecutionOption() + + enforcedOpts = { + ...enforcedOpts, + ...(lzReceiveOption ? { lzReceiveOption } : {}), + ...updateEnforcedOpts(enforcedOpts, 'lzNativeDropOption', lzNativeDropOption), + ...updateEnforcedOpts(enforcedOpts, 'lzComposeOption', lzComposeOption), + ...(lzOrderedExecutionOption ? { lzOrderedExecutionOption } : {}), + } + + return enforcedOpts +} + +/** + * Updates the enforced options for better readability. + * @param enforcedOpts - The enforced options object to update. + * @param optionName - The name of the option to update. + * @param optionValue - The value of the option to update. + * @returns The updated enforced options object. + */ +function updateEnforcedOpts(enforcedOpts, optionName, optionValue) { + if (optionValue && optionValue.length === 1) { + // If the option value is defined and has length 1, pop from array and keep as object + return { ...enforcedOpts, [optionName]: optionValue.pop() } + } else if (optionValue && optionValue.length > 1) { + // If the option value exists and has length greater than 1, keep it as an array + return { ...enforcedOpts, [optionName]: [...(enforcedOpts[optionName] || []), ...optionValue] } + } else { + // If the option value is not defined or has length 0, return the original enforcedOpts + return enforcedOpts + } +} diff --git a/packages/ua-devtools-evm-hardhat/src/tasks/oapp/index.ts b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/index.ts index 4108f919b..95558fcce 100644 --- a/packages/ua-devtools-evm-hardhat/src/tasks/oapp/index.ts +++ b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/index.ts @@ -3,4 +3,5 @@ import './config.check' import './config.get.default' import './config.get.executor' import './config.get' +import './enforced.options.get' import './config.init' diff --git a/packages/ua-devtools/src/oapp/check.ts b/packages/ua-devtools/src/oapp/check.ts index c22304d92..901e225d0 100644 --- a/packages/ua-devtools/src/oapp/check.ts +++ b/packages/ua-devtools/src/oapp/check.ts @@ -1,8 +1,17 @@ -import { OAppFactory, OAppOmniGraph, OAppPeers } from '@/oapp/types' +import { EncodedOption, OAppEnforcedOptions, OAppFactory, OAppOmniGraph, OAppPeers } from '@/oapp/types' +import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities' -export type OAppRead = (graph: OAppOmniGraph, createSdk: OAppFactory) => Promise +export type OAppReadPeers = (graph: OAppOmniGraph, createSdk: OAppFactory) => Promise +export type OAppReadEnforcedOptions = (graph: OAppOmniGraph, createSdk: OAppFactory) => Promise -export const checkOAppPeers: OAppRead = async (graph, createSdk): Promise => { +const EnforcedOptions: ExecutorOptionType[] = [ + ExecutorOptionType.LZ_RECEIVE, + ExecutorOptionType.NATIVE_DROP, + ExecutorOptionType.COMPOSE, + ExecutorOptionType.ORDERED, +] + +export const checkOAppPeers: OAppReadPeers = async (graph, createSdk): Promise => { return await Promise.all( graph.connections.map(async ({ vector }): Promise => { const sdk = await createSdk(vector.from) @@ -11,3 +20,22 @@ export const checkOAppPeers: OAppRead = async (graph, createSdk): Promise => { + return await Promise.all( + graph.connections.map(async ({ vector }): Promise => { + const enforcedOptionsRead: EncodedOption[] = [] + const oappSdk = await createSdk(vector.from) + for (const enforcedOption of EnforcedOptions) { + enforcedOptionsRead.push({ + msgType: enforcedOption, + options: await oappSdk.getEnforcedOptions(vector.to.eid, enforcedOption), + }) + } + return { vector: vector, enforcedOptions: enforcedOptionsRead } + }) + ) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0e305697..f8e45d719 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1291,6 +1291,9 @@ importers: '@layerzerolabs/lz-evm-messagelib-v2': specifier: ~2.1.4 version: 2.1.4(@axelar-network/axelar-gmp-sdk-solidity@5.6.4)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@2.1.4)(@layerzerolabs/lz-evm-v1-0.7@2.1.4)(@openzeppelin/contracts-upgradeable@4.9.5)(@openzeppelin/contracts@4.9.5)(hardhat-deploy@0.11.45)(solidity-bytes-utils@0.8.2) + '@layerzerolabs/lz-v2-utilities': + specifier: ~2.1.4 + version: 2.1.4 '@layerzerolabs/protocol-devtools': specifier: ~0.1.3 version: link:../protocol-devtools @@ -6564,6 +6567,7 @@ packages: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 + bundledDependencies: false /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -9457,7 +9461,7 @@ packages: dependencies: '@solidity-parser/parser': 0.17.0 prettier: 3.2.5 - semver: 7.5.4 + semver: 7.6.0 solidity-comments-extractor: 0.0.8 dev: true diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.enforced.options.js b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.enforced.options.js new file mode 100644 index 000000000..fe5e8c7d1 --- /dev/null +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.enforced.options.js @@ -0,0 +1,201 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities'; +import { EndpointId } from '@layerzerolabs/lz-definitions'; + +const ethContract = { + eid: EndpointId.ETHEREUM_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const avaxContract = { + eid: EndpointId.AVALANCHE_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const bscContract = { + eid: EndpointId.BSC_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +module.exports = { + contracts: [ + { + contract: avaxContract, + }, + { + contract: ethContract, + }, + { + contract: bscContract, + }, + ], + connections: [ + { + from: ethContract, + to: avaxContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 1, + }, + { + msgType: 1, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 1, + receiver: '0x000000000000000000000000000000000000001', + }, + { + msgType: 2, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 2, + receiver: '0x000000000000000000000000000000000000002', + }, + { + msgType: 1, + optionType: ExecutorOptionType.COMPOSE, + index: 0, + gas: 200000, + value: 1, + }, + { + msgType: 3, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 2, + receiver: '0x000000000000000000000000000000000000002', + }, + ], + }, + }, + { + from: ethContract, + to: bscContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + { + msgType: 2, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 1, + receiver: '0x000000000000000000000000000000000000001', + }, + { + msgType: 2, + optionType: ExecutorOptionType.COMPOSE, + index: 0, + gas: 200500, + value: 1, + }, + ], + }, + }, + { + from: avaxContract, + to: ethContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 300000, + value: 1, + }, + { + msgType: 2, + optionType: ExecutorOptionType.COMPOSE, + index: 0, + gas: 200000, + value: 1, + }, + ], + }, + }, + { + from: avaxContract, + to: bscContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 150000, + value: 0, + }, + { + msgType: 1, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 1, + receiver: '0x000000000000000000000000000000000000002', + }, + { + msgType: 1, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 4, + receiver: '0x000000000000000000000000000000000000003', + }, + { + msgType: 2, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 2, + receiver: '0x000000000000000000000000000000000000002', + }, + ], + }, + }, + { + from: bscContract, + to: ethContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200001, + value: 1, + }, + { + msgType: 1, + optionType: ExecutorOptionType.COMPOSE, + index: 0, + gas: 200000, + value: 1, + }, + { + msgType: 1, + optionType: ExecutorOptionType.COMPOSE, + index: 1, + gas: 300000, + value: 1, + }, + { + msgType: 1, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 2, + receiver: '0x000000000000000000000000000000000000002', + }, + ], + }, + }, + { + from: bscContract, + to: avaxContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 150000, + value: 0, + }, + ], + }, + }, + ], +}; diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js new file mode 100644 index 000000000..a12aa57e4 --- /dev/null +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js @@ -0,0 +1,118 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities'; +import { EndpointId } from '@layerzerolabs/lz-definitions'; + +const ethContract = { + eid: EndpointId.ETHEREUM_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const avaxContract = { + eid: EndpointId.AVALANCHE_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const bscContract = { + eid: EndpointId.BSC_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +module.exports = { + contracts: [ + { + contract: avaxContract, + }, + { + contract: ethContract, + }, + { + contract: bscContract, + }, + ], + connections: [ + { + from: ethContract, + to: avaxContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + { + from: ethContract, + to: bscContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + { + from: avaxContract, + to: ethContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + { + from: avaxContract, + to: bscContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + { + from: bscContract, + to: ethContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + { + from: bscContract, + to: avaxContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + ], + }, + }, + ], +}; diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.one.pathway.enforced.options.js b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.one.pathway.enforced.options.js new file mode 100644 index 000000000..79d58afee --- /dev/null +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.one.pathway.enforced.options.js @@ -0,0 +1,58 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities'; +import { EndpointId } from '@layerzerolabs/lz-definitions'; + +const ethContract = { + eid: EndpointId.ETHEREUM_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const avaxContract = { + eid: EndpointId.AVALANCHE_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +const bscContract = { + eid: EndpointId.BSC_V2_MAINNET, + contractName: 'DefaultOApp', +}; + +module.exports = { + contracts: [ + { + contract: avaxContract, + }, + { + contract: ethContract, + }, + { + contract: bscContract, + }, + ], + connections: [ + { + from: ethContract, + to: avaxContract, + config: { + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, + value: 0, + }, + { + msgType: 1, + optionType: ExecutorOptionType.NATIVE_DROP, + amount: 1, + receiver: '0x000000000000000000000000000000000000001', + }, + { + msgType: 1, + optionType: ExecutorOptionType.ORDERED, + }, + ], + }, + }, + ], +}; diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap index 7a8a80f16..d34a91ad1 100644 --- a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap @@ -1,5 +1,43 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`task lz:oapp:config:check should show a standard lzReceive setting for all pathways 1`] = ` +[ + "┌───────────┬───────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┐ +│ from → to │ britney │ vengaboys │ tango │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ britney │ │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬──────────────────────────────────────────┐ │ +│ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ +│ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ └─────────────────┴────────────────────┘ │ │ +│ │ │ └────────────┴──────────────────────────────────────────┘ │ └────────────┴──────────────────────────────────────────┘ │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ vengaboys │ ┌────────────┬──────────────────────────────────────────┐ │ │ ┌────────────┬──────────────────────────────────────────┐ │ +│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ │ └─────────────────┴────────────────────┘ │ │ +│ │ └────────────┴──────────────────────────────────────────┘ │ │ └────────────┴──────────────────────────────────────────┘ │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ tango │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬──────────────────────────────────────────┐ │ │ +│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ +│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ +│ │ └────────────┴──────────────────────────────────────────┘ │ └────────────┴──────────────────────────────────────────┘ │ │ +└───────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘", +] +`; + exports[`task lz:oapp:config:check should show all chains are connected after running wire with three networks 1`] = ` [ "┌───────────┬─────────┬───────────┬───────┐ @@ -78,6 +116,150 @@ exports[`task lz:oapp:config:check should show all chains are not connected expe ] `; +exports[`task lz:oapp:config:check should show different combined enforced options for all pathways 1`] = ` +[ + "┌───────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ from → to │ britney │ vengaboys │ tango │ +├───────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ britney │ │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐ │ │ +│ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ │ gas │ 300000 │ │ │ │ │ │ │ │ │ gas │ 150000 │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤ │ │ +│ │ │ ├────────────┼──────────────────────────────────────────┤ │ │ │ │ lzNativeDropOption │ ┌───┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ +│ │ │ │ msgType: 2 │ ┌─────────────────┬────────────────────┐ │ │ │ │ │ │ │ 0 │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ +│ │ │ │ │ │ lzComposeOption │ ┌───────┬────────┐ │ │ │ │ │ │ │ │ │ │ amount │ 1 │ │ │ │ │ +│ │ │ │ │ │ │ │ index │ 0 │ │ │ │ │ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ │ │ │ +│ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ │ │ │ 1 │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ +│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ │ │ │ amount │ 4 │ │ │ │ │ +│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ +│ │ │ └────────────┴──────────────────────────────────────────┘ │ │ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000003 │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ │ │ │ │ │ │ └───┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ +│ │ │ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ ├────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +│ │ │ │ │ msgType: 2 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ +│ │ │ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ +│ │ │ │ │ │ │ │ │ amount │ 2 │ │ │ │ +│ │ │ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ │ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ │ │ +│ │ │ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ +│ │ │ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ └────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ +├───────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ vengaboys │ ┌────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ ┌────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ +│ │ │ msgType: 1 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ └─────────────────┴────────────────────┘ │ │ +│ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ ├────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +│ │ │ │ │ │ │ amount │ 1 │ │ │ │ │ │ msgType: 2 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ +│ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ +│ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │ │ │ │ │ │ │ │ │ amount │ 1 │ │ │ │ +│ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │ │ │ +│ │ │ │ │ lzComposeOption │ ┌───────┬────────┐ │ │ │ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ +│ │ │ │ │ │ │ index │ 0 │ │ │ │ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ lzComposeOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ │ index │ 0 │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ │ │ │ │ gas │ 200500 │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ value │ 1 │ │ │ │ +│ │ ├────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ msgType: 2 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ └────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ +│ │ │ │ │ │ │ amount │ 2 │ │ │ │ │ │ +│ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ │ │ │ │ +│ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ +│ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ ├────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ │ msgType: 3 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ +│ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ +│ │ │ │ │ │ │ amount │ 2 │ │ │ │ │ │ +│ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ │ │ │ │ +│ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ +│ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ └────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ +├───────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ tango │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ +│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ +│ │ │ │ │ │ │ gas │ 150000 │ │ │ │ │ │ │ │ │ gas │ 200001 │ │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ value │ 1 │ │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ +│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ └────────────┴──────────────────────────────────────────┘ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ +│ │ │ │ │ │ │ │ amount │ 2 │ │ │ │ │ +│ │ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ +│ │ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ │ │ │ +│ │ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ │ │ │ ├────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ +│ │ │ │ │ │ lzComposeOption │ ┌───┬────────────────────┐ │ │ │ │ +│ │ │ │ │ │ │ │ 0 │ ┌───────┬────────┐ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ index │ 0 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ +│ │ │ │ │ │ │ ├───┼────────────────────┤ │ │ │ │ +│ │ │ │ │ │ │ │ 1 │ ┌───────┬────────┐ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ index │ 1 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ gas │ 300000 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ value │ 1 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ +│ │ │ │ │ │ │ └───┴────────────────────┘ │ │ │ │ +│ │ │ │ │ └────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ +│ │ │ └────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ +└───────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘", +] +`; + +exports[`task lz:oapp:config:check should show enforced options for one pathway 1`] = ` +[ + "┌───────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────┬───────┐ +│ from → to │ britney │ vengaboys │ tango │ +├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────┼───────┤ +│ britney │ │ │ │ +├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────┼───────┤ +│ vengaboys │ ┌────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ +│ │ │ msgType: 1 │ ┌──────────────────────────┬───────────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ +│ │ │ │ ├──────────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ │ +│ │ │ │ │ lzNativeDropOption │ ┌──────────┬────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ +│ │ │ │ │ │ │ amount │ 1 │ │ │ │ │ │ +│ │ │ │ │ │ ├──────────┼────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ +│ │ │ │ │ │ │ receiver │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │ │ │ │ │ +│ │ │ │ │ │ └──────────┴────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ +│ │ │ │ ├──────────────────────────┼───────────────────────────────────────────────────────────────────────────────────┤ │ │ │ │ +│ │ │ │ │ lzOrderedExecutionOption │ true │ │ │ │ │ +│ │ │ │ └──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ +│ │ └────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ +├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────┼───────┤ +│ tango │ │ │ │ +└───────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴───────────┴───────┘", +] +`; + exports[`task lz:oapp:config:check should show no chains are connected with two networks 1`] = ` [ "┌───────────┬─────────┬───────────┐ diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/config.check.test.ts b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/config.check.test.ts index bd0e3c7f8..0785c4428 100644 --- a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/config.check.test.ts +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/config.check.test.ts @@ -2,7 +2,11 @@ import hre from 'hardhat' import { resolve } from 'path' import { isFile } from '@layerzerolabs/io-devtools' import { deployOApp } from '../../__utils__/oapp' -import { TASK_LZ_OAPP_CONFIG_CHECK, TASK_LZ_OAPP_WIRE } from '@layerzerolabs/ua-devtools-evm-hardhat' +import { + TASK_LZ_OAPP_CONFIG_CHECK, + TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, + TASK_LZ_OAPP_WIRE, +} from '@layerzerolabs/ua-devtools-evm-hardhat' import { deployEndpoint, setupDefaultEndpoint } from '../../__utils__/endpoint' describe(`task ${TASK_LZ_OAPP_CONFIG_CHECK}`, () => { @@ -60,4 +64,28 @@ describe(`task ${TASK_LZ_OAPP_CONFIG_CHECK}`, () => { await hre.run(TASK_LZ_OAPP_CONFIG_CHECK, { oappConfig }) expect(consoleSpy.mock.lastCall).toMatchSnapshot() }) + + it('should show enforced options for one pathway', async () => { + const consoleSpy = jest.spyOn(console, 'log') + const oappConfig = configPathFixture('valid.multi.network.one.pathway.enforced.options.js') + await hre.run(TASK_LZ_OAPP_WIRE, { oappConfig, ci: true }) + await hre.run(TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, { oappConfig }) + expect(consoleSpy.mock.lastCall).toMatchSnapshot() + }) + + it('should show a standard lzReceive setting for all pathways', async () => { + const consoleSpy = jest.spyOn(console, 'log') + const oappConfig = configPathFixture('valid.multi.network.lzreceive.enforced.options.js') + await hre.run(TASK_LZ_OAPP_WIRE, { oappConfig, ci: true }) + await hre.run(TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, { oappConfig }) + expect(consoleSpy.mock.lastCall).toMatchSnapshot() + }) + + it('should show different combined enforced options for all pathways', async () => { + const consoleSpy = jest.spyOn(console, 'log') + const oappConfig = configPathFixture('valid.multi.network.enforced.options.js') + await hre.run(TASK_LZ_OAPP_WIRE, { oappConfig, ci: true }) + await hre.run(TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, { oappConfig }) + expect(consoleSpy.mock.lastCall).toMatchSnapshot() + }) }) From 178374198e67f2a5008d4788f184f2fd5a722fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lz=2Esir=CE=94rthurmoney=28=29?= Date: Thu, 8 Feb 2024 09:45:44 -0800 Subject: [PATCH 2/3] refactoring logic and updating comments --- .../src/tasks/oapp/enforced.options.get.ts | 64 +++++++------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts index a49c54996..8144e7c2f 100644 --- a/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts +++ b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts @@ -3,7 +3,7 @@ import { task } from 'hardhat/config' import { createLogger, printCrossTable, printRecord, setDefaultLogLevel } from '@layerzerolabs/io-devtools' import { TASK_LZ_OAPP_ENFORCED_OPTIONS_GET } from '@/constants/tasks' import { printLogo } from '@layerzerolabs/io-devtools/swag' -import { OAppOmniGraph } from '@layerzerolabs/ua-devtools' +import { EncodedOption, OAppOmniGraph } from '@layerzerolabs/ua-devtools' import { createConnectedContractFactory, types } from '@layerzerolabs/devtools-evm-hardhat' import { createOAppFactory } from '@layerzerolabs/ua-devtools-evm' import { checkOAppEnforcedOptions } from '@layerzerolabs/ua-devtools' @@ -27,7 +27,7 @@ export const enforcedOptionsGet: ActionType = async ({ oappConfig: oap const logger = createLogger() const graph: OAppOmniGraph = await validateAndTransformOappConfig(oappConfigPath, logger) - // need points for OApp Peer Matrix + // need points for OApp Enforced Option Matrix const points = graph.contracts .map(({ point }) => point) .map((point) => ({ @@ -41,7 +41,7 @@ export const enforcedOptionsGet: ActionType = async ({ oappConfig: oap try { const enforcedOptions = await checkOAppEnforcedOptions(graph, oAppFactory) - const peerNetworkMatrix = points.map((row) => { + const enforcedOptsNetworkMatrix = points.map((row) => { /** * for each point in the network (referred to as 'row'), create a row in the matrix */ @@ -53,15 +53,14 @@ export const enforcedOptionsGet: ActionType = async ({ oappConfig: oap return areVectorsEqual(peer.vector, { from: column, to: row }) }) /** - * update the row with a key-value pair indicating the connection status for the current column + * update the row with a key-value pair indicating the enforced option for the current column */ - const enforcedOptsByMsgType = {} + const enforcedOptsByMsgType: Record = {} if (connection?.enforcedOptions) { - connection.enforcedOptions.forEach((option) => { - let enforcedOpts = {} - if (!isZero(option.options)) { - enforcedOpts = updateEnforcedOptsFromOptions(enforcedOpts, option) - enforcedOptsByMsgType['msgType: ' + option.msgType] = enforcedOpts + connection.enforcedOptions.forEach((encodedEnforcedOpts) => { + if (!isZero(encodedEnforcedOpts.options)) { + enforcedOptsByMsgType['msgType: ' + encodedEnforcedOpts.msgType] = + decodeEnforcedOptions(encodedEnforcedOpts) } }) } @@ -78,7 +77,9 @@ export const enforcedOptionsGet: ActionType = async ({ oappConfig: oap return connectionsForCurrentRow }) - console.log(printCrossTable(peerNetworkMatrix, ['from → to', ...points.map(({ networkName }) => networkName)])) + console.log( + printCrossTable(enforcedOptsNetworkMatrix, ['from → to', ...points.map(({ networkName }) => networkName)]) + ) return enforcedOptions } catch (error) { @@ -87,50 +88,33 @@ export const enforcedOptionsGet: ActionType = async ({ oappConfig: oap } task(TASK_LZ_OAPP_ENFORCED_OPTIONS_GET, 'Outputs table of OApp enforced options using layerzero.config') - .addParam('oappConfig', 'Path to your LayerZero OApp config', './layerzero.config.js', types.string) + .addParam('oappConfig', 'Path to your LayerZero OApp config', undefined, types.string) .addParam('logLevel', 'Logging level. One of: error, warn, info, verbose, debug, silly', 'info', types.logLevel) .setAction(enforcedOptionsGet) /** - * Updates the enforced options object based on the provided encoded enforced options. - * @param enforcedOpts - The enforced options object to update. - * @param option - The encoded enforced options that needs to be decoded to extract enforced options. - * @returns The updated enforced options object. + * Decodes enforced options from the provided encoded enforced options. + * @param {EncodedOption} option - The encoded options. + * @returns {Record} - The decoded enforced options. */ -function updateEnforcedOptsFromOptions(enforcedOpts, option) { +function decodeEnforcedOptions(option: EncodedOption): Record { const fromOptions = Options.fromOptions(option.options) const lzReceiveOption = fromOptions.decodeExecutorLzReceiveOption() const lzNativeDropOption = fromOptions.decodeExecutorNativeDropOption() const lzComposeOption = fromOptions.decodeExecutorComposeOption() const lzOrderedExecutionOption = fromOptions.decodeExecutorOrderedExecutionOption() - enforcedOpts = { - ...enforcedOpts, + return { ...(lzReceiveOption ? { lzReceiveOption } : {}), - ...updateEnforcedOpts(enforcedOpts, 'lzNativeDropOption', lzNativeDropOption), - ...updateEnforcedOpts(enforcedOpts, 'lzComposeOption', lzComposeOption), + ...(lzNativeDropOption.length ? { lzNativeDropOption: headOrEverything(lzNativeDropOption) } : {}), + ...(lzComposeOption.length ? { lzComposeOption: headOrEverything(lzComposeOption) } : {}), ...(lzOrderedExecutionOption ? { lzOrderedExecutionOption } : {}), } - - return enforcedOpts } /** - * Updates the enforced options for better readability. - * @param enforcedOpts - The enforced options object to update. - * @param optionName - The name of the option to update. - * @param optionValue - The value of the option to update. - * @returns The updated enforced options object. + * This is used for better readability in print tables + * If array has length 1, pop from array and return the object + * Else return the array */ -function updateEnforcedOpts(enforcedOpts, optionName, optionValue) { - if (optionValue && optionValue.length === 1) { - // If the option value is defined and has length 1, pop from array and keep as object - return { ...enforcedOpts, [optionName]: optionValue.pop() } - } else if (optionValue && optionValue.length > 1) { - // If the option value exists and has length greater than 1, keep it as an array - return { ...enforcedOpts, [optionName]: [...(enforcedOpts[optionName] || []), ...optionValue] } - } else { - // If the option value is not defined or has length 0, return the original enforcedOpts - return enforcedOpts - } -} +const headOrEverything = (array: T[]): T | T[] => (array.length === 1 ? array[0]! : array) From 7a34aead30badb16ee16dcf76db202196dfd1509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lz=2Esir=CE=94rthurmoney=28=29?= Date: Thu, 8 Feb 2024 10:16:01 -0800 Subject: [PATCH 3/3] updating snap shot test --- ...ulti.network.lzreceive.enforced.options.js | 64 ------------------- .../__snapshots__/config.check.test.ts.snap | 56 +++++++--------- 2 files changed, 23 insertions(+), 97 deletions(-) diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js index a12aa57e4..12b2eeb1b 100644 --- a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js @@ -12,11 +12,6 @@ const avaxContract = { contractName: 'DefaultOApp', }; -const bscContract = { - eid: EndpointId.BSC_V2_MAINNET, - contractName: 'DefaultOApp', -}; - module.exports = { contracts: [ { @@ -25,9 +20,6 @@ module.exports = { { contract: ethContract, }, - { - contract: bscContract, - }, ], connections: [ { @@ -44,20 +36,6 @@ module.exports = { ], }, }, - { - from: ethContract, - to: bscContract, - config: { - enforcedOptions: [ - { - msgType: 1, - optionType: ExecutorOptionType.LZ_RECEIVE, - gas: 200000, - value: 0, - }, - ], - }, - }, { from: avaxContract, to: ethContract, @@ -72,47 +50,5 @@ module.exports = { ], }, }, - { - from: avaxContract, - to: bscContract, - config: { - enforcedOptions: [ - { - msgType: 1, - optionType: ExecutorOptionType.LZ_RECEIVE, - gas: 200000, - value: 0, - }, - ], - }, - }, - { - from: bscContract, - to: ethContract, - config: { - enforcedOptions: [ - { - msgType: 1, - optionType: ExecutorOptionType.LZ_RECEIVE, - gas: 200000, - value: 0, - }, - ], - }, - }, - { - from: bscContract, - to: avaxContract, - config: { - enforcedOptions: [ - { - msgType: 1, - optionType: ExecutorOptionType.LZ_RECEIVE, - gas: 200000, - value: 0, - }, - ], - }, - }, ], }; diff --git a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap index d34a91ad1..1e95d513d 100644 --- a/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__snapshots__/config.check.test.ts.snap @@ -2,39 +2,29 @@ exports[`task lz:oapp:config:check should show a standard lzReceive setting for all pathways 1`] = ` [ - "┌───────────┬───────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┐ -│ from → to │ britney │ vengaboys │ tango │ -├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ -│ britney │ │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬──────────────────────────────────────────┐ │ -│ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ -│ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ -│ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ -│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ -│ │ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ -│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ -│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ └─────────────────┴────────────────────┘ │ │ -│ │ │ └────────────┴──────────────────────────────────────────┘ │ └────────────┴──────────────────────────────────────────┘ │ -├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ -│ vengaboys │ ┌────────────┬──────────────────────────────────────────┐ │ │ ┌────────────┬──────────────────────────────────────────┐ │ -│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ -│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ -│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ -│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ -│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ -│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ -│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ │ └─────────────────┴────────────────────┘ │ │ -│ │ └────────────┴──────────────────────────────────────────┘ │ │ └────────────┴──────────────────────────────────────────┘ │ -├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ -│ tango │ ┌────────────┬──────────────────────────────────────────┐ │ ┌────────────┬──────────────────────────────────────────┐ │ │ -│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ -│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ -│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ -│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ -│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ │ │ │ │ value │ 0 │ │ │ │ │ -│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ │ │ │ └───────┴────────┘ │ │ │ │ -│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ │ └─────────────────┴────────────────────┘ │ │ │ -│ │ └────────────┴──────────────────────────────────────────┘ │ └────────────┴──────────────────────────────────────────┘ │ │ -└───────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘", + "┌───────────┬───────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┐ +│ from → to │ britney │ vengaboys │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ britney │ │ ┌────────────┬──────────────────────────────────────────┐ │ +│ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ +│ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ +│ │ │ └────────────┴──────────────────────────────────────────┘ │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ vengaboys │ ┌────────────┬──────────────────────────────────────────┐ │ │ +│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ +│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ +│ │ └────────────┴──────────────────────────────────────────┘ │ │ +└───────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘", ] `;