diff --git a/app/components/UI/TokenDetails/hooks/useTokenSecurityData.test.ts b/app/components/UI/TokenDetails/hooks/useTokenSecurityData.test.ts index 34dab03dff2a..c1cab8323ace 100644 --- a/app/components/UI/TokenDetails/hooks/useTokenSecurityData.test.ts +++ b/app/components/UI/TokenDetails/hooks/useTokenSecurityData.test.ts @@ -109,6 +109,42 @@ describe('useTokenSecurityData', () => { expect(result.current.securityData).toBeNull(); }); + it('ignores prefetchedData with wrong shape and fetches instead', async () => { + const assetId = 'eip155:1/erc20:0x1234' as CaipAssetType; + mockFetchTokenAssets.mockResolvedValue([ + { + assetId, + name: 'Test Token', + symbol: 'TEST', + decimals: 18, + securityData: mockSecurityData, + }, + ]); + + // Bridge SecurityData shape: { type: "Verified" } — missing resultType + const wrongShapedData = { + type: 'Verified', + } as unknown as TokenSecurityData; + + const { result } = renderHook(() => + useTokenSecurityData({ + assetId, + prefetchedData: wrongShapedData, + }), + ); + + expect(result.current.isLoading).toBe(true); + + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + }); + + expect(mockFetchTokenAssets).toHaveBeenCalledWith([assetId], { + includeTokenSecurityData: true, + }); + expect(result.current.securityData).toBe(mockSecurityData); + }); + it('does not fetch when assetId is null', () => { const { result } = renderHook(() => useTokenSecurityData({ assetId: null }), diff --git a/app/components/UI/TokenDetails/hooks/useTokenSecurityData.ts b/app/components/UI/TokenDetails/hooks/useTokenSecurityData.ts index 177878838f69..9f2398b8311b 100644 --- a/app/components/UI/TokenDetails/hooks/useTokenSecurityData.ts +++ b/app/components/UI/TokenDetails/hooks/useTokenSecurityData.ts @@ -18,10 +18,20 @@ interface UseTokenSecurityDataResult { error: Error | null; } +const isValidTokenSecurityData = (data: unknown): data is TokenSecurityData => + data != null && + typeof data === 'object' && + typeof (data as TokenSecurityData).resultType === 'string' && + Array.isArray((data as TokenSecurityData).features); + export const useTokenSecurityData = ({ assetId, - prefetchedData, + prefetchedData: rawPrefetchedData, }: UseTokenSecurityDataOpts): UseTokenSecurityDataResult => { + const prefetchedData = isValidTokenSecurityData(rawPrefetchedData) + ? rawPrefetchedData + : undefined; + const [securityData, setSecurityData] = useState( prefetchedData ?? null, );