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())
}