11import { createServerFn } from '@tanstack/react-start'
22import { type InferResponseType , parseResponse } from 'hono/client'
33import type { Address , Hex } from 'ox'
4- import type { Config } from 'wagmi'
54import { getChainId } from 'wagmi/actions'
6- import { Actions } from 'wagmi/tempo'
75import * as z from 'zod/mini'
86import { TOKEN_COUNT_MAX } from '#lib/constants'
97import { api } from '#lib/server/tempo-api'
10- import { getVerifiedTokens } from '#lib/server/verified-tokens'
118import { zAddress } from '#lib/zod'
129import { getWagmiConfig } from '#wagmi.config.ts'
1310
@@ -217,9 +214,9 @@ export type AccountTransfersApiResponse = {
217214 timestamp : string | null
218215 token : {
219216 address : Address . Address
220- symbol ? : string | undefined
221- decimals ? : number | undefined
222- currency ? : string | undefined
217+ symbol : string
218+ decimals : number
219+ currency : string
223220 }
224221 } >
225222 total : number
@@ -232,70 +229,6 @@ const EMPTY_ACCOUNT_TRANSFERS_RESPONSE: AccountTransfersApiResponse = {
232229 totalCapped : false ,
233230}
234231
235- type TransferTokenMeta = {
236- symbol ?: string | undefined
237- decimals ?: number | undefined
238- currency ?: string | undefined
239- }
240-
241- const transferTokenMetaCache = new Map < string , CacheEntry < TransferTokenMeta > > ( )
242-
243- /**
244- * Display metadata (symbol/decimals) for transfer-row tokens: the cached
245- * verified list covers nearly every row for free; unknown tokens fall back to
246- * one RPC metadata read each, memoized. (The API's `include=token` does the
247- * same upstream but adds ~5s per page — resolve locally instead.)
248- */
249- async function getTransferTokenMeta (
250- chainId : number ,
251- tokens : readonly Address . Address [ ] ,
252- ) : Promise < Map < string , TransferTokenMeta > > {
253- const verified = await getVerifiedTokens ( chainId )
254- const verifiedByAddress = new Map (
255- verified . map ( ( token ) => [ token . address . toLowerCase ( ) , token ] ) ,
256- )
257-
258- const meta = new Map < string , TransferTokenMeta > ( )
259- const misses : Address . Address [ ] = [ ]
260- for ( const token of new Set ( tokens . map ( ( t ) => t . toLowerCase ( ) ) ) ) {
261- const entry = verifiedByAddress . get ( token )
262- if ( entry ) {
263- meta . set ( token , {
264- symbol : entry . symbol ,
265- decimals : entry . decimals ,
266- currency : entry . currency ,
267- } )
268- continue
269- }
270- const cached = transferTokenMetaCache . get ( `${ chainId } -${ token } ` )
271- if ( cached && Date . now ( ) - cached . timestamp < CACHE_TTL ) {
272- meta . set ( token , cached . data )
273- continue
274- }
275- misses . push ( token as Address . Address )
276- }
277-
278- const config = getWagmiConfig ( )
279- await Promise . all (
280- misses . map ( async ( token ) => {
281- const resolved = await Actions . token
282- . getMetadata ( config as Config , { token } )
283- . then (
284- ( m ) : TransferTokenMeta => ( {
285- symbol : m . symbol ,
286- decimals : m . decimals ,
287- currency : m . currency ,
288- } ) ,
289- )
290- . catch ( ( ) : TransferTokenMeta => ( { } ) )
291- meta . set ( token . toLowerCase ( ) , resolved )
292- setCached ( transferTokenMetaCache , `${ chainId } -${ token } ` , resolved )
293- } ) ,
294- )
295-
296- return meta
297- }
298-
299232/**
300233 * Token transfers where the account is sender or recipient, across all
301234 * tokens (the address page's account-scoped Transfers tab). Rows span
@@ -321,31 +254,21 @@ export const fetchAccountTransfers = createServerFn({ method: 'POST' })
321254 } ) ,
322255 )
323256
324- const tokenMeta = await getTransferTokenMeta (
325- chainId ,
326- page . data . map (
327- ( transfer ) => transfer . sourceToken . address as Address . Address ,
328- ) ,
329- )
330-
331257 return {
332- transfers : page . data . map ( ( transfer ) => {
333- const meta = tokenMeta . get ( transfer . sourceToken . address . toLowerCase ( ) )
334- return {
335- from : transfer . sender as Address . Address ,
336- to : transfer . recipient as Address . Address ,
337- value : transfer . sourceToken . amount ,
338- transactionHash : transfer . transactionHash as Hex . Hex ,
339- blockNumber : String ( transfer . blockNumber ) ,
340- timestamp : transfer . timestamp ?? null ,
341- token : {
342- address : transfer . sourceToken . address as Address . Address ,
343- symbol : meta ?. symbol ,
344- decimals : meta ?. decimals ,
345- currency : meta ?. currency ,
346- } ,
347- }
348- } ) ,
258+ transfers : page . data . map ( ( transfer ) => ( {
259+ from : transfer . sender as Address . Address ,
260+ to : transfer . recipient as Address . Address ,
261+ value : transfer . sourceAmount . baseUnits ,
262+ transactionHash : transfer . transactionHash as Hex . Hex ,
263+ blockNumber : String ( transfer . blockNumber ) ,
264+ timestamp : transfer . timestamp ?? null ,
265+ token : {
266+ address : transfer . sourceToken . address as Address . Address ,
267+ symbol : transfer . sourceToken . symbol ,
268+ decimals : transfer . sourceToken . decimals ,
269+ currency : transfer . sourceToken . currency ,
270+ } ,
271+ } ) ) ,
349272 ...resolveTotal ( {
350273 exactCount : page . meta ?. totalCount ,
351274 exactCountCapped : page . meta ?. totalCountCapped ,
@@ -389,7 +312,7 @@ export const fetchTransfers = createServerFn({ method: 'POST' })
389312 transfers : page . data . map ( ( transfer ) => ( {
390313 from : transfer . sender as Address . Address ,
391314 to : transfer . recipient as Address . Address ,
392- value : transfer . sourceToken . amount ,
315+ value : transfer . sourceAmount . baseUnits ,
393316 transactionHash : transfer . transactionHash as Hex . Hex ,
394317 blockNumber : String ( transfer . blockNumber ) ,
395318 timestamp : transfer . timestamp ?? null ,
0 commit comments