Bot & Automation
Market AI
/root/hermes-projects/Market AI
packages/database/prisma/schema.prisma
text
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum UserRole {
USER
ADMIN
}
enum UserStatus {
ACTIVE
SUSPENDED
}
enum TradingMode {
scalp
momentum
snipe
conservative
}
enum SignalAction {
BUY
SELL
WAIT
}
enum TradeSide {
BUY
SELL
}
enum TradeMode {
paper
live
}
enum TradeStatus {
prepared
submitted
filled
rejected
failed
}
enum AlertCondition {
price_above
price_below
volume_spike
score_above
liquidity_below
}
model User {
id String @id @default(uuid())
telegramId BigInt @unique
username String?
displayName String?
role UserRole @default(USER)
status UserStatus @default(ACTIVE)
defaultMode TradingMode @default(momentum)
riskPercent Decimal @default(0.5)
preferences Json @default("{}")
analyses MemeAnalysis[]
watchlistItems WatchlistItem[]
alertRules AlertRule[]
tradeOrders TradeOrder[]
positions Position[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model MemeToken {
id String @id @default(uuid())
chainId String
tokenAddress String
symbol String
name String
pairAddress String?
dexId String?
url String?
analyses MemeAnalysis[]
scans MemeScanItem[]
tradeOrders TradeOrder[]
positions Position[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([chainId, tokenAddress])
@@index([symbol])
}
model MemeAnalysis {
id String @id @default(uuid())
userId String?
user User? @relation(fields: [userId], references: [id])
tokenId String?
token MemeToken? @relation(fields: [tokenId], references: [id])
query String
mode TradingMode
action SignalAction
confidence Int
score Int
riskLevel String
metricsSnapshot Json
reasoningSnapshot Json
providerSource String
createdAt DateTime @default(now())
@@index([query, createdAt])
@@index([action, createdAt])
}
model MemeScanRun {
id String @id @default(uuid())
chainId String
criteria Json @default("{}")
source String
items MemeScanItem[]
createdAt DateTime @default(now())
@@index([chainId, createdAt])
}
model MemeScanItem {
id String @id @default(uuid())
scanRunId String
scanRun MemeScanRun @relation(fields: [scanRunId], references: [id])
tokenId String?
token MemeToken? @relation(fields: [tokenId], references: [id])
score Int
verdict String
riskLevel String
metrics Json
warnings Json @default("[]")
createdAt DateTime @default(now())
@@index([score, createdAt])
}
model TradeOrder {
id String @id @default(uuid())
userId String?
user User? @relation(fields: [userId], references: [id])
tokenId String?
token MemeToken? @relation(fields: [tokenId], references: [id])
chainId String
tokenAddress String
side TradeSide
mode TradeMode
status TradeStatus @default(prepared)
amount Decimal
slippageBps Int
quoteSnapshot Json @default("{}")
executionResult Json @default("{}")
txHash String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([userId, createdAt])
@@index([chainId, tokenAddress])
}
model Position {
id String @id @default(uuid())
userId String
user User @relation(fields: [userId], references: [id])
tokenId String?
token MemeToken? @relation(fields: [tokenId], references: [id])
chainId String
tokenAddress String
mode TradeMode
amountToken Decimal @default(0)
averageEntry Decimal @default(0)
realizedPnlUsd Decimal @default(0)
metadata Json @default("{}")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, chainId, tokenAddress, mode])
}
model WatchlistItem {
id String @id @default(uuid())
userId String
user User @relation(fields: [userId], references: [id])
chainId String
tokenAddress String
symbol String?
note String?
createdAt DateTime @default(now())
@@unique([userId, chainId, tokenAddress])
}
model AlertRule {
id String @id @default(uuid())
userId String
user User @relation(fields: [userId], references: [id])
chainId String
tokenAddress String
condition AlertCondition
target Decimal?
enabled Boolean @default(true)
lastFiredAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([enabled, chainId, tokenAddress])
}
model ProviderSnapshot {
id String @id @default(uuid())
providerId String
status String
coverage Json
quotaSnapshot Json @default("{}")
syncedAt DateTime @default(now())
@@index([providerId, syncedAt])
}
model WebhookEvent {
id String @id @default(uuid())
source String
externalId String
payload Json @default("{}")
processedAt DateTime?
createdAt DateTime @default(now())
@@unique([source, externalId])
}
model AuditLog {
id String @id @default(uuid())
actorId String?
action String
target String
payload Json @default("{}")
createdAt DateTime @default(now())
}