diff --git a/.changeset/sixty-deers-wave.md b/.changeset/sixty-deers-wave.md new file mode 100644 index 00000000..3768d963 --- /dev/null +++ b/.changeset/sixty-deers-wave.md @@ -0,0 +1,5 @@ +--- +"@stackspulse/server": minor +--- + +Create new `/tokens/transaction-volume` route. diff --git a/apps/server/src/api/tokens/transaction-volume.get.ts b/apps/server/src/api/tokens/transaction-volume.get.ts new file mode 100644 index 00000000..2d312bad --- /dev/null +++ b/apps/server/src/api/tokens/transaction-volume.get.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; +import { sql } from "~/db/db"; +import { apiCacheConfig } from "~/lib/api"; +import { getValidatedQueryZod } from "~/lib/nitro"; + +const tokensTransactionVolumeRouteSchema = z.object({ + token: z.string(), +}); + +export default defineCachedEventHandler(async (event) => { + const query = await getValidatedQueryZod( + event, + tokensTransactionVolumeRouteSchema, + ); + + const result = await sql` +SELECT + DATE_TRUNC('day', TO_TIMESTAMP(blocks.burn_block_time)) AS date, + SUM(ft_events.amount::numeric) AS daily_volume +FROM + ft_events +JOIN + blocks ON ft_events.index_block_hash = blocks.index_block_hash +WHERE + ft_events.asset_identifier = ${query.token} + AND ft_events.canonical = true +GROUP BY + DATE_TRUNC('day', TO_TIMESTAMP(blocks.burn_block_time)) +ORDER BY + date; + `; + + const stats = result.map((row) => ({ + date: row.date.slice(0, 10), + daily_volume: row.daily_volume, + })); + + return stats; +}, apiCacheConfig);