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..8144e7c2f --- /dev/null +++ b/packages/ua-devtools-evm-hardhat/src/tasks/oapp/enforced.options.get.ts @@ -0,0 +1,120 @@ +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 { 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' +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 Enforced Option 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 enforcedOptsNetworkMatrix = 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 enforced option for the current column + */ + const enforcedOptsByMsgType: Record = {} + if (connection?.enforcedOptions) { + connection.enforcedOptions.forEach((encodedEnforcedOpts) => { + if (!isZero(encodedEnforcedOpts.options)) { + enforcedOptsByMsgType['msgType: ' + encodedEnforcedOpts.msgType] = + decodeEnforcedOptions(encodedEnforcedOpts) + } + }) + } + + return { + ...tableRow, + [column.networkName]: printRecord(enforcedOptsByMsgType), + } + }, {}) + + /** + * return the row representing connections for the current 'row' + */ + return connectionsForCurrentRow + }) + + console.log( + printCrossTable(enforcedOptsNetworkMatrix, ['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', undefined, types.string) + .addParam('logLevel', 'Logging level. One of: error, warn, info, verbose, debug, silly', 'info', types.logLevel) + .setAction(enforcedOptionsGet) + +/** + * Decodes enforced options from the provided encoded enforced options. + * @param {EncodedOption} option - The encoded options. + * @returns {Record} - The decoded enforced options. + */ +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() + + return { + ...(lzReceiveOption ? { lzReceiveOption } : {}), + ...(lzNativeDropOption.length ? { lzNativeDropOption: headOrEverything(lzNativeDropOption) } : {}), + ...(lzComposeOption.length ? { lzComposeOption: headOrEverything(lzComposeOption) } : {}), + ...(lzOrderedExecutionOption ? { lzOrderedExecutionOption } : {}), + } +} + +/** + * 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 + */ +const headOrEverything = (array: T[]): T | T[] => (array.length === 1 ? array[0]! : array) 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..12b2eeb1b --- /dev/null +++ b/tests/ua-devtools-evm-hardhat-test/test/task/oapp/__data__/configs/valid.multi.network.lzreceive.enforced.options.js @@ -0,0 +1,54 @@ +// 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', +}; + +module.exports = { + contracts: [ + { + contract: avaxContract, + }, + { + contract: ethContract, + }, + ], + connections: [ + { + from: ethContract, + to: avaxContract, + 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, + }, + ], + }, + }, + ], +}; 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..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 @@ -1,5 +1,33 @@ // 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 │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ britney │ │ ┌────────────┬──────────────────────────────────────────┐ │ +│ │ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ +│ │ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ +│ │ │ │ │ │ │ │ gas │ 200000 │ │ │ │ +│ │ │ │ │ │ │ ├───────┼────────┤ │ │ │ +│ │ │ │ │ │ │ │ value │ 0 │ │ │ │ +│ │ │ │ │ │ │ └───────┴────────┘ │ │ │ +│ │ │ │ │ └─────────────────┴────────────────────┘ │ │ +│ │ │ └────────────┴──────────────────────────────────────────┘ │ +├───────────┼───────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤ +│ vengaboys │ ┌────────────┬──────────────────────────────────────────┐ │ │ +│ │ │ msgType: 1 │ ┌─────────────────┬────────────────────┐ │ │ │ +│ │ │ │ │ lzReceiveOption │ ┌───────┬────────┐ │ │ │ │ +│ │ │ │ │ │ │ gas │ 200000 │ │ │ │ │ +│ │ │ │ │ │ ├───────┼────────┤ │ │ │ │ +│ │ │ │ │ │ │ value │ 0 │ │ │ │ │ +│ │ │ │ │ │ └───────┴────────┘ │ │ │ │ +│ │ │ │ └─────────────────┴────────────────────┘ │ │ │ +│ │ └────────────┴──────────────────────────────────────────┘ │ │ +└───────────┴───────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘", +] +`; + exports[`task lz:oapp:config:check should show all chains are connected after running wire with three networks 1`] = ` [ "┌───────────┬─────────┬───────────┬───────┐ @@ -78,6 +106,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() + }) })