import gql from 'fake-tag'; import { GetPatronsQuery, GetPatronsQueryVariables, GetpSeedHoldersQuery, GetpSeedHoldersQueryVariables, PlayerFragmentFragment, TokenBalancesFragmentFragment, } from './autogen/types'; import { client } from './client'; import { PlayerFragment, TokenBalancesFragment } from './fragments'; import { Patron } from './types'; // eslint-disable-next-line @typescript-eslint/no-unused-expressions gql` query GetpSeedBalance($address: String!) { getTokenBalances(address: $address) { ...TokenBalancesFragment } } ${TokenBalancesFragment} `; const patronsQuery = gql` query GetPatrons($addresses: [String!], $limit: Int) { player(where: { ethereum_address: { _in: $addresses } }, limit: $limit) { ...PlayerFragment } } ${PlayerFragment} `; const pSeedHoldersQuery = gql` query GetpSeedHolders($limit: Int) { pSeedHolders: getTopPSeedHolders(limit: $limit) { ...TokenBalancesFragment } } ${TokenBalancesFragment} `; const getPlayersFromAddresses = async ( addresses: Array, limit: number, ): Promise> => { const { data, error } = await client .query(patronsQuery, { addresses, limit, }) .toPromise(); if (!data) { if (error) { throw error; } return []; } return data.player; }; const getpSeedHolders = async ( limit: number, ): Promise> => { const { data, error } = await client .query( pSeedHoldersQuery, { limit, }, ) .toPromise(); if (!data || !data.pSeedHolders) { if (error) { throw error; } return []; } return data.pSeedHolders; }; export const getPatrons = async (limit = 50): Promise> => { const tokenBalances: Array = await getpSeedHolders( limit, ); const players: Array = await getPlayersFromAddresses( tokenBalances.map((u) => u.address), limit, ); const patrons: Array = tokenBalances.reduce>( (res, u) => { const player = players.find((p) => p.ethereum_address === u.address); if (player) { const patron = { ...player, pSeedBalance: u.pSeedBalance } as Patron; res.push(patron); } return res; }, [], ); return patrons; };