diff --git a/packages/snap-networks-utils/src/index.ts b/packages/snap-networks-utils/src/index.ts index 0c64eef3..c1a690d1 100644 --- a/packages/snap-networks-utils/src/index.ts +++ b/packages/snap-networks-utils/src/index.ts @@ -3,14 +3,9 @@ export { createPrefixedLogger, logger, noOpLogger } from './logger'; export { AssetsService } from './services/assets/AssetsService'; export { ASSETS_SERVICE_NAME, - type AssetsControllerGetAccountAssetByIDAction, - type AssetsControllerGetAccountAssetsByIDsAction, - type AssetsControllerGetAccountAssetsByScopeAction, type AssetsServiceMessenger, - type AssetsServiceMessengerCaller, } from './services/assets/messenger'; export type { AssetEntity, AssetScope } from './services/assets/types'; -export { mapControllerAsset } from './services/assets/utils/mapControllerAsset'; export { CORE_MESSENGER_NAMESPACE, type CoreMessenger, diff --git a/packages/snap-networks-utils/src/services/assets/AssetsService.test.ts b/packages/snap-networks-utils/src/services/assets/AssetsService.test.ts index 58be230d..abcc4d30 100644 --- a/packages/snap-networks-utils/src/services/assets/AssetsService.test.ts +++ b/packages/snap-networks-utils/src/services/assets/AssetsService.test.ts @@ -6,7 +6,7 @@ import type { import type { CaipChainId } from '@metamask/utils'; import { AssetsService } from './AssetsService'; -import type { AssetsServiceMessengerCaller } from './messenger'; +import { AssetsServiceMessenger } from './messenger'; const ACCOUNT_ID = '550e8400-e29b-41d4-a716-446655440000' as AccountId; const ASSET_ID = 'tron:728126428/slip44:195' as Caip19AssetId; @@ -34,7 +34,7 @@ const mappedAsset = { type WithAssetsServiceCallback = (payload: { assetsService: AssetsService; - mockMessenger: jest.Mocked>; + mockMessenger: jest.Mocked; }) => Promise | ReturnValue; /** @@ -47,10 +47,9 @@ type WithAssetsServiceCallback = (payload: { async function withAssetsService( testFunction: WithAssetsServiceCallback, ): Promise { - const mockMessenger: jest.Mocked> = - { - call: jest.fn(), - }; + const mockMessenger: jest.Mocked = { + call: jest.fn(), + }; const assetsService = new AssetsService({ messenger: mockMessenger, diff --git a/packages/snap-networks-utils/src/services/assets/AssetsService.ts b/packages/snap-networks-utils/src/services/assets/AssetsService.ts index f0fd5b84..909fa700 100644 --- a/packages/snap-networks-utils/src/services/assets/AssetsService.ts +++ b/packages/snap-networks-utils/src/services/assets/AssetsService.ts @@ -1,13 +1,13 @@ import type { AccountId, - Asset, + AssetsControllerGetAccountAssetByIDAction, + AssetsControllerGetAccountAssetsByIDsAction, + AssetsControllerGetAccountAssetsByScopeAction, Caip19AssetId, } from '@metamask/assets-controller'; import type { CaipChainId } from '@metamask/utils'; -import type { AssetsServiceMessengerCaller } from './messenger'; -import type { AssetEntity } from './types'; -import { mapControllerAsset } from './utils/mapControllerAsset'; +import { AssetsServiceMessenger } from './messenger'; /** * Thin service that reads account assets from Core AssetsController via a @@ -16,9 +16,9 @@ import { mapControllerAsset } from './utils/mapControllerAsset'; * Does not handle snap-owned / protocol-specific assets. */ export class AssetsService { - readonly #messenger: AssetsServiceMessengerCaller; + readonly #messenger: AssetsServiceMessenger; - constructor({ messenger }: { messenger: AssetsServiceMessengerCaller }) { + constructor({ messenger }: { messenger: AssetsServiceMessenger }) { this.#messenger = messenger; } @@ -32,18 +32,12 @@ export class AssetsService { async getAccountAssetByID( accountId: AccountId, assetId: Caip19AssetId, - ): Promise { - const result = await this.#messenger.call( + ): Promise> { + return this.#messenger.call( 'AssetsController:getAccountAssetByID', accountId, assetId, ); - - if (!result) { - return null; - } - - return mapControllerAsset(accountId, assetId, result); } /** @@ -57,28 +51,18 @@ export class AssetsService { async getAccountAssetsByIDs( accountId: AccountId, assetIds: Caip19AssetId[], - ): Promise> { + ): Promise< + ReturnType + > { if (assetIds.length === 0) { return {}; } - const controllerAssets = await this.#messenger.call( + return this.#messenger.call( 'AssetsController:getAccountAssetsByIDs', accountId, assetIds, ); - - return Object.fromEntries( - assetIds.map((assetId) => { - const controllerAsset = controllerAssets[assetId]; - return [ - assetId, - controllerAsset - ? mapControllerAsset(accountId, assetId, controllerAsset) - : null, - ]; - }), - ) as Record; } /** @@ -91,15 +75,13 @@ export class AssetsService { async getAccountAssetsByScope( scope: CaipChainId, accountId: AccountId, - ): Promise { - const controllerAssets = await this.#messenger.call( + ): Promise< + ReturnType + > { + return this.#messenger.call( 'AssetsController:getAccountAssetsByScope', accountId, scope, ); - - return (Object.entries(controllerAssets) as [Caip19AssetId, Asset][]).map( - ([assetId, asset]) => mapControllerAsset(accountId, assetId, asset), - ); } } diff --git a/packages/snap-networks-utils/src/services/assets/messenger.test.ts b/packages/snap-networks-utils/src/services/assets/messenger.test.ts index 4bfac264..be9c8dd2 100644 --- a/packages/snap-networks-utils/src/services/assets/messenger.test.ts +++ b/packages/snap-networks-utils/src/services/assets/messenger.test.ts @@ -1,7 +1,9 @@ import type { CoreMessengerCaller } from '../../types/core-messenger'; import { CORE_MESSENGER_NAMESPACE } from '../../types/core-messenger'; -import type { AssetsServiceAllowedActions } from './messenger'; -import type { AssetsServiceMessengerCaller } from './messenger'; +import type { + AssetsServiceAllowedActions, + AssetsServiceMessenger, +} from './messenger'; import { ASSETS_SERVICE_NAME } from './messenger'; describe('messenger types', () => { @@ -23,7 +25,7 @@ describe('messenger types', () => { it('keeps core and assets service callers compatible', () => { const assertCompatible = ( caller: CoreMessengerCaller, - ): AssetsServiceMessengerCaller => caller; + ): AssetsServiceMessenger => caller; expect(assertCompatible).toBeDefined(); }); diff --git a/packages/snap-networks-utils/src/services/assets/messenger.ts b/packages/snap-networks-utils/src/services/assets/messenger.ts index 9ec9f5b4..c0909d53 100644 --- a/packages/snap-networks-utils/src/services/assets/messenger.ts +++ b/packages/snap-networks-utils/src/services/assets/messenger.ts @@ -4,14 +4,7 @@ import type { AssetsControllerGetAccountAssetsByScopeAction, } from '@metamask/assets-controller'; import type { Messenger } from '@metamask/messenger'; - -import type { MessengerCaller } from '../../types/messenger-caller'; - -export type { - AssetsControllerGetAccountAssetByIDAction, - AssetsControllerGetAccountAssetsByIDsAction, - AssetsControllerGetAccountAssetsByScopeAction, -}; +import { AsyncMessenger } from '@metamask/snaps-sdk'; /** * Namespace for the {@link AssetsService} messenger. @@ -29,16 +22,6 @@ export type AssetsServiceAllowedActions = /** * Messenger restricted to actions consumed by {@link AssetsService}. */ -export type AssetsServiceMessenger = Messenger< - typeof ASSETS_SERVICE_NAME, - AssetsServiceAllowedActions +export type AssetsServiceMessenger = AsyncMessenger< + Messenger >; - -/** - * Caller type for {@link AssetsService}. - * - * Matches {@link CoreMessengerCaller} while `CoreMessenger` only delegates - * assets-controller actions. - */ -export type AssetsServiceMessengerCaller = - MessengerCaller; diff --git a/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.test.ts b/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.test.ts deleted file mode 100644 index 8475b5f9..00000000 --- a/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { - AccountId, - Asset, - Caip19AssetId, -} from '@metamask/assets-controller'; - -import { mapControllerAsset } from './mapControllerAsset'; - -describe('mapControllerAsset', () => { - const accountId = '550e8400-e29b-41d4-a716-446655440000' as AccountId; - const assetId = 'tron:728126428/trc20:unknown' as Caip19AssetId; - - it('maps controller metadata when present', () => { - const asset = { - balance: { amount: '1234567' }, - metadata: { - symbol: 'TKN', - decimals: 6, - image: 'https://example.com/token.png', - }, - } as unknown as Asset; - - expect(mapControllerAsset(accountId, assetId, asset)).toStrictEqual({ - assetType: assetId, - keyringAccountId: accountId, - network: 'tron:728126428', - symbol: 'TKN', - decimals: 6, - rawAmount: '1234567', - uiAmount: '1.234567', - iconUrl: 'https://example.com/token.png', - }); - }); - - it('uses empty iconUrl when metadata has no image', () => { - const asset = { - balance: { amount: '42' }, - metadata: { - symbol: 'TKN', - decimals: 0, - }, - } as unknown as Asset; - - expect(mapControllerAsset(accountId, assetId, asset)).toStrictEqual({ - assetType: assetId, - keyringAccountId: accountId, - network: 'tron:728126428', - symbol: 'TKN', - decimals: 0, - rawAmount: '42', - uiAmount: '42', - iconUrl: '', - }); - }); -}); diff --git a/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.ts b/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.ts deleted file mode 100644 index f50f6d85..00000000 --- a/packages/snap-networks-utils/src/services/assets/utils/mapControllerAsset.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { - AccountId, - Asset, - Caip19AssetId, -} from '@metamask/assets-controller'; -import { parseCaipAssetType } from '@metamask/utils'; - -import { toUiAmount } from '../../../utils/toUiAmount'; -import type { AssetEntity } from '../types'; - -/** - * Maps an AssetsController asset to the shared {@link AssetEntity} shape. - * - * @param accountId - Keyring account ID. - * @param assetId - CAIP-19 asset ID. - * @param asset - Asset returned by AssetsController. - * @returns Mapped asset entity. - */ -export function mapControllerAsset( - accountId: AccountId, - assetId: Caip19AssetId, - asset: Asset, -): AssetEntity { - const { chainId } = parseCaipAssetType(assetId); - const { symbol, decimals, image } = asset.metadata; - const iconUrl = image ?? ''; - const { amount } = asset.balance; - - return { - assetType: assetId, - keyringAccountId: accountId, - network: chainId, - symbol, - decimals, - rawAmount: amount, - uiAmount: toUiAmount(amount, decimals), - iconUrl, - }; -}