import { COOKIE_NAME } from "@shared/const"; import { getSessionCookieOptions } from "./_core/cookies"; import { systemRouter } from "./_core/systemRouter"; import { publicProcedure, protectedProcedure, router } from "./_core/trpc"; import { getCombinedStats, getPresaleStats } from "./onchain"; import { getRecentPurchases } from "./trc20Monitor"; import { z } from "zod"; export const appRouter = router({ system: systemRouter, auth: router({ me: publicProcedure.query(opts => opts.ctx.user), logout: publicProcedure.mutation(({ ctx }) => { const cookieOptions = getSessionCookieOptions(ctx.req); ctx.res.clearCookie(COOKIE_NAME, { ...cookieOptions, maxAge: -1 }); return { success: true } as const; }), }), // ─── Presale Stats ──────────────────────────────────────────────────────── presale: router({ // Combined stats from BSC + ETH + TRC20 stats: publicProcedure.query(async () => { return await getCombinedStats(); }), // Single chain stats chainStats: publicProcedure .input(z.object({ chain: z.enum(["BSC", "ETH"]) })) .query(async ({ input }) => { return await getPresaleStats(input.chain); }), // Recent purchases (TRC20 from DB + mock EVM for live feed) recentPurchases: publicProcedure .input(z.object({ limit: z.number().min(1).max(50).default(20) })) .query(async ({ input }) => { const trc20 = await getRecentPurchases(input.limit); return trc20; }), }), }); export type AppRouter = typeof appRouter;