Files
solace-bg-dubai/backend/src/db/schema.ts
defiQUG c94eb595f8
Some checks failed
CI / lint-and-test (push) Has been cancelled
Initial commit: add .gitignore and README
2026-02-09 21:51:53 -08:00

90 lines
3.5 KiB
TypeScript

import { pgTable, text, timestamp, integer, boolean, pgEnum, uuid } from "drizzle-orm/pg-core";
export const roleEnum = pgEnum("role", ["viewer", "initiator", "approver", "admin"]);
export const organizations = pgTable("organizations", {
id: uuid("id").defaultRandom().primaryKey(),
name: text("name").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().notNull(),
});
export const users = pgTable("users", {
id: uuid("id").defaultRandom().primaryKey(),
address: text("address").notNull().unique(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const memberships = pgTable("memberships", {
id: uuid("id").defaultRandom().primaryKey(),
organizationId: uuid("organization_id")
.references(() => organizations.id, { onDelete: "cascade" })
.notNull(),
userId: uuid("user_id")
.references(() => users.id, { onDelete: "cascade" })
.notNull(),
role: roleEnum("role").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const treasuries = pgTable("treasuries", {
id: uuid("id").defaultRandom().primaryKey(),
organizationId: uuid("organization_id")
.references(() => organizations.id, { onDelete: "cascade" })
.notNull(),
chainId: integer("chain_id").notNull(),
mainWallet: text("main_wallet").notNull().unique(),
label: text("label"),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().notNull(),
});
export const subAccounts = pgTable("sub_accounts", {
id: uuid("id").defaultRandom().primaryKey(),
treasuryId: uuid("treasury_id")
.references(() => treasuries.id, { onDelete: "cascade" })
.notNull(),
address: text("address").notNull().unique(),
label: text("label"),
metadataHash: text("metadata_hash"),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const transactionProposals = pgTable("transaction_proposals", {
id: uuid("id").defaultRandom().primaryKey(),
treasuryId: uuid("treasury_id")
.references(() => treasuries.id, { onDelete: "cascade" })
.notNull(),
proposalId: integer("proposal_id").notNull(),
walletAddress: text("wallet_address").notNull(),
to: text("to").notNull(),
value: text("value").notNull(), // Store as string to handle bigint
token: text("token"), // null for native token
data: text("data"),
status: text("status").notNull().default("pending"), // pending, executed, rejected
proposer: text("proposer").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
executedAt: timestamp("executed_at"),
});
export const approvals = pgTable("approvals", {
id: uuid("id").defaultRandom().primaryKey(),
proposalId: uuid("proposal_id")
.references(() => transactionProposals.id, { onDelete: "cascade" })
.notNull(),
signer: text("signer").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const auditLogs = pgTable("audit_logs", {
id: uuid("id").defaultRandom().primaryKey(),
organizationId: uuid("organization_id")
.references(() => organizations.id, { onDelete: "cascade" })
.notNull(),
treasuryId: uuid("treasury_id").references(() => treasuries.id, { onDelete: "set null" }),
action: text("action").notNull(), // owner_added, owner_removed, threshold_changed, etc.
actor: text("actor").notNull(),
details: text("details"), // JSON string for additional details
createdAt: timestamp("created_at").defaultNow().notNull(),
});