From 010dc98942afb636066cb4c27b769fe74bed1bd0 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 30 Jan 2025 16:11:50 +0100 Subject: [PATCH 1/4] refactor: Improve address filtering in contracts utility --- typescript/sdk/src/contracts/contracts.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/typescript/sdk/src/contracts/contracts.ts b/typescript/sdk/src/contracts/contracts.ts index df235c7e3f..9ddfea9d60 100644 --- a/typescript/sdk/src/contracts/contracts.ts +++ b/typescript/sdk/src/contracts/contracts.ts @@ -58,9 +58,12 @@ export function filterAddressesMap( factories: F, ): HyperlaneAddressesMap { const factoryKeys = Object.keys(factories); - // Filter out addresses that we do not have factories for + // Filter out addresses that we do not have factories for and remove undefined values const pickedAddressesMap = objMap(addressesMap, (_, addresses) => - pick(addresses, factoryKeys), + objFilter( + pick(addresses, factoryKeys), + (_, value): value is Address => value !== undefined, + ), ); // Filter out chains for which we do not have a complete set of addresses return objFilter( From 1b6b1a9d3e61f331c5028af5a9367cc0eadcd727 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Thu, 30 Jan 2025 16:14:15 +0100 Subject: [PATCH 2/4] docs(changeset): Fix contract address filtering to remove undefined factory addresses from the addresses map --- .changeset/late-fishes-end.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/late-fishes-end.md diff --git a/.changeset/late-fishes-end.md b/.changeset/late-fishes-end.md new file mode 100644 index 0000000000..1fe798f3cf --- /dev/null +++ b/.changeset/late-fishes-end.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': patch +--- + +Fix contract address filtering to remove undefined factory addresses from the addresses map From 0e6b269290ed0af8a2a416fc08e49ff229a481c0 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 31 Jan 2025 14:00:35 +0100 Subject: [PATCH 3/4] feat: Improve factory contract address handling with logging and zero address fallback --- typescript/sdk/src/contracts/contracts.ts | 36 ++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/typescript/sdk/src/contracts/contracts.ts b/typescript/sdk/src/contracts/contracts.ts index 9ddfea9d60..7a6c30b720 100644 --- a/typescript/sdk/src/contracts/contracts.ts +++ b/typescript/sdk/src/contracts/contracts.ts @@ -1,4 +1,4 @@ -import { Contract } from 'ethers'; +import { Contract, constants } from 'ethers'; import { Ownable, Ownable__factory } from '@hyperlane-xyz/core'; import { @@ -12,6 +12,7 @@ import { objMap, pick, promiseObjAll, + rootLogger, } from '@hyperlane-xyz/utils'; import { ChainMetadataManager } from '../metadata/ChainMetadataManager.js'; @@ -58,16 +59,37 @@ export function filterAddressesMap( factories: F, ): HyperlaneAddressesMap { const factoryKeys = Object.keys(factories); - // Filter out addresses that we do not have factories for and remove undefined values + // Filter out addresses that we do not have factories for const pickedAddressesMap = objMap(addressesMap, (_, addresses) => - objFilter( - pick(addresses, factoryKeys), - (_, value): value is Address => value !== undefined, - ), + pick(addresses, factoryKeys), + ); + + let chainWithMissingAddresses = ''; + const filledAddressesMap = objMap( + pickedAddressesMap, + (chainName, addresses) => + objMap(addresses, (key, value) => { + if (value === undefined) { + rootLogger.warn( + `Missing address for contract "${key}" on chain ${chainName}`, + ); + chainWithMissingAddresses = chainName; + return constants.AddressZero; + } + return value; + }), ); + // Add summary warning if any addresses were missing + if (chainWithMissingAddresses) { + rootLogger.warn( + `\nWarning: Core deployment incomplete for chain: ${chainWithMissingAddresses}. ` + + `Please run 'core deploy' again for this chain to fix the deployment.\n`, + ); + } + // Filter out chains for which we do not have a complete set of addresses return objFilter( - pickedAddressesMap, + filledAddressesMap, (_, addresses): addresses is HyperlaneAddresses => { return Object.keys(addresses).every((a) => factoryKeys.includes(a)); }, From 7276d7ae205c7babb0f6aa7f56bf4f7aaebf8ec8 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 31 Jan 2025 15:54:37 +0100 Subject: [PATCH 4/4] refactor: Improve missing contract address logging and handling --- typescript/sdk/src/contracts/contracts.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/typescript/sdk/src/contracts/contracts.ts b/typescript/sdk/src/contracts/contracts.ts index 7a6c30b720..ee79bc1e0b 100644 --- a/typescript/sdk/src/contracts/contracts.ts +++ b/typescript/sdk/src/contracts/contracts.ts @@ -64,26 +64,28 @@ export function filterAddressesMap( pick(addresses, factoryKeys), ); - let chainWithMissingAddresses = ''; + const chainsWithMissingAddresses = new Set(); const filledAddressesMap = objMap( pickedAddressesMap, (chainName, addresses) => objMap(addresses, (key, value) => { - if (value === undefined) { + if (!value) { rootLogger.warn( `Missing address for contract "${key}" on chain ${chainName}`, ); - chainWithMissingAddresses = chainName; + chainsWithMissingAddresses.add(chainName); return constants.AddressZero; } return value; }), ); // Add summary warning if any addresses were missing - if (chainWithMissingAddresses) { + if (chainsWithMissingAddresses.size > 0) { rootLogger.warn( - `\nWarning: Core deployment incomplete for chain: ${chainWithMissingAddresses}. ` + - `Please run 'core deploy' again for this chain to fix the deployment.\n`, + `Warning: Core deployment incomplete for chain(s): ${Array.from( + chainsWithMissingAddresses, + ).join(', ')}. ` + + `Please run 'core deploy' again for these chains to fix the deployment.`, ); }