From 29f310d60a19c41650085b982a294dff461ad9d3 Mon Sep 17 00:00:00 2001 From: Ulisses Ferreira Date: Fri, 31 Jul 2026 00:55:38 +0100 Subject: [PATCH 1/2] feat: add SNAP_OWNED_ASSETS and isSnapOwnedAsset Co-authored-by: Cursor --- .../src/clients/price-api/PriceApiClient.ts | 4 +-- .../src/clients/token-api/TokenApiClient.ts | 4 +-- .../tron-wallet-snap/src/constants/index.ts | 7 ++-- .../services/assets/snapOwnedAssets.test.ts | 32 +++++++++++++++++++ .../src/services/assets/snapOwnedAssets.ts | 18 +++++++++++ 5 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts create mode 100644 packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.ts diff --git a/packages/tron-wallet-snap/src/clients/price-api/PriceApiClient.ts b/packages/tron-wallet-snap/src/clients/price-api/PriceApiClient.ts index 4f42f0b8..4f7a92d0 100644 --- a/packages/tron-wallet-snap/src/clients/price-api/PriceApiClient.ts +++ b/packages/tron-wallet-snap/src/clients/price-api/PriceApiClient.ts @@ -7,7 +7,7 @@ import { mapKeys } from 'lodash'; import type { ICache } from '../../caching/ICache'; import { useCache } from '../../caching/useCache'; -import { SPECIAL_ASSETS } from '../../constants'; +import { SNAP_OWNED_ASSETS } from '../../constants'; import type { ConfigProvider } from '../../services/config'; import { buildUrl } from '../../utils/buildUrl'; import type { ILogger } from '../../utils/logger'; @@ -257,7 +257,7 @@ export class PriceApiClient { assert(vsCurrency, VsCurrencyParamStruct); const filteredTokens = tokenCaip19Types.filter( - (tokenCaip19Type) => !SPECIAL_ASSETS.includes(tokenCaip19Type), + (tokenCaip19Type) => !SNAP_OWNED_ASSETS.includes(tokenCaip19Type), ); return this.#getMultipleSpotPrices_CACHE(filteredTokens, vsCurrency); diff --git a/packages/tron-wallet-snap/src/clients/token-api/TokenApiClient.ts b/packages/tron-wallet-snap/src/clients/token-api/TokenApiClient.ts index 0d3c1c93..b40710fc 100644 --- a/packages/tron-wallet-snap/src/clients/token-api/TokenApiClient.ts +++ b/packages/tron-wallet-snap/src/clients/token-api/TokenApiClient.ts @@ -3,7 +3,7 @@ import { array, assert } from '@metamask/superstruct'; import type { Infer } from '@metamask/superstruct'; import { CaipAssetTypeStruct, parseCaipAssetType } from '@metamask/utils'; -import { Network, SPECIAL_ASSETS } from '../../constants'; +import { Network, SNAP_OWNED_ASSETS } from '../../constants'; import type { TokenCaipAssetType } from '../../services/assets/types'; import { TokenCaipAssetTypeStruct } from '../../services/assets/types'; import type { ConfigProvider } from '../../services/config'; @@ -94,7 +94,7 @@ export class TokenApiClient { * Exclude TRON resource tokens (energy and bandwidth), staked tokens, and tokens not from supported networks. */ const supportedAssetTypes = assetTypes.filter((assetType) => { - if (SPECIAL_ASSETS.includes(assetType)) { + if (SNAP_OWNED_ASSETS.includes(assetType)) { return false; } const { chainId } = parseCaipAssetType(assetType); diff --git a/packages/tron-wallet-snap/src/constants/index.ts b/packages/tron-wallet-snap/src/constants/index.ts index 9efe87a6..c6339e1f 100644 --- a/packages/tron-wallet-snap/src/constants/index.ts +++ b/packages/tron-wallet-snap/src/constants/index.ts @@ -388,7 +388,7 @@ export const Networks = { }, } as const; -export const SPECIAL_ASSETS: string[] = [ +export const SNAP_OWNED_ASSETS: string[] = [ KnownCaip19Id.TrxStakedForBandwidthMainnet, KnownCaip19Id.TrxStakedForBandwidthNile, KnownCaip19Id.TrxStakedForBandwidthShasta, @@ -418,9 +418,12 @@ export const SPECIAL_ASSETS: string[] = [ KnownCaip19Id.MaximumEnergyShasta, ]; +/** @deprecated Use {@link SNAP_OWNED_ASSETS} instead. */ +export const SPECIAL_ASSETS = SNAP_OWNED_ASSETS; + export const ESSENTIAL_ASSETS: string[] = [ KnownCaip19Id.TrxMainnet, KnownCaip19Id.TrxNile, KnownCaip19Id.TrxShasta, - ...SPECIAL_ASSETS, + ...SNAP_OWNED_ASSETS, ]; diff --git a/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts new file mode 100644 index 00000000..4de55df5 --- /dev/null +++ b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts @@ -0,0 +1,32 @@ +import { + KnownCaip19Id, + SNAP_OWNED_ASSETS, +} from '../../constants'; +import { isSnapOwnedAsset } from './snapOwnedAssets'; + +describe('isSnapOwnedAsset', () => { + it.each(SNAP_OWNED_ASSETS)('returns true for snap-owned asset %s', (assetId) => { + expect(isSnapOwnedAsset(assetId)).toBe(true); + }); + + it('returns false for native TRX', () => { + expect(isSnapOwnedAsset(KnownCaip19Id.TrxMainnet)).toBe(false); + expect(isSnapOwnedAsset(KnownCaip19Id.TrxNile)).toBe(false); + expect(isSnapOwnedAsset(KnownCaip19Id.TrxShasta)).toBe(false); + }); + + it('returns false for TRC20 tokens', () => { + expect(isSnapOwnedAsset(KnownCaip19Id.UsdtMainnet)).toBe(false); + expect( + isSnapOwnedAsset( + `${KnownCaip19Id.TrxMainnet.split('/')[0]}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`, + ), + ).toBe(false); + }); + + it('returns false for TRC10 tokens', () => { + expect( + isSnapOwnedAsset(`${KnownCaip19Id.TrxMainnet.split('/')[0]}/trc10:1002000`), + ).toBe(false); + }); +}); diff --git a/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.ts b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.ts new file mode 100644 index 00000000..c8d44a17 --- /dev/null +++ b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.ts @@ -0,0 +1,18 @@ +import { SNAP_OWNED_ASSETS } from '../../constants'; + +const SNAP_OWNED_ASSET_IDS = new Set(SNAP_OWNED_ASSETS); + +/** + * Returns whether an asset remains exclusively managed by the Snap. + * + * AssetsController does not persist certain Tron protocol assets, including + * staking positions and account resources. These assets must always be read, + * synchronized, persisted, and published by the Snap, regardless of the + * assets migration stage. + * + * @param assetId - CAIP-19 asset ID. + * @returns Whether the asset is exclusively managed by the Snap. + */ +export function isSnapOwnedAsset(assetId: string): boolean { + return SNAP_OWNED_ASSET_IDS.has(assetId); +} From 721da6f65debb31489e768a6657a49d83428ac1c Mon Sep 17 00:00:00 2001 From: Ulisses Ferreira Date: Fri, 31 Jul 2026 23:22:14 +0100 Subject: [PATCH 2/2] style(tron-wallet-snap): format snapOwnedAssets test Align test file formatting with lint:misc:check expectations. --- .../services/assets/snapOwnedAssets.test.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts index 4de55df5..84a8b4ee 100644 --- a/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts +++ b/packages/tron-wallet-snap/src/services/assets/snapOwnedAssets.test.ts @@ -1,13 +1,13 @@ -import { - KnownCaip19Id, - SNAP_OWNED_ASSETS, -} from '../../constants'; +import { KnownCaip19Id, SNAP_OWNED_ASSETS } from '../../constants'; import { isSnapOwnedAsset } from './snapOwnedAssets'; describe('isSnapOwnedAsset', () => { - it.each(SNAP_OWNED_ASSETS)('returns true for snap-owned asset %s', (assetId) => { - expect(isSnapOwnedAsset(assetId)).toBe(true); - }); + it.each(SNAP_OWNED_ASSETS)( + 'returns true for snap-owned asset %s', + (assetId) => { + expect(isSnapOwnedAsset(assetId)).toBe(true); + }, + ); it('returns false for native TRX', () => { expect(isSnapOwnedAsset(KnownCaip19Id.TrxMainnet)).toBe(false); @@ -26,7 +26,9 @@ describe('isSnapOwnedAsset', () => { it('returns false for TRC10 tokens', () => { expect( - isSnapOwnedAsset(`${KnownCaip19Id.TrxMainnet.split('/')[0]}/trc10:1002000`), + isSnapOwnedAsset( + `${KnownCaip19Id.TrxMainnet.split('/')[0]}/trc10:1002000`, + ), ).toBe(false); }); });