From 8226c874e39891542785dc69632adbe610420f23 Mon Sep 17 00:00:00 2001 From: Beast Date: Fri, 11 Sep 2026 20:48:14 +0800 Subject: [PATCH 1/4] feat: make safe browsable page --- .../account-all-transactions/hook.tsx | 12 ++++- .../multisig-transactions/hook.tsx | 12 ++++- .../transactions-table/hook.tsx | 12 ++++- src/hooks/useBrowsablePageDepth.tsx | 39 ++++++++++++++++ src/utils/browsable-page-depth.test.ts | 45 +++++++++++++++++++ src/utils/browsable-page-depth.ts | 25 +++++++++++ 6 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 src/hooks/useBrowsablePageDepth.tsx create mode 100644 src/utils/browsable-page-depth.test.ts create mode 100644 src/utils/browsable-page-depth.ts diff --git a/src/components/features/account-details/account-all-transactions/hook.tsx b/src/components/features/account-details/account-all-transactions/hook.tsx index 4249700..fce1a5c 100644 --- a/src/components/features/account-details/account-all-transactions/hook.tsx +++ b/src/components/features/account-details/account-all-transactions/hook.tsx @@ -6,9 +6,11 @@ import { createAccountUnifiedTransactionColumns } from '@/components/common/tabl import { DATA_POOL_INTERVAL } from '@/constants/data-pool-interval'; import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import type { UnifiedListTransactionSorts } from '@/constants/query-sorts'; +import { useBrowsablePageDepth } from '@/hooks/useBrowsablePageDepth'; import { useOrderBy } from '@/hooks/useOrderBy'; import { useTableState } from '@/hooks/useTableState'; import type { UnifiedListTransaction } from '@/schemas'; +import { browsableRowCount } from '@/utils/browsable-page-depth'; import { transformSortLiteral } from '@/utils/transform-sort'; import { withExcludedRewardTransfers } from '@/utils/unified-transaction-filters'; @@ -26,6 +28,11 @@ export const useAccountAllTransactions = (accountId: string) => { const orderByObject = useOrderBy(orderBy ?? ''); const sortingValue = transformSortLiteral(orderBy); + const { beyondDepth } = useBrowsablePageDepth({ + currentPageIndex, + limit, + handleChangePagination + }); const where = useMemo( () => @@ -43,6 +50,7 @@ export const useAccountAllTransactions = (accountId: string) => { data, error: fetchError } = api.unifiedTransactions.useGetAll({ + skip: beyondDepth, pollInterval: DATA_POOL_INTERVAL, variables: { orderBy: orderByObject, @@ -57,7 +65,7 @@ export const useAccountAllTransactions = (accountId: string) => { [accountId] ); const [rowCount, setRowCount] = useState( - data?.meta.aggregate.totalCount ?? 0 + browsableRowCount(data?.meta.aggregate.totalCount ?? 0) ); const table = useReactTable({ @@ -93,7 +101,7 @@ export const useAccountAllTransactions = (accountId: string) => { useEffect(() => { if (!loading && data?.meta.aggregate.totalCount != null) - setRowCount(data.meta.aggregate.totalCount); + setRowCount(browsableRowCount(data.meta.aggregate.totalCount)); }, [loading, data?.meta.aggregate.totalCount]); return { diff --git a/src/components/features/multisig-details/multisig-transactions/hook.tsx b/src/components/features/multisig-details/multisig-transactions/hook.tsx index d4a558c..4e3e6f8 100644 --- a/src/components/features/multisig-details/multisig-transactions/hook.tsx +++ b/src/components/features/multisig-details/multisig-transactions/hook.tsx @@ -6,9 +6,11 @@ import { UNIFIED_LIST_TRANSACTION_COLUMNS } from '@/components/common/table-colu import { DATA_POOL_INTERVAL } from '@/constants/data-pool-interval'; import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import type { UnifiedListTransactionSorts } from '@/constants/query-sorts'; +import { useBrowsablePageDepth } from '@/hooks/useBrowsablePageDepth'; import { useOrderBy } from '@/hooks/useOrderBy'; import { useTableState } from '@/hooks/useTableState'; import type { UnifiedListTransaction } from '@/schemas'; +import { browsableRowCount } from '@/utils/browsable-page-depth'; import { transformSortLiteral } from '@/utils/transform-sort'; import { withExcludedRewardTransfers } from '@/utils/unified-transaction-filters'; @@ -26,6 +28,11 @@ export const useMultisigDetailTransactions = (walletId: string) => { const orderByObject = useOrderBy(orderBy ?? ''); const sortingValue = transformSortLiteral(orderBy); + const { beyondDepth } = useBrowsablePageDepth({ + currentPageIndex, + limit, + handleChangePagination + }); const where = useMemo( () => @@ -43,6 +50,7 @@ export const useMultisigDetailTransactions = (walletId: string) => { data, error: fetchError } = api.unifiedTransactions.useGetAll({ + skip: beyondDepth, pollInterval: DATA_POOL_INTERVAL, variables: { orderBy: orderByObject, @@ -57,7 +65,7 @@ export const useMultisigDetailTransactions = (walletId: string) => { [] ); const [rowCount, setRowCount] = useState( - data?.meta.aggregate.totalCount ?? 0 + browsableRowCount(data?.meta.aggregate.totalCount ?? 0) ); const table = useReactTable({ @@ -93,7 +101,7 @@ export const useMultisigDetailTransactions = (walletId: string) => { useEffect(() => { if (!loading && data?.meta.aggregate.totalCount != null) - setRowCount(data.meta.aggregate.totalCount); + setRowCount(browsableRowCount(data.meta.aggregate.totalCount)); }, [loading, data?.meta.aggregate.totalCount]); return { diff --git a/src/components/features/transaction-listing/transactions-table/hook.tsx b/src/components/features/transaction-listing/transactions-table/hook.tsx index b4d2e16..741333a 100644 --- a/src/components/features/transaction-listing/transactions-table/hook.tsx +++ b/src/components/features/transaction-listing/transactions-table/hook.tsx @@ -7,9 +7,11 @@ import { UNIFIED_LIST_TRANSACTION_COLUMNS } from '@/components/common/table-colu import { DATA_POOL_INTERVAL } from '@/constants/data-pool-interval'; import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import type { UnifiedListTransactionSorts } from '@/constants/query-sorts'; +import { useBrowsablePageDepth } from '@/hooks/useBrowsablePageDepth'; import { useOrderBy } from '@/hooks/useOrderBy'; import { useTableState } from '@/hooks/useTableState'; import type { UnifiedListTransaction } from '@/schemas'; +import { browsableRowCount } from '@/utils/browsable-page-depth'; import { transformSortLiteral } from '@/utils/transform-sort'; import { withExcludedRewardTransfers } from '@/utils/unified-transaction-filters'; @@ -30,6 +32,11 @@ export const useTransactionsTable = () => { const orderByObject = useOrderBy(orderBy ?? ''); const sortingValue = transformSortLiteral(orderBy); + const { beyondDepth } = useBrowsablePageDepth({ + currentPageIndex, + limit, + handleChangePagination + }); const where = useMemo(() => { if (accountId) { @@ -53,6 +60,7 @@ export const useTransactionsTable = () => { data, error: fetchError } = api.unifiedTransactions.useGetAll({ + skip: beyondDepth, pollInterval: DATA_POOL_INTERVAL, variables: { orderBy: orderByObject, @@ -67,7 +75,7 @@ export const useTransactionsTable = () => { [] ); const [rowCount, setRowCount] = useState( - data?.meta.aggregate.totalCount ?? 0 + browsableRowCount(data?.meta.aggregate.totalCount ?? 0) ); const table = useReactTable({ @@ -103,7 +111,7 @@ export const useTransactionsTable = () => { useEffect(() => { if (!loading && data?.meta.aggregate.totalCount != null) - setRowCount(data.meta.aggregate.totalCount); + setRowCount(browsableRowCount(data.meta.aggregate.totalCount)); }, [loading, data?.meta.aggregate.totalCount]); return { diff --git a/src/hooks/useBrowsablePageDepth.tsx b/src/hooks/useBrowsablePageDepth.tsx new file mode 100644 index 0000000..2a8b24b --- /dev/null +++ b/src/hooks/useBrowsablePageDepth.tsx @@ -0,0 +1,39 @@ +import type { OnChangeFn, PaginationState } from '@tanstack/react-table'; +import { useEffect } from 'react'; + +import { + isBrowsablePage, + maxBrowsablePageIndex +} from '@/utils/browsable-page-depth'; + +interface BrowsablePageDepthArgs { + currentPageIndex: number; + limit: number; + handleChangePagination: OnChangeFn; +} + +/** + * Keeps OFFSET-paginated lists within {@link MAX_BROWSABLE_ROWS}. + * + * The page comes from the URL, so a stale link or a hand-edited `?page=` can + * point past the browsable depth. When that happens the caller should skip + * its query (`beyondDepth`), and this hook rewrites the URL to the deepest + * browsable page so the next render fetches something Hasura can serve fast. + */ +export const useBrowsablePageDepth = ({ + currentPageIndex, + limit, + handleChangePagination +}: BrowsablePageDepthArgs) => { + const beyondDepth = !isBrowsablePage(currentPageIndex, limit); + + useEffect(() => { + if (!beyondDepth) return; + handleChangePagination({ + pageIndex: maxBrowsablePageIndex(limit), + pageSize: limit + }); + }, [beyondDepth, limit, handleChangePagination]); + + return { beyondDepth }; +}; diff --git a/src/utils/browsable-page-depth.test.ts b/src/utils/browsable-page-depth.test.ts new file mode 100644 index 0000000..1746fe0 --- /dev/null +++ b/src/utils/browsable-page-depth.test.ts @@ -0,0 +1,45 @@ +import { + browsableRowCount, + isBrowsablePage, + MAX_BROWSABLE_ROWS, + maxBrowsablePageIndex +} from './browsable-page-depth'; + +describe('browsableRowCount', () => { + it('passes short lists through untouched', () => { + expect(browsableRowCount(0)).toBe(0); + expect(browsableRowCount(2_500)).toBe(2_500); + expect(browsableRowCount(MAX_BROWSABLE_ROWS)).toBe(MAX_BROWSABLE_ROWS); + }); + + it('caps long lists so the pager never offers a deep OFFSET', () => { + expect(browsableRowCount(238_833)).toBe(MAX_BROWSABLE_ROWS); + }); +}); + +describe('isBrowsablePage', () => { + it('accepts every page whose offset stays below the cap', () => { + expect(isBrowsablePage(0, 25)).toBe(true); + expect(isBrowsablePage(MAX_BROWSABLE_ROWS / 25 - 1, 25)).toBe(true); + }); + + it('rejects the first page whose offset reaches the cap', () => { + expect(isBrowsablePage(MAX_BROWSABLE_ROWS / 25, 25)).toBe(false); + expect(isBrowsablePage(6_000, 25)).toBe(false); + }); +}); + +describe('maxBrowsablePageIndex', () => { + it('is the last page index that isBrowsablePage accepts', () => { + for (const limit of [25, 50, 75, 100, 33]) { + const last = maxBrowsablePageIndex(limit); + expect(isBrowsablePage(last, limit)).toBe(true); + expect(isBrowsablePage(last + 1, limit)).toBe(false); + } + }); + + it('refuses a non-positive page size instead of returning Infinity', () => { + expect(() => maxBrowsablePageIndex(0)).toThrow(RangeError); + expect(() => maxBrowsablePageIndex(-25)).toThrow(RangeError); + }); +}); diff --git a/src/utils/browsable-page-depth.ts b/src/utils/browsable-page-depth.ts new file mode 100644 index 0000000..4d58eb2 --- /dev/null +++ b/src/utils/browsable-page-depth.ts @@ -0,0 +1,25 @@ +/** + * Deepest OFFSET the explorer will request on unified_transaction lists. + * + * Hasura pages with OFFSET, whose cost grows linearly with depth: the + * exclude-rewards list measured ~0.6 s at offset 50k and 4.7 s at 150k + * (statement timeout is 5 s). Capping the pager at this many rows keeps every + * reachable page comfortably under a second on hot lists. + */ +export const MAX_BROWSABLE_ROWS = 10_000; + +/** Row count to hand the table so its pager stops at the browsable depth. */ +export const browsableRowCount = (totalCount: number) => + Math.min(totalCount, MAX_BROWSABLE_ROWS); + +/** True when the page's offset stays below {@link MAX_BROWSABLE_ROWS}. */ +export const isBrowsablePage = (pageIndex: number, limit: number) => + pageIndex * limit < MAX_BROWSABLE_ROWS; + +/** Last 0-based page index for which {@link isBrowsablePage} holds. */ +export const maxBrowsablePageIndex = (limit: number) => { + if (limit <= 0) { + throw new RangeError(`page size must be positive, got ${limit}`); + } + return Math.ceil(MAX_BROWSABLE_ROWS / limit) - 1; +}; From b48132d2b0a6d8688359c7345f8d950fc49f03e0 Mon Sep 17 00:00:00 2001 From: Beast Date: Sun, 13 Sep 2026 15:01:44 +0800 Subject: [PATCH 2/4] feat: update queries to be more optimal --- src/__generated__/gql.ts | 30 ++- src/__generated__/graphql.ts | 155 +++++++++++++- src/api/accounts.tsx | 34 ++-- src/api/miner-rewards.tsx | 192 ++++++++++++++---- .../common/table-columns/ACCOUNT_COLUMNS.tsx | 25 +-- .../account-listing/accounts-table/hook.tsx | 4 +- .../miner-rewards-table/hook.tsx | 7 +- .../data-table/DataTable.stories.tsx | 1 + src/lib/graphql-benchmark/registry.ts | 11 + src/schemas/account.ts | 18 +- src/utils/miner-reward-filters.test.ts | 59 ++++++ src/utils/miner-reward-filters.ts | 37 ++++ 12 files changed, 466 insertions(+), 107 deletions(-) create mode 100644 src/utils/miner-reward-filters.test.ts create mode 100644 src/utils/miner-reward-filters.ts diff --git a/src/__generated__/gql.ts b/src/__generated__/gql.ts index 0c22e1e..0de743a 100644 --- a/src/__generated__/gql.ts +++ b/src/__generated__/gql.ts @@ -14,9 +14,9 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/ * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size */ type Documents = { - "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n flagEvents: accountEvents(\n where: {\n _or: [\n { high_security_set_id: { _is_null: false } }\n { multisig_id: { _is_null: false } }\n ]\n }\n limit: 20\n ) {\n highSecuritySet {\n who_id\n guardian_id\n }\n multisig_id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n ": typeof types.GetAccountsDocument, + "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n is_high_security\n is_guardian\n is_multisig\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n ": typeof types.GetAccountsDocument, "\n query GetAccountById($id: String!) {\n account: account_by_pk(id: $id) {\n id\n free\n frozen\n reserved\n }\n accountStats: account_stats_by_pk(id: $id) {\n total_cancelled_transfers\n total_executed_transfers\n total_immediate_transfers\n total_mined_blocks\n total_rewards\n total_scheduled_transfers\n }\n multisig: multisig_by_pk(id: $id) {\n id\n }\n guardian: high_security_set_aggregate(\n where: { who: { id: { _eq: $id } } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n beneficiaries: high_security_set_aggregate(\n where: { guardian: { id: { _eq: $id } } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": typeof types.GetAccountByIdDocument, - "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: account_aggregate(\n where: {\n transfersFrom: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n\n recentlyDeposited: account_aggregate(\n where: {\n transfersTo: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n }\n ": typeof types.GetAccountsStatsDocument, + "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n sent: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n\n recentlyDeposited: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n received: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n }\n ": typeof types.GetAccountsStatsDocument, "\n query GetBlocks(\n $limit: Int\n $offset: Int\n $orderBy: [block_order_by!]!\n $where: block_bool_exp\n ) {\n blocks: block(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n id\n hash\n height\n reward\n timestamp\n mined_by_id\n extrinsics {\n id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: block_height\n }\n }\n ": typeof types.GetBlocksDocument, "\n query GetBlockById($height: Int!, $hash: String!) {\n blocks: block(\n where: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n ) {\n id\n hash\n height\n reward\n timestamp\n extrinsics(order_by: { index_in_block: asc }) {\n id\n pallet\n call\n success\n fee\n timestamp\n indexInBlock: index_in_block\n signer {\n id\n }\n }\n }\n minerRewards: miner_reward(\n where: {\n block: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n }\n ) {\n reward\n timestamp\n miner {\n id\n }\n block {\n height\n hash\n }\n }\n rewardTransfers: unified_transaction(\n where: {\n type: { _eq: \"IMMEDIATE\" }\n hash: { _is_null: true }\n block: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n }\n ) {\n amount\n detail_id\n from {\n id\n }\n to {\n id\n }\n }\n }\n ": typeof types.GetBlockByIdDocument, "\n query GetBlockStats($startDate: timestamptz!, $endDate: timestamptz!) {\n chain: chain_stats_by_pk(id: \"global\") {\n block_height\n finalized_block_height\n }\n minedIn24Hours: block_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": typeof types.GetBlockStatsDocument, @@ -33,7 +33,9 @@ type Documents = { "\n query GetMinerLeaderboardStats(\n $startDate: timestamptz!\n $endDate: timestamptz!\n ) {\n chain: chain_stats_by_pk(id: \"global\") {\n block_height\n total_miners\n }\n last24Hour: miner_reward_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": typeof types.GetMinerLeaderboardStatsDocument, "\n query GetMinerLeaderboardChart($limit: Int) {\n topMiners: account_stats(\n limit: $limit\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n id\n total_mined_blocks\n }\n blocks: chain_stats_by_pk(id: \"global\") {\n totalCount: block_height\n }\n }\n ": typeof types.GetMinerLeaderboardChartDocument, "\n query GetMinerLeaderboard($limit: Int, $offset: Int) {\n leaderboardEntries: account_stats(\n limit: $limit\n offset: $offset\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n id\n total_mined_blocks\n total_rewards\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miners\n block_height\n }\n topMiner: account_stats(\n limit: 1\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n total_mined_blocks\n }\n }\n ": typeof types.GetMinerLeaderboardDocument, - "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": typeof types.GetMinerRewardsDocument, + "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n": typeof types.GetMinerRewardsDocument, + "\n query GetMinerRewardsWithChainTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miner_rewards\n }\n }\n": typeof types.GetMinerRewardsWithChainTotalDocument, + "\n query GetMinerRewardsWithMinerTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n $minerId: String!\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: account_stats_by_pk(id: $minerId) {\n totalCount: total_mined_blocks\n }\n }\n": typeof types.GetMinerRewardsWithMinerTotalDocument, "\n query GetMinerRewardsStats(\n $startDate: timestamptz!\n $endDate: timestamptz!\n ) {\n last24Hour: miner_reward_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n allTime: chain_stats_by_pk(id: \"global\") {\n total_miner_rewards\n }\n }\n ": typeof types.GetMinerRewardsStatsDocument, "\n query GetMinerRewardByHash($hash: String!) {\n minerRewards: miner_reward(where: { block: { hash: { _eq: $hash } } }) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n }\n ": typeof types.GetMinerRewardByHashDocument, "\n fragment MultisigCreatedFields on multisig {\n id\n timestamp\n threshold\n nonce\n signers\n creator {\n id\n }\n block {\n height\n }\n extrinsic {\n id\n pallet\n call\n }\n }\n": typeof types.MultisigCreatedFieldsFragmentDoc, @@ -89,9 +91,9 @@ type Documents = { "\n query GetWormholeExtrinsics(\n $limit: Int\n $offset: Int\n $orderBy: [wormhole_extrinsic_order_by!]!\n $where: wormhole_extrinsic_bool_exp\n ) {\n wormholeExtrinsics: wormhole_extrinsic(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n id\n }\n }\n": typeof types.GetWormholeExtrinsicsDocument, }; const documents: Documents = { - "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n flagEvents: accountEvents(\n where: {\n _or: [\n { high_security_set_id: { _is_null: false } }\n { multisig_id: { _is_null: false } }\n ]\n }\n limit: 20\n ) {\n highSecuritySet {\n who_id\n guardian_id\n }\n multisig_id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n ": types.GetAccountsDocument, + "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n is_high_security\n is_guardian\n is_multisig\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n ": types.GetAccountsDocument, "\n query GetAccountById($id: String!) {\n account: account_by_pk(id: $id) {\n id\n free\n frozen\n reserved\n }\n accountStats: account_stats_by_pk(id: $id) {\n total_cancelled_transfers\n total_executed_transfers\n total_immediate_transfers\n total_mined_blocks\n total_rewards\n total_scheduled_transfers\n }\n multisig: multisig_by_pk(id: $id) {\n id\n }\n guardian: high_security_set_aggregate(\n where: { who: { id: { _eq: $id } } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n beneficiaries: high_security_set_aggregate(\n where: { guardian: { id: { _eq: $id } } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": types.GetAccountByIdDocument, - "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: account_aggregate(\n where: {\n transfersFrom: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n\n recentlyDeposited: account_aggregate(\n where: {\n transfersTo: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n }\n ": types.GetAccountsStatsDocument, + "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n sent: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n\n recentlyDeposited: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n received: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n }\n ": types.GetAccountsStatsDocument, "\n query GetBlocks(\n $limit: Int\n $offset: Int\n $orderBy: [block_order_by!]!\n $where: block_bool_exp\n ) {\n blocks: block(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n id\n hash\n height\n reward\n timestamp\n mined_by_id\n extrinsics {\n id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: block_height\n }\n }\n ": types.GetBlocksDocument, "\n query GetBlockById($height: Int!, $hash: String!) {\n blocks: block(\n where: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n ) {\n id\n hash\n height\n reward\n timestamp\n extrinsics(order_by: { index_in_block: asc }) {\n id\n pallet\n call\n success\n fee\n timestamp\n indexInBlock: index_in_block\n signer {\n id\n }\n }\n }\n minerRewards: miner_reward(\n where: {\n block: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n }\n ) {\n reward\n timestamp\n miner {\n id\n }\n block {\n height\n hash\n }\n }\n rewardTransfers: unified_transaction(\n where: {\n type: { _eq: \"IMMEDIATE\" }\n hash: { _is_null: true }\n block: {\n _or: [{ height: { _eq: $height } }, { hash: { _eq: $hash } }]\n }\n }\n ) {\n amount\n detail_id\n from {\n id\n }\n to {\n id\n }\n }\n }\n ": types.GetBlockByIdDocument, "\n query GetBlockStats($startDate: timestamptz!, $endDate: timestamptz!) {\n chain: chain_stats_by_pk(id: \"global\") {\n block_height\n finalized_block_height\n }\n minedIn24Hours: block_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": types.GetBlockStatsDocument, @@ -108,7 +110,9 @@ const documents: Documents = { "\n query GetMinerLeaderboardStats(\n $startDate: timestamptz!\n $endDate: timestamptz!\n ) {\n chain: chain_stats_by_pk(id: \"global\") {\n block_height\n total_miners\n }\n last24Hour: miner_reward_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": types.GetMinerLeaderboardStatsDocument, "\n query GetMinerLeaderboardChart($limit: Int) {\n topMiners: account_stats(\n limit: $limit\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n id\n total_mined_blocks\n }\n blocks: chain_stats_by_pk(id: \"global\") {\n totalCount: block_height\n }\n }\n ": types.GetMinerLeaderboardChartDocument, "\n query GetMinerLeaderboard($limit: Int, $offset: Int) {\n leaderboardEntries: account_stats(\n limit: $limit\n offset: $offset\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n id\n total_mined_blocks\n total_rewards\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miners\n block_height\n }\n topMiner: account_stats(\n limit: 1\n order_by: { total_mined_blocks: desc }\n where: { total_mined_blocks: { _gt: 0 } }\n ) {\n total_mined_blocks\n }\n }\n ": types.GetMinerLeaderboardDocument, - "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n ": types.GetMinerRewardsDocument, + "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n": types.GetMinerRewardsDocument, + "\n query GetMinerRewardsWithChainTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miner_rewards\n }\n }\n": types.GetMinerRewardsWithChainTotalDocument, + "\n query GetMinerRewardsWithMinerTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n $minerId: String!\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: account_stats_by_pk(id: $minerId) {\n totalCount: total_mined_blocks\n }\n }\n": types.GetMinerRewardsWithMinerTotalDocument, "\n query GetMinerRewardsStats(\n $startDate: timestamptz!\n $endDate: timestamptz!\n ) {\n last24Hour: miner_reward_aggregate(\n where: { timestamp: { _gte: $startDate, _lte: $endDate } }\n ) {\n aggregate {\n totalCount: count\n }\n }\n allTime: chain_stats_by_pk(id: \"global\") {\n total_miner_rewards\n }\n }\n ": types.GetMinerRewardsStatsDocument, "\n query GetMinerRewardByHash($hash: String!) {\n minerRewards: miner_reward(where: { block: { hash: { _eq: $hash } } }) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n }\n ": types.GetMinerRewardByHashDocument, "\n fragment MultisigCreatedFields on multisig {\n id\n timestamp\n threshold\n nonce\n signers\n creator {\n id\n }\n block {\n height\n }\n extrinsic {\n id\n pallet\n call\n }\n }\n": types.MultisigCreatedFieldsFragmentDoc, @@ -181,7 +185,7 @@ export function gql(source: string): unknown; /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function gql(source: "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n flagEvents: accountEvents(\n where: {\n _or: [\n { high_security_set_id: { _is_null: false } }\n { multisig_id: { _is_null: false } }\n ]\n }\n limit: 20\n ) {\n highSecuritySet {\n who_id\n guardian_id\n }\n multisig_id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n "): (typeof documents)["\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n flagEvents: accountEvents(\n where: {\n _or: [\n { high_security_set_id: { _is_null: false } }\n { multisig_id: { _is_null: false } }\n ]\n }\n limit: 20\n ) {\n highSecuritySet {\n who_id\n guardian_id\n }\n multisig_id\n }\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n "]; +export function gql(source: "\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n is_high_security\n is_guardian\n is_multisig\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n "): (typeof documents)["\n query GetAccounts(\n $limit: Int\n $offset: Int\n $orderBy: [account_order_by!]\n ) {\n accounts: account(limit: $limit, offset: $offset, order_by: $orderBy) {\n id\n free\n frozen\n reserved\n is_high_security\n is_guardian\n is_multisig\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_accounts\n }\n }\n "]; /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -189,7 +193,7 @@ export function gql(source: "\n query GetAccountById($id: String!) {\n /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function gql(source: "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: account_aggregate(\n where: {\n transfersFrom: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n\n recentlyDeposited: account_aggregate(\n where: {\n transfersTo: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n }\n "): (typeof documents)["\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: account_aggregate(\n where: {\n transfersFrom: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n\n recentlyDeposited: account_aggregate(\n where: {\n transfersTo: { timestamp: { _gte: $startDate, _lte: $endDate } }\n }\n ) {\n aggregate {\n count\n }\n }\n }\n "]; +export function gql(source: "\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n sent: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n\n recentlyDeposited: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n received: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n }\n "): (typeof documents)["\n query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) {\n all: chain_stats_by_pk(id: \"global\") {\n total_accounts\n }\n\n recentlyActive: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n sent: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n\n recentlyDeposited: daily_active_account_aggregate(\n where: {\n date: { _gte: $startDate, _lte: $endDate }\n received: { _eq: true }\n }\n ) {\n aggregate {\n count(columns: account_id, distinct: true)\n }\n }\n }\n "]; /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -257,7 +261,15 @@ export function gql(source: "\n query GetMinerLeaderboard($limit: Int, $off /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function gql(source: "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n "): (typeof documents)["\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n "]; +export function gql(source: "\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n"): (typeof documents)["\n query GetMinerRewards(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: miner_reward_aggregate(where: $where) {\n aggregate {\n totalCount: count\n }\n }\n }\n"]; +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function gql(source: "\n query GetMinerRewardsWithChainTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miner_rewards\n }\n }\n"): (typeof documents)["\n query GetMinerRewardsWithChainTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: chain_stats_by_pk(id: \"global\") {\n totalCount: total_miner_rewards\n }\n }\n"]; +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function gql(source: "\n query GetMinerRewardsWithMinerTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n $minerId: String!\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: account_stats_by_pk(id: $minerId) {\n totalCount: total_mined_blocks\n }\n }\n"): (typeof documents)["\n query GetMinerRewardsWithMinerTotal(\n $limit: Int\n $offset: Int\n $orderBy: [miner_reward_order_by!]\n $where: miner_reward_bool_exp\n $minerId: String!\n ) {\n minerRewards: miner_reward(\n limit: $limit\n offset: $offset\n order_by: $orderBy\n where: $where\n ) {\n block {\n height\n hash\n }\n reward\n miner {\n id\n }\n timestamp\n }\n meta: account_stats_by_pk(id: $minerId) {\n totalCount: total_mined_blocks\n }\n }\n"]; /** * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/src/__generated__/graphql.ts b/src/__generated__/graphql.ts index 795acfb..76a0b3e 100644 --- a/src/__generated__/graphql.ts +++ b/src/__generated__/graphql.ts @@ -109,6 +109,9 @@ export type Account = { frozen: Scalars['numeric']['output']; id: Scalars['String']['output']; is_deposit_only: Scalars['Boolean']['output']; + is_guardian: Scalars['Boolean']['output']; + is_high_security: Scalars['Boolean']['output']; + is_multisig: Scalars['Boolean']['output']; last_updated: Scalars['Int']['output']; /** An array relationship */ minedBlocks: Array; @@ -278,6 +281,9 @@ export type Account_Bool_Exp = { frozen?: InputMaybe; id?: InputMaybe; is_deposit_only?: InputMaybe; + is_guardian?: InputMaybe; + is_high_security?: InputMaybe; + is_multisig?: InputMaybe; last_updated?: InputMaybe; minedBlocks?: InputMaybe; minedBlocks_aggregate?: InputMaybe; @@ -311,6 +317,7 @@ export type Account_Event = { highSecuritySet?: Maybe; high_security_set_id?: Maybe; id: Scalars['String']['output']; + incoming: Scalars['Boolean']['output']; /** An object relationship */ minerReward?: Maybe; miner_reward_id?: Maybe; @@ -329,6 +336,7 @@ export type Account_Event = { multisig_proposal_created_id?: Maybe; multisig_proposal_ready_id?: Maybe; multisig_signer_approved_id?: Maybe; + outgoing: Scalars['Boolean']['output']; /** An object relationship */ removedMultisigProposal?: Maybe; removed_multisig_proposal_id?: Maybe; @@ -352,9 +360,25 @@ export type Account_Event_Aggregate = { }; export type Account_Event_Aggregate_Bool_Exp = { + bool_and?: InputMaybe; + bool_or?: InputMaybe; count?: InputMaybe; }; +export type Account_Event_Aggregate_Bool_Exp_Bool_And = { + arguments: Account_Event_Select_Column_Account_Event_Aggregate_Bool_Exp_Bool_And_Arguments_Columns; + distinct?: InputMaybe; + filter?: InputMaybe; + predicate: Boolean_Comparison_Exp; +}; + +export type Account_Event_Aggregate_Bool_Exp_Bool_Or = { + arguments: Account_Event_Select_Column_Account_Event_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns; + distinct?: InputMaybe; + filter?: InputMaybe; + predicate: Boolean_Comparison_Exp; +}; + export type Account_Event_Aggregate_Bool_Exp_Count = { arguments?: InputMaybe>; distinct?: InputMaybe; @@ -402,6 +426,7 @@ export type Account_Event_Bool_Exp = { highSecuritySet?: InputMaybe; high_security_set_id?: InputMaybe; id?: InputMaybe; + incoming?: InputMaybe; minerReward?: InputMaybe; miner_reward_id?: InputMaybe; multisig?: InputMaybe; @@ -414,6 +439,7 @@ export type Account_Event_Bool_Exp = { multisig_proposal_created_id?: InputMaybe; multisig_proposal_ready_id?: InputMaybe; multisig_signer_approved_id?: InputMaybe; + outgoing?: InputMaybe; removedMultisigProposal?: InputMaybe; removed_multisig_proposal_id?: InputMaybe; scheduledReversibleTransfer?: InputMaybe; @@ -530,6 +556,7 @@ export type Account_Event_Order_By = { highSecuritySet?: InputMaybe; high_security_set_id?: InputMaybe; id?: InputMaybe; + incoming?: InputMaybe; minerReward?: InputMaybe; miner_reward_id?: InputMaybe; multisig?: InputMaybe; @@ -542,6 +569,7 @@ export type Account_Event_Order_By = { multisig_proposal_created_id?: InputMaybe; multisig_proposal_ready_id?: InputMaybe; multisig_signer_approved_id?: InputMaybe; + outgoing?: InputMaybe; removedMultisigProposal?: InputMaybe; removed_multisig_proposal_id?: InputMaybe; scheduledReversibleTransfer?: InputMaybe; @@ -570,6 +598,8 @@ export enum Account_Event_Select_Column { /** column name */ Id = 'id', /** column name */ + Incoming = 'incoming', + /** column name */ MinerRewardId = 'miner_reward_id', /** column name */ MultisigDepositsClaimedId = 'multisig_deposits_claimed_id', @@ -582,6 +612,8 @@ export enum Account_Event_Select_Column { /** column name */ MultisigSignerApprovedId = 'multisig_signer_approved_id', /** column name */ + Outgoing = 'outgoing', + /** column name */ RemovedMultisigProposalId = 'removed_multisig_proposal_id', /** column name */ ScheduledReversibleTransferId = 'scheduled_reversible_transfer_id', @@ -593,6 +625,22 @@ export enum Account_Event_Select_Column { TransferId = 'transfer_id' } +/** select "account_event_aggregate_bool_exp_bool_and_arguments_columns" columns of table "account_event" */ +export enum Account_Event_Select_Column_Account_Event_Aggregate_Bool_Exp_Bool_And_Arguments_Columns { + /** column name */ + Incoming = 'incoming', + /** column name */ + Outgoing = 'outgoing' +} + +/** select "account_event_aggregate_bool_exp_bool_or_arguments_columns" columns of table "account_event" */ +export enum Account_Event_Select_Column_Account_Event_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns { + /** column name */ + Incoming = 'incoming', + /** column name */ + Outgoing = 'outgoing' +} + /** Streaming cursor of the table "account_event" */ export type Account_Event_Stream_Cursor_Input = { /** Stream column input with initial value */ @@ -610,12 +658,14 @@ export type Account_Event_Stream_Cursor_Value_Input = { executed_reversible_transfer_id?: InputMaybe; high_security_set_id?: InputMaybe; id?: InputMaybe; + incoming?: InputMaybe; miner_reward_id?: InputMaybe; multisig_deposits_claimed_id?: InputMaybe; multisig_id?: InputMaybe; multisig_proposal_created_id?: InputMaybe; multisig_proposal_ready_id?: InputMaybe; multisig_signer_approved_id?: InputMaybe; + outgoing?: InputMaybe; removed_multisig_proposal_id?: InputMaybe; scheduled_reversible_transfer_id?: InputMaybe; tech_referendum_event_id?: InputMaybe; @@ -653,6 +703,9 @@ export type Account_Order_By = { frozen?: InputMaybe; id?: InputMaybe; is_deposit_only?: InputMaybe; + is_guardian?: InputMaybe; + is_high_security?: InputMaybe; + is_multisig?: InputMaybe; last_updated?: InputMaybe; minedBlocks_aggregate?: InputMaybe; privacy_deposits?: InputMaybe; @@ -672,6 +725,12 @@ export enum Account_Select_Column { /** column name */ IsDepositOnly = 'is_deposit_only', /** column name */ + IsGuardian = 'is_guardian', + /** column name */ + IsHighSecurity = 'is_high_security', + /** column name */ + IsMultisig = 'is_multisig', + /** column name */ LastUpdated = 'last_updated', /** column name */ PrivacyDeposits = 'privacy_deposits', @@ -936,6 +995,9 @@ export type Account_Stream_Cursor_Value_Input = { frozen?: InputMaybe; id?: InputMaybe; is_deposit_only?: InputMaybe; + is_guardian?: InputMaybe; + is_high_security?: InputMaybe; + is_multisig?: InputMaybe; last_updated?: InputMaybe; privacy_deposits?: InputMaybe; reserved?: InputMaybe; @@ -2151,7 +2213,12 @@ export enum Cursor_Ordering { /** columns and relationships of "daily_active_account" */ export type Daily_Active_Account = { __typename?: 'daily_active_account'; + account_id: Scalars['String']['output']; + date: Scalars['timestamptz']['output']; id: Scalars['String']['output']; + received: Scalars['Boolean']['output']; + sent: Scalars['Boolean']['output']; + signed: Scalars['Boolean']['output']; }; /** aggregated selection of "daily_active_account" */ @@ -2181,30 +2248,54 @@ export type Daily_Active_Account_Bool_Exp = { _and?: InputMaybe>; _not?: InputMaybe; _or?: InputMaybe>; + account_id?: InputMaybe; + date?: InputMaybe; id?: InputMaybe; + received?: InputMaybe; + sent?: InputMaybe; + signed?: InputMaybe; }; /** aggregate max on columns */ export type Daily_Active_Account_Max_Fields = { __typename?: 'daily_active_account_max_fields'; + account_id?: Maybe; + date?: Maybe; id?: Maybe; }; /** aggregate min on columns */ export type Daily_Active_Account_Min_Fields = { __typename?: 'daily_active_account_min_fields'; + account_id?: Maybe; + date?: Maybe; id?: Maybe; }; /** Ordering options when selecting data from "daily_active_account". */ export type Daily_Active_Account_Order_By = { + account_id?: InputMaybe; + date?: InputMaybe; id?: InputMaybe; + received?: InputMaybe; + sent?: InputMaybe; + signed?: InputMaybe; }; /** select columns of table "daily_active_account" */ export enum Daily_Active_Account_Select_Column { /** column name */ - Id = 'id' + AccountId = 'account_id', + /** column name */ + Date = 'date', + /** column name */ + Id = 'id', + /** column name */ + Received = 'received', + /** column name */ + Sent = 'sent', + /** column name */ + Signed = 'signed' } /** Streaming cursor of the table "daily_active_account" */ @@ -2217,7 +2308,12 @@ export type Daily_Active_Account_Stream_Cursor_Input = { /** Initial value of the column from where the streaming should start */ export type Daily_Active_Account_Stream_Cursor_Value_Input = { + account_id?: InputMaybe; + date?: InputMaybe; id?: InputMaybe; + received?: InputMaybe; + sent?: InputMaybe; + signed?: InputMaybe; }; /** columns and relationships of "daily_chain_stats" */ @@ -8789,6 +8885,7 @@ export type Transfer = { amount: Scalars['numeric']['output']; /** An object relationship */ block?: Maybe; + block_height: Scalars['Int']['output']; block_id?: Maybe; /** An object relationship */ event?: Maybe; @@ -8872,6 +8969,7 @@ export type Transfer_Aggregate_Order_By = { export type Transfer_Avg_Fields = { __typename?: 'transfer_avg_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -8880,6 +8978,7 @@ export type Transfer_Avg_Fields = { /** order by avg() on columns of table "transfer" */ export type Transfer_Avg_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -8892,6 +8991,7 @@ export type Transfer_Bool_Exp = { _or?: InputMaybe>; amount?: InputMaybe; block?: InputMaybe; + block_height?: InputMaybe; block_id?: InputMaybe; event?: InputMaybe; executedBy?: InputMaybe; @@ -8914,6 +9014,7 @@ export type Transfer_Bool_Exp = { export type Transfer_Max_Fields = { __typename?: 'transfer_max_fields'; amount?: Maybe; + block_height?: Maybe; block_id?: Maybe; extrinsic_id?: Maybe; fee?: Maybe; @@ -8930,6 +9031,7 @@ export type Transfer_Max_Fields = { /** order by max() on columns of table "transfer" */ export type Transfer_Max_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; block_id?: InputMaybe; extrinsic_id?: InputMaybe; fee?: InputMaybe; @@ -8947,6 +9049,7 @@ export type Transfer_Max_Order_By = { export type Transfer_Min_Fields = { __typename?: 'transfer_min_fields'; amount?: Maybe; + block_height?: Maybe; block_id?: Maybe; extrinsic_id?: Maybe; fee?: Maybe; @@ -8963,6 +9066,7 @@ export type Transfer_Min_Fields = { /** order by min() on columns of table "transfer" */ export type Transfer_Min_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; block_id?: InputMaybe; extrinsic_id?: InputMaybe; fee?: InputMaybe; @@ -8980,6 +9084,7 @@ export type Transfer_Min_Order_By = { export type Transfer_Order_By = { amount?: InputMaybe; block?: InputMaybe; + block_height?: InputMaybe; block_id?: InputMaybe; event?: InputMaybe; executedBy?: InputMaybe; @@ -9003,6 +9108,8 @@ export enum Transfer_Select_Column { /** column name */ Amount = 'amount', /** column name */ + BlockHeight = 'block_height', + /** column name */ BlockId = 'block_id', /** column name */ ExtrinsicId = 'extrinsic_id', @@ -9030,6 +9137,7 @@ export enum Transfer_Select_Column { export type Transfer_Stddev_Fields = { __typename?: 'transfer_stddev_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9038,6 +9146,7 @@ export type Transfer_Stddev_Fields = { /** order by stddev() on columns of table "transfer" */ export type Transfer_Stddev_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9047,6 +9156,7 @@ export type Transfer_Stddev_Order_By = { export type Transfer_Stddev_Pop_Fields = { __typename?: 'transfer_stddev_pop_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9055,6 +9165,7 @@ export type Transfer_Stddev_Pop_Fields = { /** order by stddev_pop() on columns of table "transfer" */ export type Transfer_Stddev_Pop_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9064,6 +9175,7 @@ export type Transfer_Stddev_Pop_Order_By = { export type Transfer_Stddev_Samp_Fields = { __typename?: 'transfer_stddev_samp_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9072,6 +9184,7 @@ export type Transfer_Stddev_Samp_Fields = { /** order by stddev_samp() on columns of table "transfer" */ export type Transfer_Stddev_Samp_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9088,6 +9201,7 @@ export type Transfer_Stream_Cursor_Input = { /** Initial value of the column from where the streaming should start */ export type Transfer_Stream_Cursor_Value_Input = { amount?: InputMaybe; + block_height?: InputMaybe; block_id?: InputMaybe; extrinsic_id?: InputMaybe; fee?: InputMaybe; @@ -9105,6 +9219,7 @@ export type Transfer_Stream_Cursor_Value_Input = { export type Transfer_Sum_Fields = { __typename?: 'transfer_sum_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9113,6 +9228,7 @@ export type Transfer_Sum_Fields = { /** order by sum() on columns of table "transfer" */ export type Transfer_Sum_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9122,6 +9238,7 @@ export type Transfer_Sum_Order_By = { export type Transfer_Var_Pop_Fields = { __typename?: 'transfer_var_pop_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9130,6 +9247,7 @@ export type Transfer_Var_Pop_Fields = { /** order by var_pop() on columns of table "transfer" */ export type Transfer_Var_Pop_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9139,6 +9257,7 @@ export type Transfer_Var_Pop_Order_By = { export type Transfer_Var_Samp_Fields = { __typename?: 'transfer_var_samp_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9147,6 +9266,7 @@ export type Transfer_Var_Samp_Fields = { /** order by var_samp() on columns of table "transfer" */ export type Transfer_Var_Samp_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -9156,6 +9276,7 @@ export type Transfer_Var_Samp_Order_By = { export type Transfer_Variance_Fields = { __typename?: 'transfer_variance_fields'; amount?: Maybe; + block_height?: Maybe; fee?: Maybe; leaf_index?: Maybe; transfer_count?: Maybe; @@ -9164,6 +9285,7 @@ export type Transfer_Variance_Fields = { /** order by variance() on columns of table "transfer" */ export type Transfer_Variance_Order_By = { amount?: InputMaybe; + block_height?: InputMaybe; fee?: InputMaybe; leaf_index?: InputMaybe; transfer_count?: InputMaybe; @@ -10073,7 +10195,7 @@ export type GetAccountsQueryVariables = Exact<{ }>; -export type GetAccountsQuery = { __typename?: 'query_root', accounts: Array<{ __typename?: 'account', id: string, free: any, frozen: any, reserved: any, flagEvents: Array<{ __typename?: 'account_event', multisig_id?: string | null, highSecuritySet?: { __typename?: 'high_security_set', who_id?: string | null, guardian_id?: string | null } | null }> }>, meta?: { __typename?: 'chain_stats', totalCount: number } | null }; +export type GetAccountsQuery = { __typename?: 'query_root', accounts: Array<{ __typename?: 'account', id: string, free: any, frozen: any, reserved: any, is_high_security: boolean, is_guardian: boolean, is_multisig: boolean }>, meta?: { __typename?: 'chain_stats', totalCount: number } | null }; export type GetAccountByIdQueryVariables = Exact<{ id: Scalars['String']['input']; @@ -10088,7 +10210,7 @@ export type GetAccountsStatsQueryVariables = Exact<{ }>; -export type GetAccountsStatsQuery = { __typename?: 'query_root', all?: { __typename?: 'chain_stats', total_accounts: number } | null, recentlyActive: { __typename?: 'account_aggregate', aggregate?: { __typename?: 'account_aggregate_fields', count: number } | null }, recentlyDeposited: { __typename?: 'account_aggregate', aggregate?: { __typename?: 'account_aggregate_fields', count: number } | null } }; +export type GetAccountsStatsQuery = { __typename?: 'query_root', all?: { __typename?: 'chain_stats', total_accounts: number } | null, recentlyActive: { __typename?: 'daily_active_account_aggregate', aggregate?: { __typename?: 'daily_active_account_aggregate_fields', count: number } | null }, recentlyDeposited: { __typename?: 'daily_active_account_aggregate', aggregate?: { __typename?: 'daily_active_account_aggregate_fields', count: number } | null } }; export type GetBlocksQueryVariables = Exact<{ limit?: InputMaybe; @@ -10226,6 +10348,27 @@ export type GetMinerRewardsQueryVariables = Exact<{ export type GetMinerRewardsQuery = { __typename?: 'query_root', minerRewards: Array<{ __typename?: 'miner_reward', reward: any, timestamp: any, block?: { __typename?: 'block', height: number, hash: string } | null, miner?: { __typename?: 'account', id: string } | null }>, meta: { __typename?: 'miner_reward_aggregate', aggregate?: { __typename?: 'miner_reward_aggregate_fields', totalCount: number } | null } }; +export type GetMinerRewardsWithChainTotalQueryVariables = Exact<{ + limit?: InputMaybe; + offset?: InputMaybe; + orderBy?: InputMaybe | Miner_Reward_Order_By>; + where?: InputMaybe; +}>; + + +export type GetMinerRewardsWithChainTotalQuery = { __typename?: 'query_root', minerRewards: Array<{ __typename?: 'miner_reward', reward: any, timestamp: any, block?: { __typename?: 'block', height: number, hash: string } | null, miner?: { __typename?: 'account', id: string } | null }>, meta?: { __typename?: 'chain_stats', totalCount: number } | null }; + +export type GetMinerRewardsWithMinerTotalQueryVariables = Exact<{ + limit?: InputMaybe; + offset?: InputMaybe; + orderBy?: InputMaybe | Miner_Reward_Order_By>; + where?: InputMaybe; + minerId: Scalars['String']['input']; +}>; + + +export type GetMinerRewardsWithMinerTotalQuery = { __typename?: 'query_root', minerRewards: Array<{ __typename?: 'miner_reward', reward: any, timestamp: any, block?: { __typename?: 'block', height: number, hash: string } | null, miner?: { __typename?: 'account', id: string } | null }>, meta?: { __typename?: 'account_stats', totalCount: number } | null }; + export type GetMinerRewardsStatsQueryVariables = Exact<{ startDate: Scalars['timestamptz']['input']; endDate: Scalars['timestamptz']['input']; @@ -10668,9 +10811,9 @@ export const MultisigProposalListFieldsFragmentDoc = {"kind":"Document","definit export const MultisigProposalDetailFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MultisigProposalDetailFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"multisig_proposal"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"deposit"}},{"kind":"Field","name":{"kind":"Name","value":"expiry_block"}},{"kind":"Field","name":{"kind":"Name","value":"approvals"}},{"kind":"Field","name":{"kind":"Name","value":"pallet"}},{"kind":"Field","name":{"kind":"Name","value":"call"}},{"kind":"Field","name":{"kind":"Name","value":"call_raw"}},{"kind":"Field","name":{"kind":"Name","value":"decode_error"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"tx_id"}},{"kind":"Field","name":{"kind":"Name","value":"transfer_amount"}},{"kind":"Field","name":{"kind":"Name","value":"schedule_amount"}},{"kind":"Field","name":{"kind":"Name","value":"delay_kind"}},{"kind":"Field","name":{"kind":"Name","value":"delay_value"}},{"kind":"Field","name":{"kind":"Name","value":"schedule_asset_id"}},{"kind":"Field","name":{"kind":"Name","value":"multisig"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"proposer"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"guardian"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"transferTo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"scheduleTo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recoverAccount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdExtrinsic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"pallet"}},{"kind":"Field","name":{"kind":"Name","value":"call"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAtBlock"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}}]}}]}}]} as unknown as DocumentNode; export const MultisigProposalLifecycleEventFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MultisigProposalLifecycleEventFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"multisig_proposal_created"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"extrinsic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}}]}}]}}]} as unknown as DocumentNode; export const MultisigSignerApprovedFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MultisigSignerApprovedFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"multisig_signer_approved"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"approvals_count"}},{"kind":"Field","name":{"kind":"Name","value":"approver"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"proposal"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"multisig"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"proposer"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}}]}},{"kind":"Field","name":{"kind":"Name","value":"extrinsic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"pallet"}},{"kind":"Field","name":{"kind":"Name","value":"call"}}]}}]}}]} as unknown as DocumentNode; -export const GetAccountsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAccounts"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"account_order_by"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"accounts"},"name":{"kind":"Name","value":"account"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"free"}},{"kind":"Field","name":{"kind":"Name","value":"frozen"}},{"kind":"Field","name":{"kind":"Name","value":"reserved"}},{"kind":"Field","alias":{"kind":"Name","value":"flagEvents"},"name":{"kind":"Name","value":"accountEvents"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"high_security_set_id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_is_null"},"value":{"kind":"BooleanValue","value":false}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"multisig_id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_is_null"},"value":{"kind":"BooleanValue","value":false}}]}}]}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"20"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"highSecuritySet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"who_id"}},{"kind":"Field","name":{"kind":"Name","value":"guardian_id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"multisig_id"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"total_accounts"}}]}}]}}]} as unknown as DocumentNode; +export const GetAccountsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAccounts"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"account_order_by"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"accounts"},"name":{"kind":"Name","value":"account"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"free"}},{"kind":"Field","name":{"kind":"Name","value":"frozen"}},{"kind":"Field","name":{"kind":"Name","value":"reserved"}},{"kind":"Field","name":{"kind":"Name","value":"is_high_security"}},{"kind":"Field","name":{"kind":"Name","value":"is_guardian"}},{"kind":"Field","name":{"kind":"Name","value":"is_multisig"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"total_accounts"}}]}}]}}]} as unknown as DocumentNode; export const GetAccountByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAccountById"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"account"},"name":{"kind":"Name","value":"account_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"free"}},{"kind":"Field","name":{"kind":"Name","value":"frozen"}},{"kind":"Field","name":{"kind":"Name","value":"reserved"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"accountStats"},"name":{"kind":"Name","value":"account_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total_cancelled_transfers"}},{"kind":"Field","name":{"kind":"Name","value":"total_executed_transfers"}},{"kind":"Field","name":{"kind":"Name","value":"total_immediate_transfers"}},{"kind":"Field","name":{"kind":"Name","value":"total_mined_blocks"}},{"kind":"Field","name":{"kind":"Name","value":"total_rewards"}},{"kind":"Field","name":{"kind":"Name","value":"total_scheduled_transfers"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"multisig"},"name":{"kind":"Name","value":"multisig_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"guardian"},"name":{"kind":"Name","value":"high_security_set_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"who"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"beneficiaries"},"name":{"kind":"Name","value":"high_security_set_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"guardian"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GetAccountsStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAccountsStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"all"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total_accounts"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"recentlyActive"},"name":{"kind":"Name","value":"account_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"transfersFrom"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"timestamp"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"recentlyDeposited"},"name":{"kind":"Name","value":"account_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"transfersTo"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"timestamp"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetAccountsStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAccountsStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"all"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total_accounts"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"recentlyActive"},"name":{"kind":"Name","value":"daily_active_account_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"date"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"sent"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"BooleanValue","value":true}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"columns"},"value":{"kind":"EnumValue","value":"account_id"}},{"kind":"Argument","name":{"kind":"Name","value":"distinct"},"value":{"kind":"BooleanValue","value":true}}]}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"recentlyDeposited"},"name":{"kind":"Name","value":"daily_active_account_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"date"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"received"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"BooleanValue","value":true}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"count"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"columns"},"value":{"kind":"EnumValue","value":"account_id"}},{"kind":"Argument","name":{"kind":"Name","value":"distinct"},"value":{"kind":"BooleanValue","value":true}}]}]}}]}}]}}]} as unknown as DocumentNode; export const GetBlocksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetBlocks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"block_order_by"}}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"block_bool_exp"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"blocks"},"name":{"kind":"Name","value":"block"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}},{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"mined_by_id"}},{"kind":"Field","name":{"kind":"Name","value":"extrinsics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"block_height"}}]}}]}}]} as unknown as DocumentNode; export const GetBlockByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetBlockById"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"height"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"hash"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"blocks"},"name":{"kind":"Name","value":"block"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"height"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"height"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"hash"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"hash"}}}]}}]}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}},{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"extrinsics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"index_in_block"},"value":{"kind":"EnumValue","value":"asc"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"pallet"}},{"kind":"Field","name":{"kind":"Name","value":"call"}},{"kind":"Field","name":{"kind":"Name","value":"success"}},{"kind":"Field","name":{"kind":"Name","value":"fee"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","alias":{"kind":"Name","value":"indexInBlock"},"name":{"kind":"Name","value":"index_in_block"}},{"kind":"Field","name":{"kind":"Name","value":"signer"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"minerRewards"},"name":{"kind":"Name","value":"miner_reward"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"block"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"height"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"height"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"hash"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"hash"}}}]}}]}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"miner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"rewardTransfers"},"name":{"kind":"Name","value":"unified_transaction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"type"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"StringValue","value":"IMMEDIATE","block":false}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"hash"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_is_null"},"value":{"kind":"BooleanValue","value":true}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"block"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"height"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"height"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"hash"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"hash"}}}]}}]}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"}},{"kind":"Field","name":{"kind":"Name","value":"detail_id"}},{"kind":"Field","name":{"kind":"Name","value":"from"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"to"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetBlockStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetBlockStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"chain"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"block_height"}},{"kind":"Field","name":{"kind":"Name","value":"finalized_block_height"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"minedIn24Hours"},"name":{"kind":"Name","value":"block_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"timestamp"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}}]}}]} as unknown as DocumentNode; @@ -10688,6 +10831,8 @@ export const GetMinerLeaderboardStatsDocument = {"kind":"Document","definitions" export const GetMinerLeaderboardChartDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerLeaderboardChart"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"topMiners"},"name":{"kind":"Name","value":"account_stats"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"EnumValue","value":"desc"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gt"},"value":{"kind":"IntValue","value":"0"}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"total_mined_blocks"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"blocks"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"block_height"}}]}}]}}]} as unknown as DocumentNode; export const GetMinerLeaderboardDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerLeaderboard"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"leaderboardEntries"},"name":{"kind":"Name","value":"account_stats"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"EnumValue","value":"desc"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gt"},"value":{"kind":"IntValue","value":"0"}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"total_mined_blocks"}},{"kind":"Field","name":{"kind":"Name","value":"total_rewards"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"total_miners"}},{"kind":"Field","name":{"kind":"Name","value":"block_height"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"topMiner"},"name":{"kind":"Name","value":"account_stats"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"1"}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"EnumValue","value":"desc"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"total_mined_blocks"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gt"},"value":{"kind":"IntValue","value":"0"}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total_mined_blocks"}}]}}]}}]} as unknown as DocumentNode; export const GetMinerRewardsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerRewards"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_order_by"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_bool_exp"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"minerRewards"},"name":{"kind":"Name","value":"miner_reward"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"miner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"miner_reward_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetMinerRewardsWithChainTotalDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerRewardsWithChainTotal"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_order_by"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_bool_exp"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"minerRewards"},"name":{"kind":"Name","value":"miner_reward"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"miner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"total_miner_rewards"}}]}}]}}]} as unknown as DocumentNode; +export const GetMinerRewardsWithMinerTotalDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerRewardsWithMinerTotal"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_order_by"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"miner_reward_bool_exp"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"minerId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"minerRewards"},"name":{"kind":"Name","value":"miner_reward"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"miner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"account_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"minerId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"total_mined_blocks"}}]}}]}}]} as unknown as DocumentNode; export const GetMinerRewardsStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerRewardsStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"timestamptz"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"last24Hour"},"name":{"kind":"Name","value":"miner_reward_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"timestamp"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_gte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"startDate"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"_lte"},"value":{"kind":"Variable","name":{"kind":"Name","value":"endDate"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}},{"kind":"Field","alias":{"kind":"Name","value":"allTime"},"name":{"kind":"Name","value":"chain_stats_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"StringValue","value":"global","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total_miner_rewards"}}]}}]}}]} as unknown as DocumentNode; export const GetMinerRewardByHashDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMinerRewardByHash"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"hash"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"minerRewards"},"name":{"kind":"Name","value":"miner_reward"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"block"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"hash"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"hash"}}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}},{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reward"}},{"kind":"Field","name":{"kind":"Name","value":"miner"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}}]}}]}}]} as unknown as DocumentNode; export const GetMultisigCreatedDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetMultisigCreated"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"multisig_order_by"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"multisig_bool_exp"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"multisigCreatedEvents"},"name":{"kind":"Name","value":"multisig"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MultisigCreatedFields"}}]}},{"kind":"Field","alias":{"kind":"Name","value":"meta"},"name":{"kind":"Name","value":"multisig_aggregate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"aggregate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"totalCount"},"name":{"kind":"Name","value":"count"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MultisigCreatedFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"multisig"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"threshold"}},{"kind":"Field","name":{"kind":"Name","value":"nonce"}},{"kind":"Field","name":{"kind":"Name","value":"signers"}},{"kind":"Field","name":{"kind":"Name","value":"creator"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"block"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"height"}}]}},{"kind":"Field","name":{"kind":"Name","value":"extrinsic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"pallet"}},{"kind":"Field","name":{"kind":"Name","value":"call"}}]}}]}}]} as unknown as DocumentNode; diff --git a/src/api/accounts.tsx b/src/api/accounts.tsx index 1f6ee4b..80dae1c 100644 --- a/src/api/accounts.tsx +++ b/src/api/accounts.tsx @@ -31,21 +31,9 @@ export const accounts = { free frozen reserved - flagEvents: accountEvents( - where: { - _or: [ - { high_security_set_id: { _is_null: false } } - { multisig_id: { _is_null: false } } - ] - } - limit: 20 - ) { - highSecuritySet { - who_id - guardian_id - } - multisig_id - } + is_high_security + is_guardian + is_multisig } meta: chain_stats_by_pk(id: "global") { totalCount: total_accounts @@ -118,29 +106,33 @@ export const accounts = { const startDate = subDays(startOfToday(), 7).toISOString(); const endDate = endOfToday().toISOString(); + // daily_active_account is one row per (UTC day, account) with sent/received flags, + // so the 7-day distinct counts read a few thousand indexed rows instead of the transfer table. const GET_ACCOUNTS_STATS = gql` query GetAccountsStats($startDate: timestamptz!, $endDate: timestamptz!) { all: chain_stats_by_pk(id: "global") { total_accounts } - recentlyActive: account_aggregate( + recentlyActive: daily_active_account_aggregate( where: { - transfersFrom: { timestamp: { _gte: $startDate, _lte: $endDate } } + date: { _gte: $startDate, _lte: $endDate } + sent: { _eq: true } } ) { aggregate { - count + count(columns: account_id, distinct: true) } } - recentlyDeposited: account_aggregate( + recentlyDeposited: daily_active_account_aggregate( where: { - transfersTo: { timestamp: { _gte: $startDate, _lte: $endDate } } + date: { _gte: $startDate, _lte: $endDate } + received: { _eq: true } } ) { aggregate { - count + count(columns: account_id, distinct: true) } } } diff --git a/src/api/miner-rewards.tsx b/src/api/miner-rewards.tsx index 897005d..507f93a 100644 --- a/src/api/miner-rewards.tsx +++ b/src/api/miner-rewards.tsx @@ -11,57 +11,177 @@ import type { } from '@/schemas'; import type { PaginatedQueryVariables } from '@/types/query'; import { useGetRecentDateRange } from '@/utils/get-recent-date-range'; +import { + extractMinerId, + isUnfilteredMinerRewards +} from '@/utils/miner-reward-filters'; + +// Field lists are written out per document (no template interpolation) so graphql-codegen +// can still extract typed documents for these queries. +const GET_MINER_REWARDS = gql` + query GetMinerRewards( + $limit: Int + $offset: Int + $orderBy: [miner_reward_order_by!] + $where: miner_reward_bool_exp + ) { + minerRewards: miner_reward( + limit: $limit + offset: $offset + order_by: $orderBy + where: $where + ) { + block { + height + hash + } + reward + miner { + id + } + timestamp + } + meta: miner_reward_aggregate(where: $where) { + aggregate { + totalCount: count + } + } + } +`; + +/** Unfiltered list: total from O(1) chain_stats instead of a full-table count. */ +const GET_MINER_REWARDS_WITH_CHAIN_TOTAL = gql` + query GetMinerRewardsWithChainTotal( + $limit: Int + $offset: Int + $orderBy: [miner_reward_order_by!] + $where: miner_reward_bool_exp + ) { + minerRewards: miner_reward( + limit: $limit + offset: $offset + order_by: $orderBy + where: $where + ) { + block { + height + hash + } + reward + miner { + id + } + timestamp + } + meta: chain_stats_by_pk(id: "global") { + totalCount: total_miner_rewards + } + } +`; + +/** Single-miner list: total from O(1) account_stats (one row per reward) instead of a filtered count. */ +const GET_MINER_REWARDS_WITH_MINER_TOTAL = gql` + query GetMinerRewardsWithMinerTotal( + $limit: Int + $offset: Int + $orderBy: [miner_reward_order_by!] + $where: miner_reward_bool_exp + $minerId: String! + ) { + minerRewards: miner_reward( + limit: $limit + offset: $offset + order_by: $orderBy + where: $where + ) { + block { + height + hash + } + reward + miner { + id + } + timestamp + } + meta: account_stats_by_pk(id: $minerId) { + totalCount: total_mined_blocks + } + } +`; + +type StatsTotalListResponse = { + minerRewards: MinerRewardListResponse['minerRewards']; + meta: { totalCount: number } | null; +}; + +function documentForListTotals(options: { + useChainTotal: boolean; + useMinerTotal: boolean; +}) { + if (options.useChainTotal) { + return GET_MINER_REWARDS_WITH_CHAIN_TOTAL; + } + if (options.useMinerTotal) { + return GET_MINER_REWARDS_WITH_MINER_TOTAL; + } + return GET_MINER_REWARDS; +} + +/** A missing stats row means nothing has been indexed for that scope yet, i.e. zero rewards. */ +function normalizeListResponse( + data: MinerRewardListResponse | StatsTotalListResponse | undefined +): MinerRewardListResponse | undefined { + if (!data) return undefined; + const meta = data.meta as + | MinerRewardListResponse['meta'] + | StatsTotalListResponse['meta'] + | undefined; + if (meta && 'aggregate' in meta) { + return data as MinerRewardListResponse; + } + return { + minerRewards: data.minerRewards, + meta: { aggregate: { totalCount: meta?.totalCount ?? 0 } } + }; +} export const minerRewards = { useGetAll: ( config?: QueryHookOptions< MinerRewardListResponse, - PaginatedQueryVariables + PaginatedQueryVariables & { + minerId?: string; + } > ) => { - const GET_MINER_REWARDS = gql` - query GetMinerRewards( - $limit: Int - $offset: Int - $orderBy: [miner_reward_order_by!] - $where: miner_reward_bool_exp - ) { - minerRewards: miner_reward( - limit: $limit - offset: $offset - order_by: $orderBy - where: $where - ) { - block { - height - hash - } - reward - miner { - id - } - timestamp - } - meta: miner_reward_aggregate(where: $where) { - aggregate { - totalCount: count - } - } - } - `; + const where = config?.variables?.where; + const minerId = extractMinerId(where); + const useChainTotal = isUnfilteredMinerRewards(where); + const useMinerTotal = !useChainTotal && !!minerId; - return useQuery< - MinerRewardListResponse, - PaginatedQueryVariables - >(GET_MINER_REWARDS, { + const document = documentForListTotals({ useChainTotal, useMinerTotal }); + + const result = useQuery(document, { ...config, variables: { orderBy: config?.variables?.orderBy ?? { timestamp: 'desc' }, limit: config?.variables?.limit ?? QUERY_DEFAULT_LIMIT, offset: config?.variables?.offset ?? 0, - where: config?.variables?.where + where, + ...(useMinerTotal ? { minerId } : {}) } }); + + return { + ...result, + data: normalizeListResponse( + result.data as + | MinerRewardListResponse + | StatsTotalListResponse + | undefined + ) + }; }, useGetStats: ( config?: Omit, 'variables'> diff --git a/src/components/common/table-columns/ACCOUNT_COLUMNS.tsx b/src/components/common/table-columns/ACCOUNT_COLUMNS.tsx index c7c1730..86911ef 100644 --- a/src/components/common/table-columns/ACCOUNT_COLUMNS.tsx +++ b/src/components/common/table-columns/ACCOUNT_COLUMNS.tsx @@ -3,23 +3,10 @@ import { createColumnHelper } from '@tanstack/react-table'; import { Badge } from '@/components/ui/badge'; import { LinkWithCopy } from '@/components/ui/composites/link-with-copy/LinkWithCopy'; import { RESOURCES } from '@/constants/resources'; -import type { Account } from '@/schemas'; +import type { AccountListItem } from '@/schemas'; import { formatMonetaryValue } from '@/utils/formatter'; -const columnHelper = createColumnHelper(); - -const getAccountFlags = (account: Account) => { - const events = account.flagEvents ?? []; - const isHighSec = events.some( - (event) => event.highSecuritySet?.who_id === account.id - ); - const isGuardian = events.some( - (event) => event.highSecuritySet?.guardian_id === account.id - ); - const isMultisig = events.some((event) => !!event.multisig_id); - - return { isHighSec, isGuardian, isMultisig }; -}; +const columnHelper = createColumnHelper(); export const ACCOUNT_COLUMNS = [ columnHelper.accessor('id', { @@ -38,9 +25,11 @@ export const ACCOUNT_COLUMNS = [ id: 'flags', header: 'Flags', cell: (props) => { - const { isHighSec, isGuardian, isMultisig } = getAccountFlags( - props.row.original - ); + const { + is_high_security: isHighSec, + is_guardian: isGuardian, + is_multisig: isMultisig + } = props.row.original; const hasFlags = isHighSec || isGuardian || isMultisig; if (!hasFlags) { diff --git a/src/components/features/account-listing/accounts-table/hook.tsx b/src/components/features/account-listing/accounts-table/hook.tsx index 591fdb3..79bf027 100644 --- a/src/components/features/account-listing/accounts-table/hook.tsx +++ b/src/components/features/account-listing/accounts-table/hook.tsx @@ -8,7 +8,7 @@ import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import type { AccountSorts } from '@/constants/query-sorts'; import { useOrderBy } from '@/hooks/useOrderBy'; import { useTableState } from '@/hooks/useTableState'; -import type { Account } from '@/schemas'; +import type { AccountListItem } from '@/schemas'; import { transformSortLiteral } from '@/utils/transform-sort'; export const useAccountsTable = () => { @@ -42,7 +42,7 @@ export const useAccountsTable = () => { const accountColumns = useMemo(() => ACCOUNT_COLUMNS, []); const [rowCount, setRowCount] = useState(data?.meta.totalCount ?? 0); - const table = useReactTable({ + const table = useReactTable({ data: data?.accounts ?? [], columns: accountColumns, getCoreRowModel: getCoreRowModel(), diff --git a/src/components/features/miner-reward-listing/miner-rewards-table/hook.tsx b/src/components/features/miner-reward-listing/miner-rewards-table/hook.tsx index 5fa3046..32d6d65 100644 --- a/src/components/features/miner-reward-listing/miner-rewards-table/hook.tsx +++ b/src/components/features/miner-reward-listing/miner-rewards-table/hook.tsx @@ -10,6 +10,7 @@ import type { MinerRewardSorts } from '@/constants/query-sorts'; import { useOrderBy } from '@/hooks/useOrderBy'; import { useTableState } from '@/hooks/useTableState'; import type { MinerReward } from '@/schemas'; +import { minerRewardsOfMiner } from '@/utils/miner-reward-filters'; import { transformSortLiteral } from '@/utils/transform-sort'; export const useMinerRewardsTable = () => { @@ -40,11 +41,7 @@ export const useMinerRewardsTable = () => { orderBy: orderByObject, limit, offset: currentPageIndex * limit, - ...(accountId && { - where: { - miner: { id_eq: accountId } - } - }) + ...(accountId && { where: minerRewardsOfMiner(accountId) }) } }); diff --git a/src/components/ui/composites/data-table/DataTable.stories.tsx b/src/components/ui/composites/data-table/DataTable.stories.tsx index 84a4391..6b7852f 100644 --- a/src/components/ui/composites/data-table/DataTable.stories.tsx +++ b/src/components/ui/composites/data-table/DataTable.stories.tsx @@ -26,6 +26,7 @@ type Story = StoryObj; const mockTransactions: Transaction[] = Array.from({ length: 12 }, (_, i) => ({ block: { height: 293293 + i }, + block_height: 293293 + i, extrinsic: { id: `0xhash${i.toString().padStart(4, '0')}`, pallet: 'balances', diff --git a/src/lib/graphql-benchmark/registry.ts b/src/lib/graphql-benchmark/registry.ts index 13d2724..0ddf419 100644 --- a/src/lib/graphql-benchmark/registry.ts +++ b/src/lib/graphql-benchmark/registry.ts @@ -24,6 +24,7 @@ import { GetMinerRewardByHashDocument, GetMinerRewardsDocument, GetMinerRewardsStatsDocument, + GetMinerRewardsWithChainTotalDocument, GetScheduledReversibleTransactionByTxIdDocument, GetScheduledReversibleTransactionsDocument, GetStatusDocument, @@ -218,6 +219,16 @@ export const graphqlBenchmarkRegistry: GraphqlBenchmarkRegistryEntry[] = [ offset: 0 }) }, + { + // What the unfiltered miner-rewards listing actually issues (total from chain_stats). + name: 'GetMinerRewardsWithChainTotal', + document: GetMinerRewardsWithChainTotalDocument, + getVariables: () => ({ + orderBy: { timestamp: 'desc' }, + limit: QUERY_DEFAULT_LIMIT, + offset: 0 + }) + }, { name: 'GetMinerRewardsStats', document: GetMinerRewardsStatsDocument, diff --git a/src/schemas/account.ts b/src/schemas/account.ts index e441dd7..9733d25 100644 --- a/src/schemas/account.ts +++ b/src/schemas/account.ts @@ -1,16 +1,12 @@ import type * as gql from '../__generated__/graphql'; -export interface AccountFlagEvent { - highSecuritySet?: { - who_id?: string | null; - guardian_id?: string | null; - } | null; - multisig_id?: string | null; -} +export type Account = Pick; -export interface Account - extends Pick { - flagEvents?: AccountFlagEvent[]; +/** Listing row: flags are denormalized onto `account` by the indexer (no nested event lookups). */ +export interface AccountListItem extends Account { + is_high_security: boolean; + is_guardian: boolean; + is_multisig: boolean; } export interface AccountStats { @@ -39,7 +35,7 @@ export interface AccountResponse { } export interface AccountListResponse { - accounts: Account[]; + accounts: AccountListItem[]; meta: { totalCount: number; }; diff --git a/src/utils/miner-reward-filters.test.ts b/src/utils/miner-reward-filters.test.ts new file mode 100644 index 0000000..730986d --- /dev/null +++ b/src/utils/miner-reward-filters.test.ts @@ -0,0 +1,59 @@ +import { + extractMinerId, + isUnfilteredMinerRewards, + minerRewardsOfMiner +} from './miner-reward-filters'; + +const minerId = 'qzjVsKygc34wWPcC5gaRArB5PZPV92h1BTzEaY8kQHuBs9Kjk'; + +describe('isUnfilteredMinerRewards', () => { + it('treats undefined, null and {} as unfiltered', () => { + expect(isUnfilteredMinerRewards(undefined)).toBe(true); + expect(isUnfilteredMinerRewards(null)).toBe(true); + expect(isUnfilteredMinerRewards({})).toBe(true); + }); + + it('treats keys explicitly set to undefined as absent', () => { + expect(isUnfilteredMinerRewards({ miner_id: undefined })).toBe(true); + }); + + it('rejects any real predicate', () => { + expect(isUnfilteredMinerRewards(minerRewardsOfMiner(minerId))).toBe(false); + expect(isUnfilteredMinerRewards({ reward: { _gt: '0' } })).toBe(false); + }); +}); + +describe('extractMinerId', () => { + it('returns null for unfiltered input', () => { + expect(extractMinerId(undefined)).toBeNull(); + expect(extractMinerId({})).toBeNull(); + }); + + it('extracts the id from the builder output', () => { + expect(extractMinerId(minerRewardsOfMiner(minerId))).toBe(minerId); + }); + + it('extracts the id from a hand-written exact miner_id _eq filter', () => { + expect(extractMinerId({ miner_id: { _eq: minerId } })).toBe(minerId); + }); + + it('returns null when other predicates are combined with the miner filter', () => { + expect( + extractMinerId({ miner_id: { _eq: minerId }, reward: { _gt: '0' } }) + ).toBeNull(); + expect( + extractMinerId({ _and: [{ miner_id: { _eq: minerId } }] }) + ).toBeNull(); + }); + + it('returns null for non-_eq or multi-operator miner_id comparisons', () => { + expect(extractMinerId({ miner_id: { _in: [minerId] } })).toBeNull(); + expect( + extractMinerId({ miner_id: { _eq: minerId, _neq: 'other' } }) + ).toBeNull(); + }); + + it('returns null for the nested relationship form', () => { + expect(extractMinerId({ miner: { id: { _eq: minerId } } })).toBeNull(); + }); +}); diff --git a/src/utils/miner-reward-filters.ts b/src/utils/miner-reward-filters.ts new file mode 100644 index 0000000..d7133a5 --- /dev/null +++ b/src/utils/miner-reward-filters.ts @@ -0,0 +1,37 @@ +import type { Miner_Reward_Bool_Exp } from '@/__generated__/graphql'; + +function definedKeys(obj: object): string[] { + return Object.keys(obj).filter( + (k) => (obj as Record)[k] != null + ); +} + +/** Filter for rewards of one miner; keep in sync with `extractMinerId`. */ +export function minerRewardsOfMiner(minerId: string): Miner_Reward_Bool_Exp { + return { miner_id: { _eq: minerId } }; +} + +/** True when `where` has no predicates, so `chain_stats.total_miner_rewards` is the list total. */ +export function isUnfilteredMinerRewards( + where?: Miner_Reward_Bool_Exp | null +): boolean { + if (!where) return true; + return definedKeys(where).length === 0; +} + +/** + * If `where` is exactly `{ miner_id: { _eq: } }`, return that id so the list total + * can come from `account_stats.total_mined_blocks`. Anything else returns null. + */ +export function extractMinerId( + where?: Miner_Reward_Bool_Exp | null +): string | null { + if (!where) return null; + const keys = definedKeys(where); + if (keys.length !== 1 || keys[0] !== 'miner_id') return null; + + const comparison = where.miner_id; + if (!comparison || definedKeys(comparison).length !== 1) return null; + + return typeof comparison._eq === 'string' ? comparison._eq : null; +} From 4610af400b10595f0842554f572240aa88c24cda Mon Sep 17 00:00:00 2001 From: Beast Date: Sun, 13 Sep 2026 15:13:16 +0800 Subject: [PATCH 3/4] fix: comma spacing --- src/components/ui/timestamp-display.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ui/timestamp-display.tsx b/src/components/ui/timestamp-display.tsx index 942d9e5..25ac7f4 100644 --- a/src/components/ui/timestamp-display.tsx +++ b/src/components/ui/timestamp-display.tsx @@ -20,13 +20,13 @@ export const TimestampDisplay: React.FC = ({ setIsOpen(true)} onMouseLeave={() => setIsOpen(false)} - className="whitespace-nowrap font-mono text-[11px] text-muted-text" + className="numeric whitespace-nowrap text-[11px] text-muted-text" > {timeinUtc} {timeDistance} From b03135c49f91986a29f4063517f527f2ac3804f1 Mon Sep 17 00:00:00 2001 From: Beast Date: Sun, 13 Sep 2026 18:15:58 +0800 Subject: [PATCH 4/4] fix: date bounds --- src/api/accounts.tsx | 7 +-- src/lib/graphql-benchmark/registry.ts | 7 +-- .../get-account-stats-utc-date-range.test.ts | 51 +++++++++++++++++++ src/utils/get-account-stats-utc-date-range.ts | 21 ++++++++ 4 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 src/utils/get-account-stats-utc-date-range.test.ts create mode 100644 src/utils/get-account-stats-utc-date-range.ts diff --git a/src/api/accounts.tsx b/src/api/accounts.tsx index 80dae1c..046bb50 100644 --- a/src/api/accounts.tsx +++ b/src/api/accounts.tsx @@ -1,8 +1,5 @@ import type { QueryHookOptions } from '@apollo/client'; import { gql, useQuery } from '@apollo/client'; -import { endOfToday } from 'date-fns/endOfToday'; -import { startOfToday } from 'date-fns/startOfToday'; -import { subDays } from 'date-fns/subDays'; import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import type { AccountSorts } from '@/constants/query-sorts'; @@ -12,6 +9,7 @@ import type { AccountStatsResponse } from '@/schemas'; import type { PaginatedQueryVariables } from '@/types/query'; +import { getAccountStatsUtcDateRange } from '@/utils/get-account-stats-utc-date-range'; export const accounts = { useGetAll: ( @@ -103,8 +101,7 @@ export const accounts = { useGetStats: ( config?: Omit, 'variables'> ) => { - const startDate = subDays(startOfToday(), 7).toISOString(); - const endDate = endOfToday().toISOString(); + const { startDate, endDate } = getAccountStatsUtcDateRange(); // daily_active_account is one row per (UTC day, account) with sent/received flags, // so the 7-day distinct counts read a few thousand indexed rows instead of the transfer table. diff --git a/src/lib/graphql-benchmark/registry.ts b/src/lib/graphql-benchmark/registry.ts index 0ddf419..fe5688c 100644 --- a/src/lib/graphql-benchmark/registry.ts +++ b/src/lib/graphql-benchmark/registry.ts @@ -1,7 +1,6 @@ import { gql } from '@apollo/client'; import { endOfToday } from 'date-fns/endOfToday'; import { startOfToday } from 'date-fns/startOfToday'; -import { subDays } from 'date-fns/subDays'; import { GetAccountByIdDocument, @@ -34,6 +33,7 @@ import { } from '@/__generated__/graphql'; import { QUERY_DEFAULT_LIMIT } from '@/constants/query-default-limit'; import { SEARCH_PREVIEW_RESULTS_LIMIT } from '@/constants/search-preview-results-limit'; +import { getAccountStatsUtcDateRange } from '@/utils/get-account-stats-utc-date-range'; import type { GraphqlBenchmarkRegistryEntry } from './types'; @@ -71,10 +71,7 @@ const SearchHexDocument = gql` `; function accountStatsDates() { - return { - startDate: subDays(startOfToday(), 7).toISOString(), - endDate: endOfToday().toISOString() - }; + return getAccountStatsUtcDateRange(); } function statsDay() { diff --git a/src/utils/get-account-stats-utc-date-range.test.ts b/src/utils/get-account-stats-utc-date-range.test.ts new file mode 100644 index 0000000..6e978cd --- /dev/null +++ b/src/utils/get-account-stats-utc-date-range.test.ts @@ -0,0 +1,51 @@ +import { endOfDay } from 'date-fns/endOfDay'; +import { startOfDay } from 'date-fns/startOfDay'; +import { subDays } from 'date-fns/subDays'; + +import { + ACCOUNT_STATS_LOOKBACK_DAYS, + getAccountStatsUtcDateRange +} from './get-account-stats-utc-date-range'; + +const originalTz = process.env.TZ; + +describe('getAccountStatsUtcDateRange', () => { + beforeAll(() => { + process.env.TZ = 'America/Los_Angeles'; + }); + + afterAll(() => { + if (originalTz === undefined) { + delete process.env.TZ; + } else { + process.env.TZ = originalTz; + } + }); + + it('uses UTC calendar-day bounds so the first UTC bucket is not dropped in PDT', () => { + // Sunday 13 Sep 2026, 12:00 PDT (UTC−7). + const now = new Date('2026-09-13T19:00:00.000Z'); + + expect(now.getTimezoneOffset()).toBe(420); + + const utcBucketStart = '2026-09-06T00:00:00.000Z'; + const localLookbackStart = subDays( + startOfDay(now), + ACCOUNT_STATS_LOOKBACK_DAYS + ).toISOString(); + const localLookbackEnd = endOfDay(now).toISOString(); + + // Local PDT midnight is 07:00Z, so a local _gte would exclude the whole + // 2026-09-06 UTC rollup bucket (00:00Z) that daily_active_account stores. + expect(localLookbackStart).toBe('2026-09-06T07:00:00.000Z'); + expect(localLookbackEnd).toBe('2026-09-14T06:59:59.999Z'); + expect(utcBucketStart < localLookbackStart).toBe(true); + + const { startDate, endDate } = getAccountStatsUtcDateRange(now); + + expect(startDate).toBe(utcBucketStart); + expect(endDate).toBe('2026-09-13T23:59:59.999Z'); + expect(startDate <= utcBucketStart).toBe(true); + expect(endDate >= '2026-09-13T00:00:00.000Z').toBe(true); + }); +}); diff --git a/src/utils/get-account-stats-utc-date-range.ts b/src/utils/get-account-stats-utc-date-range.ts new file mode 100644 index 0000000..f1f7e1c --- /dev/null +++ b/src/utils/get-account-stats-utc-date-range.ts @@ -0,0 +1,21 @@ +import { utc } from '@date-fns/utc'; +import { endOfDay } from 'date-fns/endOfDay'; +import { startOfDay } from 'date-fns/startOfDay'; +import { subDays } from 'date-fns/subDays'; + +/** Inclusive lookback matching GetAccountsStats (`$startDate` = today − 7 days). */ +export const ACCOUNT_STATS_LOOKBACK_DAYS = 7; + +/** + * UTC calendar-day bounds for `daily_active_account` rollup queries. + * + * Indexer rows are keyed at UTC midnight. Local `startOfToday()` bounds + * (e.g. 07:00Z in America/Los_Angeles) exclude that first UTC bucket. + */ +export const getAccountStatsUtcDateRange = (now: Date = new Date()) => ({ + startDate: subDays( + startOfDay(now, { in: utc }), + ACCOUNT_STATS_LOOKBACK_DAYS + ).toISOString(), + endDate: endOfDay(now, { in: utc }).toISOString() +});