From a6fc4a534fb60d478a719b725a8090e09002a3d2 Mon Sep 17 00:00:00 2001 From: syoul Date: Sun, 22 Mar 2026 18:40:07 +0100 Subject: [PATCH] fix: use real totalCount from Subsquid instead of capped fetch limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add totalCount to the GraphQL query so transactionCount reflects the true number of transfers in the period, not the 2000-item fetch cap. This also fixes the average Ğ1/tx calculation. Co-Authored-By: Claude Sonnet 4.6 --- src/services/DataService.ts | 3 +-- src/services/adapters/SubsquidAdapter.ts | 28 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/services/DataService.ts b/src/services/DataService.ts index d10e047..ccb40d0 100644 --- a/src/services/DataService.ts +++ b/src/services/DataService.ts @@ -37,10 +37,9 @@ async function fetchLiveTransactions(periodDays: number): Promise<{ totalCount: number; totalVolume: number; }> { - const rawTransfers = await fetchTransfers(periodDays); + const { transfers: rawTransfers, totalCount } = await fetchTransfers(periodDays); if (rawTransfers.length === 0) return { geolocated: [], totalCount: 0, totalVolume: 0 }; - const totalCount = rawTransfers.length; const totalVolume = rawTransfers.reduce((s, t) => s + t.amount, 0); // Carte SS58 courant → clé Duniter (= _id Cesium+) diff --git a/src/services/adapters/SubsquidAdapter.ts b/src/services/adapters/SubsquidAdapter.ts index b3ae06e..38bede1 100644 --- a/src/services/adapters/SubsquidAdapter.ts +++ b/src/services/adapters/SubsquidAdapter.ts @@ -33,6 +33,7 @@ const SubsquidTransferNodeSchema = z.object({ const SubsquidResponseSchema = z.object({ data: z.object({ transfers: z.object({ + totalCount: z.number().int(), nodes: z.array(SubsquidTransferNodeSchema), }), }), @@ -62,6 +63,7 @@ const TRANSFERS_QUERY = ` first: $limit filter: { timestamp: { greaterThanOrEqualTo: $since } } ) { + totalCount nodes { id blockNumber @@ -151,10 +153,15 @@ export async function buildIdentityKeyMap(): Promise> { return result; } +export interface FetchTransfersResult { + transfers: RawTransfer[]; + totalCount: number; +} + export async function fetchTransfers( periodDays: number, limit = 2000 -): Promise { +): Promise { const since = new Date( Date.now() - periodDays * 24 * 60 * 60 * 1000 ).toISOString(); @@ -180,12 +187,15 @@ export async function fetchTransfers( const parsed = SubsquidResponseSchema.parse(raw); - return parsed.data.transfers.nodes.map((node) => ({ - id: node.id, - timestamp: new Date(node.timestamp).getTime(), - amount: parseInt(node.amount, 10) / 100, - fromId: node.fromId ?? '', - toId: node.toId ?? '', - fromName: node.from?.linkedIdentity?.name ?? '', - })); + return { + totalCount: parsed.data.transfers.totalCount, + transfers: parsed.data.transfers.nodes.map((node) => ({ + id: node.id, + timestamp: new Date(node.timestamp).getTime(), + amount: parseInt(node.amount, 10) / 100, + fromId: node.fromId ?? '', + toId: node.toId ?? '', + fromName: node.from?.linkedIdentity?.name ?? '', + })), + }; }