diff --git a/modules/statics/src/coins.ts b/modules/statics/src/coins.ts index 1686e7ce42..36c0a2d5e6 100644 --- a/modules/statics/src/coins.ts +++ b/modules/statics/src/coins.ts @@ -34,7 +34,7 @@ import { BaseCoin, CoinFeature, DynamicCoin } from './base'; import { AmsNetworkConfigMap, AmsTokenConfig, TrimmedAmsTokenConfig } from './tokenConfig'; import { CoinMap } from './map'; import { BaseNetwork, getNetwork, getNetworksMap, NetworkType } from './networks'; -import { networkFeatureMapForTokens } from './networkFeatureMapForTokens'; +import { getNetworkFeatures } from './networkFeatureMapForTokens'; import { ofcErc20Coins, tOfcErc20Coins } from './coins/ofcErc20Coins'; import { ofcCoins } from './coins/ofcCoins'; import { allCoinsAndTokens } from './allCoinsAndTokens'; @@ -117,6 +117,18 @@ export function createToken(token: AmsTokenConfig): Readonly | undefin ton: jettonToken, }; + // EVM-compatible chains are identified by a numeric chainId on their network object. + const tokenNetwork = token.network instanceof BaseNetwork ? token.network : undefined; + if ( + tokenNetwork && + 'chainId' in tokenNetwork && + typeof (tokenNetwork as { chainId?: unknown }).chainId === 'number' + ) { + if (!erc20ChainToNameMap[token.family]) { + erc20ChainToNameMap[token.family] = token.family; + } + } + // dynamically add erc20 token initializers for eth like chains to the initializer map Object.keys(erc20ChainToNameMap).forEach((key) => { initializerMap[key] = erc20Token; @@ -519,9 +531,9 @@ export function createTokenMapUsingTrimmedConfigDetails( { ...tokenConfig, features: tokenConfig.additionalFeatures ?? [], network }, ]; } - } else if (network && networkFeatureMapForTokens[network.family]) { + } else if (network && getNetworkFeatures(network.family as string)) { const features = new Set([ - ...(networkFeatureMapForTokens[network.family] || []), + ...(getNetworkFeatures(network.family as string) || []), ...(tokenConfig.additionalFeatures || []), ]); tokenConfig.excludedFeatures?.forEach((feature) => features.delete(feature)); @@ -549,9 +561,9 @@ export function createTokenUsingTrimmedConfigDetails( return undefined; } - if (network && networkFeatureMapForTokens[network.family]) { + if (network && getNetworkFeatures(network.family as string)) { const features = new Set([ - ...(networkFeatureMapForTokens[network.family] || []), + ...(getNetworkFeatures(network.family as string) || []), ...(tokenConfig.additionalFeatures || []), ]); tokenConfig.excludedFeatures?.forEach((feature) => features.delete(feature)); diff --git a/modules/statics/src/index.ts b/modules/statics/src/index.ts index 243d3e5a90..2adb89bfda 100644 --- a/modules/statics/src/index.ts +++ b/modules/statics/src/index.ts @@ -37,7 +37,7 @@ export { CantonToken, } from './account'; export { CoinMap } from './map'; -export { networkFeatureMapForTokens } from './networkFeatureMapForTokens'; +export { networkFeatureMapForTokens, registerNetworkFeatures, getNetworkFeatures } from './networkFeatureMapForTokens'; export { generateErc20Coin, generateTestErc20Coin, diff --git a/modules/statics/src/networkFeatureMapForTokens.ts b/modules/statics/src/networkFeatureMapForTokens.ts index a48e0ae94d..ec4fcfc1a0 100644 --- a/modules/statics/src/networkFeatureMapForTokens.ts +++ b/modules/statics/src/networkFeatureMapForTokens.ts @@ -13,6 +13,22 @@ import { TAO_TOKEN_FEATURES, } from './coinFeatures'; +const dynamicNetworkFeaturesMap = new Map(); + +/** Register default token features for a dynamically onboarded chain family. */ +export function registerNetworkFeatures(family: string, features: CoinFeature[]): void { + dynamicNetworkFeaturesMap.set(family, features); +} + +/** + * Look up token features for a family. + * Checks static map first, then falls back to dynamic map. + * Returns undefined if the family is not registered in either map. + */ +export function getNetworkFeatures(family: string): CoinFeature[] | undefined { + return networkFeatureMapForTokens[family as CoinFamily] ?? dynamicNetworkFeaturesMap.get(family); +} + export const networkFeatureMapForTokens: Partial> = { algo: AccountCoin.DEFAULT_FEATURES, apt: APT_FEATURES,