diff --git a/src/core/services/mirrornode/__tests__/unit/mocks.ts b/src/core/services/mirrornode/__tests__/unit/mocks.ts index c11b1a401..ab8848c62 100644 --- a/src/core/services/mirrornode/__tests__/unit/mocks.ts +++ b/src/core/services/mirrornode/__tests__/unit/mocks.ts @@ -67,8 +67,6 @@ export const createMockGetAccountsAPIResponse = ( export const createMockTokenBalancesResponse = ( overrides: Partial = {}, ): TokenBalancesResponse => ({ - account: '0.0.1234', - balance: 0, tokens: [ { token_id: '0.0.2000', @@ -76,7 +74,7 @@ export const createMockTokenBalancesResponse = ( decimals: 6, }, ], - timestamp: '2024-01-01T12:00:00.000Z', + links: { next: null }, ...overrides, }); diff --git a/src/core/services/mirrornode/hedera-mirrornode-service.ts b/src/core/services/mirrornode/hedera-mirrornode-service.ts index e7ebaeaf2..274ac2a31 100644 --- a/src/core/services/mirrornode/hedera-mirrornode-service.ts +++ b/src/core/services/mirrornode/hedera-mirrornode-service.ts @@ -38,6 +38,7 @@ import { handleMirrorNodeErrorResponse } from '@/core/utils/handle-mirror-node-e import { AccountAPIResponseSchema, GetAccountsAPIResponseSchema, + TokenBalancesResponseSchema, TokenInfoSchema, } from './schemas'; import { NetworkToBaseUrl } from './types'; @@ -135,8 +136,13 @@ export class HederaMirrornodeServiceDefaultImpl implements HederaMirrornodeServi ); } - return (await response.json()) as TokenBalancesResponse; + return parseWithSchema( + TokenBalancesResponseSchema, + await response.json(), + `Mirror Node GET /accounts/${accountId}/tokens`, + ); } catch (error) { + if (error instanceof CliError) throw error; if (error instanceof NotFoundError || error instanceof NetworkError) throw error; throw new NetworkError( diff --git a/src/core/services/mirrornode/schemas.ts b/src/core/services/mirrornode/schemas.ts index 43fbb85f3..e8390347e 100644 --- a/src/core/services/mirrornode/schemas.ts +++ b/src/core/services/mirrornode/schemas.ts @@ -6,6 +6,8 @@ import type { AccountListItemBalance, AccountListItemTokenBalance, GetAccountsAPIResponse, + TokenBalanceInfo, + TokenBalancesResponse, TokenInfo, } from './types'; @@ -101,3 +103,19 @@ export const GetAccountsAPIResponseSchema: z.ZodType = }) .optional(), }); + +export const TokenBalanceInfoSchema: z.ZodType = z.object({ + token_id: z.string(), + balance: z.number(), + decimals: z.number().optional(), +}); + +export const TokenBalancesResponseSchema: z.ZodType = + z.object({ + tokens: z.array(TokenBalanceInfoSchema), + links: z + .object({ + next: z.string().nullable().optional(), + }) + .optional(), + }); diff --git a/src/core/services/mirrornode/types.ts b/src/core/services/mirrornode/types.ts index 06e1564d6..dc1131b86 100644 --- a/src/core/services/mirrornode/types.ts +++ b/src/core/services/mirrornode/types.ts @@ -49,18 +49,17 @@ export interface AccountResponse { keyAlgorithm: KeyAlgorithm; } -// Token Balance Response -export interface TokenBalancesResponse { - account: string; - balance: number; - tokens: TokenBalanceInfo[]; - timestamp: string; -} - export interface TokenBalanceInfo { token_id: string; balance: number; - decimals: number; + decimals?: number; +} + +export interface TokenBalancesResponse { + tokens: TokenBalanceInfo[]; + links?: { + next?: string | null; + }; } export type MirrorNodeTokenKey = {