A Prediction Market on the AT Protocol
1import { text, integer, json, pgTable, timestamp, pgEnum, index } from "drizzle-orm/pg-core";
2import { relations } from "drizzle-orm";
3import { drizzle } from "drizzle-orm/node-postgres";
4import { ENV } from "@/core/env";
5
6const SHARED_SCHEMA = {
7 uri: text().primaryKey().notNull(),
8 did: text().notNull(),
9 rev: text().notNull(),
10 rkey: text().notNull(),
11 cid: text().notNull(),
12 record: json().notNull(),
13 createdAt: timestamp({ withTimezone: true }).notNull(),
14}
15
16export const betPositionEnum = pgEnum("bet_position", ["yes", "no"]);
17export const resolutionAnswerEnum = pgEnum("resolution_answer", ["yes", "no"]);
18
19export const marketsTable = pgTable("markets", {
20 ...SHARED_SCHEMA,
21 question: text().notNull(),
22 liquidity: integer().notNull(),
23 closesAt: timestamp({ withTimezone: true }).notNull(),
24});
25
26export const betsTable = pgTable("bets", {
27 ...SHARED_SCHEMA,
28 position: betPositionEnum().notNull(),
29 marketUri: text().notNull().references(() => marketsTable.uri),
30}, (table) => [
31 index('bets_market_uri_idx').on(table.marketUri),
32]);
33
34export const resolutionsTable = pgTable("resolutions", {
35 ...SHARED_SCHEMA,
36 answer: resolutionAnswerEnum().notNull(),
37 marketUri: text().notNull().unique().references(() => marketsTable.uri),
38});
39
40export const marketsRelations = relations(marketsTable, ({ many, one }) => ({
41 bets: many(betsTable),
42 resolution: one(resolutionsTable),
43}));
44
45export const betsRelations = relations(betsTable, ({ one }) => ({
46 market: one(marketsTable, {
47 fields: [betsTable.marketUri],
48 references: [marketsTable.uri],
49 }),
50}));
51
52export const resolutionsRelations = relations(resolutionsTable, ({ one }) => ({
53 market: one(marketsTable, {
54 fields: [resolutionsTable.marketUri],
55 references: [marketsTable.uri],
56 }),
57}));
58
59export const db = drizzle(ENV.DATABASE_URL, {
60 schema: {
61 marketsTable,
62 betsTable,
63 resolutionsTable,
64 marketsRelations,
65 betsRelations,
66 resolutionsRelations
67 }
68});