From e46cb5cf405e74f17ff67d97fdab9717e5cbc88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Fri, 27 Sep 2024 22:57:06 +0200 Subject: [PATCH] feat: create new token holders route (#128) --- .changeset/odd-foxes-march.md | 5 +++ apps/server/src/api/tokens/holders.get.ts | 37 +++++++++++++++++++ .../src/api/tokens/transaction-volume.get.ts | 7 +++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .changeset/odd-foxes-march.md create mode 100644 apps/server/src/api/tokens/holders.get.ts diff --git a/.changeset/odd-foxes-march.md b/.changeset/odd-foxes-march.md new file mode 100644 index 0000000..e8cf057 --- /dev/null +++ b/.changeset/odd-foxes-march.md @@ -0,0 +1,5 @@ +--- +"@stackspulse/server": minor +--- + +Create new `/tokens/holders` route. diff --git a/apps/server/src/api/tokens/holders.get.ts b/apps/server/src/api/tokens/holders.get.ts new file mode 100644 index 0000000..cf71e5e --- /dev/null +++ b/apps/server/src/api/tokens/holders.get.ts @@ -0,0 +1,37 @@ +import { z } from "zod"; +import { apiCacheConfig } from "~/lib/api"; +import { getValidatedQueryZod } from "~/lib/nitro"; +import { stacksClient } from "~/lib/stacks"; + +const tokensHoldersRouteSchema = z.object({ + token: z.string(), + limit: z.number().min(1).max(100).optional(), + offset: z.number().min(0).optional(), +}); + +type TokensHoldersRouteResponse = { + total_supply: string; + total: number; + results: { + address: string; + balance: string; + }[]; +}; + +export default defineCachedEventHandler(async (event) => { + const query = await getValidatedQueryZod(event, tokensHoldersRouteSchema); + + const limit = query.limit ?? 20; + const offset = query.offset ?? 0; + + const data: TokensHoldersRouteResponse = ( + await stacksClient.GET("/extended/v1/tokens/ft/{token}/holders", { + params: { + path: { token: query.token }, + query: { limit, offset }, + }, + }) + ).data; + + return data; +}, apiCacheConfig); diff --git a/apps/server/src/api/tokens/transaction-volume.get.ts b/apps/server/src/api/tokens/transaction-volume.get.ts index 2d312ba..edb252b 100644 --- a/apps/server/src/api/tokens/transaction-volume.get.ts +++ b/apps/server/src/api/tokens/transaction-volume.get.ts @@ -7,6 +7,11 @@ const tokensTransactionVolumeRouteSchema = z.object({ token: z.string(), }); +type TokensTransactionVolumeRouteResponse = { + date: string; + daily_volume: string; +}[]; + export default defineCachedEventHandler(async (event) => { const query = await getValidatedQueryZod( event, @@ -30,7 +35,7 @@ ORDER BY date; `; - const stats = result.map((row) => ({ + const stats: TokensTransactionVolumeRouteResponse = result.map((row) => ({ date: row.date.slice(0, 10), daily_volume: row.daily_volume, }));