From 550431d41b6d786a33110b49f780f7e1a67fc26f Mon Sep 17 00:00:00 2001 From: Maxime OUAIRY Date: Fri, 5 Jun 2026 07:22:10 +0200 Subject: [PATCH] feat: deduplicate USDC token on ARC mainnet --- .../src/AssetsController.test.ts | 6 ++---- packages/assets-controller/src/defaults.ts | 19 +++++++++++++++++++ packages/controller-utils/src/constants.ts | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/assets-controller/src/AssetsController.test.ts b/packages/assets-controller/src/AssetsController.test.ts index dc87406633..9865f69dbc 100644 --- a/packages/assets-controller/src/AssetsController.test.ts +++ b/packages/assets-controller/src/AssetsController.test.ts @@ -28,7 +28,7 @@ import type { DataResponse, FungibleAssetMetadata, } from './types'; -import { formatExchangeRatesForBridge } from './utils'; +import { formatExchangeRatesForBridge, normalizeAssetId } from './utils'; jest.mock('./utils', () => { const actual = jest.requireActual('./utils'); @@ -269,12 +269,10 @@ describe('AssetsController', () => { const defaultState = getDefaultAssetsControllerState(); const assetIds = Object.keys(defaultState.assetsInfo); expect(assetIds.length).toBeGreaterThan(0); - // Every erc20 asset ID must contain at least one uppercase hex letter - // (EIP-55 checksum property) so that keys match normalizeAssetId output. const erc20Ids = assetIds.filter((id) => id.includes('/erc20:')); expect(erc20Ids.length).toBeGreaterThan(0); for (const id of erc20Ids) { - expect(id).toMatch(/\/erc20:0x[0-9a-fA-F]*[A-F][0-9a-fA-F]*/u); + expect(id).toBe(normalizeAssetId(id as Caip19AssetId)); } }); }); diff --git a/packages/assets-controller/src/defaults.ts b/packages/assets-controller/src/defaults.ts index edb5be687b..576fe588ba 100644 --- a/packages/assets-controller/src/defaults.ts +++ b/packages/assets-controller/src/defaults.ts @@ -31,6 +31,23 @@ const MUSD_METADATA: FungibleAssetMetadata = { decimals: 6, }; +/** + * Harcoded metadata for USDC on Arc (5042/0x13b2). + * USDC exists as both native (18 decimals) and ERC20 (6 decimals). + * We choose to force-hide the native version to avoid double listing using + * `CHAIN_IDS_WITH_NO_NATIVE_TOKEN`. + * In the meantime, the code below force-shows USDC the ERC20 token. + */ +const USDC_ON_ARC_ASSET_ID = + 'eip155:5042/erc20:0x3600000000000000000000000000000000000000'; + +const USDC_ON_ARC_METADATA: FungibleAssetMetadata = { + type: 'erc20', + symbol: 'USDC', + name: 'USDC', + decimals: 6, +}; + /** * Build the CAIP-19 asset ID for the mUSD ERC-20 token on a given EVM * chain. @@ -59,6 +76,7 @@ export const DEFAULT_TRACKED_ASSETS_BY_CHAIN: ReadonlyMap< ['eip155:1' as ChainId, [musdAssetId('eip155:1' as ChainId)]], ['eip155:59144' as ChainId, [musdAssetId('eip155:59144' as ChainId)]], ['eip155:143' as ChainId, [musdAssetId('eip155:143' as ChainId)]], + ['eip155:5042' as ChainId, [USDC_ON_ARC_ASSET_ID]], ]); /** @@ -79,6 +97,7 @@ export const DEFAULT_ASSET_METADATA: ReadonlyMap = [musdAssetId('eip155:1' as ChainId), MUSD_METADATA], [musdAssetId('eip155:59144' as ChainId), MUSD_METADATA], [musdAssetId('eip155:143' as ChainId), MUSD_METADATA], + [USDC_ON_ARC_ASSET_ID, USDC_ON_ARC_METADATA], ]); /** diff --git a/packages/controller-utils/src/constants.ts b/packages/controller-utils/src/constants.ts index 99f23aa72d..b8a1d16894 100644 --- a/packages/controller-utils/src/constants.ts +++ b/packages/controller-utils/src/constants.ts @@ -336,4 +336,5 @@ export const DAYS = DAY; export const CHAIN_IDS_WITH_NO_NATIVE_TOKEN = [ 'eip155:42431', // Tempo Testnet 'eip155:4217', // Tempo Mainnet + 'eip155:5042', // Arc Mainnet ] as const;