From 1c014c2a8cd03c42a2bc6ff870917972956c69fe Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 9 Jan 2026 13:15:16 +0000 Subject: [PATCH 1/3] Update token service to include RWA data in API requests - Modified token service URLs to append `includeRwaData=true` for fetching token data. - Updated related test cases to reflect the new API request structure. - Adjusted `TokenListController` to support RWA data in token list retrieval. This change enhances the token service functionality by allowing the inclusion of RWA data in the responses, improving the overall data richness for consumers. --- .../assets-controllers/src/TokenListController.test.ts | 2 +- packages/assets-controllers/src/TokenListController.ts | 8 +++++--- packages/assets-controllers/src/token-service.test.ts | 10 +++++----- packages/assets-controllers/src/token-service.ts | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/assets-controllers/src/TokenListController.test.ts b/packages/assets-controllers/src/TokenListController.test.ts index b6a03aa7b52..1db82bd2ed4 100644 --- a/packages/assets-controllers/src/TokenListController.test.ts +++ b/packages/assets-controllers/src/TokenListController.test.ts @@ -1366,5 +1366,5 @@ describe('TokenListController', () => { function getTokensPath(chainId: Hex) { return `/tokens/${convertHexToDecimal( chainId, - )}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`; + )}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`; } diff --git a/packages/assets-controllers/src/TokenListController.ts b/packages/assets-controllers/src/TokenListController.ts index 6ee57c476bb..216cace42b9 100644 --- a/packages/assets-controllers/src/TokenListController.ts +++ b/packages/assets-controllers/src/TokenListController.ts @@ -19,10 +19,11 @@ import { formatAggregatorNames, formatIconUrlWithProxy, } from './assetsUtil'; -import { fetchTokenListByChainId } from './token-service'; +import { TokenRwaData, fetchTokenListByChainId } from './token-service'; -const DEFAULT_INTERVAL = 24 * 60 * 60 * 1000; -const DEFAULT_THRESHOLD = 24 * 60 * 60 * 1000; +// 4 Hour Interval Cache Refresh Threshold +const DEFAULT_INTERVAL = 4 * 60 * 60 * 1000; +const DEFAULT_THRESHOLD = 4 * 60 * 60 * 1000; const name = 'TokenListController'; @@ -34,6 +35,7 @@ export type TokenListToken = { occurrences: number; aggregators: string[]; iconUrl: string; + rwaData?: TokenRwaData; }; export type TokenListMap = Record; diff --git a/packages/assets-controllers/src/token-service.test.ts b/packages/assets-controllers/src/token-service.test.ts index 1d06f437e4a..37f899b9b97 100644 --- a/packages/assets-controllers/src/token-service.test.ts +++ b/packages/assets-controllers/src/token-service.test.ts @@ -293,7 +293,7 @@ describe('Token service', () => { const { signal } = new AbortController(); nock(TOKEN_END_POINT_API) .get( - `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) .reply(200, sampleTokenList) .persist(); @@ -310,7 +310,7 @@ describe('Token service', () => { nock(TOKEN_END_POINT_API) .get( - `/tokens/${lineaChainId}?occurrenceFloor=1&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${lineaChainId}?occurrenceFloor=1&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) .reply(200, sampleTokenListLinea) .persist(); @@ -324,7 +324,7 @@ describe('Token service', () => { const abortController = new AbortController(); nock(TOKEN_END_POINT_API) .get( - `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) // well beyond time it will take to abort .delay(ONE_SECOND_IN_MILLISECONDS) @@ -344,7 +344,7 @@ describe('Token service', () => { const { signal } = new AbortController(); nock(TOKEN_END_POINT_API) .get( - `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) .replyWithError('Example network error') .persist(); @@ -358,7 +358,7 @@ describe('Token service', () => { const { signal } = new AbortController(); nock(TOKEN_END_POINT_API) .get( - `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) .reply(500) .persist(); diff --git a/packages/assets-controllers/src/token-service.ts b/packages/assets-controllers/src/token-service.ts index 3048b9bbcbb..e5aa5722fe9 100644 --- a/packages/assets-controllers/src/token-service.ts +++ b/packages/assets-controllers/src/token-service.ts @@ -23,7 +23,7 @@ function getTokensURL(chainId: Hex): string { return `${TOKEN_END_POINT_API}/tokens/${convertHexToDecimal( chainId, - )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`; + )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`; } /** From cfb24ed68f7778740fb53e1494bebaa14ce17cf6 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 9 Jan 2026 13:19:26 +0000 Subject: [PATCH 2/3] docs: update changelog --- packages/assets-controllers/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/assets-controllers/CHANGELOG.md b/packages/assets-controllers/CHANGELOG.md index 7e5c7bd81ac..9edd0a7d622 100644 --- a/packages/assets-controllers/CHANGELOG.md +++ b/packages/assets-controllers/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add RWA (Real World Assets) data support for token metadata endpoint ([#7595](https://github.com/MetaMask/core/pull/7595)) + - Update token service to include RWA data in API requests by appending `includeRwaData=true` parameter to token list API calls + - `TokenListController` now includes `rwaData` optional field in `TokenListToken` type to support RWA data in token list retrieval + - Reduced `TokenListController` cache time from 24hrs to 4hrs. + ### Changed - Bump `@metamask/multichain-account-service` from `^4.1.0` to `^5.0.0` ([#7594](https://github.com/MetaMask/core/pull/7594)) From cb897e9b9c5f9f580c5d9b944482acb6a430ccb3 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Fri, 9 Jan 2026 13:30:41 +0000 Subject: [PATCH 3/3] test: update tests --- packages/assets-controllers/src/token-service.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/assets-controllers/src/token-service.test.ts b/packages/assets-controllers/src/token-service.test.ts index 37f899b9b97..00f48428193 100644 --- a/packages/assets-controllers/src/token-service.test.ts +++ b/packages/assets-controllers/src/token-service.test.ts @@ -372,7 +372,7 @@ describe('Token service', () => { const { signal } = new AbortController(); nock(TOKEN_END_POINT_API) .get( - `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`, + `/tokens/${sampleDecimalChainId}?occurrenceFloor=3&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false&includeRwaData=true`, ) // well beyond timeout .delay(ONE_SECOND_IN_MILLISECONDS)