nac-presale/server/routers.ts

45 lines
1.6 KiB
TypeScript

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;