import { getAddress } from 'viem'; import { PumToken } from '../../../types'; export const PUM_TOKENS_QUERY = `query pumTokens($limit: Int, $offset: Int, $orderBy: PumToken_orderBy) { pumTokens( first: $limit skip: $offset orderBy: $orderBy orderDirection: desc ) { id address name symbol issuer { id name } reserveCT reserveStable isMarketOpen uniqueBuyers metadata createdAt updatedAt token { tokenHolders( first: 10 orderDirection: desc orderBy: balance ) { holder { address name } } } hourlyPriceChange: tokenPrices( where: { interval: HOUR } orderBy: startAt orderDirection: desc first: 24 ) { id interval open high low close volume traderCount buyers { id name } sellers { id name } startAt createdAt updatedAt } dailyPriceChange: tokenPrices( where: { interval: DAY } orderBy: startAt orderDirection: desc first: 7 ) { id interval open high low close volume traderCount buyers { id name } sellers { id name } startAt createdAt updatedAt } } }`; export interface PumTokenEntities { pumTokens: { id: string; name: string; symbol: string; issuer: { id: string; name: string; }; reserveCT: string; reserveStable: string; isMarketOpen: boolean; uniqueBuyers: string; metadata: string; createdAt: string; updatedAt: string; token: { tokenHolders: { holder: { address: string; name?: string; }; }[]; }; hourlyPriceChange: { id: string; interval: 'HOUR' | 'DAY'; open: string; high: string; low: string; close: string; volume: string; traderCount: string; buyers: { id: string; name?: string; }[]; sellers: { id: string; name?: string; }[]; startAt: string; createdAt: string; updatedAt: string; }[]; dailyPriceChange: { id: string; interval: 'HOUR' | 'DAY'; open: string; high: string; low: string; close: string; volume: string; traderCount: string; buyers: { id: string; name?: string; }[]; sellers: { id: string; name?: string; }[]; startAt: string; createdAt: string; updatedAt: string; }[]; }[]; } export function transform(entity: PumTokenEntities): PumToken[] { return entity.pumTokens.map((pumToken) => ({ id: pumToken.id, name: pumToken.name, symbol: pumToken.symbol, issuer: { name: pumToken.issuer.name, address: getAddress(pumToken.issuer.id), }, reserveCT: BigInt(pumToken.reserveCT), reserveStable: BigInt(pumToken.reserveStable), isMarketOpen: pumToken.isMarketOpen, uniqueBuyers: Number(pumToken.uniqueBuyers), metadata: pumToken.metadata, createdAt: Number(pumToken.createdAt), updatedAt: Number(pumToken.updatedAt), holders: pumToken.token.tokenHolders.map((holder) => ({ address: holder.holder.address, name: holder.holder.name, })), hourlyPriceChange: pumToken.hourlyPriceChange.map((price) => ({ id: price.id, interval: price.interval, open: BigInt(price.open), high: BigInt(price.high), low: BigInt(price.low), close: BigInt(price.close), volume: BigInt(price.volume), traderCount: Number(price.traderCount), buyers: price.buyers, sellers: price.sellers, startAt: Number(price.startAt), createdAt: Number(price.createdAt), updatedAt: Number(price.updatedAt), })), dailyPriceChange: pumToken.dailyPriceChange.map((price) => ({ id: price.id, interval: price.interval, open: BigInt(price.open), high: BigInt(price.high), low: BigInt(price.low), close: BigInt(price.close), volume: BigInt(price.volume), traderCount: Number(price.traderCount), buyers: price.buyers, sellers: price.sellers, startAt: Number(price.startAt), createdAt: Number(price.createdAt), updatedAt: Number(price.updatedAt), })), })); }