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 ?? '', + })), + }; }