// DBIS Core Banking System - Database Schema
// Sovereign-grade financial infrastructure

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// ============================================================================
// Sovereign Banks & Identity
// ============================================================================

model SovereignBank {
  id                String   @id @default(uuid())
  sovereignCode     String   @unique // OMNL, etc.
  name              String
  bic               String?  @unique
  lei               String?  @unique
  hsmIdentity       String?  // HSM-backed identity reference
  rootSovereignKey  String?  // RSK reference
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  // Relations
  accounts          BankAccount[]
  identities        SovereignIdentity[]
  fxTrades          FxTrade[]
  cbdcIssuance      CbdcIssuance[]
  complianceRecords ComplianceRecord[]
  contracts         SmartContract[]
  isoMessages       IsoMessage[]
  liquidityPools    LiquidityPool[]
  creditLines       InterbankCreditLine[]
  settlementNodes   SovereignSettlementNode[]
  // Volume X Relations
  metaCouncilMembers MetaSovereignCouncilMember[]
  privileges        SovereignPrivilege[]
  faceEconomies     FaceEconomy[]
  chronoSettlementsSource ChronoSettlement[] @relation("ChronoSettlementSource")
  chronoSettlementsDestination ChronoSettlement[] @relation("ChronoSettlementDestination")
  // Volume XII Relations
  ummcMappings       UmmcSovereignMapping[]
  temporalCurrencyTransactions TemporalCurrencyTransaction[]
  aifxTrades         AifxTrade[]
  interplanetarySsuTransactions InterplanetarySsuTransaction[]
  continuityIdentities SovereignContinuityIdentity[]
  // Volume XIV Relations
  infiniteLayerIdentities InfiniteLayerIdentity[]
  holographicAnchors HolographicAnchor[]
  // Supplement B Relations
  dsez                    DigitalSovereignEconomicZone[]
  // Volume II: Supranational Relations
  supranationalMemberships SupranationalEntityMember[]
  // Nostro/Vostro Relations
  nostroVostroParticipants NostroVostroParticipant[] @relation("NostroVostroParticipantToSovereignBank")

  bondMarketParticipants BondMarketParticipant[] @relation("BondMarketParticipantToSovereignBank")
  @@index([sovereignCode])
  @@index([bic])
  @@map("sovereign_banks")
}

model SovereignIdentity {
  id                String   @id @default(uuid())
  sovereignBankId   String
  identityType      String   // Master, Treasury, CBDC, Settlement, API
  identityKey       String   // Cryptographic key reference
  hsmKeyId          String?  // HSM key identifier
  certificate       String?  // X.509 certificate
  quantumKeyId      String?  // Reference to quantum-safe cryptographic key
  isQuantumEnabled  Boolean  @default(false) // Whether quantum-safe crypto is enabled
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([identityType])
  @@index([quantumKeyId])
  @@map("sovereign_identities")
}

// ============================================================================
// Account Management
// ============================================================================

model BankAccount {
  id                String   @id @default(uuid())
  accountNumber     String   @unique
  sovereignBankId   String
  accountType       String   // sovereign, treasury, commercial, correspondent, settlement
  currencyCode      String   // ISO 4217
  assetType         String   @default("fiat") // fiat, cbdc, commodity, security
  balance           Decimal  @default(0) @db.Decimal(32, 8)
  availableBalance  Decimal  @default(0) @db.Decimal(32, 8)
  reservedBalance   Decimal  @default(0) @db.Decimal(32, 8)
  reserveRequirement Decimal? @db.Decimal(32, 8)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  
  // Ledger relations
  debitEntries      LedgerEntry[] @relation("DebitAccount")
  creditEntries     LedgerEntry[] @relation("CreditAccount")

  @@index([sovereignBankId])
  @@index([accountNumber])
  @@index([accountType])
  @@index([currencyCode])
  @@map("bank_accounts")
}

// ============================================================================
// Global Ledger System
// ============================================================================

model LedgerEntry {
  id                String   @id @default(uuid())
  ledgerId          String   // Master, Sovereign, or Sub-ledger ID
  debitAccountId    String
  creditAccountId   String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String   // ISO 4217
  fxRate            Decimal? @db.Decimal(32, 12)
  assetType         String   @default("fiat")
  transactionType  String   // Type A-G
  referenceId       String
  timestampUtc      DateTime @default(now())
  blockHash         String   // SHA-3 hash
  previousHash      String?  // Previous entry hash for chaining
  auditFlag         Boolean  @default(false)
  amlRiskScore      Int?     @default(0)
  status            String   @default("pending") // pending, posted, settled, reversed
  metadata          Json?    // Additional transaction data
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  debitAccount      BankAccount @relation("DebitAccount", fields: [debitAccountId], references: [id])
  creditAccount     BankAccount @relation("CreditAccount", fields: [creditAccountId], references: [id])

  @@index([ledgerId])
  @@index([referenceId])
  @@index([timestampUtc])
  @@index([status])
  @@index([blockHash])
  @@index([transactionType])
  @@map("ledger_entries")
}

// Sub-ledgers
model FxSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  fxTradeId         String
  baseCurrency      String
  quoteCurrency     String
  baseAmount        Decimal  @db.Decimal(32, 8)
  quoteAmount       Decimal  @db.Decimal(32, 8)
  fxRate            Decimal  @db.Decimal(32, 12)
  createdAt         DateTime @default(now())

  @@index([fxTradeId])
  @@map("fx_sub_ledger")
}

model SecuritiesSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  securityId        String
  securityType       String   // bond, equity, tokenized
  quantity          Decimal  @db.Decimal(32, 8)
  price             Decimal? @db.Decimal(32, 12)
  createdAt         DateTime @default(now())

  @@index([securityId])
  @@map("securities_sub_ledger")
}

model CommoditiesSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  commodityType     String   // gold, oil, metals
  quantity          Decimal  @db.Decimal(32, 8)
  unit              String   // oz, barrel, kg
  price             Decimal? @db.Decimal(32, 12)
  createdAt         DateTime @default(now())

  @@index([commodityType])
  @@map("commodities_sub_ledger")
}

model DerivativesSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  derivativeType    String
  notionalAmount    Decimal  @db.Decimal(32, 8)
  markToMarket      Decimal? @db.Decimal(32, 12)
  createdAt         DateTime @default(now())

  @@map("derivatives_sub_ledger")
}

model CbdcSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  cbdcIssuanceId    String
  walletId          String?
  operationType     String   // mint, burn, transfer
  amount            Decimal  @db.Decimal(32, 8)
  createdAt         DateTime @default(now())

  @@index([cbdcIssuanceId])
  @@index([walletId])
  @@map("cbdc_sub_ledger")
}

model CustodySubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  custodianId       String
  assetType         String
  quantity          Decimal  @db.Decimal(32, 8)
  createdAt         DateTime @default(now())

  @@index([custodianId])
  @@map("custody_sub_ledger")
}

model CollateralSubLedger {
  id                String   @id @default(uuid())
  ledgerEntryId     String   @unique
  collateralType    String
  pledgedAmount     Decimal  @db.Decimal(32, 8)
  valuation         Decimal  @db.Decimal(32, 12)
  createdAt         DateTime @default(now())

  @@map("collateral_sub_ledger")
}

// ============================================================================
// FX Engine
// ============================================================================

model FxPair {
  id                String   @id @default(uuid())
  baseCurrency      String
  quoteCurrency     String
  pairCode          String   @unique // OMF/USD
  pricingMethod     String   // VWAP, TWAP, DBIS_SCI
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  trades            FxTrade[]

  @@index([pairCode])
  @@index([baseCurrency, quoteCurrency])
  @@map("fx_pairs")
}

model FxTrade {
  id                String   @id @default(uuid())
  tradeId           String   @unique
  sovereignBankId   String
  fxPairId         String
  baseCurrency      String
  quoteCurrency     String
  tradeType         String   // spot, forward, swap, option, cbdc_cross_chain
  quantity          Decimal  @db.Decimal(32, 8)
  price             Decimal  @db.Decimal(32, 12)
  orderType         String   // market, limit, stop, sovereign
  initiatorEntity   String
  counterpartyEntity String?
  settlementMode    String   // RTGS, T+1, atomic
  status            String   @default("pending") // pending, executed, settled, cancelled
  timestampUtc      DateTime @default(now())
  executedAt       DateTime?
  settledAt         DateTime?
  metadata          Json?

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id])
  fxPair           FxPair @relation(fields: [fxPairId], references: [id])

  @@index([sovereignBankId])
  @@index([tradeId])
  @@index([status])
  @@index([timestampUtc])
  @@map("fx_trades")
}

model LiquidityPool {
  id                String   @id @default(uuid())
  sovereignBankId   String
  currencyCode      String
  totalLiquidity    Decimal  @db.Decimal(32, 8)
  availableLiquidity Decimal @db.Decimal(32, 8)
  reservedLiquidity Decimal  @db.Decimal(32, 8)
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@unique([sovereignBankId, currencyCode])
  @@index([sovereignBankId])
  @@map("liquidity_pools")
}

// ============================================================================
// CBDC System
// ============================================================================

model CbdcIssuance {
  id                String   @id @default(uuid())
  recordId          String   @unique
  sovereignBankId   String
  walletId          String?
  amountMinted      Decimal  @default(0) @db.Decimal(32, 8)
  amountBurned      Decimal  @default(0) @db.Decimal(32, 8)
  netChange         Decimal  @default(0) @db.Decimal(32, 8)
  operationType     String   // mint, burn, transfer
  operatorIdentity  String
  reserveBacking    Decimal? @db.Decimal(32, 8) // 1:1 backing verification
  timestampUtc      DateTime @default(now())
  metadata          Json?

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([walletId])
  @@index([timestampUtc])
  @@map("cbdc_issuance")
}

model CbdcWallet {
  id                String   @id @default(uuid())
  walletId          String   @unique
  sovereignBankId   String
  walletType        String   // retail, wholesale, institutional
  currencyCode      String
  balance           Decimal  @default(0) @db.Decimal(32, 8)
  status            String   @default("active")
  tieredAccess      Json?    // Access control configuration
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sovereignBankId])
  @@index([walletType])
  @@map("cbdc_wallets")
}

model CbdcOfflineCapsule {
  id                String   @id @default(uuid())
  capsuleId         String   @unique
  senderWalletId    String
  receiverWalletId  String
  amount            Decimal  @db.Decimal(32, 8)
  timestamp         DateTime
  expiryWindow      Int      // Allowed time window in seconds
  doubleSpendToken  String   @unique
  signature         String
  status            String   @default("pending") // pending, validated, synced, rejected
  syncedAt          DateTime?
  createdAt         DateTime @default(now())

  @@index([capsuleId])
  @@index([doubleSpendToken])
  @@index([status])
  @@map("cbdc_offline_capsules")
}

// ============================================================================
// Securities & Commodities
// ============================================================================

model Security {
  id                String   @id @default(uuid())
  securityId        String   @unique
  securityType      String   // bond, equity, tokenized
  issuer            String
  currencyCode      String
  quantity          Decimal  @db.Decimal(32, 8)
  price             Decimal? @db.Decimal(32, 12)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([securityId])
  @@index([securityType])
  @@map("securities")
}

model Commodity {
  id                String   @id @default(uuid())
  commodityType     String   // gold, oil, metals
  unit              String   // oz, barrel, kg
  spotPrice         Decimal  @db.Decimal(32, 12)
  priceSource       String
  lastUpdated       DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@unique([commodityType, unit])
  @@index([commodityType])
  @@map("commodities")
}

// ============================================================================
// Compliance & Risk
// ============================================================================

model ComplianceRecord {
  id                String   @id @default(uuid())
  sovereignBankId   String
  transactionId     String?
  recordType        String   // aml_check, sanctions_screening, pep_check, risk_score
  entityName        String?
  entityType        String?
  riskScore         Int      @default(0)
  status            String   @default("clear") // clear, flagged, blocked
  screeningResult   Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([transactionId])
  @@index([recordType])
  @@index([status])
  @@map("compliance_records")
}

model SuspiciousActivityReport {
  id                String   @id @default(uuid())
  reportId          String   @unique
  transactionId     String?
  reportType        String   // SAR, STR
  severity          String   // low, medium, high, critical
  description       String
  status            String   @default("pending") // pending, submitted, acknowledged
  submittedAt       DateTime?
  createdAt         DateTime @default(now())

  @@index([reportId])
  @@index([status])
  @@map("suspicious_activity_reports")
}

model SanctionsList {
  id                String   @id @default(uuid())
  entityName        String
  entityType        String   // individual, organization, country
  listSource        String   // OFAC, EU, UN
  listId            String
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([entityName])
  @@index([listSource])
  @@index([status])
  @@map("sanctions_lists")
}

// ============================================================================
// Smart Contracts
// ============================================================================

model SmartContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  sovereignBankId   String
  templateType      String   // FX_SWAP, LETTER_OF_CREDIT, SOVEREIGN_GUARANTEE, CBDC_CONDITIONAL, COMMODITY_REDEMPTION
  contractState     String   @default("draft") // draft, active, executed, expired, cancelled
  parameters        Json
  signatories       Json     // Array of required signatories
  signatures        Json?    // Collected signatures
  executionResult   Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt
  executedAt        DateTime?

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([contractId])
  @@index([templateType])
  @@index([contractState])
  @@map("smart_contracts")
}

// ============================================================================
// ISO 20022 Messages
// ============================================================================

model IsoMessage {
  id                String   @id @default(uuid())
  messageId         String   @unique
  sovereignBankId   String
  messageType       String   // PACS.008, PACS.002, CAMT.053, FXMT.001, etc.
  direction         String   // inbound, outbound
  status            String   @default("pending") // pending, processed, failed, acknowledged
  rawMessage        String   @db.Text
  parsedData        Json?
  dbisExtensions    Json?    // SOV-ID, MACI, CBDC-MODE
  hsmSignature      String?
  createdAt         DateTime @default(now())
  processedAt       DateTime?
  acknowledgedAt    DateTime?

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([messageId])
  @@index([messageType])
  @@index([status])
  @@index([createdAt])
  @@map("iso_messages")
}

// ============================================================================
// Treasury & Liquidity
// ============================================================================

model InterbankCreditLine {
  id                String   @id @default(uuid())
  sovereignBankId   String
  counterpartyBankId String
  creditLimit       Decimal  @db.Decimal(32, 8)
  usedAmount        Decimal  @default(0) @db.Decimal(32, 8)
  availableAmount   Decimal  @db.Decimal(32, 8)
  currencyCode      String
  status            String   @default("active")
  expiryDate        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([sovereignBankId])
  @@index([counterpartyBankId])
  @@map("interbank_credit_lines")
}

model LiquidityForecast {
  id                String   @id @default(uuid())
  sovereignBankId   String
  forecastDate      DateTime
  forecastType      String   // daily, weekly, monthly
  lcr               Decimal? @db.Decimal(32, 8) // Liquidity Coverage Ratio
  nsfr              Decimal? @db.Decimal(32, 8) // Net Stable Funding Ratio
  hqla              Decimal? @db.Decimal(32, 8) // High-Quality Liquid Assets
  forecastData      Json
  createdAt         DateTime @default(now())

  @@index([sovereignBankId])
  @@index([forecastDate])
  @@map("liquidity_forecasts")
}

// ============================================================================
// ICC Trade Finance
// ============================================================================

model LetterOfCredit {
  id                String   @id @default(uuid())
  lcId              String   @unique
  applicantBankId   String
  beneficiaryBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  expiryDate        DateTime
  status            String   @default("issued") // issued, presented, accepted, rejected, expired
  documents         Json?    // eUCP 2.0 compliant documents
  contractReference String?  // Smart contract reference
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([lcId])
  @@index([status])
  @@map("letters_of_credit")
}

model SovereignGuarantee {
  id                String   @id @default(uuid())
  guaranteeId       String   @unique
  guarantorBankId   String
  beneficiaryBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  guaranteeType     String   // demand_guarantee, bank_guarantee
  expiryDate        DateTime
  status            String   @default("active") // active, invoked, expired, cancelled
  contractReference String?  // Smart contract reference
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([guaranteeId])
  @@index([status])
  @@map("sovereign_guarantees")
}

// ============================================================================
// Governance & Rulebook
// ============================================================================

model RulebookRule {
  id                String   @id @default(uuid())
  ruleId            String   @unique
  ruleCategory      String   // eligibility, liquidity, settlement, default
  ruleName          String
  ruleDescription   String   @db.Text
  ruleLogic         Json     // Rule evaluation logic
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([ruleCategory])
  @@index([status])
  @@map("rulebook_rules")
}

model DefaultEvent {
  id                String   @id @default(uuid())
  eventId           String   @unique
  sovereignBankId   String
  eventType         String   // technical_default, liquidity_default, reserve_breach
  severity          String   // low, medium, high, critical
  status            String   @default("active") // active, resolved, escalated
  description       String   @db.Text
  resolutionActions  Json?
  createdAt         DateTime @default(now())
  resolvedAt        DateTime?

  @@index([sovereignBankId])
  @@index([eventType])
  @@index([status])
  @@map("default_events")
}

// ============================================================================
// Audit & Monitoring
// ============================================================================

model AuditLog {
  id                String   @id @default(uuid())
  eventType         String
  entityType        String
  entityId          String
  action            String
  actorId           String?
  actorType         String?
  details           Json?
  timestamp         DateTime @default(now())
  ipAddress         String?
  userAgent         String?

  @@index([eventType])
  @@index([entityType, entityId])
  @@index([timestamp])
  @@map("audit_logs")
}

// ============================================================================
// DBIS Volume II: Constitution & Governance
// ============================================================================

model ConstitutionArticle {
  id                String   @id @default(uuid())
  articleNumber     String   // I, II, III, etc.
  articleTitle      String
  section           String?  // 1.1, 1.2, etc.
  content           String   @db.Text
  version           Int      @default(1)
  effectiveDate     DateTime
  expiryDate        DateTime?
  status            String   @default("active") // active, superseded, archived
  metadata          Json?    // Additional legal references
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([articleNumber])
  @@index([version])
  @@index([status])
  @@map("constitution_articles")
}

model GovernanceBody {
  id                String   @id @default(uuid())
  bodyType          String   // BoardOfGovernors, MSC, CAA, SCC
  name              String
  description       String   @db.Text
  memberCount       Int?
  votingMechanism   String   // simple_majority, supermajority_2_3, unanimous
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  members           GovernanceBodyMember[]
  votingRecords     VotingRecord[]

  @@index([bodyType])
  @@index([status])
  @@map("governance_bodies")
}

model GovernanceBodyMember {
  id                String   @id @default(uuid())
  governanceBodyId  String
  sovereignBankId   String?
  memberName        String
  memberRole        String   // Governor, Officer, Auditor, etc.
  votingWeight      Decimal? @db.Decimal(32, 8) // Calculated based on liquidity + stability
  status            String   @default("active")
  appointedAt       DateTime @default(now())
  termEndDate       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  governanceBody    GovernanceBody @relation(fields: [governanceBodyId], references: [id], onDelete: Cascade)

  @@index([governanceBodyId])
  @@index([sovereignBankId])
  @@map("governance_body_members")
}

model VotingRecord {
  id                String   @id @default(uuid())
  governanceBodyId  String
  proposalId        String   @unique
  proposalType      String   // amendment, operational_update, membership_change, liquidity_guarantee
  proposalTitle     String
  proposalContent   String   @db.Text
  requiredVoteType  String   // simple_majority, supermajority_2_3, unanimous
  status            String   @default("pending") // pending, approved, rejected, withdrawn
  votesFor          Int      @default(0)
  votesAgainst      Int      @default(0)
  votesAbstain      Int      @default(0)
  totalVotingWeight  Decimal  @default(0) @db.Decimal(32, 8)
  votingDeadline    DateTime?
  votedAt           DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  governanceBody    GovernanceBody @relation(fields: [governanceBodyId], references: [id])
  votes             Vote[]

  @@index([governanceBodyId])
  @@index([proposalId])
  @@index([status])
  @@map("voting_records")
}

model Vote {
  id                String   @id @default(uuid())
  votingRecordId    String
  memberId          String
  vote              String   // for, against, abstain
  votingWeight      Decimal  @db.Decimal(32, 8)
  timestamp         DateTime @default(now())

  votingRecord      VotingRecord @relation(fields: [votingRecordId], references: [id], onDelete: Cascade)

  @@index([votingRecordId])
  @@index([memberId])
  @@map("votes")
}

model DisputeResolution {
  id                String   @id @default(uuid())
  disputeId         String   @unique
  sovereignBankId1   String
  sovereignBankId2   String
  disputeType       String   // settlement, fx, liquidity, compliance
  description       String   @db.Text
  stage             String   @default("bilateral") // bilateral, caa_mediation, binding_arbitration
  status            String   @default("active") // active, resolved, escalated
  resolution        String?  @db.Text
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([disputeId])
  @@index([sovereignBankId1])
  @@index([sovereignBankId2])
  @@index([stage])
  @@index([status])
  @@map("dispute_resolutions")
}

// ============================================================================
// DBIS Volume II: Quantum-Safe Cryptography
// ============================================================================

model QuantumMigrationPhase {
  id                String   @id @default(uuid())
  phaseNumber       Int      // 1, 2, 3
  phaseName         String   // Phase I - Hybrid, Phase II - Full PQC, Phase III - Quantum-Native
  description       String   @db.Text
  targetComponents  Json     // Array of components to migrate
  status            String   @default("planned") // planned, in_progress, completed
  startDate         DateTime?
  completionDate    DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  migrations        MigrationAudit[]

  @@index([phaseNumber])
  @@index([status])
  @@map("quantum_migration_phases")
}

model CryptographicKey {
  id                String   @id @default(uuid())
  keyId             String   @unique
  keyType           String   // ecc_521, pqc_kyber, pqc_dilithium, hybrid, xmss, sphincs_plus
  keyPurpose        String   // ledger_hashing, api_signature, cbdc_capsule, smart_contract, sovereign_identity
  publicKey         String   @db.Text
  privateKeyRef     String?  // Reference to HSM-stored private key
  hsmKeyId          String?  // HSM key identifier
  algorithm         String   // CRYSTALS-Kyber, CRYSTALS-Dilithium, ECC-521, etc.
  keySize           Int?     // Key size in bits
  status            String   @default("active") // active, rotated, revoked
  createdAt         DateTime @default(now())
  rotatedAt         DateTime?
  expiresAt         DateTime?

  @@index([keyId])
  @@index([keyType])
  @@index([keyPurpose])
  @@index([status])
  @@map("cryptographic_keys")
}

model MigrationAudit {
  id                String   @id @default(uuid())
  phaseId           String
  componentType     String   // ledger, api, cbdc, smart_contract, identity
  componentId       String
  migrationStatus   String   // pending, in_progress, completed, failed
  oldKeyId          String?
  newKeyId          String?
  migrationDate     DateTime?
  notes             String?  @db.Text
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  phase             QuantumMigrationPhase @relation(fields: [phaseId], references: [id], onDelete: Cascade)

  @@index([phaseId])
  @@index([componentType])
  @@index([componentId])
  @@index([migrationStatus])
  @@map("migration_audits")
}

// ============================================================================
// DBIS Volume II: Sovereign Risk Index (SRI)
// ============================================================================

model SovereignRiskIndex {
  id                String   @id @default(uuid())
  sovereignBankId   String
  sriScore          Decimal  @db.Decimal(32, 8) // 0-100 scale
  sriRating         String   // AAA, AA, A, BBB, BB, B, CCC
  calculatedAt      DateTime @default(now())
  effectiveDate     DateTime @default(now())
  status            String   @default("active") // active, historical
  metadata          Json?    // Calculation details

  inputs            SRIInput[]
  enforcements      SRIEnforcement[]

  @@index([sovereignBankId])
  @@index([sriScore])
  @@index([sriRating])
  @@index([calculatedAt])
  @@map("sovereign_risk_indices")
}

model SRIInput {
  id                String   @id @default(uuid())
  sriId             String
  inputCategory     String   // financial_stability, fx_commodity, operational
  inputType         String   // SLCR, NSFR_S, cross_border_exposure, fx_volatility_30d, fx_volatility_90d, commodity_reserve, settlement_failure_rate, aml_compliance, cyber_defense
  inputValue        Decimal  @db.Decimal(32, 8)
  weight            Decimal? @db.Decimal(32, 8) // Weight in calculation
  source            String?  // Data source
  timestamp         DateTime @default(now())

  sri               SovereignRiskIndex @relation(fields: [sriId], references: [id], onDelete: Cascade)

  @@index([sriId])
  @@index([inputCategory])
  @@index([inputType])
  @@map("sri_inputs")
}

model SRIEnforcement {
  id                String   @id @default(uuid())
  sriId             String
  sovereignBankId   String
  triggerLevel      String   // sri_40, sri_60
  enforcementType   String   // liquidity_requirement, fx_stabilization, enhanced_monitoring, crisis_protocol, liquidity_injection, settlement_restriction
  action            String   @db.Text
  status            String   @default("active") // active, executed, resolved
  executedAt        DateTime?
  resolvedAt        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sri               SovereignRiskIndex @relation(fields: [sriId], references: [id], onDelete: Cascade)

  @@index([sriId])
  @@index([sovereignBankId])
  @@index([triggerLevel])
  @@index([status])
  @@map("sri_enforcements")
}

// ============================================================================
// DBIS Volume II: Accounting & Reporting Standards
// ============================================================================

model ConsolidatedStatement {
  id                String   @id @default(uuid())
  statementId       String   @unique
  statementType     String   // CSLR, CrossBorderExposure, CBDCReserveAdequacy
  reportDate        DateTime
  periodStart       DateTime
  periodEnd         DateTime
  status            String   @default("draft") // draft, final, published
  statementData     Json     // Consolidated data
  publishedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([statementId])
  @@index([statementType])
  @@index([reportDate])
  @@index([status])
  @@map("consolidated_statements")
}

model SovereignReport {
  id                String   @id @default(uuid())
  sovereignBankId   String
  reportId          String   @unique
  reportType        String   // daily_liquidity, weekly_fx_reserve, monthly_aml_compliance, quarterly_cbdc_audit
  reportPeriod      String   // daily, weekly, monthly, quarterly
  reportDate        DateTime
  dueDate           DateTime
  status            String   @default("pending") // pending, submitted, reviewed, overdue
  reportData        Json     // Report data
  submittedAt       DateTime?
  reviewedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sovereignBankId])
  @@index([reportId])
  @@index([reportType])
  @@index([reportDate])
  @@index([status])
  @@map("sovereign_reports")
}

model ValuationRule {
  id                String   @id @default(uuid())
  ruleId            String   @unique
  assetType         String   // fiat, cbdc, commodity, security, derivative
  valuationMethod   String   // fair_value, commodity_feed, fx_reference_rate
  feedSource        String?  // Data feed source
  updateFrequency   String   // real_time, hourly, daily
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  ruleConfig        Json?    // Configuration parameters
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([ruleId])
  @@index([assetType])
  @@index([status])
  @@map("valuation_rules")
}

// ============================================================================
// DBIS Volume II: Instant Settlement Network (ISN)
// ============================================================================

model SettlementRoute {
  id                String   @id @default(uuid())
  routeId           String   @unique
  sourceBankId      String
  destinationBankId String
  currencyCode      String
  routeType         String   // direct, via_intermediary, mesh
  intermediaryBankIds Json?  // Array of intermediary bank IDs
  liquidityProximity Decimal? @db.Decimal(32, 8)
  trustWeight       Decimal? @db.Decimal(32, 8)
  fxCost            Decimal? @db.Decimal(32, 12)
  estimatedLatency  Int?     // Milliseconds
  // SIRE extensions
  sireCost          Decimal? @db.Decimal(32, 12) // Total SIRE calculated cost
  sriRiskScore      Decimal? @db.Decimal(32, 8)
  liquidityPenalty  Decimal? @db.Decimal(32, 8)
  ssuAdjustment     Decimal? @db.Decimal(32, 8)
  status            String   @default("active")
  lastUsedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  routingDecisions  SireRoutingDecision[]

  @@index([routeId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([currencyCode])
  @@index([status])
  @@map("settlement_routes")
}

model AtomicSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  transactionId     String?
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // currency, cbdc, commodity, security
  settlementMode    String   // atomic, rtgs
  dualLedgerCommit  Boolean  @default(false)
  sovereignLedgerHash String?
  dbisLedgerHash    String?
  settlementTime    Int?     // Milliseconds to settle
  status            String   @default("pending") // pending, committed, settled, failed
  committedAt       DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([settlementId])
  @@index([transactionId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@index([committedAt])
  @@map("atomic_settlements")
}

model SyntheticSettlementUnit {
  id                String   @id @default(uuid())
  ssuId             String   @unique
  ssuName           String
  description       String   @db.Text
  underlyingAssets  Json     // Array of underlying assets
  conversionRate    Decimal? @db.Decimal(32, 12)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  compositions      SsuComposition[]
  transactions      SsuTransaction[]
  redemptionRequests SsuRedemptionRequest[]

  @@index([ssuId])
  @@index([status])
  @@map("synthetic_settlement_units")
}

// ============================================================================
// DBIS Volume II: RegTech Framework
// ============================================================================

model SupervisionRule {
  id                String   @id @default(uuid())
  ruleId            String   @unique
  ruleName          String
  ruleType          String   // aml_behavior, sanctions_matching, fx_anomaly, transaction_velocity, clustering
  ruleLogic         Json     // Rule evaluation logic
  threshold         Decimal? @db.Decimal(32, 8)
  severity          String   // low, medium, high, critical
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([ruleId])
  @@index([ruleType])
  @@index([status])
  @@map("supervision_rules")
}

model SupervisoryDashboard {
  id                String   @id @default(uuid())
  dashboardId       String   @unique
  sovereignBankId   String?
  dashboardType     String   // real_time_sri, liquidity_stress, cbdc_penetration, incident_alerts
  metrics           Json     // Dashboard metrics
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([dashboardId])
  @@index([sovereignBankId])
  @@index([dashboardType])
  @@map("supervisory_dashboards")
}

model ComplianceSandbox {
  id                String   @id @default(uuid())
  sandboxId         String   @unique
  sovereignBankId   String
  scenarioType      String   // rule_change, aml_scenario, policy_validation
  scenarioName      String
  scenarioConfig    Json     // Scenario configuration
  testResults       Json?
  status            String   @default("draft") // draft, running, completed, failed
  startedAt         DateTime?
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sandboxId])
  @@index([sovereignBankId])
  @@index([scenarioType])
  @@index([status])
  @@map("compliance_sandboxes")
}

// ============================================================================
// DBIS Volume II: Internal Operations & HR
// ============================================================================

model DbisRole {
  id                String   @id @default(uuid())
  roleId            String   @unique
  roleName          String   // Governor, MSC_Officer, CAA_Auditor, Sovereign_Relations_Director, Crisis_Operations_Commander
  roleDescription   String   @db.Text
  accessLevel       String   // tier_1, tier_2, tier_3, tier_4
  permissions       Json     // Array of permissions
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  employees         EmployeeCredential[]

  @@index([roleId])
  @@index([roleName])
  @@index([accessLevel])
  @@map("dbis_roles")
}

model EmployeeCredential {
  id                String   @id @default(uuid())
  employeeId        String   @unique
  roleId            String
  employeeName      String
  email             String
  securityClearance String   // tier_1, tier_2, tier_3, tier_4
  cryptographicBadgeId String? // Cryptographic identity badge reference
  hsmCredentialId   String?  // HSM-secured credential reference
  status            String   @default("active") // active, suspended, revoked
  issuedAt          DateTime @default(now())
  expiresAt         DateTime?
  revokedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  role              DbisRole @relation(fields: [roleId], references: [id], onDelete: Cascade)

  @@index([employeeId])
  @@index([roleId])
  @@index([securityClearance])
  @@index([status])
  @@map("employee_credentials")
}

model CrisisProtocol {
  id                String   @id @default(uuid())
  protocolId        String   @unique
  protocolName      String
  crisisType        String   // fx_collapse, default_event, liquidity_freeze, cyber_attack
  escalationChain   Json     // Array of escalation steps
  activationCriteria Json   // Criteria for activation
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  activatedAt       DateTime?
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([protocolId])
  @@index([crisisType])
  @@index([status])
  @@map("crisis_protocols")
}

// ============================================================================
// DBIS Volume III: Global Settlement System (GSS)
// ============================================================================

model SovereignSettlementNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  sovereignBankId   String
  layer              String   // layer_1_sovereign, layer_2_master, layer_3_scf, layer_4_fil
  nodeType          String   // SSN (Sovereign Settlement Node)
  status            String   @default("active") // active, suspended, inactive
  lastSyncAt        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  masterLedgerEntries GssMasterLedger[]
  stateBlocks       StateBlock[]

  @@index([nodeId])
  @@index([sovereignBankId])
  @@index([layer])
  @@index([status])
  @@map("sovereign_settlement_nodes")
}

model GssMasterLedger {
  id                String   @id @default(uuid())
  entryId           String   @unique
  nodeId            String
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // fiat, cbdc, commodity, security, synthetic
  sovereignSignature String?
  dbisSignature     String?
  dualLedgerCommit  Boolean  @default(false)
  sovereignLedgerHash String?
  dbisLedgerHash    String?
  status            String   @default("pending") // pending, committed, settled, failed
  committedAt       DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              SovereignSettlementNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([entryId])
  @@index([nodeId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@index([committedAt])
  @@map("gss_master_ledger")
}

model GssLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  layerNumber       Int      // 1, 2, 3, 4
  layerName         String   // Sovereign, DBIS Master, Smart Clearing Fabric, Finality & Irreversibility
  description       String   @db.Text
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([layerId])
  @@index([layerNumber])
  @@map("gss_layers")
}

model StateBlock {
  id                String   @id @default(uuid())
  blockId           String   @unique
  nodeId            String
  transactionPayload Json
  sovereignSignature String
  hashLock          String   // SHA3(tx_payload + sovereign_signature)
  blockHash         String
  previousBlockHash String?
  status            String   @default("locked") // locked, unlocked, final
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              SovereignSettlementNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([blockId])
  @@index([nodeId])
  @@index([hashLock])
  @@index([status])
  @@map("state_blocks")
}

// ============================================================================
// DBIS Volume III: CBDC Interoperability Matrix (CIM)
// ============================================================================

model CimIdentityMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  sourceSovereignBankId String
  targetSovereignBankId String
  sourceIdentityId  String
  targetIdentityId  String
  identityType      String   // kyc, aml, cbdc_wallet
  certificationLevel String // basic, enhanced, sovereign
  crossCertificationHash String?
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([mappingId])
  @@index([sourceSovereignBankId])
  @@index([targetSovereignBankId])
  @@index([identityType])
  @@map("cim_identity_mappings")
}

model CimInterledgerConversion {
  id                String   @id @default(uuid())
  conversionId      String   @unique
  sourceSovereignBankId String
  targetSovereignBankId String
  sourceCbdcCode    String
  targetCbdcCode    String
  amount            Decimal  @db.Decimal(32, 8)
  fxRate            Decimal? @db.Decimal(32, 12)
  conversionType    String   // fx_linked, commodity_backed
  dualPostingStatus String   @default("pending") // pending, scb_posted, dbis_posted, both_posted
  scbLedgerHash     String?
  dbisLedgerHash    String?
  status            String   @default("pending") // pending, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([conversionId])
  @@index([sourceSovereignBankId])
  @@index([targetSovereignBankId])
  @@index([status])
  @@map("cim_interledger_conversions")
}

model CimContractTemplate {
  id                String   @id @default(uuid())
  templateId        String   @unique
  templateCode      String   // DBIS-CT-001, DBIS-CT-002, etc.
  templateName      String
  templateType      String   // time_locked, condition_based, cross_border
  contractLogic     Json     // Contract logic definition
  validationRules   Json     // Unified rule validation
  status            String   @default("active")
  version           Int      @default(1)
  effectiveDate     DateTime
  expiryDate        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([templateId])
  @@index([templateCode])
  @@index([templateType])
  @@index([status])
  @@map("cim_contract_templates")
}

model CimOfflineCapsule {
  id                String   @id @default(uuid())
  capsuleId         String   @unique
  sourceSovereignBankId String
  targetSovereignBankId String
  senderWalletId     String
  receiverWalletId  String
  amount            Decimal  @db.Decimal(32, 8)
  timestamp         DateTime
  expiryWindow      Int      // Allowed time window in seconds
  doubleSpendToken  String   @unique
  signature         String
  crossSovereignRecognition Boolean @default(false)
  globalSyncStatus  String   @default("pending") // pending, recognized, synced, rejected
  syncedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([capsuleId])
  @@index([doubleSpendToken])
  @@index([sourceSovereignBankId])
  @@index([targetSovereignBankId])
  @@index([globalSyncStatus])
  @@map("cim_offline_capsules")
}

// ============================================================================
// DBIS Volume III: Synthetic Settlement Unit (SSU) Extensions
// ============================================================================

model SsuComposition {
  id                String   @id @default(uuid())
  ssuId             String
  currencyWeight    Decimal  @db.Decimal(32, 8) // 40%
  commodityWeight   Decimal  @db.Decimal(32, 8) // 30%
  cbdcWeight        Decimal  @db.Decimal(32, 8) // 20%
  lamWeight         Decimal  @db.Decimal(32, 8) // 10% (Liquidity Adjustment Mechanism)
  topSovereigns     Json     // Top 10 SCBs
  commodities       Json     // Gold, oil, rare metals
  cbdcs             Json     // Sovereign CBDC tier
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ssu               SyntheticSettlementUnit @relation(fields: [ssuId], references: [id], onDelete: Cascade)

  @@index([ssuId])
  @@map("ssu_compositions")
}

model SsuTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  ssuId             String
  transactionType   String   // mint, burn, settle, redeem, recycle
  amount            Decimal  @db.Decimal(32, 8)
  sourceBankId      String?
  destinationBankId String?
  settlementId      String?
  status            String   @default("pending") // pending, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ssu               SyntheticSettlementUnit @relation(fields: [ssuId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([ssuId])
  @@index([transactionType])
  @@index([status])
  @@map("ssu_transactions")
}

model SsuRedemptionRequest {
  id                String   @id @default(uuid())
  requestId         String   @unique
  ssuId             String
  sovereignBankId   String
  amount            Decimal  @db.Decimal(32, 8)
  targetAssetType   String   // currency, commodity, cbdc
  targetCurrencyCode String?
  status            String   @default("pending") // pending, approved, processed, rejected
  processedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ssu               SyntheticSettlementUnit @relation(fields: [ssuId], references: [id], onDelete: Cascade)

  @@index([requestId])
  @@index([ssuId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("ssu_redemption_requests")
}

// ============================================================================
// DBIS Volume III: Commodity-Backed Digital System (CBDS)
// ============================================================================

model CommodityDigitalToken {
  id                String   @id @default(uuid())
  cdtId             String   @unique
  commodityType     String   // GOLD, SILVER, PLATINUM, OIL, GAS, AGRICULTURAL
  weight            Decimal  @db.Decimal(32, 8) // e.g., 1.000 troy ounce
  unit              String   // troy_ounce, barrel, kg
  reserveCertificateId String
  custodianId       String
  sovereignIssuerId String
  timestamp         DateTime @default(now())
  signature         String   // HSM signature
  status            String   @default("active") // active, burned, redeemed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserveCertificate CommodityReserveCertificate @relation(fields: [reserveCertificateId], references: [id])
  custodian         CommodityCustodian @relation(fields: [custodianId], references: [id])
  transactions      CdtTransaction[]

  @@index([cdtId])
  @@index([commodityType])
  @@index([reserveCertificateId])
  @@index([custodianId])
  @@index([status])
  @@map("commodity_digital_tokens")
}

model CommodityReserveCertificate {
  id                String   @id @default(uuid())
  certificateId     String   @unique
  commodityType     String
  quantity          Decimal  @db.Decimal(32, 8)
  unit              String
  custodianId       String
  certificateHash   String   // HASH256(...)
  verificationStatus String @default("pending") // pending, verified, rejected
  auditDate         DateTime?
  nextAuditDate     DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  custodian         CommodityCustodian @relation(fields: [custodianId], references: [id])
  cdts              CommodityDigitalToken[]

  @@index([certificateId])
  @@index([certificateHash])
  @@index([custodianId])
  @@index([verificationStatus])
  @@map("commodity_reserve_certificates")
}

model CdtTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  cdtId             String
  transactionType   String   // transfer, burn, exchange_cbdc, cross_commodity_swap
  sourceBankId      String?
  destinationBankId String?
  targetAssetType   String?  // cbdc, commodity, ssu
  targetAssetId     String?
  amount            Decimal  @db.Decimal(32, 8)
  status            String   @default("pending") // pending, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  cdt               CommodityDigitalToken @relation(fields: [cdtId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([cdtId])
  @@index([transactionType])
  @@index([status])
  @@map("cdt_transactions")
}

model CommodityCustodian {
  id                String   @id @default(uuid())
  custodianId       String   @unique
  custodianName     String
  entityType        String   // approved_entity, sovereign_custodian
  approvalStatus    String   @default("pending") // pending, approved, suspended
  approvalDate      DateTime?
  commoditiesHandled Json    // Array of commodity types
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  certificates      CommodityReserveCertificate[]
  cdts              CommodityDigitalToken[]

  @@index([custodianId])
  @@map("commodity_custodians")
}

// ============================================================================
// DBIS Volume III: Global Liquidity Pool (GLP)
// ============================================================================

model GlobalLiquidityPool {
  id                String   @id @default(uuid())
  poolId            String   @unique
  totalLiquidity    Decimal  @default(0) @db.Decimal(32, 8)
  availableLiquidity Decimal @default(0) @db.Decimal(32, 8)
  reservedLiquidity Decimal  @default(0) @db.Decimal(32, 8)
  currencyCode      String?
  assetType         String   // multi_asset
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contributions     GlpContribution[]
  withdrawals       GlpWithdrawal[]

  @@index([poolId])
  @@map("global_liquidity_pools")
}

model GlpContribution {
  id                String   @id @default(uuid())
  contributionId    String   @unique
  poolId            String
  sovereignBankId   String
  contributionType  String   // scb_reserve, commodity_reserve, cbdc_liquidity, dbis_stabilization
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String?
  assetType         String?
  status            String   @default("pending") // pending, confirmed, failed
  confirmedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GlobalLiquidityPool @relation(fields: [poolId], references: [id], onDelete: Cascade)

  @@index([contributionId])
  @@index([poolId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("glp_contributions")
}

model GlpWithdrawal {
  id                String   @id @default(uuid())
  withdrawalId      String   @unique
  poolId            String
  sovereignBankId   String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String?
  withdrawalTier    String   // tier_1_automatic, tier_2_assisted, tier_3_crisis_intervention
  liquidityScore    Decimal? @db.Decimal(32, 8)
  triggerCondition  String?  // <85% liquidity score, msc_approval, scc_activation
  approvalEntityId  String?
  approvalStatus    String   @default("pending") // pending, approved, rejected, executed
  approvedAt        DateTime?
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GlobalLiquidityPool @relation(fields: [poolId], references: [id], onDelete: Cascade)

  @@index([withdrawalId])
  @@index([poolId])
  @@index([sovereignBankId])
  @@index([withdrawalTier])
  @@map("glp_withdrawals")
}

model LiquidityScore {
  id                String   @id @default(uuid())
  scoreId           String   @unique
  sovereignBankId   String
  score             Decimal  @db.Decimal(32, 8) // 0-100 scale
  bufferLevel       Decimal? @db.Decimal(32, 8)
  riskFactors       Json?    // Risk factors affecting score
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([scoreId])
  @@index([sovereignBankId])
  @@index([score])
  @@index([calculatedAt])
  @@map("liquidity_scores")
}

// ============================================================================
// DBIS Volume III: Cross-Chain Settlement
// ============================================================================

model CrossChainSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  sourceChainType   String   // dbis_sovereign, scb_cbdc, commodity_tokenization, security_token
  sourceChainId     String
  targetChainType   String
  targetChainId     String
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  assetType         String
  status            String   @default("pending") // pending, verified, committed, settled, failed
  committedAt       DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  commitments       CrossChainCommitment[]
  chainHeaders      ChainHeader[]

  @@index([settlementId])
  @@index([sourceChainType])
  @@index([targetChainType])
  @@index([sourceBankId])
  @@index([status])
  @@map("cross_chain_settlements")
}

model ChainHeader {
  id                String   @id @default(uuid())
  headerId          String   @unique
  settlementId      String
  chainType         String
  chainId           String
  blockNumber       String?
  blockHash         String
  previousBlockHash String?
  timestamp         DateTime
  verificationStatus String @default("pending") // pending, verified, rejected
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        CrossChainSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([headerId])
  @@index([settlementId])
  @@index([chainType])
  @@index([blockHash])
  @@index([verificationStatus])
  @@map("chain_headers")
}

model CrossChainCommitment {
  id                String   @id @default(uuid())
  commitmentId      String   @unique
  settlementId      String
  chainId           String   // SCB1, SCB2, DBIS
  commitmentHash    String
  commitmentType    String   // scb1_commit, scb2_commit, dbis_commit
  status            String   @default("pending") // pending, committed, verified
  committedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        CrossChainSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([commitmentId])
  @@index([settlementId])
  @@index([chainId])
  @@index([commitmentType])
  @@map("cross_chain_commitments")
}

// ============================================================================
// DBIS Volume III: Sovereign Interoperability Routing Engine (SIRE)
// ============================================================================

model SireRoutingDecision {
  id                String   @id @default(uuid())
  decisionId        String   @unique
  sourceBankId      String
  destinationBankId String
  routeId           String?
  routeType         String   // scb_to_scb, scb_to_dbis_to_scb, scb_to_dbis_to_private_bank
  optimalRoute      Json     // Calculated optimal route
  fxCost            Decimal? @db.Decimal(32, 12)
  sriRiskScore      Decimal? @db.Decimal(32, 8)
  liquidityPenalty  Decimal? @db.Decimal(32, 8)
  ssuAdjustment     Decimal? @db.Decimal(32, 8)
  totalCost         Decimal  @db.Decimal(32, 12)
  decisionTimestamp DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  route             SettlementRoute? @relation(fields: [routeId], references: [id])
  metrics           SireRoutingMetrics?

  @@index([decisionId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([routeId])
  @@map("sire_routing_decisions")
}

model SireRoutingMetrics {
  id                String   @id @default(uuid())
  metricsId         String   @unique
  decisionId        String @unique
  fxVolatility      Decimal? @db.Decimal(32, 12)
  liquidityBufferLevel Decimal? @db.Decimal(32, 8)
  sriScore          Decimal? @db.Decimal(32, 8)
  syntheticSettlementCost Decimal? @db.Decimal(32, 12)
  commodityIndex    Json?    // Commodity index values
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  decision          SireRoutingDecision @relation(fields: [decisionId], references: [id], onDelete: Cascade)

  @@index([metricsId])
  @@index([decisionId])
  @@map("sire_routing_metrics")
}

// ============================================================================
// DBIS Volume IV: Global Derivatives Settlement Layer (GDSL)
// ============================================================================

model DerivativeContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  derivativeType    String   // irs, fx_forward, fx_swap, sovereign_cds, oil_future, gold_swap, agricultural_forward, cbdc_liquidity_future, synthetic_ssu_option, tokenized_bond_future
  party1BankId      String
  party2BankId      String
  notionalAmount    Decimal  @db.Decimal(32, 8)
  contractTerms     Json     // Contract terms and parameters
  smartContractId   String?  // Reference to smart contract
  status            String   @default("active") // active, expired, terminated, settled
  initiatedAt       DateTime @default(now())
  maturityDate      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  margins           DerivativeMargin[]
  settlements       DerivativeSettlement[]
  collaterals       DerivativeCollateral[]

  @@index([contractId])
  @@index([derivativeType])
  @@index([party1BankId])
  @@index([party2BankId])
  @@index([status])
  @@map("derivative_contracts")
}

model DerivativeMargin {
  id                String   @id @default(uuid())
  marginId          String   @unique
  contractId        String
  marginType        String   // initial_margin, variation_margin
  amount            Decimal  @db.Decimal(32, 8)
  exposure          Decimal? @db.Decimal(32, 8)
  volatility        Decimal? @db.Decimal(32, 12)
  sriFactor         Decimal? @db.Decimal(32, 12)
  markToMarket      Decimal? @db.Decimal(32, 12)
  previousMarkToMarket Decimal? @db.Decimal(32, 12)
  calculatedAt      DateTime @default(now())
  status            String   @default("pending") // pending, posted, settled
  postedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contract          DerivativeContract @relation(fields: [contractId], references: [id], onDelete: Cascade)

  @@index([marginId])
  @@index([contractId])
  @@index([marginType])
  @@index([status])
  @@map("derivative_margins")
}

model DerivativeSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  contractId        String
  settlementAmount  Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // fiat, cbdc, commodity, security
  hashLock          String   // Hash-lock for finality
  sovereignLedgerHash String?
  dbisLedgerHash    String?
  dualLedgerCommit  Boolean  @default(false)
  status            String   @default("pending") // pending, committed, settled, final
  committedAt       DateTime?
  settledAt         DateTime?
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contract          DerivativeContract @relation(fields: [contractId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([contractId])
  @@index([hashLock])
  @@index([status])
  @@map("derivative_settlements")
}

model DerivativeCollateral {
  id                String   @id @default(uuid())
  collateralId      String   @unique
  contractId        String
  assetType         String   // fiat, cbdc, commodity, security, ssu
  assetId           String?
  amount            Decimal  @db.Decimal(32, 8)
  valuation         Decimal  @db.Decimal(32, 12)
  haircut           Decimal? @db.Decimal(32, 12)
  status            String   @default("active") // active, released, liquidated
  allocatedAt       DateTime @default(now())
  releasedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contract          DerivativeContract @relation(fields: [contractId], references: [id], onDelete: Cascade)

  @@index([collateralId])
  @@index([contractId])
  @@index([assetType])
  @@index([status])
  @@map("derivative_collaterals")
}

// ============================================================================
// DBIS Volume IV: Inter-SCB Bond Issuance Network (IBIN)
// ============================================================================

model DigitalBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  issuerBankId      String
  couponRate        Decimal  @db.Decimal(32, 12) // Percentage
  maturityDate      DateTime
  principal         Decimal  @db.Decimal(32, 8)
  currencyCode      String
  settlementMode    String   @default("cbdc") // cbdc, fiat
  collateral        Json?    // Optional commodity or SSU
  hsmSignature      String   // HSM-signed signature
  status            String   @default("issued") // issued, active, matured, redeemed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  trades            BondTrade[]
  couponPayments    BondCouponPayment[]

  @@index([bondId])
  @@index([issuerBankId])
  @@index([maturityDate])
  @@index([status])
  @@map("digital_bonds")
}

model BondOrderBook {
  id                String   @id @default(uuid())
  orderId           String   @unique
  bondId            String
  orderType         String   // buy, sell
  price             Decimal  @db.Decimal(32, 12)
  quantity          Decimal  @db.Decimal(32, 8)
  participantBankId String
  priority          Int      // Price-time priority
  status            String   @default("pending") // pending, matched, cancelled, expired
  placedAt          DateTime @default(now())
  matchedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([orderId])
  @@index([bondId])
  @@index([orderType])
  @@index([status])
  @@index([priority])
  @@map("bond_order_books")
}

model BondTrade {
  id                String   @id @default(uuid())
  tradeId           String   @unique
  bondId            String
  buyerBankId       String
  sellerBankId      String
  quantity          Decimal  @db.Decimal(32, 8)
  price             Decimal  @db.Decimal(32, 12)
  tradeAmount       Decimal  @db.Decimal(32, 8)
  settlementId      String?  // Reference to settlement
  status            String   @default("pending") // pending, settled, failed
  tradedAt          DateTime @default(now())
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              DigitalBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([tradeId])
  @@index([bondId])
  @@index([buyerBankId])
  @@index([sellerBankId])
  @@index([status])
  @@map("bond_trades")
}

model BondCouponPayment {
  id                String   @id @default(uuid())
  paymentId         String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  currencyCode      String
  paymentDate       DateTime
  settlementMode    String   @default("cbdc") // cbdc with FX conversion as needed
  sovereignLedgerHash String?
  dbisLedgerHash    String?
  dualLedgerCommit  Boolean  @default(false)
  status            String   @default("pending") // pending, settled, failed
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              DigitalBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([paymentId])
  @@index([bondId])
  @@index([paymentDate])
  @@index([status])
  @@map("bond_coupon_payments")
}

// ============================================================================
// DBIS Volume IV: Digital Sovereign Debt Market (DSDM)
// ============================================================================

model SovereignDebtInstrument {
  id                String   @id @default(uuid())
  instrumentId      String   @unique
  issuerBankId      String
  participantBankId String
  instrumentType    String   // bond, note, bill
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  maturityDate      DateTime
  participantType   String   // scb, supranational, pension_fund, licensed_institution
  status            String   @default("active") // active, matured, redeemed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([instrumentId])
  @@index([issuerBankId])
  @@index([participantBankId])
  @@index([participantType])
  @@index([status])
  @@map("sovereign_debt_instruments")
}

model DebtLadder {
  id                String   @id @default(uuid())
  ladderId          String   @unique
  sovereignBankId   String
  maturityDate      DateTime
  principalAmount   Decimal  @db.Decimal(32, 8)
  currencyCode      String
  rolloverContractId String? // Reference to rollover contract
  status            String   @default("active") // active, rolled_over, matured
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([ladderId])
  @@index([sovereignBankId])
  @@index([maturityDate])
  @@index([status])
  @@map("debt_ladders")
}

model DebtRollover {
  id                String   @id @default(uuid())
  rolloverId        String   @unique
  sovereignBankId   String
  originalLadderId  String
  newLadderId       String?
  rolloverAmount    Decimal  @db.Decimal(32, 8)
  currencyCode      String
  fundingSource     String   @default("cbdc") // cbdc, fiat
  status            String   @default("pending") // pending, executed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([rolloverId])
  @@index([sovereignBankId])
  @@index([originalLadderId])
  @@index([status])
  @@map("debt_rollovers")
}

model PublicMarketOperation {
  id                String   @id @default(uuid())
  pmoId             String   @unique
  sovereignBankId   String
  operationType     String   // maturity_ladder, rollover, debt_refinancing
  operationData     Json     // Operation configuration
  status            String   @default("pending") // pending, executed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([pmoId])
  @@index([sovereignBankId])
  @@index([operationType])
  @@index([status])
  @@map("public_market_operations")
}

// ============================================================================
// DBIS Volume IV: Quantum-Safe CBDC Wallet Standards
// ============================================================================

model QuantumWallet {
  id                String   @id @default(uuid())
  walletId          String   @unique
  sovereignBankId   String
  walletType        String   // retail, wholesale, institutional
  currencyCode      String
  balance           Decimal  @default(0) @db.Decimal(32, 8)
  dilithiumKeyId    String   // PQC signature key (Dilithium)
  kyberKeyId        String   // PQC key exchange key (Kyber)
  hsmIdentityCert   String   // HSM-bound identity certificate
  waoId             String?  // Wallet Attestation Object reference
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  attestations      WalletAttestationObject[]
  capsules          QuantumWalletCapsule[]
  riskScores        WalletRiskScore[]

  @@index([walletId])
  @@index([sovereignBankId])
  @@index([walletType])
  @@index([status])
  @@map("quantum_wallets")
}

model WalletAttestationObject {
  id                String   @id @default(uuid())
  waoId             String   @unique
  walletId          String
  deviceAttestation Json     // Device attestation data
  attestationHash   String   // Hash of attestation
  attestationCycle  Int      // 12-hour cycle number
  status            String   @default("valid") // valid, expired, revoked
  attestedAt        DateTime @default(now())
  expiresAt         DateTime
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  wallet            QuantumWallet @relation(fields: [walletId], references: [id], onDelete: Cascade)

  @@index([waoId])
  @@index([walletId])
  @@index([status])
  @@index([attestationCycle])
  @@map("wallet_attestation_objects")
}

model QuantumWalletCapsule {
  id                String   @id @default(uuid())
  capsuleId         String   @unique
  senderWalletId    String
  receiverWalletId  String
  amount            Decimal  @db.Decimal(32, 8)
  timestamp         DateTime
  expiryWindow      Int      // Allowed time window in seconds
  doubleSpendToken  String   @unique
  pqcSignature      String   // PQC-secured signature
  scbVerification   Boolean  @default(false)
  dbisVerification  Boolean  @default(false)
  status            String   @default("pending") // pending, validated, synced, rejected
  syncedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  wallet            QuantumWallet @relation(fields: [senderWalletId], references: [id], onDelete: Cascade)

  @@index([capsuleId])
  @@index([doubleSpendToken])
  @@index([status])
  @@map("quantum_wallet_capsules")
}

model WalletRiskScore {
  id                String   @id @default(uuid())
  scoreId           String   @unique
  walletId          String
  riskScore         Decimal  @db.Decimal(32, 8) // 0-100 scale
  riskFactors       Json?    // Risk factors
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  wallet            QuantumWallet @relation(fields: [walletId], references: [id], onDelete: Cascade)

  @@index([scoreId])
  @@index([walletId])
  @@index([calculatedAt])
  @@map("wallet_risk_scores")
}

// ============================================================================
// DBIS Volume IV: Settlement Law Codebook
// ============================================================================

model SettlementLawArticle {
  id                String   @id @default(uuid())
  articleId         String   @unique
  articleNumber     String   // 12, 19, 27, etc.
  articleTitle      String
  content           String   @db.Text
  principle         String?  // Principle 1 (Finality), Principle 2 (Irrevocability), Principle 3 (Multilateral Recognition)
  version           Int      @default(1)
  effectiveDate     DateTime
  expiryDate        DateTime?
  status            String   @default("active") // active, superseded, archived
  metadata          Json?    // Additional legal references
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  finalities        SettlementFinality[]
  disputes          SettlementDispute[]

  @@index([articleId])
  @@index([articleNumber])
  @@index([principle])
  @@index([status])
  @@map("settlement_law_articles")
}

model SettlementFinality {
  id                String   @id @default(uuid())
  finalityId        String   @unique
  transactionId     String
  articleId         String
  masterLedgerCommit Boolean @default(false)
  legalBinding      Boolean  @default(false)
  principle         String   // Principle 1, 2, or 3
  status            String   @default("pending") // pending, final, disputed
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  article           SettlementLawArticle @relation(fields: [articleId], references: [id], onDelete: Cascade)

  @@index([finalityId])
  @@index([transactionId])
  @@index([articleId])
  @@index([status])
  @@map("settlement_finalities")
}

model SettlementDispute {
  id                String   @id @default(uuid())
  disputeId         String   @unique
  transactionId     String
  articleId         String
  party1BankId      String
  party2BankId      String
  disputeType       String   // settlement, finality, cross_border
  description       String   @db.Text
  stage             String   @default("bilateral") // bilateral, caa_review, arbitration_tribunal
  status            String   @default("active") // active, resolved, escalated
  resolution        String?  @db.Text
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  article           SettlementLawArticle @relation(fields: [articleId], references: [id], onDelete: Cascade)
  arbitrations      SettlementArbitration[]

  @@index([disputeId])
  @@index([transactionId])
  @@index([articleId])
  @@index([stage])
  @@index([status])
  @@map("settlement_disputes")
}

model SettlementArbitration {
  id                String   @id @default(uuid())
  arbitrationId     String   @unique
  disputeId         String
  tribunalDecision  String   @db.Text
  decisionType      String   // final, binding, appealable
  status            String   @default("pending") // pending, decided, enforced
  decidedAt         DateTime?
  enforcedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  dispute           SettlementDispute @relation(fields: [disputeId], references: [id], onDelete: Cascade)

  @@index([arbitrationId])
  @@index([disputeId])
  @@index([status])
  @@map("settlement_arbitrations")
}

// ============================================================================
// DBIS Volume IV: Sovereign Stablecoin Compliance Framework
// ============================================================================

model SovereignStablecoin {
  id                String   @id @default(uuid())
  stablecoinId      String   @unique
  issuerBankId      String
  stablecoinCode    String   @unique
  name              String
  totalSupply       Decimal  @default(0) @db.Decimal(32, 8)
  collateralizationRatio Decimal @db.Decimal(32, 12) // Must be >= 1.0
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  collaterals       StablecoinCollateral[]
  reserves          StablecoinReserve[]
  audits            StablecoinAudit[]

  @@index([stablecoinId])
  @@index([issuerBankId])
  @@index([stablecoinCode])
  @@index([status])
  @@map("sovereign_stablecoins")
}

model StablecoinCollateral {
  id                String   @id @default(uuid())
  collateralId      String   @unique
  stablecoinId      String
  assetType         String   // cbdc, gold, commodity, security, ssu
  assetId           String?
  amount            Decimal  @db.Decimal(32, 8)
  valuation         Decimal  @db.Decimal(32, 12)
  status            String   @default("active") // active, released
  allocatedAt       DateTime @default(now())
  releasedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  stablecoin        SovereignStablecoin @relation(fields: [stablecoinId], references: [id], onDelete: Cascade)

  @@index([collateralId])
  @@index([stablecoinId])
  @@index([assetType])
  @@index([status])
  @@map("stablecoin_collaterals")
}

model StablecoinReserve {
  id                String   @id @default(uuid())
  reserveId         String   @unique
  stablecoinId      String
  snapshotDate      DateTime
  totalReserves     Decimal  @db.Decimal(32, 8)
  totalSupply       Decimal  @db.Decimal(32, 8)
  collateralizationRatio Decimal @db.Decimal(32, 12)
  reserveBreakdown  Json     // Breakdown by asset type
  status            String   @default("pending") // pending, verified, published
  verifiedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  stablecoin        SovereignStablecoin @relation(fields: [stablecoinId], references: [id], onDelete: Cascade)

  @@index([reserveId])
  @@index([stablecoinId])
  @@index([snapshotDate])
  @@index([status])
  @@map("stablecoin_reserves")
}

model StablecoinAudit {
  id                String   @id @default(uuid())
  auditId           String   @unique
  stablecoinId      String
  auditDate         DateTime
  auditType         String   // daily_reserve, hsm_signed, zk_proof
  hsmSignature      String?  // HSM-signed audit
  zkProof           String?  // Zero-knowledge collateral proof
  auditResult       Json     // Audit findings
  status            String   @default("pending") // pending, verified, published
  verifiedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  stablecoin        SovereignStablecoin @relation(fields: [stablecoinId], references: [id], onDelete: Cascade)

  @@index([auditId])
  @@index([stablecoinId])
  @@index([auditDate])
  @@index([auditType])
  @@index([status])
  @@map("stablecoin_audits")
}

// ============================================================================
// DBIS Volume IV: Multi-Asset Collateralization Engine (MACE)
// ============================================================================

model MultiAssetCollateral {
  id                String   @id @default(uuid())
  collateralId      String   @unique
  assetType         String   // fiat, cbdc, commodity, security, ssu
  assetId           String?
  amount            Decimal  @db.Decimal(32, 8)
  valuation         Decimal  @db.Decimal(32, 12)
  haircut           Decimal? @db.Decimal(32, 12)
  fxCost            Decimal? @db.Decimal(32, 12)
  liquidityWeight   Decimal? @db.Decimal(32, 12)
  sriRiskPenalty    Decimal? @db.Decimal(32, 12)
  optimizationScore Decimal? @db.Decimal(32, 12)
  status            String   @default("active") // active, released, liquidated
  allocatedAt       DateTime @default(now())
  releasedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  optimizations     CollateralOptimization[]

  @@index([collateralId])
  @@index([assetType])
  @@index([status])
  @@map("multi_asset_collaterals")
}

model CollateralOptimization {
  id                String   @id @default(uuid())
  optimizationId    String   @unique
  collateralId      String
  optimizationType  String   // allocation, rebalancing, liquidation
  optimalAllocation  Json     // Optimal allocation result
  totalCost         Decimal  @db.Decimal(32, 12) // haircuts + fx_cost + liquidity_weight + risk_penalty
  calculationMethod String   // argmin optimization
  status            String   @default("pending") // pending, applied, rejected
  calculatedAt      DateTime @default(now())
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  collateral        MultiAssetCollateral @relation(fields: [collateralId], references: [id], onDelete: Cascade)

  @@index([optimizationId])
  @@index([collateralId])
  @@index([optimizationType])
  @@index([status])
  @@map("collateral_optimizations")
}

model CollateralHaircut {
  id                String   @id @default(uuid())
  haircutId         String   @unique
  assetType         String   // fiat, cbdc, commodity, security, ssu
  haircutRate       Decimal  @db.Decimal(32, 12) // Percentage
  effectiveDate     DateTime
  expiryDate        DateTime?
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([haircutId])
  @@index([assetType])
  @@index([status])
  @@map("collateral_haircuts")
}

model CollateralLiquidity {
  id                String   @id @default(uuid())
  liquidityId       String   @unique
  assetType         String
  liquidityWeight   Decimal  @db.Decimal(32, 12)
  liquidityScore    Decimal? @db.Decimal(32, 8) // 0-100 scale
  effectiveDate     DateTime
  expiryDate        DateTime?
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([liquidityId])
  @@index([assetType])
  @@index([status])
  @@map("collateral_liquidities")
}

// ============================================================================
// DBIS Volume IV: Global DeFi-Integrated Sovereign Layer
// ============================================================================

model DeFiModule {
  id                String   @id @default(uuid())
  moduleId          String   @unique
  moduleName        String
  moduleType        String   // swap, lending, staking, liquidity_pool
  permissionLevel   String   // permissioned, sovereign_verified
  status            String   @default("pending") // pending, approved, active, suspended
  approvalDate      DateTime?
  approvedBy        String?  // SCB or DBIS entity
  moduleConfig      Json     // Module configuration
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  nodes             DeFiNode[]
  pools             DeFiLiquidityPool[]
  swaps             DeFiSwap[]

  @@index([moduleId])
  @@index([moduleType])
  @@index([permissionLevel])
  @@index([status])
  @@map("defi_modules")
}

model DeFiNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  moduleId          String
  sovereignBankId   String?
  nodeType          String   // sovereign_verified, dbis_governed
  verificationStatus String @default("pending") // pending, verified, revoked
  verificationDate  DateTime?
  nodeAddress       String?  // Node network address
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  module            DeFiModule @relation(fields: [moduleId], references: [id], onDelete: Cascade)

  @@index([nodeId])
  @@index([moduleId])
  @@index([sovereignBankId])
  @@index([verificationStatus])
  @@index([status])
  @@map("defi_nodes")
}

model DeFiLiquidityPool {
  id                String   @id @default(uuid())
  poolId            String   @unique
  moduleId          String
  poolName          String
  assetTypes        Json     // Array of asset types in pool
  totalLiquidity    Decimal  @default(0) @db.Decimal(32, 8)
  governanceModel   String   @default("dbis_governed") // dbis_governed, scb_oversight
  status            String   @default("active") // active, paused, closed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  module            DeFiModule @relation(fields: [moduleId], references: [id], onDelete: Cascade)
  swaps             DeFiSwap[]

  @@index([poolId])
  @@index([moduleId])
  @@index([status])
  @@map("defi_liquidity_pools")
}

model DeFiSwap {
  id                String   @id @default(uuid())
  swapId            String   @unique
  moduleId          String
  poolId            String?
  sourceAssetType   String
  targetAssetType   String
  sourceAmount      Decimal  @db.Decimal(32, 8)
  targetAmount      Decimal  @db.Decimal(32, 8)
  exchangeRate      Decimal  @db.Decimal(32, 12)
  participantBankId String
  scbOversight      Boolean  @default(true)
  onChainTxHash     String?  // On-chain transaction hash
  status            String   @default("pending") // pending, executed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  module            DeFiModule @relation(fields: [moduleId], references: [id], onDelete: Cascade)
  pool              DeFiLiquidityPool? @relation(fields: [poolId], references: [id])

  @@index([swapId])
  @@index([moduleId])
  @@index([poolId])
  @@index([status])
  @@map("defi_swaps")
}

// ============================================================================
// DBIS Volume VI: Global Regulatory Harmonization, Sovereign Digital Identity,
// Autonomous Liquidity Systems, AML Pattern Language, and Financial Ontology
// ============================================================================

// UDFO - Unified DBIS Financial Ontology
model UDFOAsset {
  id                String   @id @default(uuid())
  assetType         String   // FIAT, CBDC, SSU, COMMODITY, SECURITY
  code              String   @unique
  name              String
  definition        String   @db.Text
  properties        Json
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([assetType])
  @@index([code])
  @@map("udfo_assets")
}

model UDFOEntity {
  id                String   @id @default(uuid())
  entityType        String   // SCB, BANK, INDIVIDUAL, INSTITUTION, CONTRACT
  identifier        String   @unique
  name              String
  definition        String   @db.Text
  properties        Json
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([entityType])
  @@index([identifier])
  @@map("udfo_entities")
}

model UDFOProcess {
  id                String   @id @default(uuid())
  processType       String   // SETTLEMENT, ISSUANCE, CONVERSION, REDEMPTION, COLLATERALIZATION
  code              String   @unique
  name              String
  definition        String   @db.Text
  inputs            String[] // Asset/Entity IDs
  outputs           String[] // Asset/Entity IDs
  triggers          String[] // Event triggers
  properties        Json
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([processType])
  @@index([code])
  @@map("udfo_processes")
}

model OntologyMapping {
  id                String   @id @default(uuid())
  sourceDomain      String   // ASSET, ENTITY, PROCESS
  sourceId          String
  targetDomain      String   // ASSET, ENTITY, PROCESS
  targetId          String
  mappingType       String
  confidence        Decimal  @db.Decimal(5, 4) // 0-1
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sourceDomain, sourceId])
  @@index([targetDomain, targetId])
  @@map("ontology_mappings")
}

// SDIP - Sovereign Digital Identity Passport
model SovereignDigitalIdentityPassport {
  id                String   @id @default(uuid())
  passportId        String   @unique
  entityType        String   // SCB, BANK, PERSON, INSTITUTION, CONTRACT
  entityId          String   // Reference to GBIG identity
  sovereignIssuer   String   // SCB code
  rootCert          String   // HSM signature
  pqSignature       String   // Dilithium signature
  trustLevel        String   // TL0, TL1, TL2, TL3, TL4
  expiry            DateTime
  revocationStatus  String   @default("ACTIVE") // ACTIVE, REVOKED, EXPIRED
  attributes        Json
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  revocations       SDIPRevocation[]

  @@index([passportId])
  @@index([entityId])
  @@index([sovereignIssuer])
  @@index([trustLevel])
  @@index([revocationStatus])
  @@map("sovereign_digital_identity_passports")
}

model SDIPRevocation {
  id                String   @id @default(uuid())
  revocationId      String   @unique
  passportId        String
  reason            String   @db.Text
  revokedBy         String
  createdAt         DateTime @default(now())

  passport          SovereignDigitalIdentityPassport @relation(fields: [passportId], references: [id], onDelete: Cascade)

  @@index([revocationId])
  @@index([passportId])
  @@map("sdip_revocations")
}

// GRHS - Global Regulatory Harmonization Suite
model RegulatoryHarmonizationRule {
  id                String   @id @default(uuid())
  pillar            String   // MONETARY, LEGAL, COMPLIANCE, TRADE
  ruleCode          String
  name              String
  description       String   @db.Text
  requirements      String[]
  applicableSovereigns String[] // Empty = all
  status            String   @default("ACTIVE") // ACTIVE, DRAFT, SUSPENDED
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@unique([pillar, ruleCode])
  @@index([pillar])
  @@index([ruleCode])
  @@index([status])
  @@map("regulatory_harmonization_rules")
}

model RegulatoryEquivalenceScore {
  id                String   @id @default(uuid())
  scoreId           String   @unique
  sovereignBankId   String
  compliance        Decimal  @db.Decimal(5, 2) // 0-100
  transparency      Decimal  @db.Decimal(5, 2) // 0-100
  amlStrength       Decimal  @db.Decimal(5, 2) // 0-100
  cbdcMaturity      Decimal  @db.Decimal(5, 2) // 0-100
  repScore          Decimal  @db.Decimal(5, 2) // Calculated
  equivalent        Boolean  @default(false) // repScore >= 95%
  calculatedAt      DateTime @default(now())

  @@index([scoreId])
  @@index([sovereignBankId])
  @@index([equivalent])
  @@index([calculatedAt])
  @@map("regulatory_equivalence_scores")
}

model HarmonizationCompliance {
  id                String   @id @default(uuid())
  sovereignBankId   String
  pillar            String   // MONETARY, LEGAL, COMPLIANCE, TRADE
  complianceScore   Decimal  @db.Decimal(5, 2) // 0-100
  lastAssessment    DateTime
  nextAssessment    DateTime
  issues            String[]
  status            String   @default("COMPLIANT") // COMPLIANT, NON_COMPLIANT, PARTIAL
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sovereignBankId])
  @@index([pillar])
  @@index([status])
  @@map("harmonization_compliance")
}

model FastTrackPrivilege {
  id                String   @id @default(uuid())
  privilegeId       String   @unique
  sovereignBankId   String
  privilegeType     String   // SETTLEMENT, LIQUIDITY, OVERSIGHT
  grantedAt         DateTime @default(now())
  expiresAt         DateTime?
  status            String   @default("ACTIVE") // ACTIVE, REVOKED, EXPIRED
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([privilegeId])
  @@index([sovereignBankId])
  @@index([privilegeType])
  @@index([status])
  @@map("fast_track_privileges")
}

// GASE - Global AML & Sanctions Engine
model GlobalSanctionsList {
  id                String   @id @default(uuid())
  entityName        String
  entityType        String   // individual, organization, country
  listSource        String   // OFAC, EU, UN, etc.
  listId            String
  country           String?
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@unique([entityName, listSource])
  @@index([entityName])
  @@index([listSource])
  @@index([status])
  @@map("global_sanctions_lists")
}

model PEPGraphNode {
  id                String   @id @default(uuid())
  entityId          String   @unique
  entityName        String
  pepType           String
  country           String
  position          String
  riskLevel         String   // LOW, MEDIUM, HIGH
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  edgesFrom         PEPGraphEdge[] @relation("FromNode")
  edgesTo           PEPGraphEdge[] @relation("ToNode")

  @@index([entityId])
  @@index([entityName])
  @@index([country])
  @@map("pep_graph_nodes")
}

model PEPGraphEdge {
  id                String   @id @default(uuid())
  fromNodeId        String
  toNodeId          String
  relationshipType  String
  strength          Decimal  @db.Decimal(5, 4) // 0-1
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  fromNode          PEPGraphNode @relation("FromNode", fields: [fromNodeId], references: [entityId], onDelete: Cascade)
  toNode             PEPGraphNode @relation("ToNode", fields: [toNodeId], references: [entityId], onDelete: Cascade)

  @@index([fromNodeId])
  @@index([toNodeId])
  @@index([relationshipType])
  @@map("pep_graph_edges")
}

model SuspiciousActivityScore {
  id                String   @id @default(uuid())
  sasId             String   @unique
  transactionId     String
  entityId          String
  score              Decimal  @db.Decimal(5, 2) // 0-100
  factors            Json     // { sanctionsMatch, pepMatch, patternRisk, velocityAnomaly, geographicRisk }
  riskTier           String   // TIER_1, TIER_2, TIER_3, TIER_4
  calculatedAt       DateTime @default(now())

  @@index([sasId])
  @@index([transactionId])
  @@index([entityId])
  @@index([riskTier])
  @@index([calculatedAt])
  @@map("suspicious_activity_scores")
}

model RiskTier {
  id                String   @id @default(uuid())
  entityId          String   @unique
  riskTier          String   // TIER_1, TIER_2, TIER_3, TIER_4
  assignedAt        DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([entityId])
  @@index([riskTier])
  @@map("risk_tiers")
}

// WAPL - Worldwide AML Pattern Language
model WAPLPattern {
  id                String   @id @default(uuid())
  patternCode       String   @unique
  name              String
  description       String   @db.Text
  patternDefinition String   @db.Text
  severity          String   // LOW, MEDIUM, HIGH, CRITICAL
  status            String   @default("ACTIVE") // ACTIVE, DRAFT, SUSPENDED
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  matches           PatternMatch[]

  @@index([patternCode])
  @@index([status])
  @@map("wapl_patterns")
}

model PatternMatch {
  id                String   @id @default(uuid())
  patternId         String
  transactionId     String
  matchScore         Decimal  @db.Decimal(5, 4) // 0-1
  matchedConditions  String[]
  alertGenerated     Boolean  @default(false)
  detectedAt         DateTime @default(now())

  pattern            WAPLPattern @relation(fields: [patternId], references: [id], onDelete: Cascade)
  alerts             PatternAlert[]

  @@index([id])
  @@index([patternId])
  @@index([transactionId])
  @@index([detectedAt])
  @@map("pattern_matches")
}

model PatternAlert {
  id                String   @id @default(uuid())
  patternMatchId     String
  transactionId     String
  patternCode       String
  severity          String
  description       String   @db.Text
  status            String   @default("PENDING") // PENDING, REVIEWED, RESOLVED, FALSE_POSITIVE
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  patternMatch       PatternMatch @relation(fields: [patternMatchId], references: [id], onDelete: Cascade)

  @@index([id])
  @@index([patternMatchId])
  @@index([transactionId])
  @@index([status])
  @@index([createdAt])
  @@map("pattern_alerts")
}

// ALPS - Autonomous Liquidity Provision System
model AutonomousLiquidityAction {
  id                String   @id @default(uuid())
  actionId          String   @unique
  actionType         String   // INJECTION, WITHDRAWAL
  sovereignBankId   String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String?
  triggerReason     String   @db.Text
  executedAt        DateTime?
  status            String   @default("PENDING") // PENDING, EXECUTED, FAILED
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([actionId])
  @@index([sovereignBankId])
  @@index([actionType])
  @@index([status])
  @@map("autonomous_liquidity_actions")
}

model LiquidityStressEvent {
  id                String   @id @default(uuid())
  eventId           String   @unique
  sovereignBankId   String
  predictedAt       DateTime @default(now())
  predictedStressDate DateTime
  stressLevel       String   // LOW, MEDIUM, HIGH, CRITICAL
  predictedLiquidityRatio Decimal @db.Decimal(5, 2)
  confidence        Decimal  @db.Decimal(5, 4) // 0-1
  status            String   @default("PREDICTED") // PREDICTED, OCCURRED, MITIGATED, FALSE_POSITIVE
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([eventId])
  @@index([sovereignBankId])
  @@index([status])
  @@index([predictedStressDate])
  @@map("liquidity_stress_events")
}

model SovereignLiquidityRatio {
  id                String   @id @default(uuid())
  sovereignBankId   String   @unique
  ratio             Decimal  @db.Decimal(5, 2) // SXLR
  riskFactors       String[]
  calculatedAt      DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([sovereignBankId])
  @@index([ratio])
  @@index([calculatedAt])
  @@map("sovereign_liquidity_ratios")
}

// ============================================================================
// DBIS Volume VIII: DBIS Cyber-Defense Command (DCDC)
// ============================================================================

model DcdcDivision {
  id                String   @id @default(uuid())
  divisionId        String   @unique
  divisionType      String   // SDD, ODU, FRB, CIST
  divisionName      String
  description       String   @db.Text
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  threats           CyberThreatIncident[]
  actions           DefenseLayerAction[]

  @@index([divisionId])
  @@index([divisionType])
  @@index([status])
  @@map("dcdc_divisions")
}

model CyberThreatIncident {
  id                String   @id @default(uuid())
  incidentId        String   @unique
  divisionId        String?
  threatType        String   // technical, financial, coordination
  threatCategory    String   // T1, T2, T3
  severity          String   // low, medium, high, critical
  sourceBankId      String?
  targetBankId      String?
  description       String   @db.Text
  detectionMethod   String   // ml_anomaly, pq_signature, sgse, manual
  status            String   @default("detected") // detected, contained, neutralized, resolved
  detectedAt        DateTime @default(now())
  containedAt       DateTime?
  neutralizedAt     DateTime?
  resolvedAt        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  division          DcdcDivision? @relation(fields: [divisionId], references: [id])
  actions           DefenseLayerAction[]
  mitigations       ThreatMitigation[]

  @@index([incidentId])
  @@index([divisionId])
  @@index([threatCategory])
  @@index([severity])
  @@index([status])
  @@index([detectedAt])
  @@map("cyber_threat_incidents")
}

model DefenseLayerAction {
  id                String   @id @default(uuid())
  actionId          String   @unique
  divisionId        String?
  incidentId        String?
  layer             String   // A (Detection), B (Containment), C (Neutralization), D (Restoration)
  actionType        String   // anomaly_detection, route_isolation, kill_switch, ledger_freeze, rollback
  targetNodeId      String?
  targetBankId      String?
  description       String   @db.Text
  actionStatus      String   @default("pending") // pending, executed, failed, rolled_back
  executedAt        DateTime?
  rolledBackAt      DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  division          DcdcDivision? @relation(fields: [divisionId], references: [id])
  incident          CyberThreatIncident? @relation(fields: [incidentId], references: [id])

  @@index([actionId])
  @@index([divisionId])
  @@index([incidentId])
  @@index([layer])
  @@index([actionStatus])
  @@map("defense_layer_actions")
}

model SovereignGraphSecurityEngine {
  id                String   @id @default(uuid())
  sgseId            String   @unique
  graphType         String   // threat_graph, identity_graph, transaction_graph
  graphData         Json     // Graph structure data
  nodeCount         Int?
  edgeCount         Int?
  lastUpdated       DateTime @default(now())
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  anomalies         LedgerAnomaly[]

  @@index([sgseId])
  @@index([graphType])
  @@index([status])
  @@map("sovereign_graph_security_engines")
}

model LedgerAnomaly {
  id                String   @id @default(uuid())
  anomalyId         String   @unique
  sgseId            String?
  ledgerId          String
  anomalyType       String   // double_spend, invalid_signature, hash_mismatch, unauthorized_transaction
  severity          String   // low, medium, high, critical
  detectedAt        DateTime @default(now())
  remediatedAt      DateTime?
  remediationAction String?
  status            String   @default("detected") // detected, under_investigation, remediated
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sgse              SovereignGraphSecurityEngine? @relation(fields: [sgseId], references: [id])

  @@index([anomalyId])
  @@index([sgseId])
  @@index([ledgerId])
  @@index([anomalyType])
  @@index([status])
  @@map("ledger_anomalies")
}

model NodeQuarantine {
  id                String   @id @default(uuid())
  quarantineId      String   @unique
  nodeId            String
  sovereignBankId   String?
  quarantineReason  String
  quarantineType    String   // automatic, manual, dcdc_ordered
  status            String   @default("quarantined") // quarantined, released, permanent
  quarantinedAt     DateTime @default(now())
  releasedAt        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([quarantineId])
  @@index([nodeId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("node_quarantines")
}

// ============================================================================
// DBIS Volume VIII: Planetary Settlement Grid (PSG)
// ============================================================================

model PsgSovereignNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  sovereignBankId   String
  region            String   // Geographic region
  nodeType          String   // geo_redundant
  replicationLinks  Json?    // PQ-encrypted replication link configs
  status            String   @default("active") // active, suspended, inactive
  lastSyncAt        DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  epochs            SettlementEpoch[]
  stateBlocks       PsgStateBlock[]

  @@index([nodeId])
  @@index([sovereignBankId])
  @@index([region])
  @@index([status])
  @@map("psg_sovereign_nodes")
}

model PsgMasterGrid {
  id                String   @id @default(uuid())
  gridId            String   @unique
  gridName          String   @default("DBIS Master Grid")
  consensusEngine   String   // quantum_grade_consensus
  status            String   @default("active")
  lastConsensusAt   DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  epochs            SettlementEpoch[]
  relayHubs         SupraSovereignRelayHub[]

  @@index([gridId])
  @@index([status])
  @@map("psg_master_grids")
}

model SupraSovereignRelayHub {
  id                String   @id @default(uuid())
  hubId             String   @unique
  gridId            String?
  hubName           String
  region            String   // Continent/region
  optimizedRoutes   Json?    // Optimized routing paths
  latencyStats      Json?    // Latency statistics
  status            String   @default("active") // active, suspended, maintenance
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  grid              PsgMasterGrid? @relation(fields: [gridId], references: [id])

  @@index([hubId])
  @@index([gridId])
  @@index([region])
  @@index([status])
  @@map("supra_sovereign_relay_hubs")
}

model SettlementEpoch {
  id                String   @id @default(uuid())
  epochId           String   @unique
  gridId            String?
  nodeId            String?
  assetType         String   // cbdc_fiat, commodity, security
  epochInterval     Int      // 1 (CBDC/fiat), 5 (commodity), 10 (securities) seconds
  epochNumber       Int
  stateHash         String   // PSG_State = HASH(SCB_blocks + CBDC_tx + Commodity_tx + Security_tx)
  committedAt       DateTime @default(now())
  status            String   @default("committed") // committed, final, rolled_back
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  grid              PsgMasterGrid? @relation(fields: [gridId], references: [id])
  node              PsgSovereignNode? @relation(fields: [nodeId], references: [id])
  stateBlocks       PsgStateBlock[]

  @@index([epochId])
  @@index([gridId])
  @@index([nodeId])
  @@index([assetType])
  @@index([epochNumber])
  @@map("settlement_epochs")
}

model PsgStateBlock {
  id                String   @id @default(uuid())
  blockId           String   @unique
  epochId           String?
  nodeId            String?
  scbBlocks         Json     // SCB block references
  cbdcTransactions  Json?    // CBDC transactions
  commodityTransactions Json? // Commodity transactions
  securityTransactions Json? // Security transactions
  stateHash         String
  previousBlockHash String?
  status            String   @default("pending") // pending, committed, final
  committedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  epoch             SettlementEpoch? @relation(fields: [epochId], references: [id])
  node              PsgSovereignNode? @relation(fields: [nodeId], references: [id])

  @@index([blockId])
  @@index([epochId])
  @@index([nodeId])
  @@index([stateHash])
  @@index([status])
  @@map("psg_state_blocks")
}

// ============================================================================
// DBIS Volume VIII: Distributed Sovereign Compute Mesh (DSCM-X)
// ============================================================================

model DscmNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  sovereignBankId   String?
  nodeType          String   // SEN, CEN, FXN, CTN
  nodeName          String
  computeCapacity   Decimal? @db.Decimal(32, 8) // Compute units
  latency           Int?     // Latency in milliseconds
  sovereignPriority Int?     // Priority level (1-10)
  riskWeight        Decimal? @db.Decimal(32, 8)
  status            String   @default("active") // active, suspended, offline
  registeredAt      DateTime @default(now())
  lastHeartbeat     DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  tasks             ComputeTask[]
  aiTasks           FederatedAiTask[]

  @@index([nodeId])
  @@index([sovereignBankId])
  @@index([nodeType])
  @@index([status])
  @@map("dscm_nodes")
}

model ComputeTask {
  id                String   @id @default(uuid())
  taskId            String   @unique
  nodeId            String
  taskType          String   // smart_contract, settlement, risk_calculation, compliance_check
  taskPayload       Json
  computeCost       Decimal? @db.Decimal(32, 8)
  latency           Int?     // Milliseconds
  distributionScore Decimal? @db.Decimal(32, 8) // compute_cost + latency + sovereign_priority + risk_weight
  status            String   @default("pending") // pending, executing, completed, failed
  assignedAt        DateTime @default(now())
  startedAt         DateTime?
  completedAt       DateTime?
  result            Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              DscmNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([taskId])
  @@index([nodeId])
  @@index([taskType])
  @@index([status])
  @@map("compute_tasks")
}

model FederatedAiTask {
  id                String   @id @default(uuid())
  taskId            String   @unique
  nodeId            String
  aiType            String   // risk_analysis, compliance_check, threat_detection
  taskPayload       Json
  federatedNodes    Json?    // Array of participating nodes
  consensusResult   Json?
  status            String   @default("pending") // pending, running, consensus_reached, failed
  startedAt         DateTime?
  consensusReachedAt DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              DscmNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([taskId])
  @@index([nodeId])
  @@index([aiType])
  @@index([status])
  @@map("federated_ai_tasks")
}

// ============================================================================
// DBIS Volume VIII: CBDC Governance & Monetary Modeling
// ============================================================================

model CbdcMonetaryCommittee {
  id                String   @id @default(uuid())
  committeeId       String   @unique
  sovereignBankId   String
  committeeName     String
  memberCount       Int?
  votingMechanism   String   // simple_majority, supermajority
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  supplyControls    CbdcSupplyControl[]
  velocityControls  CbdcVelocityControl[]

  @@index([committeeId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("cbdc_monetary_committees")
}

model DbisMonetaryCouncil {
  id                String   @id @default(uuid())
  councilId         String   @unique
  councilName       String   @default("DBIS Monetary & Settlement Council")
  memberCount       Int?
  votingMechanism   String   // simple_majority, supermajority_2_3
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([councilId])
  @@index([status])
  @@map("dbis_monetary_councils")
}

model CbdcComplianceBoard {
  id                String   @id @default(uuid())
  boardId           String   @unique
  boardName         String   @default("CBDC Compliance & Enforcement Board")
  memberCount       Int?
  enforcementLevel  String   // advisory, binding
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([boardId])
  @@index([status])
  @@map("cbdc_compliance_boards")
}

model CbdcSupplyControl {
  id                String   @id @default(uuid())
  controlId         String   @unique
  committeeId       String?
  sovereignBankId   String
  operationType     String   // issue, burn
  amount            Decimal  @db.Decimal(32, 8)
  dualSignature1    String?  // First signature (SCB)
  dualSignature2    String?  // Second signature (DBIS)
  stressAdjustedCap Decimal? @db.Decimal(32, 8)
  status            String   @default("pending") // pending, approved, executed
  approvedAt        DateTime?
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  committee         CbdcMonetaryCommittee? @relation(fields: [committeeId], references: [id])

  @@index([controlId])
  @@index([committeeId])
  @@index([sovereignBankId])
  @@index([operationType])
  @@index([status])
  @@map("cbdc_supply_controls")
}

model CbdcVelocityControl {
  id                String   @id @default(uuid())
  controlId         String   @unique
  committeeId       String?
  sovereignBankId   String
  walletId          String?
  walletLevelLimit  Decimal? @db.Decimal(32, 8)
  spendingCategory  String?  // Category-based spending limits
  timeBasedThrottle Json?    // Time-based throttle configuration
  status            String   @default("active")
  effectiveDate     DateTime
  expiryDate        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  committee         CbdcMonetaryCommittee? @relation(fields: [committeeId], references: [id])

  @@index([controlId])
  @@index([committeeId])
  @@index([sovereignBankId])
  @@index([walletId])
  @@index([status])
  @@map("cbdc_velocity_controls")
}

model CbdcLiquidityWindow {
  id                String   @id @default(uuid())
  windowId          String   @unique
  sovereignBankId   String
  windowType        String   // standing, emergency
  availableLiquidity Decimal @db.Decimal(32, 8)
  swapRate          Decimal? @db.Decimal(32, 12) // CBDC-to-SSU swap rate
  status            String   @default("open") // open, closed, suspended
  openedAt          DateTime @default(now())
  closedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([windowId])
  @@index([sovereignBankId])
  @@index([windowType])
  @@index([status])
  @@map("cbdc_liquidity_windows")
}

model CbdcMonetarySimulation {
  id                String   @id @default(uuid())
  simulationId      String   @unique
  sovereignBankId   String?
  simulationType    String   // cross_border_flows, liquidity_shock, fx_spillover, commodity_backed_circulation
  supplyChange      Decimal? @db.Decimal(32, 8)
  velocityFactor    Decimal? @db.Decimal(32, 12)
  fxReserveStrength Decimal? @db.Decimal(32, 12)
  impactScore       Decimal? @db.Decimal(32, 12) // CBDC_supply_change * velocity_factor * FX_reserve_strength
  simulationResults Json?
  status            String   @default("running") // running, completed, failed
  startedAt         DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([simulationId])
  @@index([sovereignBankId])
  @@index([simulationType])
  @@index([status])
  @@map("cbdc_monetary_simulations")
}

// ============================================================================
// DBIS Volume VIII: Global Quantum Ledger (GQL)
// ============================================================================

model GqlBlock {
  id                String   @id @default(uuid())
  blockId           String   @unique
  timestamp         DateTime @default(now())
  pqSignatures      Json     // Array of PQ signatures
  quantumStateCommit String? // ENTANGLED_HASH (future)
  multiAssetRoot    String   // HASH(cbdc, fiat, ssu, commodity, security)
  previousBlockHash String?
  blockHash         String
  status            String   @default("pending") // pending, verified, final
  verifiedAt        DateTime?
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pqSignatureBlocks PqSignatureBlock[]
  quantumHashes     QuantumHash[]

  @@index([blockId])
  @@index([blockHash])
  @@index([previousBlockHash])
  @@index([status])
  @@map("gql_blocks")
}

model QuantumStateCommitment {
  id                String   @id @default(uuid())
  commitmentId      String   @unique
  blockId           String?
  entangledHash     String?  // Entanglement-based hash (future)
  commitmentType    String   // entangled_state_commitment
  status            String   @default("pending") // pending, verified (future module)
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([commitmentId])
  @@index([blockId])
  @@map("quantum_state_commitments")
}

model PqSignatureBlock {
  id                String   @id @default(uuid())
  signatureId       String   @unique
  blockId           String
  algorithm         String   // XMSS, SPHINCS+
  signature         String   @db.Text
  publicKey         String   @db.Text
  verificationStatus String @default("pending") // pending, verified, rejected
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  block             GqlBlock @relation(fields: [blockId], references: [id], onDelete: Cascade)

  @@index([signatureId])
  @@index([blockId])
  @@index([algorithm])
  @@index([verificationStatus])
  @@map("pq_signature_blocks")
}

model QuantumHash {
  id                String   @id @default(uuid())
  hashId            String   @unique
  blockId           String?
  hashAlgorithm     String   // Q-Keccak
  hashValue         String
  originalData      Json?    // Original data hashed
  createdAt         DateTime @default(now())

  block             GqlBlock? @relation(fields: [blockId], references: [id])

  @@index([hashId])
  @@index([blockId])
  @@index([hashAlgorithm])
  @@map("quantum_hashes")
}

// ============================================================================
// DBIS Volume VIII: Advanced FX/CBDC/SSU Simulation Engine (A-FCSS)
// ============================================================================

model AfcssSimulation {
  id                String   @id @default(uuid())
  simulationId      String   @unique
  simulationType    String   // fx_volatility, cbdc_circulation, ssu_stabilization, multi_asset_contagion
  parameters        Json
  impactScore       Decimal? @db.Decimal(32, 12) // (FX_vol * CBDC_velocity * SSU_weight) - liquidity_shock + sovereign_stability_index
  simulationResults Json?
  status            String   @default("running") // running, completed, failed
  startedAt         DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  impacts           FxCbdcSsuImpact[]
  contagionRisks    MultiAssetContagionRisk[]

  @@index([simulationId])
  @@index([simulationType])
  @@index([status])
  @@map("afcss_simulations")
}

model FxCbdcSsuImpact {
  id                String   @id @default(uuid())
  impactId          String   @unique
  simulationId      String
  fxVolatility      Decimal? @db.Decimal(32, 12)
  cbdcVelocity      Decimal? @db.Decimal(32, 12)
  ssuWeight         Decimal? @db.Decimal(32, 12)
  liquidityShock    Decimal? @db.Decimal(32, 12)
  sovereignStabilityIndex Decimal? @db.Decimal(32, 12)
  impactScore       Decimal  @db.Decimal(32, 12)
  impactType        String   // fx_impact, cbdc_impact, ssu_impact, combined
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  simulation        AfcssSimulation @relation(fields: [simulationId], references: [id], onDelete: Cascade)

  @@index([impactId])
  @@index([simulationId])
  @@index([impactType])
  @@map("fx_cbdc_ssu_impacts")
}

model MultiAssetContagionRisk {
  id                String   @id @default(uuid())
  riskId            String   @unique
  simulationId      String
  sourceAsset       String   // cbdc, fiat, commodity, security, ssu
  targetAsset       String
  contagionScore    Decimal  @db.Decimal(32, 12) // 0-100 scale
  riskFactors       Json?
  severity          String   // low, medium, high, critical
  assessedAt        DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  simulation        AfcssSimulation @relation(fields: [simulationId], references: [id], onDelete: Cascade)

  @@index([riskId])
  @@index([simulationId])
  @@index([sourceAsset, targetAsset])
  @@index([severity])
  @@map("multi_asset_contagion_risks")
}

// ============================================================================
// DBIS Volume VIII: Supra-Sovereign Threat Matrix (SSTM)
// ============================================================================

model SupraSovereignThreat {
  id                String   @id @default(uuid())
  threatId          String   @unique
  threatCategory    String   // T1 (Technical), T2 (Financial), T3 (Coordination)
  threatType        String   // pq_key_extraction, smart_contract_infiltration, fx_destabilization, cbdc_bank_run, state_linked_warfare, insider_collusion
  severity          String   // low, medium, high, critical
  affectedBanks     Json?    // Array of affected SCB IDs
  coordinationLevel String?  // single_scb, multi_scb, supra_sovereign
  description       String   @db.Text
  detectedAt        DateTime @default(now())
  status            String   @default("detected") // detected, mitigated, resolved
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  patterns          CoordinatedThreatPattern[]
  mitigations       ThreatMitigation[]

  @@index([threatId])
  @@index([threatCategory])
  @@index([threatType])
  @@index([severity])
  @@index([status])
  @@map("supra_sovereign_threats")
}

model CoordinatedThreatPattern {
  id                String   @id @default(uuid())
  patternId         String   @unique
  threatId          String
  patternType       String   // multi_scb_attack, synthetic_asset_manipulation, rogue_ai_economic_actor
  affectedBanks     Json     // Array of SCB IDs
  attackVector      String?
  patternSignature  Json?    // Pattern signature for detection
  detectedAt        DateTime @default(now())
  status            String   @default("detected") // detected, analyzed, mitigated
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  threat            SupraSovereignThreat @relation(fields: [threatId], references: [id], onDelete: Cascade)

  @@index([patternId])
  @@index([threatId])
  @@index([patternType])
  @@index([status])
  @@map("coordinated_threat_patterns")
}

model ThreatMitigation {
  id                String   @id @default(uuid())
  mitigationId      String   @unique
  threatId          String?
  incidentId        String?
  mitigationType    String   // dcdc_response, quarantine, ledger_freeze, multi_scb_coordination
  action            String   @db.Text
  affectedEntities  Json?    // Affected nodes, banks, assets
  status            String   @default("pending") // pending, executing, completed, failed
  initiatedAt       DateTime @default(now())
  completedAt       DateTime?
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  threat            SupraSovereignThreat? @relation(fields: [threatId], references: [id])
  incident          CyberThreatIncident? @relation(fields: [incidentId], references: [id])

  @@index([mitigationId])
  @@index([threatId])
  @@index([incidentId])
  @@index([mitigationType])
  @@index([status])
  @@map("threat_mitigations")
}

// ============================================================================
// DBIS Volume VII: Global Payments Network (GPN)
// ============================================================================

model GpnPayment {
  id                String   @id @default(uuid())
  paymentId         String   @unique
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // fiat, cbdc, commodity, security, ssu
  paymentType       String   // person_to_person, bank_to_bank, scb_to_scb, commodity_backed, security_linked, cross_chain
  routeId           String?
  layer1Status      String   @default("pending") // pending, authenticated, rejected
  layer2Status      String   @default("pending") // pending, routed, rejected
  layer3Status      String   @default("pending") // pending, settled, failed
  hashLock          String?  // Hash-lock for finality
  scbLedgerHash     String?  // SCB ledger hash
  dbisLedgerHash    String?  // DBIS Master Ledger hash
  isoMessageId      String?  // ISO 20022 message reference
  smeEnvelope       Json?    // Sovereign Message Envelope
  status            String   @default("pending") // pending, processing, settled, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  route             GpnRoute? @relation(fields: [routeId], references: [id])
  settlementLocks   GpnSettlementLock[]

  @@index([paymentId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([routeId])
  @@index([status])
  @@index([hashLock])
  @@map("gpn_payments")
}

model GpnRoute {
  id                String   @id @default(uuid())
  routeId           String   @unique
  sourceBankId      String
  destinationBankId String
  currencyCode      String
  routePath         Json     // Array of intermediate nodes
  fxCost            Decimal  @db.Decimal(32, 12)
  liquidityScore   Decimal  @db.Decimal(32, 8)
  sriWeight         Decimal  @db.Decimal(32, 8)
  totalCost         Decimal  @db.Decimal(32, 12)
  status            String   @default("active") // active, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  payments          GpnPayment[]

  @@index([routeId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@map("gpn_routes")
}

model GpnSettlementLock {
  id                String   @id @default(uuid())
  lockId            String   @unique
  paymentId         String
  hashLock          String   // Hash-lock value
  scbLedgerHash     String?  // SCB ledger hash
  dbisLedgerHash    String?  // DBIS Master Ledger hash
  lockStatus        String   @default("pending") // pending, matched, expired
  matchedAt         DateTime?
  expiresAt         DateTime
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  payment           GpnPayment @relation(fields: [paymentId], references: [id], onDelete: Cascade)

  @@index([lockId])
  @@index([paymentId])
  @@index([hashLock])
  @@index([lockStatus])
  @@map("gpn_settlement_locks")
}

// ============================================================================
// DBIS Volume VII: Multi-Asset RTGS System (M-RTGS)
// ============================================================================

model MrtgsQueue {
  id                String   @id @default(uuid())
  queueId           String   @unique
  paymentId         String
  priorityTier      Int      // 1 = Sovereign & systemic, 2 = Interbank, 3 = Retail CBDC
  priorityScore     Decimal  @db.Decimal(32, 12) // systemic_value + fx_cost_penalty + liquidity_weight + SRI_adjustment
  assetType         String   // fiat, cbdc, ssu, commodity, security
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  sourceBankId      String
  destinationBankId String
  queuePosition     Int
  status            String   @default("queued") // queued, processing, settled, failed
  queuedAt          DateTime @default(now())
  processedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        MrtgsSettlement?

  @@index([queueId])
  @@index([paymentId])
  @@index([priorityTier])
  @@index([priorityScore])
  @@index([status])
  @@index([queuedAt])
  @@map("mrtgs_queues")
}

model MrtgsSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  queueId           String   @unique
  paymentId         String
  assetType         String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  sourceBankId      String
  destinationBankId String
  settlementTime    Int      // Milliseconds
  ledgerSyncStatus  Json     // Multi-ledger synchronization status
  status            String   @default("pending") // pending, settled, failed
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  queue             MrtgsQueue @relation(fields: [queueId], references: [id], onDelete: Cascade)
  riskAlerts        MrtgsRiskAlert[]

  @@index([settlementId])
  @@index([queueId])
  @@index([paymentId])
  @@index([status])
  @@map("mrtgs_settlements")
}

model MrtgsRiskAlert {
  id                String   @id @default(uuid())
  alertId           String   @unique
  settlementId      String
  alertType         String   // velocity, liquidity_congestion, fx_slip, commodity_shock, cbdc_routing_anomaly
  severity          String   // low, medium, high, critical
  description       String   @db.Text
  metrics           Json     // Alert metrics
  status            String   @default("active") // active, resolved, acknowledged
  createdAt         DateTime @default(now())
  resolvedAt        DateTime?
  updatedAt         DateTime @updatedAt

  settlement        MrtgsSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([alertId])
  @@index([settlementId])
  @@index([alertType])
  @@index([severity])
  @@index([status])
  @@map("mrtgs_risk_alerts")
}

// ============================================================================
// DBIS Volume VII: Sovereign Cloud Infrastructure (SCI)
// ============================================================================

model SovereignComputeZone {
  id                String   @id @default(uuid())
  zoneId            String   @unique
  sovereignBankId   String
  zoneName          String
  zoneType          String   // primary, replica, backup
  region            String
  zeroTrustConfig   Json     // Zero-trust isolation configuration
  pqHsmConfig       Json?    // PQ-HSM configuration
  status            String   @default("active") // active, suspended, decommissioned
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  replications      SovereignReplication[]
  contracts         SevmContract[]
  attestations      SovereignAttestation[]

  @@index([zoneId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("sovereign_compute_zones")
}

model SovereignReplication {
  id                String   @id @default(uuid())
  replicationId     String   @unique
  zoneId            String
  targetZoneId      String
  replicationType   String   // metadata, full, incremental
  metadataHash      String   // Hash of metadata (updated every 30s)
  lastHashTime      DateTime
  status            String   @default("active") // active, paused, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  zone              SovereignComputeZone @relation(fields: [zoneId], references: [id], onDelete: Cascade)

  @@index([replicationId])
  @@index([zoneId])
  @@index([targetZoneId])
  @@index([status])
  @@map("sovereign_replications")
}

model SevmContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  zoneId            String
  contractType      String   // cbdc_workflow, fx_swap, commodity_redemption, settlement_contract
  contractAddress   String   // SEVM contract address
  contractCode      String   @db.Text // Smart contract code
  contractHash      String   // Hash of contract code
  deployerBankId    String
  status            String   @default("pending") // pending, deployed, active, suspended
  deployedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  zone              SovereignComputeZone @relation(fields: [zoneId], references: [id], onDelete: Cascade)

  @@index([contractId])
  @@index([zoneId])
  @@index([contractType])
  @@index([contractAddress])
  @@index([status])
  @@map("sevm_contracts")
}

model SovereignAttestation {
  id                String   @id @default(uuid())
  attestationId     String   @unique
  zoneId            String
  attestationType   String   // tpm_integrity, pq_encryption, cross_zone_firewall, continuous_integrity
  attestationData   Json     // Attestation evidence
  integrityHash     String   // Integrity verification hash
  status            String   @default("pending") // pending, verified, failed
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  zone              SovereignComputeZone @relation(fields: [zoneId], references: [id], onDelete: Cascade)

  @@index([attestationId])
  @@index([zoneId])
  @@index([attestationType])
  @@index([status])
  @@map("sovereign_attestations")
}

// ============================================================================
// DBIS Volume VII: ZK-CBDC Validation Framework
// ============================================================================

model ZkProof {
  id                String   @id @default(uuid())
  proofId           String   @unique
  walletId          String
  proofType         String   // zkBP (balance), zkCP (compliance), zkIP (identity)
  proofData         String   @db.Text // ZK proof data
  publicInputs      Json     // Public inputs for verification
  verificationKey   String   // Verification key reference
  status            String   @default("pending") // pending, verified, rejected
  verifiedAt        DateTime?
  expiresAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  verifications     ZkVerification[]

  @@index([proofId])
  @@index([walletId])
  @@index([proofType])
  @@index([status])
  @@map("zk_proofs")
}

model ZkVerification {
  id                String   @id @default(uuid())
  verificationId    String   @unique
  proofId           String
  contractId        String?  // Smart contract reference
  verificationType  String   // balance_check, compliance_check, identity_check, combined
  zkbpResult        Boolean? // ZK-Balance Proof result
  zkcpResult        Boolean? // ZK-Compliance Proof result
  zkipResult        Boolean? // ZK-Identity Proof result
  overallResult     Boolean  // Combined: zkBP && zkCP && zkIP
  status            String   @default("pending") // pending, verified, rejected
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  proof             ZkProof @relation(fields: [proofId], references: [id], onDelete: Cascade)

  @@index([verificationId])
  @@index([proofId])
  @@index([contractId])
  @@index([verificationType])
  @@index([status])
  @@map("zk_verifications")
}

// ============================================================================
// DBIS Volume VII: Autonomous Regulatory Intelligence (ARI)
// ============================================================================

model AriPolicy {
  id                String   @id @default(uuid())
  policyId          String   @unique
  policyType        String   // aml, fx_risk, liquidity, sanctions, settlement
  policyName        String
  policyRules       Json     // Policy rules and conditions
  layer             String   // cortex, reflex, execution
  status            String   @default("active") // active, suspended, archived
  effectiveDate     DateTime
  expiryDate        DateTime?
  createdBy         String   @default("ari") // ari, msc, caa
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  decisions         AriDecision[]
  updates           AriPolicyUpdate[]

  @@index([policyId])
  @@index([policyType])
  @@index([layer])
  @@index([status])
  @@map("ari_policies")
}

model AriDecision {
  id                String   @id @default(uuid())
  decisionId        String   @unique
  policyId          String?
  decisionType      String   // policy_update, fx_band_adjustment, liquidity_limit_change, aml_rule_update, sanctions_update
  targetSystem      String   // gpn, m_rtgs, alps, gase, fx_engine
  decisionData      Json     // Decision parameters and actions
  triggerCondition  String   @db.Text // Condition that triggered decision (e.g., "SARE.FXSP > 0.35")
  status            String   @default("pending") // pending, applied, rejected, overridden
  appliedAt         DateTime?
  reviewedBy        String?  // MSC or CAA reviewer
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  policy            AriPolicy? @relation(fields: [policyId], references: [id])

  @@index([decisionId])
  @@index([policyId])
  @@index([decisionType])
  @@index([targetSystem])
  @@index([status])
  @@map("ari_decisions")
}

model AriPolicyUpdate {
  id                String   @id @default(uuid())
  updateId          String   @unique
  policyId          String
  updateType        String   // creation, modification, suspension, reactivation
  previousRules     Json?    // Previous policy rules
  newRules          Json     // New policy rules
  reason            String   @db.Text
  updatedBy         String   @default("ari") // ari, msc, caa
  reviewWindow      DateTime? // MSC review window
  caaOverride       Boolean  @default(false)
  status            String   @default("pending") // pending, approved, rejected
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  policy            AriPolicy @relation(fields: [policyId], references: [id], onDelete: Cascade)

  @@index([updateId])
  @@index([policyId])
  @@index([updateType])
  @@index([status])
  @@map("ari_policy_updates")
}

// ============================================================================
// DBIS Volume VII: Cross-Border Algorithmic Settlement Optimizer (CASO)
// ============================================================================

model CasoRoute {
  id                String   @id @default(uuid())
  routeId           String   @unique
  sourceBankId      String
  destinationBankId String
  currencyCode      String
  assetType         String
  fxCost            Decimal  @db.Decimal(32, 12)
  liquidityPenalty  Decimal  @db.Decimal(32, 12)
  volatilityRisk    Decimal  @db.Decimal(32, 12)
  sriFactor         Decimal  @db.Decimal(32, 12)
  ssuCost           Decimal  @db.Decimal(32, 12)
  totalCost         Decimal  @db.Decimal(32, 12) // argmin result
  routePath         Json     // Optimized route path
  status            String   @default("active") // active, applied, expired
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  optimizations     CasoOptimization[]

  @@index([routeId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@map("caso_routes")
}

model CasoOptimization {
  id                String   @id @default(uuid())
  optimizationId    String   @unique
  routeId           String
  optimizationType  String   // gpn_routing, m_rtgs_queueing, sire_integration, alps_liquidity
  inputParameters   Json     // Input parameters for optimization
  optimizationResult Json    // Optimization result data
  status            String   @default("pending") // pending, applied, rejected
  calculatedAt      DateTime @default(now())
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  route             CasoRoute @relation(fields: [routeId], references: [id], onDelete: Cascade)

  @@index([optimizationId])
  @@index([routeId])
  @@index([optimizationType])
  @@index([status])
  @@map("caso_optimizations")
}

// ============================================================================
// DBIS Volume VII: Decentralized Sovereign Compliance Nodes (DSCN)
// ============================================================================

model DscnNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  sovereignBankId   String?
  privateBankId     String?
  nodeType          String   // scb, private_bank, regulated_institution
  nodeName          String
  nodeAddress       String   // Network address
  registrationStatus String @default("pending") // pending, approved, active, suspended
  approvedAt        DateTime?
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  complianceResults DscnComplianceResult[]
  syncRecords       DscnSyncRecord[]

  @@index([nodeId])
  @@index([sovereignBankId])
  @@index([privateBankId])
  @@index([nodeType])
  @@index([status])
  @@map("dscn_nodes")
}

model DscnComplianceResult {
  id                String   @id @default(uuid())
  resultId          String   @unique
  nodeId            String
  complianceType    String   // aml_scan, sanctions_check, identity_verification
  entityId          String   // Entity being checked
  entityType        String   // wallet, account, transaction
  scanResult        String   // pass, fail, review_required
  riskScore         Decimal? @db.Decimal(32, 8)
  details           Json     // Detailed compliance results
  status            String   @default("pending") // pending, synced, failed
  syncedToDbis      Boolean  @default(false)
  syncedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              DscnNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([resultId])
  @@index([nodeId])
  @@index([complianceType])
  @@index([entityId])
  @@index([scanResult])
  @@index([status])
  @@map("dscn_compliance_results")
}

model DscnSyncRecord {
  id                String   @id @default(uuid())
  syncId            String   @unique
  nodeId            String
  syncType          String   // compliance_result, ledger_state, identity_update
  syncData          Json     // Data being synchronized
  dbisLedgerHash    String?  // DBIS Master Ledger hash after sync
  syncStatus        String   @default("pending") // pending, synced, failed
  syncedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              DscnNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([syncId])
  @@index([nodeId])
  @@index([syncType])
  @@index([syncStatus])
  @@map("dscn_sync_records")
}

// ============================================================================
// DBIS Volume IX: Global Synthetic Derivatives System (GSDS)
// ============================================================================

model SyntheticDerivative {
  id                String   @id @default(uuid())
  derivativeId      String   @unique
  derivativeType    String   // synthetic_currency, multi_asset, synthetic_credit, behavioral
  party1BankId      String
  party2BankId      String?
  underlyingAsset   String   // SSU, CBDC, commodity, security, fiat, fx
  notionalAmount    Decimal  @db.Decimal(32, 8)
  contractTerms     Json     // Contract terms and parameters
  smartContractId   String?  // Reference to smart contract
  status            String   @default("active") // active, expired, terminated, settled, auto_closed
  initiatedAt       DateTime @default(now())
  maturityDate      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pricing           GsdsPricingEngine[]
  collaterals       SyntheticDerivativeCollateral[]
  settlements       SyntheticDerivativeSettlement[]

  @@index([derivativeId])
  @@index([derivativeType])
  @@index([party1BankId])
  @@index([party2BankId])
  @@index([status])
  @@map("synthetic_derivatives")
}

model GsdsPricingEngine {
  id                String   @id @default(uuid())
  pricingId         String   @unique
  derivativeId      String
  baseValue         Decimal  @db.Decimal(32, 12)
  volatilityFactor  Decimal  @db.Decimal(32, 12)
  collateralRatio   Decimal  @db.Decimal(32, 12)
  liquidityPenalty  Decimal  @db.Decimal(32, 12)
  sriAdjustment     Decimal  @db.Decimal(32, 12)
  syntheticPrice    Decimal  @db.Decimal(32, 12) // Calculated: base_value + volatility_factor + collateral_ratio - liquidity_penalty + SRI_adjustment
  pricingSource     String   // gql_state, msc_parameters, ai_liquidity_estimator
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        SyntheticDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)

  @@index([pricingId])
  @@index([derivativeId])
  @@index([calculatedAt])
  @@map("gsds_pricing_engine")
}

model SyntheticDerivativeCollateral {
  id                String   @id @default(uuid())
  collateralId      String   @unique
  derivativeId      String
  assetType         String   // cbdc, ssu, commodity, security, fiat
  assetId           String?
  amount            Decimal  @db.Decimal(32, 8)
  valuation         Decimal  @db.Decimal(32, 12)
  marginRequirement Decimal  @db.Decimal(32, 12)
  status            String   @default("active") // active, released, liquidated
  allocatedAt       DateTime @default(now())
  releasedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        SyntheticDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)

  @@index([collateralId])
  @@index([derivativeId])
  @@index([assetType])
  @@index([status])
  @@map("synthetic_derivative_collaterals")
}

model SyntheticDerivativeSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  derivativeId      String
  settlementAmount  Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // fiat, cbdc, commodity, security, ssu
  hashLock          String?  // Hash-lock for finality
  sovereignLedgerHash String?
  dbisLedgerHash    String?
  dualLedgerCommit  Boolean  @default(false)
  status            String   @default("pending") // pending, committed, settled, final
  committedAt       DateTime?
  settledAt         DateTime?
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        SyntheticDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([derivativeId])
  @@index([hashLock])
  @@index([status])
  @@map("synthetic_derivative_settlements")
}

// ============================================================================
// DBIS Volume IX: Interplanetary Settlement Pathways (ISP)
// ============================================================================

model InterplanetaryNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  planetaryLocation String   // earth, lunar, martian
  sovereignBankId   String?
  nodeType          String   // scb, sovereign_authority, economic_council
  nodeName          String
  nodeAddress       String   // Network address
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  issuances         InterplanetarySSU[]
  cbdcIssuances     InterplanetaryCBDC[]

  @@index([nodeId])
  @@index([planetaryLocation])
  @@index([sovereignBankId])
  @@index([status])
  targetSettlements InterplanetarySettlement[] @relation("TargetSettlement")
  sourceSettlements InterplanetarySettlement[] @relation("SourceSettlement")
  targetRelayGrids  InterplanetaryRelayGrid[] @relation("TargetNode")
  sourceRelayGrids  InterplanetaryRelayGrid[] @relation("SourceNode")
  @@map("interplanetary_nodes")
}

model InterplanetaryRelayGrid {
  id                String   @id @default(uuid())
  relayId           String   @unique
  sourceNodeId      String
  targetNodeId      String
  relayType         String   // deep_space_relay, sovereign_relay
  messageType       String   // settlement, cbdc_issuance, state_sync
  messagePayload    Json     // PQC-light messaging payload
  pqcSignature      String?  // Post-quantum cryptography signature
  latency           Int?     // Estimated latency in seconds
  highLatencyBuffer Boolean  @default(false) // High-latency settlement buffer
  status            String   @default("pending") // pending, relayed, delivered, failed
  relayedAt         DateTime?
  deliveredAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sourceNode        InterplanetaryNode @relation("SourceNode", fields: [sourceNodeId], references: [id], onDelete: Cascade)
  targetNode        InterplanetaryNode @relation("TargetNode", fields: [targetNodeId], references: [id], onDelete: Cascade)

  @@index([relayId])
  @@index([sourceNodeId])
  @@index([targetNodeId])
  @@index([status])
  @@map("interplanetary_relay_grid")
}

model InterplanetarySettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  sourceNodeId      String
  targetNodeId      String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // cbdc, ssu, fiat, commodity
  settlementType    String   // direct, relayed, temporal
  hashLock          String?  // Hash-lock for finality
  status            String   @default("pending") // pending, committed, settled, final
  committedAt       DateTime?
  settledAt         DateTime?
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sourceNode        InterplanetaryNode @relation("SourceSettlement", fields: [sourceNodeId], references: [id], onDelete: Cascade)
  targetNode        InterplanetaryNode @relation("TargetSettlement", fields: [targetNodeId], references: [id], onDelete: Cascade)
  temporalEngine    TemporalSettlementEngine?

  @@index([settlementId])
  @@index([sourceNodeId])
  @@index([targetNodeId])
  @@index([status])
  @@map("interplanetary_settlements")
}

model TemporalSettlementEngine {
  id                String   @id @default(uuid())
  tseId             String   @unique
  settlementId      String   @unique
  futureStateEstimate Json   // Predictive state estimate
  preCommitHash     String   // HASH(future_state_estimate)
  communicationDelay Int     // Delay in seconds
  predictiveContract Json?   // Predictive contract terms
  status            String   @default("pending") // pending, committed, verified, settled
  committedAt       DateTime?
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        InterplanetarySettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([tseId])
  @@index([settlementId])
  @@index([preCommitHash])
  @@index([status])
  @@map("temporal_settlement_engine")
}

model InterplanetarySSU {
  id                String   @id @default(uuid())
  issuId            String   @unique
  nodeId            String
  amount            Decimal  @db.Decimal(32, 8)
  gravityAdjustment Decimal? @db.Decimal(32, 12) // Gravity-adjusted economic valuation
  radiationEnvelope String?  // Radiation-hardened cryptographic envelope
  status            String   @default("active") // active, redeemed, expired
  issuedAt          DateTime @default(now())
  redeemedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              InterplanetaryNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([issuId])
  @@index([nodeId])
  @@index([status])
  @@map("interplanetary_ssu")
}

model InterplanetaryCBDC {
  id                String   @id @default(uuid())
  icbdcId           String   @unique
  nodeId            String
  currencyCode      String
  amount            Decimal  @db.Decimal(32, 8)
  issuanceType      String   // mars_issuance, lunar_issuance
  sovereignAutonomy Boolean  @default(true) // Sovereign autonomy flag
  dualLedgerFinality Boolean @default(false) // Dual-ledger finality respecting DBIS authority
  status            String   @default("active") // active, redeemed, expired
  issuedAt          DateTime @default(now())
  redeemedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              InterplanetaryNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([icbdcId])
  @@index([nodeId])
  @@index([currencyCode])
  @@index([status])
  @@map("interplanetary_cbdc")
}

// ============================================================================
// DBIS Volume IX: Behavioral Economics & Incentive Engine (BEIE)
// ============================================================================

model BehavioralMetric {
  id                String   @id @default(uuid())
  metricId          String   @unique
  entityId          String   // User, institution, or sovereign ID
  entityType       String   // retail_cbdc_user, institution, sovereign_liquidity_actor
  metricType       String   // ccv, ilb, srp
  metricValue      Decimal  @db.Decimal(32, 12)
  metricData       Json?    // Additional metric data
  calculatedAt     DateTime @default(now())
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  @@index([metricId])
  @@index([entityId])
  @@index([entityType])
  @@index([metricType])
  @@index([calculatedAt])
  @@map("behavioral_metrics")
}

model BehavioralIncentive {
  id                String   @id @default(uuid())
  incentiveId      String   @unique
  entityId          String
  entityType       String   // retail_cbdc_user, institution, sovereign
  incentiveType    String   // cbdc_micro_reward, ssu_fee_adjustment
  incentiveAmount  Decimal  @db.Decimal(32, 8)
  incentiveReason  String   // stabilizing_behavior, low_risk_flow
  status           String   @default("pending") // pending, applied, expired
  appliedAt        DateTime?
  expiresAt        DateTime?
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  @@index([incentiveId])
  @@index([entityId])
  @@index([entityType])
  @@index([incentiveType])
  @@index([status])
  @@map("behavioral_incentives")
}

model BehavioralPenalty {
  id                String   @id @default(uuid())
  penaltyId        String   @unique
  entityId          String
  entityType       String   // retail_cbdc_user, institution, sovereign
  penaltyType      String   // liquidity_penalty, fee_increase, access_restriction
  penaltyAmount    Decimal? @db.Decimal(32, 8)
  penaltyReason    String   // risky_behavior_detected, srp_risk_threshold_exceeded
  riskScore        Decimal  @db.Decimal(32, 12) // SRP_risk or other risk metric
  threshold        Decimal  @db.Decimal(32, 12) // Threshold that triggered penalty
  predictiveContract Json?  // Predictive penalty contract
  status           String   @default("pending") // pending, applied, resolved
  appliedAt        DateTime?
  resolvedAt       DateTime?
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  @@index([penaltyId])
  @@index([entityId])
  @@index([entityType])
  @@index([penaltyType])
  @@index([status])
  @@map("behavioral_penalties")
}

model BehavioralProfile {
  id                String   @id @default(uuid())
  profileId        String   @unique
  entityId          String
  entityType       String   // retail_cbdc_user, institution, sovereign
  ccvScore         Decimal? @db.Decimal(32, 12) // Consumer CBDC Velocity
  ilbScore         Decimal? @db.Decimal(32, 12) // Institutional Liquidity Behavior
  srpScore         Decimal? @db.Decimal(32, 12) // Sovereign Reaction Profile
  behaviorPattern  Json?    // Behavioral pattern data
  riskLevel        String   @default("low") // low, medium, high, critical
  status           String   @default("active") // active, suspended, archived
  lastUpdated      DateTime @default(now())
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  @@index([profileId])
  @@index([entityId])
  @@index([entityType])
  @@index([riskLevel])
  @@index([status])
  @@map("behavioral_profiles")
}

// ============================================================================
// DBIS Volume IX: Supra-National Funds Network (SNFN)
// ============================================================================

model SupraFundNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  nodeType          String   // sfn, dfn, csn
  nodeName          String
  fundType          String   // sovereign_wealth_fund, supranational_institution, development_fund, stabilization_pool
  totalAssets       Decimal  @db.Decimal(32, 8)
  availableLiquidity Decimal @db.Decimal(32, 8)
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  loans             SupraFundLoan[]
  settlements       SupraFundSettlement[]

  @@index([nodeId])
  @@index([nodeType])
  @@index([fundType])
  @@index([status])
  developmentFundNodes      DevelopmentFundNode[]
  crisisStabilizationNodes  CrisisStabilizationNode[]
  @@map("supra_fund_nodes")
}

model DevelopmentFundNode {
  id                String   @id @default(uuid())
  dfnId             String   @unique
  nodeId             String
  directLendingCap   Decimal @db.Decimal(32, 8)
  commodityBackedLoans Boolean @default(true)
  status             String   @default("active") // active, suspended, inactive
  createdAt          DateTime @default(now())
  updatedAt          DateTime @updatedAt

  node               SupraFundNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([dfnId])
  @@index([nodeId])
  @@index([status])
  @@map("development_fund_nodes")
}

model CrisisStabilizationNode {
  id                String   @id @default(uuid())
  csnId             String   @unique
  nodeId             String
  triggerCondition   String   // sri_critical, fx_collapse, commodity_shock
  triggerThreshold  Decimal  @db.Decimal(32, 12)
  stabilizationCap  Decimal  @db.Decimal(32, 8)
  status            String   @default("standby") // standby, activated, deactivated
  activatedAt       DateTime?
  deactivatedAt     DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node               SupraFundNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([csnId])
  @@index([nodeId])
  @@index([triggerCondition])
  @@index([status])
  @@map("crisis_stabilization_nodes")
}

model SupraFundLoan {
  id                String   @id @default(uuid())
  loanId            String   @unique
  nodeId            String
  borrowerBankId    String
  loanAmount        Decimal  @db.Decimal(32, 8)
  currencyCode      String
  sriFactor         Decimal  @db.Decimal(32, 12)
  reserveStrength   Decimal  @db.Decimal(32, 12)
  fxExposure        Decimal  @db.Decimal(32, 12)
  liquidityShortfall Decimal @db.Decimal(32, 12)
  loanEligibility   Decimal  @db.Decimal(32, 12) // Calculated: SRI_factor + reserve_strength + FX_exposure + liquidity_shortfall
  interestRate      Decimal? @db.Decimal(32, 12)
  maturityDate      DateTime?
  status            String   @default("pending") // pending, approved, disbursed, repaid, defaulted
  approvedAt        DateTime?
  disbursedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node               SupraFundNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([loanId])
  @@index([nodeId])
  @@index([borrowerBankId])
  @@index([status])
  @@map("supra_fund_loans")
}

model SupraFundSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  nodeId            String
  loanId            String?
  disbursementType  String   // cbdc, ssu, commodity_token, tokenized_bond
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetId           String?  // Asset ID if tokenized
  status            String   @default("pending") // pending, disbursed, settled
  disbursedAt       DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node               SupraFundNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([nodeId])
  @@index([loanId])
  @@index([status])
  @@map("supra_fund_settlements")
}

// ============================================================================
// DBIS Volume IX: Multi-Reality Ledger Interfaces (MRLI)
// ============================================================================

model MultiRealityLedger {
  id                String   @id @default(uuid())
  ledgerId          String   @unique
  ledgerName        String
  ledgerType        String   // classical, distributed, quantum, simulation
  mergedState       Json?    // MERGE(classical_state, dlt_state, quantum_state, simulated_state)
  status            String   @default("active") // active, syncing, conflict, resolved
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  interfaces        ClassicalInterface[]
  dltInterfaces     DistributedLedgerInterface[]
  quantumInterfaces QuantumLedgerInterface[]
  simInterfaces     SimulationInterface[]
  synchronizations  MRLISynchronization[]

  @@index([ledgerId])
  @@index([ledgerType])
  @@index([status])
  @@map("multi_reality_ledgers")
}

model ClassicalInterface {
  id                String   @id @default(uuid())
  interfaceId       String   @unique
  ledgerId          String
  connectionType    String   // sql, nosql, dbms
  connectionString  String   // Connection details
  stateSnapshot     Json?    // Classical state snapshot
  status            String   @default("active") // active, disconnected, error
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            MultiRealityLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([interfaceId])
  @@index([ledgerId])
  @@index([status])
  @@map("classical_interfaces")
}

model DistributedLedgerInterface {
  id                String   @id @default(uuid())
  interfaceId       String   @unique
  ledgerId          String
  ledgerType        String   // tokenized_asset, security_token_platform
  chainId           String?
  stateSnapshot     Json?    // DLT state snapshot
  status            String   @default("active") // active, disconnected, error
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            MultiRealityLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([interfaceId])
  @@index([ledgerId])
  @@index([status])
  @@map("distributed_ledger_interfaces")
}

model QuantumLedgerInterface {
  id                String   @id @default(uuid())
  interfaceId       String   @unique
  ledgerId          String
  gqlStateAccess    Boolean  @default(true) // GQL state access
  entanglementSnapshot Json? // Entanglement-based snapshots
  status            String   @default("active") // active, disconnected, error
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            MultiRealityLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([interfaceId])
  @@index([ledgerId])
  @@index([status])
  @@map("quantum_ledger_interfaces")
}

model SimulationInterface {
  id                String   @id @default(uuid())
  interfaceId       String   @unique
  ledgerId          String
  simulationType    String   // ai_economic_simulation, hypothetical_ledger_state
  simulationState   Json?    // Simulated ledger state
  status            String   @default("active") // active, disconnected, error
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            MultiRealityLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([interfaceId])
  @@index([ledgerId])
  @@index([status])
  @@map("simulation_interfaces")
}

model MRLISynchronization {
  id                String   @id @default(uuid())
  syncId            String   @unique
  ledgerId          String
  classicalState    Json?
  dltState          Json?
  quantumState      Json?
  simulatedState    Json?
  mergedState       Json     // MERGE result
  conflictDetected  Boolean  @default(false)
  conflictResolution Json?   // Conflict resolution using sovereign trust graph
  resolutionMethod  String?  // sovereign_trust_graph, dbis_arbitration
  status            String   @default("pending") // pending, merged, conflict, resolved
  syncedAt          DateTime?
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            MultiRealityLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([syncId])
  @@index([ledgerId])
  @@index([status])
  @@map("mrli_synchronizations")
}

// ============================================================================
// DBIS Volume IX: Advanced Sovereign Simulation Stack (ASSS)
// ============================================================================

model SovereignSimulation {
  id                String   @id @default(uuid())
  simulationId      String   @unique
  simulationName    String
  simulationType    String   // stress_test, policy_design, fx_band_calibration
  status            String   @default("running") // running, completed, failed, cancelled
  startedAt         DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layers            SimulationLayer[]
  outcomes          SimulationOutcome[]
  scenario          SimulationScenario?

  @@index([simulationId])
  @@index([simulationType])
  @@index([status])
  @@map("sovereign_simulations")
}

model SimulationLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  simulationId      String
  layerType         String   // macro, sovereign, micro, asset
  layerConfig       Json     // Layer configuration
  layerData         Json?    // Layer-specific data
  status            String   @default("active") // active, completed, error
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  simulation        SovereignSimulation @relation(fields: [simulationId], references: [id], onDelete: Cascade)

  @@index([layerId])
  @@index([simulationId])
  @@index([layerType])
  @@index([status])
  @@map("simulation_layers")
}

model SimulationOutcome {
  id                String   @id @default(uuid())
  outcomeId         String   @unique
  simulationId      String
  outcomeType       String   // fx_projection, cbdc_impact, ssu_interaction, commodity_cycle, behavior_impact, risk_assessment
  outcomeData       Json     // Model results: MODEL(FX, CBDC, SSU, commodity, behavior, risk)
  projection        Json?    // Projected outcomes
  accuracy          Decimal? @db.Decimal(32, 12) // Accuracy score if validated
  status            String   @default("pending") // pending, validated, archived
  calculatedAt     DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  simulation        SovereignSimulation @relation(fields: [simulationId], references: [id], onDelete: Cascade)

  @@index([outcomeId])
  @@index([simulationId])
  @@index([outcomeType])
  @@index([status])
  @@map("simulation_outcomes")
}

model SimulationScenario {
  id                String   @id @default(uuid())
  scenarioId        String   @unique
  simulationId      String   @unique
  scenarioName      String
  scenarioType      String   // liquidity_shock, fx_collapse, commodity_depletion, sovereign_default
  scenarioConfig    Json     // Scenario configuration
  stressLevel       String   // low, medium, high, extreme
  status            String   @default("active") // active, completed, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  simulation        SovereignSimulation @relation(fields: [simulationId], references: [id], onDelete: Cascade)

  @@index([scenarioId])
  @@index([simulationId])
  @@index([scenarioType])
  @@index([status])
  @@map("simulation_scenarios")
}

// ============================================================================
// DBIS Volume XII: Unified Multiverse Monetary Constitution, Temporal Currency Engines, Interplanetary FX, Infinite-State Reserves, and Omega-Layer Settlement Fabric
// ============================================================================

// ============================================================================
// Volume XII: Unified Multiverse Monetary Constitution (UMMC)
// ============================================================================

model UmmcConstitutionalPillar {
  id                String   @id @default(uuid())
  pillarId          String   @unique
  pillarNumber      Int      // 1, 2, 3, 4, 5
  pillarName        String   // Cross-Reality Sovereign Integrity, Temporal Alignment, Quantum Coherence, Holographic Equivalence, Parallel-State Reconciliation
  description       String   @db.Text
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  clauses           UmmcBindingClause[]
  mappings          UmmcSovereignMapping[]

  @@index([pillarId])
  @@index([pillarNumber])
  @@index([status])
  @@map("ummc_constitutional_pillars")
}

model UmmcBindingClause {
  id                String   @id @default(uuid())
  clauseId          String   @unique
  clauseCode        String   // XII-A, XII-F, XII-K
  clauseName        String
  description       String   @db.Text
  pillarId          String?
  bindingType       String   // multiversal_finality, anti_divergence, sovereign_identity_equivalence
  enforcementLevel  String   // strict, moderate, advisory
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pillar            UmmcConstitutionalPillar? @relation(fields: [pillarId], references: [id], onDelete: SetNull)
  validations       UmmcClauseValidation[]

  @@index([clauseId])
  @@index([clauseCode])
  @@index([pillarId])
  @@index([status])
  @@map("ummc_binding_clauses")
}

model UmmcClauseValidation {
  id                String   @id @default(uuid())
  validationId      String   @unique
  clauseId          String
  sovereignBankId   String?
  validationType    String   // compliance_check, divergence_measure, identity_verification
  validationResult  String   // compliant, non_compliant, pending
  validationData    Json?    // Validation details
  validatedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  clause            UmmcBindingClause @relation(fields: [clauseId], references: [id], onDelete: Cascade)

  @@index([validationId])
  @@index([clauseId])
  @@index([sovereignBankId])
  @@index([validationResult])
  @@map("ummc_clause_validations")
}

model UmmcSovereignMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  sovereignBankId   String
  realityLayer      String   // classical, distributed, quantum, holographic, parallel
  identityAnchor    String   // Cross-reality identity anchor
  ledgerAnchor      String?  // Ledger anchor reference
  settlementAnchor  String?  // Settlement anchor reference
  divergenceBand    Decimal? @db.Decimal(32, 12) // Maximum allowed divergence
  pillarId          String?
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  pillar            UmmcConstitutionalPillar? @relation(fields: [pillarId], references: [id], onDelete: SetNull)

  @@index([mappingId])
  @@index([sovereignBankId])
  @@index([realityLayer])
  @@index([status])
  @@map("ummc_sovereign_mappings")
}

// ============================================================================
// Volume XII: Synthetic Temporal Currency Engine (STCE)
// ============================================================================

model TemporalCurrencyUnit {
  id                String   @id @default(uuid())
  tcuId             String   @unique
  tcuCode           String   @unique // TCU code (e.g., TCU-EARTH, TCU-LUNA)
  tcuName           String
  description       String   @db.Text
  baseCurrency      String?  // Reference currency for TCU
  presentValue      Decimal  @db.Decimal(32, 12)
  primeTemporalBond Boolean  @default(true) // Bonded to Prime Ledger
  status            String   @default("active") // active, suspended, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  projections       TemporalProjection[]
  stabilityStates   TemporalStabilityState[]
  transactions      TemporalCurrencyTransaction[]

  @@index([tcuId])
  @@index([tcuCode])
  @@index([status])
  @@map("temporal_currency_units")
}

model TemporalProjection {
  id                String   @id @default(uuid())
  projectionId      String   @unique
  tcuId             String
  projectionType    String   // forward_indexed, retro_correction
  timeDelta         Decimal  @db.Decimal(32, 12) // Δt in temporal units
  projectedValue    Decimal  @db.Decimal(32, 12)
  economicData      Json?    // Economic projection data
  confidence        Decimal? @db.Decimal(32, 12) // Confidence score
  projectedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  tcu               TemporalCurrencyUnit @relation(fields: [tcuId], references: [id], onDelete: Cascade)

  @@index([projectionId])
  @@index([tcuId])
  @@index([projectionType])
  @@index([projectedAt])
  @@map("temporal_projections")
}

model TemporalStabilityState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  tcuId             String
  presentValue      Decimal  @db.Decimal(32, 12)
  futureWeight      Decimal  @db.Decimal(32, 12)
  retroFactor       Decimal  @db.Decimal(32, 12)
  ssuAnchor         Decimal? @db.Decimal(32, 12) // SSU anchor value
  calculatedValue   Decimal  @db.Decimal(32, 12) // TCU_value from stability equation
  stabilityScore    Decimal? @db.Decimal(32, 12) // Stability metric
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  tcu               TemporalCurrencyUnit @relation(fields: [tcuId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([tcuId])
  @@index([calculatedAt])
  @@map("temporal_stability_states")
}

model TemporalCurrencyTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  tcuId             String
  sovereignBankId   String
  transactionType   String   // issuance, redemption, transfer, exchange
  amount            Decimal  @db.Decimal(32, 12)
  valueAtTime       Decimal  @db.Decimal(32, 12) // Value at transaction time
  timestamp         DateTime @default(now())
  status            String   @default("pending") // pending, executed, settled, failed
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  tcu               TemporalCurrencyUnit @relation(fields: [tcuId], references: [id], onDelete: Cascade)
  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([tcuId])
  @@index([sovereignBankId])
  @@index([status])
  @@index([timestamp])
  @@map("temporal_currency_transactions")
}

// ============================================================================
// Volume XII: Autonomous Interplanetary FX Zone (AIFX)
// ============================================================================

model AifxCorridor {
  id                String   @id @default(uuid())
  corridorId        String   @unique
  corridorName      String   // Earth ↔ Luna, Earth ↔ Mars, Mars ↔ Luna, Interplanetary SSU
  originPlanet      String   // Earth, Luna, Mars
  destinationPlanet String   // Earth, Luna, Mars
  baseCurrency      String
  quoteCurrency     String
  lagAdjustment     Decimal  @db.Decimal(32, 12) // Latency adjustment factor
  gravityFactor     Decimal  @db.Decimal(32, 12) // Gravity-based adjustment
  radiationRiskSpread Decimal @db.Decimal(32, 12) // Volatility spread
  velocityNormalization Decimal @db.Decimal(32, 12) // Planetary velocity normalization
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  trades            AifxTrade[]
  pricingStates     AifxPricingState[]

  @@index([corridorId])
  @@index([originPlanet, destinationPlanet])
  @@index([status])
  @@map("aifx_corridors")
}

model AifxTrade {
  id                String   @id @default(uuid())
  tradeId           String   @unique
  corridorId        String
  sovereignBankId   String
  baseCurrency      String
  quoteCurrency     String
  amount            Decimal  @db.Decimal(32, 12)
  fxPrice           Decimal  @db.Decimal(32, 12)
  liquidityWeight   Decimal  @db.Decimal(32, 12)
  gravityFactor     Decimal  @db.Decimal(32, 12)
  latencyCost       Decimal  @db.Decimal(32, 12)
  timeDilationIndex Decimal  @db.Decimal(32, 12)
  ssuStability      Decimal? @db.Decimal(32, 12)
  settlementMode    String   // atomic, rtgs, delayed
  status            String   @default("pending") // pending, executed, settled, failed
  executedAt        DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  corridor          AifxCorridor @relation(fields: [corridorId], references: [id], onDelete: Cascade)
  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([tradeId])
  @@index([corridorId])
  @@index([sovereignBankId])
  @@index([status])
  @@index([executedAt])
  @@map("aifx_trades")
}

model AifxPricingState {
  id                String   @id @default(uuid())
  pricingId         String   @unique
  corridorId        String
  fxPrice           Decimal  @db.Decimal(32, 12)
  liquidityWeight   Decimal  @db.Decimal(32, 12)
  gravityFactor     Decimal  @db.Decimal(32, 12)
  latencyCost       Decimal  @db.Decimal(32, 12)
  timeDilationIndex Decimal  @db.Decimal(32, 12)
  ssuStability      Decimal? @db.Decimal(32, 12)
  pricingMethod     String   // nce, caso, hybrid
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  corridor          AifxCorridor @relation(fields: [corridorId], references: [id], onDelete: Cascade)

  @@index([pricingId])
  @@index([corridorId])
  @@index([calculatedAt])
  @@map("aifx_pricing_states")
}

model InterplanetarySsu {
  id                String   @id @default(uuid())
  issuId            String   @unique
  issuCode          String   @unique // iSSU code
  description       String   @db.Text
  basePlanet        String?  // Reference planet
  composition       Json?    // Asset composition
  conversionRate    Decimal? @db.Decimal(32, 12)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  transactions      InterplanetarySsuTransaction[]

  @@index([issuId])
  @@index([issuCode])
  @@index([status])
  @@map("interplanetary_ssus")
}

model InterplanetarySsuTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  issuId            String
  sovereignBankId   String
  amount            Decimal  @db.Decimal(32, 12)
  originPlanet      String
  destinationPlanet String
  settlementMode    String
  status            String   @default("pending")
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  issu              InterplanetarySsu @relation(fields: [issuId], references: [id], onDelete: Cascade)
  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([issuId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("interplanetary_ssu_transactions")
}

// ============================================================================
// Volume XII: Infinite-State Reserve Model (ISRM)
// ============================================================================

model InfiniteStateReserve {
  id                String   @id @default(uuid())
  reserveId         String   @unique
  reserveName       String
  classicalReserve  Decimal  @db.Decimal(32, 12)
  quantumReserve    Decimal? @db.Decimal(32, 12) // Quantum superposition reserve
  parallelReserve   Decimal? @db.Decimal(32, 12) // Parallel state reserve
  holographicReserve Decimal? @db.Decimal(32, 12) // Holographic projection reserve
  temporalReserve   Decimal? @db.Decimal(32, 12) // Temporal future reserve
  totalReserve      Decimal  @db.Decimal(32, 12) // Calculated total
  variance          Decimal? @db.Decimal(32, 12) // Cross-state variance
  entropy           Decimal? @db.Decimal(32, 12) // Quantum entropy
  status            String   @default("active")
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  quantumStates     QuantumReserveState[]
  parallelBranches  ParallelReserveBranch[]
  temporalFutures   TemporalReserveFuture[]

  @@index([reserveId])
  @@index([status])
  @@index([calculatedAt])
  @@map("infinite_state_reserves")
}

model QuantumReserveState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  reserveId         String
  quantumState      Json     // Quantum state representation
  probabilityAmplitude Decimal @db.Decimal(32, 12)
  entanglementHash  String?  // Entanglement reference
  coherence         Decimal? @db.Decimal(32, 12) // Quantum coherence measure
  measuredAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserve           InfiniteStateReserve @relation(fields: [reserveId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([reserveId])
  @@index([measuredAt])
  @@map("quantum_reserve_states")
}

model ParallelReserveBranch {
  id                String   @id @default(uuid())
  branchId          String   @unique
  reserveId         String
  branchName        String
  branchState       String   // parallel_outcome_1, parallel_outcome_2, etc.
  reserveAmount     Decimal  @db.Decimal(32, 12)
  probability       Decimal? @db.Decimal(32, 12) // Branch probability
  divergence        Decimal? @db.Decimal(32, 12) // Divergence from prime
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserve           InfiniteStateReserve @relation(fields: [reserveId], references: [id], onDelete: Cascade)

  @@index([branchId])
  @@index([reserveId])
  @@index([branchState])
  @@index([status])
  @@map("parallel_reserve_branches")
}

model TemporalReserveFuture {
  id                String   @id @default(uuid())
  futureId          String   @unique
  reserveId         String
  futureTime        DateTime // Projected future time
  projectedReserve  Decimal  @db.Decimal(32, 12)
  confidence        Decimal? @db.Decimal(32, 12)
  scenario          String?  // Future scenario identifier
  projectedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserve           InfiniteStateReserve @relation(fields: [reserveId], references: [id], onDelete: Cascade)

  @@index([futureId])
  @@index([reserveId])
  @@index([futureTime])
  @@map("temporal_reserve_futures")
}

// ============================================================================
// Volume XII: Omega-Layer Settlement Fabric (Ω-LSF)
// ============================================================================

model OmegaLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  layerNumber       Int      // 0, 1, 2, 3, 4
  layerName         String   // Ω0: Prime Ledger, Ω1: Quantum Ledger, Ω2: Holographic Simulation, Ω3: Parallel-State Ledger, Ω4: Temporal Ledger
  description       String   @db.Text
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  states            OmegaState[]
  reconciliations   OmegaReconciliation[]

  @@index([layerId])
  @@index([layerNumber])
  @@index([status])
  @@map("omega_layers")
}

model OmegaState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  layerId           String
  stateHash         String   // State hash/identifier
  stateData         Json     // Layer-specific state data
  primeState        Json?    // Ω0 prime state reference
  quantumState      Json?    // Ω1 quantum state
  holographicState  Json?    // Ω2 holographic state
  parallelState     Json?    // Ω3 parallel state
  temporalState     Json?    // Ω4 temporal state
  mergedState       Json?    // MERGE result
  consistencyStatus String   @default("pending") // pending, consistent, inconsistent, corrected
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layer             OmegaLayer @relation(fields: [layerId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([layerId])
  @@index([consistencyStatus])
  @@index([timestamp])
  @@map("omega_states")
}

model OmegaReconciliation {
  id                String   @id @default(uuid())
  reconciliationId  String   @unique
  layerId           String?
  reconciliationType String   // dimensional, cross_reality, temporal, quantum_temporal
  primeState        Json?
  quantumState      Json?
  holographicState  Json?
  parallelState     Json?
  temporalState     Json?
  mergedState       Json     // MERGE result
  inconsistencyDetected Boolean @default(false)
  correctionMethod  String?  // quantum_temporal_correction, realign_all_states
  correctionApplied Json?    // Correction details
  status            String   @default("pending") // pending, reconciled, inconsistent, corrected
  reconciledAt      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layer             OmegaLayer? @relation(fields: [layerId], references: [id], onDelete: SetNull)
  consistencyEvents OmegaConsistencyEvent[]

  @@index([reconciliationId])
  @@index([layerId])
  @@index([status])
  @@index([reconciledAt])
  @@map("omega_reconciliations")
}

model OmegaConsistencyEvent {
  id                String   @id @default(uuid())
  eventId           String   @unique
  reconciliationId  String
  eventType         String   // inconsistency_detected, correction_executed, realignment_complete
  eventData         Json?    // Event details
  consistencyBefore String?  // Consistency status before event
  consistencyAfter  String?  // Consistency status after event
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reconciliation    OmegaReconciliation @relation(fields: [reconciliationId], references: [id], onDelete: Cascade)

  @@index([eventId])
  @@index([reconciliationId])
  @@index([eventType])
  @@index([timestamp])
  @@map("omega_consistency_events")
}

// ============================================================================
// Volume XII: Sovereign Multiverse Continuity Protocols (SMCP)
// ============================================================================

model SovereignContinuityIdentity {
  id                String   @id @default(uuid())
  continuityId      String   @unique
  sovereignBankId   String
  unifiedIdentity   String   // Unified SCB identity across all realities
  classicalIdentity String?  // Classical reality identity
  quantumIdentity   String?  // Quantum realm identity
  holographicIdentity String? // Holographic/simulated identity
  parallelIdentity  Json?    // Parallel state identities (array)
  temporalIdentity  String?  // Temporal identity anchor
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  stateMappings     MultiverseStateMapping[]

  @@index([continuityId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("sovereign_continuity_identities")
}

model MultiverseStateMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  continuityId      String
  realityType       String   // classical, quantum, holographic, parallel, temporal
  stateIdentifier   String   // State identifier in that reality
  stateData         Json?    // State-specific data
  divergence        Decimal? @db.Decimal(32, 12) // Divergence from unified identity
  lastSynced        DateTime?
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  continuity        SovereignContinuityIdentity @relation(fields: [continuityId], references: [id], onDelete: Cascade)

  @@index([mappingId])
  @@index([continuityId])
  @@index([realityType])
  @@index([status])
  @@map("multiverse_state_mappings")
}

// Add relations to existing SovereignBank model
// These will be added via separate search_replace operations

// ============================================================================
// DBIS Volume XI: Supra-Constitutional DBIS Charter (SCDC)
// ============================================================================

model SupraConstitutionalCharter {
  id                String   @id @default(uuid())
  charterId         String   @unique
  version           String   // Version of the charter
  effectiveDate     DateTime @default(now())
  status            String   @default("active") // active, superseded, archived
  metaSovereignPrimacy Boolean @default(true)
  dimensionalConsistency Boolean @default(true)
  temporalNonContradiction Boolean @default(true)
  economicCausality  Boolean @default(true)
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  articles          CharterArticle[]
  integrityChecks   TemporalIntegrityCheck[]
  aiActions         AIAutonomousAction[]

  @@index([charterId])
  @@index([version])
  @@index([status])
  @@map("supra_constitutional_charter")
}

model CharterArticle {
  id                String   @id @default(uuid())
  articleId         String   @unique
  charterId         String
  articleNumber     Int      // Article 1, 9, 14, 22, etc.
  title             String
  content           String   @db.Text
  principleType     String?  // settlement_supremacy, temporal_integrity, multiversal_recognition, ai_mandate
  enforcementLevel  String   @default("mandatory") // mandatory, advisory, optional
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  charter           SupraConstitutionalCharter @relation(fields: [charterId], references: [id], onDelete: Cascade)

  @@index([articleId])
  @@index([charterId])
  @@index([articleNumber])
  @@index([principleType])
  @@map("charter_articles")
}

model TemporalIntegrityCheck {
  id                String   @id @default(uuid())
  checkId           String   @unique
  charterId         String
  transactionId     String?  // Related transaction if applicable
  checkType         String   // causality, non_contradiction, timeline_integrity
  checkResult       String   // passed, failed, warning
  checkDetails      Json?    // Detailed check results
  contradictionDetected Boolean @default(false)
  resolved          Boolean  @default(false)
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  charter           SupraConstitutionalCharter @relation(fields: [charterId], references: [id], onDelete: Cascade)

  @@index([checkId])
  @@index([charterId])
  @@index([transactionId])
  @@index([checkType])
  @@index([checkResult])
  @@map("temporal_integrity_checks")
}

model AIAutonomousAction {
  id                String   @id @default(uuid())
  actionId          String   @unique
  charterId         String
  aiSystem          String   // NCE, ARI, SARE
  actionType        String   // stability_enforcement, risk_mitigation, settlement_correction
  actionDetails     Json     // Action parameters and results
  authorizationLevel String  // autonomous, supervised, manual
  status            String   @default("pending") // pending, executing, completed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  charter           SupraConstitutionalCharter @relation(fields: [charterId], references: [id], onDelete: Cascade)

  @@index([actionId])
  @@index([charterId])
  @@index([aiSystem])
  @@index([actionType])
  @@index([status])
  @@map("ai_autonomous_actions")
}

// ============================================================================
// DBIS Volume XI: Global Multiversal Monetary Theory (GMMT)
// ============================================================================

model RealityLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  layerName         String
  layerType         String   // classical, quantum, simulated, holographic, parallel
  authenticationStatus String @default("pending") // pending, authenticated, rejected
  coherenceLevel    Decimal  @db.Decimal(32, 12) // Consistency with Prime Ledger
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  monetaryUnits     MultiversalMonetaryUnit[]
  conversions       MonetaryUnitConversion[]
  valuations        ValuationCalculation[]

  @@index([layerId])
  @@index([layerType])
  @@index([authenticationStatus])
  @@map("reality_layers")
}

model MultiversalMonetaryUnit {
  id                String   @id @default(uuid())
  unitId            String   @unique
  layerId           String
  unitType          String   // PMU, QMU, HMU, PSU
  unitName          String
  anchorValue       Decimal? @db.Decimal(32, 12) // Anchor to Prime Monetary Unit
  derivationFormula Json?    // How unit is derived (SSU + temporal stability functions)
  quantumState      Json?    // For QMU: quantum resonance states
  holographicEncoding Json?  // For HMU: holographic projection data
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layer             RealityLayer @relation(fields: [layerId], references: [id], onDelete: Cascade)
  conversions       MonetaryUnitConversion[] @relation("SourceUnit")
  targetConversions MonetaryUnitConversion[] @relation("TargetUnit")
  valuations        ValuationCalculation[]

  @@index([unitId])
  @@index([layerId])
  @@index([unitType])
  @@map("multiversal_monetary_units")
}

model MonetaryUnitConversion {
  id                String   @id @default(uuid())
  conversionId      String   @unique
  sourceUnitId      String
  targetUnitId      String
  conversionRate    Decimal  @db.Decimal(32, 12)
  conversionFormula Json?    // Conversion calculation details
  confidenceLevel   Decimal  @db.Decimal(32, 12) // 0-1 confidence in conversion
  status            String   @default("active")
  validFrom         DateTime @default(now())
  validTo           DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sourceUnit        MultiversalMonetaryUnit @relation("SourceUnit", fields: [sourceUnitId], references: [id], onDelete: Cascade)
  targetUnit        MultiversalMonetaryUnit @relation("TargetUnit", fields: [targetUnitId], references: [id], onDelete: Cascade)

  @@index([conversionId])
  @@index([sourceUnitId])
  @@index([targetUnitId])
  @@index([status])
  realityLayer              RealityLayer[]
  @@map("monetary_unit_conversions")
}

model ValuationCalculation {
  id                String   @id @default(uuid())
  valuationId       String   @unique
  layerId           String
  unitId            String
  assetId           String?  // Asset being valued
  classicalValue   Decimal  @db.Decimal(32, 12)
  quantumExpectedValue Decimal? @db.Decimal(32, 12)
  holographicProjection Decimal? @db.Decimal(32, 12)
  parallelArbitrageAdjustment Decimal? @db.Decimal(32, 12)
  totalValue        Decimal  @db.Decimal(32, 12) // Sum of all components
  calculationFormula Json    // Full formula breakdown
  status            String   @default("active")
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layer             RealityLayer @relation(fields: [layerId], references: [id], onDelete: Cascade)
  unit              MultiversalMonetaryUnit @relation(fields: [unitId], references: [id], onDelete: Cascade)

  @@index([valuationId])
  @@index([layerId])
  @@index([unitId])
  @@index([assetId])
  @@map("valuation_calculations")
}

// ============================================================================
// DBIS Volume XI: Temporal Liquidity Portals (TLP)
// ============================================================================

model TemporalLiquidityPortal {
  id                String   @id @default(uuid())
  portalId          String   @unique
  portalName        String
  targetTimeDelta   Int      // Δ in seconds (future time window)
  confidenceLevel   Decimal  @db.Decimal(32, 12) // 0-1 confidence
  maxLiquidityBorrow Decimal @db.Decimal(32, 8) // Maximum liquidity that can be borrowed
  status            String   @default("active") // active, suspended, closed
  activatedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserves          FutureLiquidityReserve[]
  paradoxDetections ParadoxDetection[]
  buffers           TemporalBuffer[]

  @@index([portalId])
  @@index([status])
  @@map("temporal_liquidity_portals")
}

model FutureLiquidityReserve {
  id                String   @id @default(uuid())
  reserveId         String   @unique
  portalId          String
  predictedTime     DateTime // t+Δ
  predictedReserves Decimal  @db.Decimal(32, 8)
  confidenceLevel   Decimal  @db.Decimal(32, 12)
  availableLiquidity Decimal @db.Decimal(32, 8) // predicted_reserves * confidence_level
  borrowedAmount    Decimal  @default(0) @db.Decimal(32, 8)
  status            String   @default("available") // available, borrowed, exhausted, expired
  expiresAt         DateTime
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  portal            TemporalLiquidityPortal @relation(fields: [portalId], references: [id], onDelete: Cascade)

  @@index([reserveId])
  @@index([portalId])
  @@index([predictedTime])
  @@index([status])
  @@map("future_liquidity_reserves")
}

model ParadoxDetection {
  id                String   @id @default(uuid())
  detectionId       String   @unique
  portalId          String
  transactionId     String?  // Related transaction
  paradoxType       String   // causality_violation, timeline_contradiction, economic_paradox
  severity          String   // low, medium, high, critical
  detectedAt        DateTime @default(now())
  resolved          Boolean  @default(false)
  resolutionMethod  String?  // rollback, adjustment, rejection
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  portal            TemporalLiquidityPortal @relation(fields: [portalId], references: [id], onDelete: Cascade)

  @@index([detectionId])
  @@index([portalId])
  @@index([transactionId])
  @@index([paradoxType])
  @@index([resolved])
  @@map("paradox_detections")
}

model TemporalBuffer {
  id                String   @id @default(uuid())
  bufferId          String   @unique
  portalId          String
  bufferType        String   // interplanetary_settlement, csse, ai_policy_correction
  bufferAmount      Decimal  @db.Decimal(32, 8)
  allocatedAmount   Decimal  @default(0) @db.Decimal(32, 8)
  status            String   @default("active") // active, allocated, exhausted
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  portal            TemporalLiquidityPortal @relation(fields: [portalId], references: [id], onDelete: Cascade)

  @@index([bufferId])
  @@index([portalId])
  @@index([bufferType])
  @@map("temporal_buffers")
}

// ============================================================================
// DBIS Volume XI: Unified Holographic Economic Model (UHEM)
// ============================================================================

model HolographicEconomicState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  stateHash         String   @unique // Hash of encoded state
  cbdcFlow          Json     // CBDC flow data
  fxMatrix          Json     // FX matrix data
  ssuPressure       Json     // SSU pressure indicators
  stabilityFields   Json     // Stability field data
  encodedState      Json     // Full ENCODE result
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  projections       EconomicProjection[]
  corrections       DeviationCorrection[]
  mappings          HolographicMapping[]

  @@index([stateId])
  @@index([stateHash])
  @@index([timestamp])
  @@map("holographic_economic_states")
}

model EconomicProjection {
  id                String   @id @default(uuid())
  projectionId      String   @unique
  stateId           String
  targetReality     String   // Target reality layer for projection
  projectionData     Json     // Projected economic flows
  projectionMethod   String   // forward_projection, reverse_projection, cross_reality
  accuracy          Decimal? @db.Decimal(32, 12) // Projection accuracy if validated
  status            String   @default("active") // active, validated, archived
  projectedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  state             HolographicEconomicState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([projectionId])
  @@index([stateId])
  @@index([targetReality])
  @@index([status])
  @@map("economic_projections")
}

model DeviationCorrection {
  id                String   @id @default(uuid())
  correctionId      String   @unique
  stateId           String
  deviationType     String   // non_physical, inconsistency, divergence
  deviationMagnitude Decimal  @db.Decimal(32, 12)
  correctionApplied Json     // Correction details
  correctionMethod  String   // reverse_projection, prime_ledger_alignment
  status            String   @default("pending") // pending, applied, verified
  correctedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  state             HolographicEconomicState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([correctionId])
  @@index([stateId])
  @@index([deviationType])
  @@index([status])
  @@map("deviation_corrections")
}

model HolographicMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  stateId           String
  sourceReality     String   // Source reality layer
  targetReality     String   // Target reality layer
  mappingData       Json     // Mapping transformation data
  mappingType       String   // economic_flow, behavioral_dynamics, predictive_analytics
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  state             HolographicEconomicState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([mappingId])
  @@index([stateId])
  @@index([sourceReality])
  @@index([targetReality])
  @@map("holographic_mappings")
}

// ============================================================================
// DBIS Volume XI: Omni-Sovereign Settlement Matrix (OSSM)
// ============================================================================

model OmniSovereignMatrix {
  id                String   @id @default(uuid())
  matrixId          String   @unique
  matrixName        String
  status            String   @default("active") // active, suspended, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  dimensions        MatrixDimension[]
  coordinates       SettlementCoordinate[]
  layerStates       RealityLayerState[]

  @@index([matrixId])
  @@index([status])
  @@map("omni_sovereign_matrices")
}

model MatrixDimension {
  id                String   @id @default(uuid())
  dimensionId       String   @unique
  matrixId          String
  dimensionType     String   // X_sovereign, Y_asset, Z_temporal, Omega_reality
  dimensionName      String
  dimensionData     Json     // Dimension-specific data (SCBs, assets, timeframes, realities)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  matrix            OmniSovereignMatrix @relation(fields: [matrixId], references: [id], onDelete: Cascade)

  @@index([dimensionId])
  @@index([matrixId])
  @@index([dimensionType])
  @@map("matrix_dimensions")
}

model SettlementCoordinate {
  id                String   @id @default(uuid())
  coordinateId      String   @unique
  matrixId          String
  sovereignIndex    Int      // X dimension
  assetIndex        Int      // Y dimension
  temporalIndex     Int      // Z dimension
  realityIndex      Int      // Ω dimension
  settlementState   Json     // State at this coordinate
  settlementStatus  String   @default("pending") // pending, synchronized, conflicted
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  matrix            OmniSovereignMatrix @relation(fields: [matrixId], references: [id], onDelete: Cascade)

  @@index([coordinateId])
  @@index([matrixId])
  @@index([sovereignIndex, assetIndex, temporalIndex, realityIndex])
  @@index([settlementStatus])
  @@map("settlement_coordinates")
}

model RealityLayerState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  matrixId          String
  realityLayer      String   // classical, quantum, simulated, parallel
  layerState        Json     // MERGE result for this reality
  syncStatus        String   @default("pending") // pending, synced, conflicted
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  matrix            OmniSovereignMatrix @relation(fields: [matrixId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([matrixId])
  @@index([realityLayer])
  @@index([syncStatus])
  @@map("reality_layer_states")
}

// ============================================================================
// DBIS Volume XI: Multiverse-Consistent FX/SSU Stability Framework
// ============================================================================

model MultiverseStabilityIndex {
  id                String   @id @default(uuid())
  indexId           String   @unique
  realityLayer      String   // Which reality layer this index applies to
  fxStability       Decimal  @db.Decimal(32, 12)
  ssuInertia        Decimal  @db.Decimal(32, 12)
  temporalSmoothing Decimal  @db.Decimal(32, 12)
  crossRealityDivergence Decimal @db.Decimal(32, 12)
  totalStability    Decimal  @db.Decimal(32, 12) // Calculated stability score
  status            String   @default("active")
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  calculations      StabilityCalculation[]
  divergences       RealityDivergence[]

  @@index([indexId])
  @@index([realityLayer])
  @@index([calculatedAt])
  @@map("multiverse_stability_indices")
}

model RealityDivergence {
  id                String   @id @default(uuid())
  divergenceId      String   @unique
  indexId           String
  sourceReality     String
  targetReality     String
  divergenceType    String   // fx_divergence, ssu_divergence, stability_divergence
  divergenceMagnitude Decimal @db.Decimal(32, 12)
  threshold         Decimal  @db.Decimal(32, 12) // Alert threshold
  alertLevel        String   // info, warning, critical
  status            String   @default("detected") // detected, resolved, ignored
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  index             MultiverseStabilityIndex @relation(fields: [indexId], references: [id], onDelete: Cascade)

  @@index([divergenceId])
  @@index([indexId])
  @@index([sourceReality, targetReality])
  @@index([alertLevel])
  convergence               RealityConvergence[]
  @@map("reality_divergences")
}

model StabilityCalculation {
  id                String   @id @default(uuid())
  calculationId     String   @unique
  indexId           String
  calculationType   String   // fx_stability, ssu_inertia, temporal_smoothing, divergence
  inputData         Json     // Input parameters
  calculationResult Decimal  @db.Decimal(32, 12)
  calculationFormula Json     // Formula used
  status            String   @default("active")
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  index             MultiverseStabilityIndex @relation(fields: [indexId], references: [id], onDelete: Cascade)

  @@index([calculationId])
  @@index([indexId])
  @@index([calculationType])
  @@map("stability_calculations")
}

// ============================================================================
// DBIS Volume XI: Quantum-Temporal Arbitration Engine (QTAE)
// ============================================================================

model QuantumTemporalArbitration {
  id                String   @id @default(uuid())
  arbitrationId     String   @unique
  arbitrationType   String   // cross_chain, temporal, parallel, quantum
  status            String   @default("pending") // pending, analyzing, resolved, failed
  initiatedAt       DateTime @default(now())
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contradictions    ContradictionEvent[]
  rollbacks         ConsistencyRollback[]
  decisions         ArbitrationDecision[]

  @@index([arbitrationId])
  @@index([arbitrationType])
  @@index([status])
  @@map("quantum_temporal_arbitrations")
}

model ContradictionEvent {
  id                String   @id @default(uuid())
  eventId           String   @unique
  arbitrationId     String
  contradictionType String   // cross_chain_state, temporal_inconsistency, parallel_ledger_conflict, quantum_deviation
  severity          String   // low, medium, high, critical
  detectedAt        DateTime @default(now())
  eventData         Json     // Contradiction details
  resolved          Boolean  @default(false)
  resolutionMethod  String?  // rollback, adjustment, rejection
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  arbitration       QuantumTemporalArbitration @relation(fields: [arbitrationId], references: [id], onDelete: Cascade)

  @@index([eventId])
  @@index([arbitrationId])
  @@index([contradictionType])
  @@index([resolved])
  @@map("contradiction_events")
}

model ConsistencyRollback {
  id                String   @id @default(uuid())
  rollbackId        String   @unique
  arbitrationId     String
  targetState       Json     // State to rollback to
  rollbackReason    String
  rollbackScope     Json     // What is being rolled back
  status            String   @default("pending") // pending, executing, completed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  arbitration       QuantumTemporalArbitration @relation(fields: [arbitrationId], references: [id], onDelete: Cascade)

  @@index([rollbackId])
  @@index([arbitrationId])
  @@index([status])
  @@map("consistency_rollbacks")
}

model ArbitrationDecision {
  id                String   @id @default(uuid())
  decisionId        String   @unique
  arbitrationId     String
  decisionType      String   // rollback, affirm_finality, partial_resolution
  decisionDetails   Json     // Decision rationale and actions
  finality          Boolean  @default(false) // Whether decision is final
  msaNotified       Boolean  @default(false) // Whether MSA has been notified
  msaNotificationAt DateTime?
  status            String   @default("pending") // pending, executed, confirmed
  decidedAt         DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  arbitration       QuantumTemporalArbitration @relation(fields: [arbitrationId], references: [id], onDelete: Cascade)

  @@index([decisionId])
  @@index([arbitrationId])
  @@index([decisionType])
  @@index([finality])
  @@map("arbitration_decisions")
}

// ============================================================================
// DBIS Volume X: Meta-Sovereign Governance Framework (MSGF)
// ============================================================================

model MetaSovereignCouncil {
  id                String   @id @default(uuid())
  councilId         String   @unique
  councilType       String   // MSA, UMC, AESU
  name              String
  description       String   @db.Text
  authorityLevel    String   // Tier 0 - Meta-Sovereign
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  members           MetaSovereignCouncilMember[]
  policies          MetaSovereignPolicy[]
  decisions         MetaSovereignDecision[]

  @@index([councilId])
  @@index([councilType])
  @@index([status])
  @@map("meta_sovereign_councils")
}

model MetaSovereignCouncilMember {
  id                String   @default(uuid()) @id
  councilId         String
  sovereignBankId   String?
  memberName        String
  memberRole        String
  votingWeight      Decimal? @db.Decimal(32, 8)
  status            String   @default("active")
  appointedAt       DateTime @default(now())
  termEndDate       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  council            MetaSovereignCouncil @relation(fields: [councilId], references: [id], onDelete: Cascade)
  sovereignBank      SovereignBank? @relation(fields: [sovereignBankId], references: [id], onDelete: SetNull)

  @@index([councilId])
  @@index([sovereignBankId])
  @@map("meta_sovereign_council_members")
}

model GovernanceTier {
  id                String   @id @default(uuid())
  tierId            String   @unique
  tierNumber        Int      // 0, 1, 2, 3
  tierName          String   // Tier 0 - Meta-Sovereign, Tier 1 - Sovereign, etc.
  description       String   @db.Text
  authorityScope    Json     // Authority definitions
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt


  @@index([tierId])
  @@index([tierNumber])
  @@index([status])
  toDelegations           TierDelegation[] @relation("ToTier")
  fromDelegations           TierDelegation[] @relation("FromTier")
  @@map("governance_tiers")
}

model TierDelegation {
  id                String   @id @default(uuid())
  delegationId      String   @unique
  fromTierId        String
  toTierId          String
  delegationType    String   // cross_border_settlement, cbdc_compliance, fx_alignment
  authorityScope    Json
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  fromTier          GovernanceTier @relation("FromTier", fields: [fromTierId], references: [id], onDelete: Cascade)
  toTier            GovernanceTier @relation("ToTier", fields: [toTierId], references: [id], onDelete: Cascade)

  @@index([delegationId])
  @@index([fromTierId])
  @@index([toTierId])
  @@index([status])
  @@map("tier_delegations")
}

model MetaSovereignPolicy {
  id                String   @id @default(uuid())
  policyId          String   @unique
  councilId         String
  policyType        String   // fx_governance, cbdc_interoperability, ssu_composition, global_liquidity
  policyTitle       String
  policyContent     Json     // Policy details
  enforcementLevel  String   // advisory, mandatory, critical
  status            String   @default("draft") // draft, active, suspended, revoked
  effectiveDate     DateTime?
  revokedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  council           MetaSovereignCouncil @relation(fields: [councilId], references: [id], onDelete: Cascade)
  enforcements     PolicyEnforcement[]

  @@index([policyId])
  @@index([councilId])
  @@index([policyType])
  @@index([status])
  @@map("meta_sovereign_policies")
}

model PolicyEnforcement {
  id                String   @id @default(uuid())
  enforcementId     String   @unique
  policyId          String
  enforcementType   String   // privilege_suspension, liquidity_compression, liquidity_expansion, ssu_recalibration, fx_band_reset
  targetSovereignBankId String?
  enforcementData   Json
  status            String   @default("pending") // pending, active, completed, cancelled
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  policy            MetaSovereignPolicy @relation(fields: [policyId], references: [id], onDelete: Cascade)

  @@index([enforcementId])
  @@index([policyId])
  @@index([targetSovereignBankId])
  @@index([status])
  @@map("policy_enforcements")
}

model SovereignPrivilege {
  id                String   @id @default(uuid())
  privilegeId       String   @unique
  sovereignBankId   String
  privilegeType     String   // settlement_access, cbdc_issuance, fx_trading, liquidity_access
  status            String   @default("active") // active, suspended, revoked
  suspensionReason  String?  @db.Text
  suspendedAt       DateTime?
  restoredAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([privilegeId])
  @@index([sovereignBankId])
  @@index([privilegeType])
  @@index([status])
  @@map("sovereign_privileges")
}

model MetaSovereignDecision {
  id                String   @id @default(uuid())
  decisionId        String   @unique
  councilId         String
  decisionType      String   // policy_approval, enforcement_order, dispute_resolution
  decisionContent   Json
  status            String   @default("pending") // pending, approved, rejected, executed
  approvedAt        DateTime?
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  council           MetaSovereignCouncil @relation(fields: [councilId], references: [id], onDelete: Cascade)

  @@index([decisionId])
  @@index([councilId])
  @@index([status])
  @@map("meta_sovereign_decisions")
}

// ============================================================================
// DBIS Volume X: Universal Monetary Alignment Protocol (UMAP)
// ============================================================================

model UniversalMonetaryBaseline {
  id                String   @id @default(uuid())
  umbId             String   @unique
  baselineName      String
  description       String   @db.Text
  valuationStandard Json     // Neutral valuation standards
  assetTypes        Json     // fiat, cbdc, commodity, ssu, synthetic_planetary
  status            String   @default("active") // active, deprecated, draft
  effectiveDate     DateTime @default(now())
  deprecatedAt      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  parityCalculations GlobalParityEngine[]

  @@index([umbId])
  @@index([status])
  @@map("universal_monetary_baselines")
}

model GlobalParityEngine {
  id                String   @id @default(uuid())
  parityId          String   @unique
  umbId             String?
  currencyCode      String
  assetType         String   // fiat, cbdc, commodity, ssu
  fxWeight          Decimal  @db.Decimal(32, 12)
  commodityWeight   Decimal  @db.Decimal(32, 12)
  ssuStability      Decimal  @db.Decimal(32, 12)
  riskPremium       Decimal  @db.Decimal(32, 12)
  calculatedParity  Decimal  @db.Decimal(32, 12) // parity = fx_weight + commodity_weight + ssu_stability + risk_premium
  status            String   @default("active")
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  umb               UniversalMonetaryBaseline? @relation(fields: [umbId], references: [id], onDelete: SetNull)
  contracts         AlignmentContract[]

  @@index([parityId])
  @@index([currencyCode])
  @@index([assetType])
  @@index([status])
  @@map("global_parity_engines")
}

model AlignmentContract {
  id                String   @id @default(uuid())
  contractId         String   @unique
  parityId           String
  contractType       String   // re_alignment_target, fx_corridor_limit, ssu_stabilization
  contractRules      Json     // Smart contract rules
  targetValue        Decimal? @db.Decimal(32, 12)
  threshold          Decimal? @db.Decimal(32, 12)
  status            String   @default("active") // active, triggered, expired
  triggeredAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  parity            GlobalParityEngine @relation(fields: [parityId], references: [id], onDelete: Cascade)

  @@index([contractId])
  @@index([parityId])
  @@index([contractType])
  @@index([status])
  @@map("alignment_contracts")
}

model MonetaryDriftCorrection {
  id                String   @id @default(uuid())
  correctionId      String   @unique
  currencyCode      String
  assetType         String
  driftAmount       Decimal  @db.Decimal(32, 12)
  driftType         String   // market_drift, fx_drift, commodity_shock
  correctionMethod  String   // cbdc_rebalancing, ssu_pressure_absorption, fx_cost_correction
  correctionAmount  Decimal  @db.Decimal(32, 12)
  status            String   @default("pending") // pending, applied, failed
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([correctionId])
  @@index([currencyCode])
  @@index([assetType])
  @@index([status])
  @@map("monetary_drift_corrections")
}

// ============================================================================
// DBIS Volume X: Neural Consensus Engine (NCE)
// ============================================================================

model NeuralConsensusState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  ledgerStateHash   String
  neuralVote        Decimal  @db.Decimal(32, 12) // Confidence percentage (0-100)
  scbSignals        Json     // SCB signal data
  aiForecasts       Json     // AI forecast data
  quantumSignatures Json     // Quantum signature data
  consensusResult   String   // approved, rejected, pending
  confidenceThreshold Decimal @default(97) @db.Decimal(32, 12) // Default 97%
  status            String   @default("pending") // pending, confirmed, rejected
  confirmedAt      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  layers            NeuralLayer[]
  signatures        NeuralQuantumSignature[]

  @@index([stateId])
  @@index([ledgerStateHash])
  @@index([consensusResult])
  @@index([status])
  @@map("neural_consensus_states")
}

model NeuralLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  stateId           String
  layerType         String   // input, consensus, decision
  layerData         Json     // Layer processing data
  output            Json?    // Layer output
  status            String   @default("active")
  processedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  state             NeuralConsensusState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([layerId])
  @@index([stateId])
  @@index([layerType])
  @@map("neural_layers")
}

model NeuralQuantumSignature {
  id                String   @id @default(uuid())
  signatureId       String   @unique
  stateId           String
  quantumKeyId      String
  signature         String
  signatureType     String   // pq_dilithium, pq_kyber, xmss, sphincs_plus
  thresholdMet      Boolean  @default(false)
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  state             NeuralConsensusState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([signatureId])
  @@index([stateId])
  @@index([quantumKeyId])
  @@index([thresholdMet])
  @@map("neural_quantum_signatures")
}

// ============================================================================
// DBIS Volume X: Fully Autonomous CBDC Economies (FACE)
// ============================================================================

model FaceEconomy {
  id                String   @id @default(uuid())
  economyId         String   @unique
  sovereignBankId   String
  economyName       String
  description       String   @db.Text
  economyType       String   // retail, wholesale, hybrid
  status            String   @default("active") // active, suspended, archived
  activatedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  behavioralEngine  FaceBehavioralEngine?
  supplyContracts   FaceSupplyContract[]
  stabilizationContracts FaceStabilizationContract[]
  incentives        FaceIncentive[]

  @@index([economyId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("face_economies")
}

model FaceBehavioralEngine {
  id                String   @id @default(uuid())
  engineId          String   @unique
  economyId         String   @unique
  engineConfig      Json     // AI behavioral configuration
  behaviorModel     String   // Model type/version
  status            String   @default("active")
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  economy           FaceEconomy @relation(fields: [economyId], references: [id], onDelete: Cascade)

  @@index([engineId])
  @@index([economyId])
  @@map("face_behavioral_engines")
}

model FaceSupplyContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  economyId         String
  contractType      String   // automatic_supply_adjustment
  velocityTarget    Decimal  @db.Decimal(32, 12)
  velocityDangerThreshold Decimal @db.Decimal(32, 12)
  mintCondition     Json     // if velocity < target: mint_cbdc()
  burnCondition     Json     // elif velocity > danger_threshold: burn_cbdc()
  status            String   @default("active") // active, triggered, suspended
  lastTriggeredAt   DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  economy           FaceEconomy @relation(fields: [economyId], references: [id], onDelete: Cascade)

  @@index([contractId])
  @@index([economyId])
  @@index([status])
  @@map("face_supply_contracts")
}

model FaceStabilizationContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  economyId         String
  contractType      String   // auto_stabilization
  sriThreshold      Decimal  @db.Decimal(32, 12)
  rateAdjustmentRule Json    // if SRI_risk > threshold: impose_rate_adjustment()
  adjustmentType    String   // interest_rate, liquidity_rate, fee_adjustment
  status            String   @default("active") // active, triggered, suspended
  lastTriggeredAt   DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  economy           FaceEconomy @relation(fields: [economyId], references: [id], onDelete: Cascade)

  @@index([contractId])
  @@index([economyId])
  @@index([status])
  @@map("face_stabilization_contracts")
}

model FaceIncentive {
  id                String   @id @default(uuid())
  incentiveId       String   @unique
  economyId         String
  incentiveType     String   // reward, penalty, predictive_nudge
  targetBehavior     String   // stabilizing_flow, velocity_control, risk_reduction
  incentiveAmount    Decimal  @db.Decimal(32, 12)
  conditions        Json     // Conditions for incentive application
  status            String   @default("active") // active, applied, expired
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  economy           FaceEconomy @relation(fields: [economyId], references: [id], onDelete: Cascade)

  @@index([incentiveId])
  @@index([economyId])
  @@index([incentiveType])
  @@index([status])
  @@map("face_incentives")
}

// ============================================================================
// DBIS Volume X: Chrono-Sovereign Settlement Engine (CSSE)
// ============================================================================

model ChronoSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String
  timeDomain        String   // earth, lunar, martian, relativistic
  timeOffset        Decimal  @db.Decimal(32, 12) // Time offset in seconds
  status            String   @default("pre_commit") // pre_commit, committed, reconciled, settled
  preCommittedAt    DateTime?
  committedAt       DateTime?
  reconciledAt      DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sourceBank        SovereignBank @relation("ChronoSettlementSource", fields: [sourceBankId], references: [id], onDelete: Cascade)
  destinationBank   SovereignBank @relation("ChronoSettlementDestination", fields: [destinationBankId], references: [id], onDelete: Cascade)
  preCommits        TemporalPreCommit[]
  reconciliations   TemporalReconciliation[]

  @@index([settlementId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@map("chrono_settlements")
}

model TemporalPreCommit {
  id                String   @id @default(uuid())
  preCommitId       String   @unique
  settlementId      String
  predictedState    Json     // Predicted future state
  sovereignSignature String
  preCommitHash     String   // HASH(predicted_state + sovereign_signature)
  status            String   @default("pending") // pending, verified, committed
  verifiedAt        DateTime?
  committedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        ChronoSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([preCommitId])
  @@index([settlementId])
  @@index([status])
  @@map("temporal_pre_commits")
}

model TemporalReconciliation {
  id                String   @id @default(uuid())
  reconciliationId  String   @unique
  settlementId      String
  delayCost         Decimal  @db.Decimal(32, 12)
  fxDrift           Decimal  @db.Decimal(32, 12)
  commodityShockDelta Decimal @db.Decimal(32, 12)
  adjustmentAmount  Decimal  @db.Decimal(32, 12)
  reconciliationData Json
  status            String   @default("pending") // pending, calculated, applied
  calculatedAt      DateTime?
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        ChronoSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([reconciliationId])
  @@index([settlementId])
  @@index([status])
  @@map("temporal_reconciliations")
}

// ============================================================================
// DBIS Volume X: Interdimensional Ledger Compliance (ILC) - Concept Level
// ============================================================================

model InterdimensionalLedger {
  id                String   @id @default(uuid())
  ledgerId          String   @unique
  ledgerName        String
  dimension         String   // D0, D1, D2, D3, D4
  dimensionType     String   // classical, dlt, quantum, simulated, parallel
  description       String   @db.Text
  ledgerState       Json?    // Current ledger state
  status            String   @default("active") // active, synchronized, conflict, resolved
  lastSyncAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  dimensions        LedgerDimension[]
  reconciliations   DimensionReconciliation[]

  @@index([ledgerId])
  @@index([dimension])
  @@index([dimensionType])
  @@index([status])
  @@map("interdimensional_ledgers")
}

model LedgerDimension {
  id                String   @id @default(uuid())
  dimensionId       String   @unique
  ledgerId          String
  dimensionCode     String   // D0, D1, D2, D3, D4
  dimensionName     String   // D0 - Classical Finance, D1 - Distributed Ledger Systems, etc.
  dimensionMetadata Json     // Dimension-specific metadata
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            InterdimensionalLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([dimensionId])
  @@index([ledgerId])
  @@index([dimensionCode])
  @@map("ledger_dimensions")
}

model DimensionReconciliation {
  id                String   @id @default(uuid())
  reconciliationId  String   @unique
  ledgerId          String
  dimensionStates   Json     // States from D0, D1, D2, D3
  reconciledState   Json?    // Result of reconciliation
  consistencyCheck  Boolean  @default(false) // ledger_state[D0] == reconcile(...)
  metaResolution    Json?    // invoke_meta_resolution() if inconsistent
  status            String   @default("pending") // pending, consistent, inconsistent, resolved
  checkedAt         DateTime?
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledger            InterdimensionalLedger @relation(fields: [ledgerId], references: [id], onDelete: Cascade)

  @@index([reconciliationId])
  @@index([ledgerId])
  @@index([status])
  @@map("dimension_reconciliations")
}

// ============================================================================
// DBIS Volume XIV: Trans-Causal Monetary Protocol, Infinite-Layer Identity, Holographic Sovereign Anchors, Reality-Spanning Smart Contracts, and Superposition Asset Valuation
// ============================================================================

// Volume XIV: Trans-Causal Monetary Protocol (TCMP)
model TransCausalTransaction {
  id                String   @id @default(uuid())
  tcxId             String   @unique
  presentState      Json     // S0 - Current state
  futureProjection  Json     // S+ - Future state projection
  pastAlignment     Json     // S- - Past state alignment
  causalHash        String   // HASH(S0 + S+ + S-)
  integrityWeight   Decimal  @db.Decimal(32, 12) // ψ - Integrity weight
  causalCoherence   Decimal? @db.Decimal(32, 12) // f(S0, S+, S-) coherence score
  coherenceThreshold Decimal @default(0.95) @db.Decimal(32, 12)
  status            String   @default("pending") // pending, coherent, deferred, resolved
  deferredReason    String?  @db.Text
  resolutionMapping Json?    // Causal-resolution mapping if coherence fails
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt
  resolvedAt        DateTime?

  resolutions       CausalResolution[]

  @@index([tcxId])
  @@index([causalHash])
  @@index([status])
  @@index([causalCoherence])
  @@map("trans_causal_transactions")
}

model CausalResolution {
  id                String   @id @default(uuid())
  resolutionId      String   @unique
  tcxId             String
  resolutionType    String   // temporal_loop, retrocausal, forward_predicted, quantum_timeline
  resolutionMapping Json     // Causal-resolution mapping
  resolutionResult  Json?     // Result of resolution
  status            String   @default("pending") // pending, applied, failed
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  transaction       TransCausalTransaction @relation(fields: [tcxId], references: [id], onDelete: Cascade)

  @@index([resolutionId])
  @@index([tcxId])
  @@index([resolutionType])
  @@index([status])
  @@map("causal_resolutions")
}

// Volume XIV: Infinite-Layer Identity Engine (ILIE)
model InfiniteLayerIdentity {
  id                String   @id @default(uuid())
  identityId        String   @unique
  sovereignBankId   String?  // Optional: if entity is an SCB
  entityType        String   // scb, private_bank, digital_entity, conscious, quantum, simulated, parallel
  entityId          String   // Reference to entity
  unifiedIdentity   String   // I∞ = unify(I0, I1, I2, I3, I4, ...)
  identityDrift     Decimal  @default(0) @db.Decimal(32, 12) // Measured drift
  driftThreshold    Decimal  @default(0.01) @db.Decimal(32, 12)
  status            String   @default("active") // active, drift_detected, corrected, suspended
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt
  lastCorrectionAt  DateTime?

  sovereignBank     SovereignBank? @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  layers            IdentityLayer[]
  corrections       IdentityCorrection[]

  @@index([identityId])
  @@index([sovereignBankId])
  @@index([entityType])
  @@index([entityId])
  @@index([status])
  @@map("infinite_layer_identities")
}

model IdentityLayer {
  id                String   @id @default(uuid())
  layerId           String   @unique
  identityId        String
  layerNumber       Int      // L0, L1, L2, L3, L4, L∞
  layerType         String   // classical, dlt, quantum, cognitive, simulated, meta
  layerIdentity     String   // Identity at this layer
  layerMetadata     Json?    // Layer-specific metadata
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  identity          InfiniteLayerIdentity @relation(fields: [identityId], references: [id], onDelete: Cascade)

  @@index([layerId])
  @@index([identityId])
  @@index([layerNumber])
  @@index([layerType])
  @@map("identity_layers")
}

model IdentityCorrection {
  id                String   @id @default(uuid())
  correctionId      String   @unique
  identityId        String
  correctionType    String   // drift_correction, alignment, unification
  beforeState       Json     // State before correction
  afterState        Json     // State after correction
  correctionDetails Json?    // Correction algorithm details
  status            String   @default("pending") // pending, applied, failed
  appliedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  identity          InfiniteLayerIdentity @relation(fields: [identityId], references: [id], onDelete: Cascade)

  @@index([correctionId])
  @@index([identityId])
  @@index([status])
  @@map("identity_corrections")
}

// Volume XIV: Sovereign Holographic Anchor System (SHAS)
model HolographicAnchor {
  id                String   @id @default(uuid())
  anchorId          String   @unique
  sovereignBankId   String?  // Optional: if anchor is for a sovereign
  sovereignId       String?  // Sovereign identity (alternative reference)
  assetId           String?  // Asset identity
  anchorType        String   // sovereign, asset, ledger_state
  encodedAnchor     String   // H_anchor = ENCODE(...)
  sovereignIdentity Json?    // Sovereign identity data
  ledgerState       Json?    // Ledger state at anchor
  reflectionState   Json?    // Reflection state
  multiverseAlignment Json?  // Multiverse alignment data
  integrityStatus   String   @default("pending") // pending, verified, failed
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank? @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)
  integrityChecks    AnchorIntegrityCheck[]
  settlements       HolographicSettlement[]

  @@index([anchorId])
  @@index([sovereignBankId])
  @@index([sovereignId])
  @@index([assetId])
  @@index([anchorType])
  @@index([integrityStatus])
  @@map("holographic_anchors")
}

model AnchorIntegrityCheck {
  id                String   @id @default(uuid())
  checkId           String   @unique
  anchorId          String
  checkType         String   // identity_verification, settlement_grounding, divergence_protection
  checkResult       String   // passed, failed, warning
  checkDetails      Json?    // Detailed check results
  status            String   @default("pending") // pending, completed
  checkedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  anchor            HolographicAnchor @relation(fields: [anchorId], references: [id], onDelete: Cascade)

  @@index([checkId])
  @@index([anchorId])
  @@index([checkType])
  @@index([checkResult])
  @@map("anchor_integrity_checks")
}

model HolographicSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  anchorId           String
  settlementType    String   // standard, cross_reality, multiverse
  settlementData    Json     // Settlement details
  holographicCheck  Boolean  @default(false) // Passed holographic-identity check
  finalityStatus    String   @default("pending") // pending, verified, finalized
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  anchor            HolographicAnchor @relation(fields: [anchorId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([anchorId])
  @@index([finalityStatus])
  @@map("holographic_settlements")
}

// Volume XIV: Reality-Spanning Smart Contract Kernel (RSSCK)
model RealitySpanningContract {
  id                String   @id @default(uuid())
  contractId        String   @unique
  contractHash      String   // Contract hash
  contractCode      Json     // Contract code/logic
  dimensions        Json     // Dimensions contract spans
  timelines         Json?    // Timeline information
  simulatedLayers   Json?    // Simulated layer data
  quantumStates     Json?    // Quantum-entangled contract states
  realityAgreement  Boolean  @default(false) // all_realities_agree(contract_hash)
  agreementDetails  Json?    // Agreement status per reality
  status            String   @default("pending") // pending, agreed, resolving, executed, failed
  executionResult   Json?    // Execution result
  ossmResolution    Json?    // OSSM adjudication if needed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  executions        ContractExecution[]
  resolutions       ContractResolution[]

  @@index([contractId])
  @@index([contractHash])
  @@index([status])
  @@index([realityAgreement])
  @@map("reality_spanning_contracts")
}

model ContractExecution {
  id                String   @id @default(uuid())
  executionId       String   @unique
  contractId        String
  executionType     String   // standard, cross_dimensional, temporal, quantum_entangled
  executionData     Json     // Execution parameters
  intentProbabilities Json?  // Intent probabilities (cognitive layer)
  consciousnessSignatures Json? // Consciousness signatures
  quantumSymmetry   Json?    // Quantum decision symmetry
  executionResult   Json?    // Execution result
  status            String   @default("pending") // pending, executing, completed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contract          RealitySpanningContract @relation(fields: [contractId], references: [id], onDelete: Cascade)

  @@index([executionId])
  @@index([contractId])
  @@index([status])
  @@map("contract_executions")
}

model ContractResolution {
  id                String   @id @default(uuid())
  resolutionId      String   @unique
  contractId        String
  resolutionType    String   // ossm_adjudication, reality_merge, conflict_resolution
  conflictDetails   Json?    // Conflict information
  resolutionResult   Json?    // Resolution result
  status            String   @default("pending") // pending, resolved, failed
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  contract          RealitySpanningContract @relation(fields: [contractId], references: [id], onDelete: Cascade)

  @@index([resolutionId])
  @@index([contractId])
  @@index([status])
  @@map("contract_resolutions")
}

// Volume XIV: Superposition-Based Asset Valuation (SBAV)
model SuperpositionAsset {
  id                String   @id @default(uuid())
  assetId           String   @unique
  assetType         String   // quantum_commodity, parallel_sovereign_bond, infinite_state_reserve
  assetName         String
  superpositionStates Json   // Multiple simultaneous states
  stateProbabilities Json    // Probability for each state
  superposedValue   Decimal? @db.Decimal(32, 12) // Σ(state_value[i] * probability[i])
  collapsedValue    Decimal? @db.Decimal(32, 12) // Value after collapse
  collapseStatus    String   @default("superposed") // superposed, collapsing, collapsed
  collapsedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  valuations        AssetValuation[]
  reconciliations   AssetReconciliation[]

  @@index([assetId])
  @@index([assetType])
  @@index([collapseStatus])
  @@map("superposition_assets")
}

model AssetValuation {
  id                String   @id @default(uuid())
  valuationId       String   @unique
  assetId           String
  stateIndex        Int?     // Which state in superposition
  stateValue        Decimal  @db.Decimal(32, 12)
  probability       Decimal  @db.Decimal(32, 12) // probability[i]
  weightedValue     Decimal  @db.Decimal(32, 12) // state_value[i] * probability[i]
  valuationTime     DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  asset             SuperpositionAsset @relation(fields: [assetId], references: [id], onDelete: Cascade)

  @@index([valuationId])
  @@index([assetId])
  @@index([stateIndex])
  @@map("asset_valuations")
}

model AssetReconciliation {
  id                String   @id @default(uuid())
  reconciliationId  String   @unique
  assetId           String
  reconciliationType String  // parallel_branch, quantum_state, holographic_projection
  beforeState       Json     // State before reconciliation
  afterState        Json     // State after reconciliation
  reconciliationDetails Json? // Reconciliation algorithm
  status            String   @default("pending") // pending, reconciled, failed
  reconciledAt      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  asset             SuperpositionAsset @relation(fields: [assetId], references: [id], onDelete: Cascade)

  @@index([reconciliationId])
  @@index([assetId])
  @@index([status])
  @@map("asset_reconciliations")
}

// Volume XIV: DBIS Economic Entanglement Index (EEI)
model EconomicEntanglement {
  id                String   @id @default(uuid())
  entanglementId    String   @unique
  measurementTime   DateTime @default(now())
  cohesionFactor    Decimal  @db.Decimal(32, 12)
  divergencePressure Decimal @db.Decimal(32, 12)
  quantumResonance  Decimal  @db.Decimal(32, 12)
  eeiValue          Decimal  @db.Decimal(32, 12) // cohesion_factor - divergence_pressure + quantum_resonance
  stabilityLevel    String   // low, medium, high, very_high
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  measurements      EntanglementMeasurement[]

  @@index([entanglementId])
  @@index([measurementTime])
  @@index([eeiValue])
  @@index([stabilityLevel])
  @@map("economic_entanglements")
}

model EntanglementMeasurement {
  id                String   @id @default(uuid())
  measurementId     String   @unique
  entanglementId    String
  measurementType   String   // cohesion, divergence, quantum_resonance
  measurementValue  Decimal  @db.Decimal(32, 12)
  measurementDetails Json?   // Measurement details
  measuredAt        DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entanglement      EconomicEntanglement @relation(fields: [entanglementId], references: [id], onDelete: Cascade)

  @@index([measurementId])
  @@index([entanglementId])
  @@index([measurementType])
  @@map("entanglement_measurements")
}

// Volume XIV: Unified Pan-Reality Monetary Fabric (UPRMF)
model PanRealityMonetaryFabric {
  id                String   @id @default(uuid())
  fabricId          String   @unique
  fabricVersion     String   @default("1.0")
  ummcState         Json?    // UMMC state
  omegaLsfState     Json?    // Ω-LSF state
  hsmnState         Json?    // HSMN state (if exists)
  tcmpState         Json?    // TCMP state
  ilieState         Json?    // ILIE state
  mergedState       Json?    // MERGE(UMMC, Ω-LSF, HSMN, TCMP, ILIE)
  crossDimensionalAlignment Boolean @default(false)
  temporalIntegrity Boolean  @default(false)
  quantumCoherence  Boolean  @default(false)
  holographicHarmony Boolean @default(false)
  sovereignContinuity Boolean @default(false)
  overallStatus     String   @default("initializing") // initializing, aligned, coherent, operational
  lastMergeAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  alignments        FabricAlignment[]
  integrityChecks   FabricIntegrityCheck[]

  @@index([fabricId])
  @@index([overallStatus])
  @@map("pan_reality_monetary_fabric")
}

model FabricAlignment {
  id                String   @id @default(uuid())
  alignmentId       String   @unique
  fabricId          String
  alignmentType     String   // cross_dimensional, temporal, quantum, holographic, sovereign
  alignmentStatus   String   // pending, aligned, misaligned, corrected
  alignmentDetails  Json?    // Alignment details
  correctedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  fabric            PanRealityMonetaryFabric @relation(fields: [fabricId], references: [id], onDelete: Cascade)

  @@index([alignmentId])
  @@index([fabricId])
  @@index([alignmentType])
  @@index([alignmentStatus])
  @@map("fabric_alignments")
}

model FabricIntegrityCheck {
  id                String   @id @default(uuid())
  checkId           String   @unique
  fabricId          String
  checkType         String   // cross_dimensional, temporal, quantum_coherence, holographic, sovereign_continuity
  checkResult       String   // passed, failed, warning
  checkDetails      Json?    // Detailed check results
  status            String   @default("pending") // pending, completed
  checkedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  fabric            PanRealityMonetaryFabric @relation(fields: [fabricId], references: [id], onDelete: Cascade)

  @@index([checkId])
  @@index([fabricId])
  @@index([checkType])
  @@index([checkResult])
  @@map("fabric_integrity_checks")
}

// ============================================================================
// DBIS Volume XIII: Hyper-Sovereign Monetary Nexus, Dimensional Arbitrage Engine, Temporal-Multiversal FX Parity, Conscious-Ledger Integration, and Singularity-Grade Liquidity Systems
// ============================================================================

// ============================================================================
// Volume XIII: Hyper-Sovereign Monetary Nexus (HSMN)
// ============================================================================

model HsmnNexusLayer {
  id                String   @id @default(uuid())
  nexusId           String   @unique
  layerNumber       Int      // 0=Prime, 1=Multiversal, 2=Temporal, 3=Consciousness, 4=Quantum
  layerName         String
  description       String   @db.Text
  anchorValue       Decimal? @db.Decimal(32, 12)
  stabilityIndex    Decimal? @db.Decimal(32, 12)
  status            String   @default("active") // active, suspended, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignMappings  HsmnSovereignMapping[]
  realityStates      HsmnRealityState[]
  bindingLaws        HsmnBindingLaw[]

  @@index([nexusId])
  @@index([layerNumber])
  @@index([status])
  @@map("hsmn_nexus_layers")
}

model HsmnSovereignMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  nexusLayerId      String
  sovereignBankId   String
  realityBranch     String?  // For HS1 (Multiversal)
  parallelState     String?  // For HS1 (Multiversal)
  identityHash      String
  bindingStatus     String   @default("bound") // bound, unbound, pending
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  nexusLayer        HsmnNexusLayer @relation(fields: [nexusLayerId], references: [id], onDelete: Cascade)

  @@index([mappingId])
  @@index([nexusLayerId])
  @@index([sovereignBankId])
  @@index([realityBranch])
  @@index([identityHash])
  @@index([status])
  @@map("hsmn_sovereign_mappings")
}

model HsmnRealityState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  nexusLayerId      String
  sovereignBankId   String
  realityType       String   // temporal, consciousness, quantum
  timeline          String?  // For temporal states
  stateData         Json     // State-specific data
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  nexusLayer        HsmnNexusLayer @relation(fields: [nexusLayerId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([nexusLayerId])
  @@index([sovereignBankId])
  @@index([realityType])
  @@index([status])
  @@map("hsmn_reality_states")
}

model HsmnBindingLaw {
  id                String   @id @default(uuid())
  bindingId         String   @unique
  sovereignBankId   String
  identityHash      String
  unified           Boolean  @default(false)
  identityInvariant Boolean  @default(false)
  ledgerTruth       Boolean  @default(false)
  temporalConsistency Boolean @default(false)
  quantumCoherence  Boolean  @default(false)
  status            String   @default("unbound") // bound, unbound, pending
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([bindingId])
  @@index([sovereignBankId])
  @@index([identityHash])
  @@index([status])
  nexusLayer                HsmnNexusLayer[]
  @@map("hsmn_binding_laws")
}

// ============================================================================
// Volume XIII: Unified Dimensional Arbitrage Engine (UDAE)
// ============================================================================

model DimensionalArbitrage {
  id                          String   @id @default(uuid())
  arbitrageId                 String   @unique
  dimension                   String
  timeline                    String?
  parallelBranch              String?
  quantumState                String?
  simulatedEconomy            String?
  classicalPrice              Decimal  @db.Decimal(32, 12)
  quantumExpectedPrice        Decimal  @db.Decimal(32, 12)
  parallelStateDivergence     Decimal  @db.Decimal(32, 12)
  holographicProjectionAdjustment Decimal @db.Decimal(32, 12)
  arbitrageDelta              Decimal  @db.Decimal(32, 12)
  tolerance                   Decimal  @db.Decimal(32, 12)
  requiresRebalance           Boolean  @default(false)
  status                      String   @default("calculated") // calculated, compressed, rebalanced
  createdAt                   DateTime @default(now())
  updatedAt                   DateTime @updatedAt

  rebalances                  DimensionalRebalance[]

  @@index([arbitrageId])
  @@index([dimension])
  @@index([status])
  @@index([requiresRebalance])
  @@map("dimensional_arbitrage")
}

model DimensionalRebalance {
  id                String   @id @default(uuid())
  rebalanceId       String   @unique
  arbitrageId       String
  adjustmentAmount  Decimal  @db.Decimal(32, 12)
  dimension         String?
  timeline          String?
  parallelBranch    String?
  quantumState      String?
  status            String   @default("executed") // executed, pending, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  arbitrage         DimensionalArbitrage @relation(fields: [arbitrageId], references: [id], onDelete: Cascade)

  @@index([rebalanceId])
  @@index([arbitrageId])
  @@index([status])
  @@map("dimensional_rebalance")
}

// ============================================================================
// Volume XIII: Temporal-Multiversal FX Parity Law (TMFPL)
// ============================================================================

model TemporalFxParity {
  id                  String   @id @default(uuid())
  parityId            String   @unique
  currencyPair        String
  spotRate            Decimal  @db.Decimal(32, 12)
  temporalSmoothing   Decimal  @db.Decimal(32, 12)
  parallelArbitrage   Decimal  @db.Decimal(32, 12)
  ssuAnchor           Decimal  @db.Decimal(32, 12)
  gqlResonance        Decimal  @db.Decimal(32, 12)
  calculatedParity    Decimal  @db.Decimal(32, 12)
  divergence          Decimal  @db.Decimal(32, 12)
  requiresCorrection  Boolean  @default(false)
  status              String   @default("calculated") // calculated, corrected, monitoring
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  corrections         TemporalCorrection[]
  divergences         ParityDivergence[]

  @@index([parityId])
  @@index([currencyPair])
  @@index([status])
  @@index([requiresCorrection])
  @@map("temporal_fx_parity")
}

model TemporalCorrection {
  id                String   @id @default(uuid())
  correctionId      String   @unique
  parityId          String
  correctionAmount  Decimal  @db.Decimal(32, 12)
  correctedParity   Decimal  @db.Decimal(32, 12)
  currencyPair      String
  status            String   @default("applied") // applied, pending, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  parity            TemporalFxParity @relation(fields: [parityId], references: [id], onDelete: Cascade)

  @@index([correctionId])
  @@index([parityId])
  @@index([status])
  @@map("temporal_corrections")
}

model ParityDivergence {
  id                String   @id @default(uuid())
  divergenceId      String   @unique
  parityId           String
  divergenceAmount  Decimal  @db.Decimal(32, 12)
  severity          String   // warning, critical
  status            String   @default("detected") // detected, resolved, monitoring
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  parity            TemporalFxParity @relation(fields: [parityId], references: [id], onDelete: Cascade)

  @@index([divergenceId])
  @@index([parityId])
  @@index([severity])
  @@index([status])
  @@map("parity_divergences")
}

// ============================================================================
// Volume XIII: DBIS Conscious-Ledger Integration Model (CLIM)
// ============================================================================

model ConsciousnessState {
  id                    String   @id @default(uuid())
  stateId               String   @unique
  agentId               String
  stateHash             String
  cognitiveIntent       String   @db.Text
  transactionHistory    String[] // Array of transaction IDs
  sovereignBehaviorField String  @db.Text
  influenceLevel         Decimal  @db.Decimal(32, 12)
  status                 String   @default("active")
  createdAt              DateTime @default(now())
  updatedAt              DateTime @updatedAt

  contracts              CognitiveContract[]

  @@index([stateId])
  @@index([agentId])
  @@index([stateHash])
  @@index([status])
  @@map("consciousness_states")
}

model CognitiveContract {
  id                  String   @id @default(uuid())
  contractId          String   @unique
  stateId             String
  threshold           Decimal  @db.Decimal(32, 12)
  action              String   @db.Text
  parameters          Json?
  cognitiveAlignment  Decimal  @db.Decimal(32, 12)
  executionStatus     String   @default("pending_execution") // pending_execution, executed, delayed, rejected
  executedAt          DateTime?
  status              String   @default("active")
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  state               ConsciousnessState @relation(fields: [stateId], references: [id], onDelete: Cascade)

  @@index([contractId])
  @@index([stateId])
  @@index([executionStatus])
  @@index([status])
  @@map("cognitive_contracts")
}

model BehavioralField {
  id                String   @id @default(uuid())
  fieldId           String   @unique
  sovereignBankId   String
  fieldData         Json
  influenceScore    Decimal  @db.Decimal(32, 12)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([fieldId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("behavioral_fields")
}

// ============================================================================
// Volume XIII: Singularity-Grade Liquidity Engine (SGLE)
// ============================================================================

model SingularityLiquidity {
  id                String   @id @default(uuid())
  liquidityId       String   @unique
  generationId      String?
  gapId             String? @unique
  liquidityAmount   Decimal  @db.Decimal(32, 12)
  generationType    String   // manual, auto
  conservationLimit Decimal? @db.Decimal(32, 12)
  withinLimits      Boolean  @default(true)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  gap               LiquidityGap? @relation(fields: [gapId], references: [id], onDelete: SetNull)

  @@index([liquidityId])
  @@index([generationId])
  @@index([gapId])
  @@index([status])
  @@map("singularity_liquidity")
}

model LiquidityProjection {
  id                          String   @id @default(uuid())
  projectionId                String   @unique
  qpuPrediction               Decimal  @db.Decimal(32, 12)
  multiversalReserveStrength  Decimal  @db.Decimal(32, 12)
  consciousnessAlignmentFactor Decimal  @db.Decimal(32, 12)
  futureLiquidity             Decimal  @db.Decimal(32, 12)
  currentLiquidity             Decimal  @db.Decimal(32, 12)
  liquidityGap                Decimal  @db.Decimal(32, 12)
  timeHorizon                  Int      // in seconds
  sufficiency                  Boolean  @default(false)
  status                      String   @default("calculated") // calculated, updated, archived
  createdAt                   DateTime @default(now())
  updatedAt                   DateTime @updatedAt

  gaps                        LiquidityGap[]

  @@index([projectionId])
  @@index([status])
  @@index([sufficiency])
  @@map("liquidity_projections")
}

model LiquidityGap {
  id                String   @id @default(uuid())
  gapId             String   @unique
  projectionId      String
  gapAmount         Decimal  @db.Decimal(32, 12)
  status            String   @default("detected") // detected, addressed, resolved
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  projection        LiquidityProjection @relation(fields: [projectionId], references: [id], onDelete: Cascade)
  liquidity         SingularityLiquidity?

  @@index([gapId])
  @@index([projectionId])
  @@index([status])
  @@map("liquidity_gaps")
}

// ============================================================================
// Volume XIII: Meta-Reality Economic Convergence Protocol (MRECP)
// ============================================================================

model RealityConvergence {
  id                  String   @id @default(uuid())
  convergenceId       String   @unique
  realityDivergence    Decimal  @db.Decimal(32, 12)
  sovereignAlignment  Decimal  @db.Decimal(32, 12)
  fxStability         Decimal  @db.Decimal(32, 12)
  ssuStability         Decimal  @db.Decimal(32, 12)
  cbdcStability       Decimal  @db.Decimal(32, 12)
  convergence         Decimal  @db.Decimal(32, 12)
  stable              Boolean  @default(false)
  status              String   @default("calculated") // calculated, harmonized, archived
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  harmonizations      EconomicHarmonization[]
  divergences         RealityDivergence[]

  @@index([convergenceId])
  @@index([status])
  @@index([stable])
  @@map("reality_convergence")
}

model EconomicHarmonization {
  id                String   @id @default(uuid())
  harmonizationId   String   @unique
  convergenceId     String?
  adjustmentAmount  Decimal  @db.Decimal(32, 12)
  status            String   @default("applied") // applied, pending, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  convergence       RealityConvergence? @relation(fields: [convergenceId], references: [id], onDelete: SetNull)

  @@index([harmonizationId])
  @@index([convergenceId])
  @@index([status])
  @@map("economic_harmonizations")
}

// ============================================================================
// Volume XIII: Prime-Reality Oversight Engine (PROE)
// ============================================================================

model PrimeRealityDeviation {
  id                    String   @id @default(uuid())
  deviationId           String   @unique
  realityType           String   // parallel, quantum, temporal, simulated
  realityId             String
  primeRealityState     Decimal  @db.Decimal(32, 12)
  alternateRealityState Decimal  @db.Decimal(32, 12)
  deviationAmount       Decimal  @db.Decimal(32, 12)
  threshold             Decimal  @db.Decimal(32, 12)
  exceedsThreshold      Boolean  @default(false)
  requiresAlignment     Boolean  @default(false)
  status                String   @default("detected") // detected, aligned, monitoring
  createdAt             DateTime @default(now())
  updatedAt             DateTime @updatedAt

  alignments            AlignmentEnforcement[]

  @@index([deviationId])
  @@index([realityType])
  @@index([realityId])
  @@index([status])
  @@index([requiresAlignment])
  @@map("prime_reality_deviations")
}

model AlignmentEnforcement {
  id                String   @id @default(uuid())
  alignmentId       String   @unique
  deviationId       String
  adjustmentAmount  Decimal  @db.Decimal(32, 12)
  aligned           Boolean  @default(false)
  status            String   @default("enforced") // enforced, pending, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  deviation         PrimeRealityDeviation @relation(fields: [deviationId], references: [id], onDelete: Cascade)

  @@index([alignmentId])
  @@index([deviationId])
  @@index([status])
  @@map("alignment_enforcements")
}

model RealityState {
  id                String   @id @default(uuid())
  realityId         String   @unique
  realityType       String   // prime, parallel, quantum, temporal, simulated
  stateData         Json
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([realityId])
  @@index([realityType])
  @@index([status])
  @@map("reality_states")
}

// ============================================================================
// DBIS Special Sub-Volumes
// ============================================================================

// Sub-Volume A: Global Atomic Settlements (GAS) Network

model GasSettlement {
  id                  String   @id @default(uuid())
  gasSettlementId     String   @unique
  settlementId        String?  // Reference to AtomicSettlement
  sourceBankId        String
  destinationBankId   String
  amount              Decimal  @db.Decimal(32, 8)
  currencyCode        String
  assetType           String
  networkType         String   // classical, cbdc, commodity, security, quantum, multiversal
  commitmentHash      String
  routeId             String?
  routingEngine       String?  // sire, caso, arifx, hybrid
  fxCommit            String?
  assetCommit         String?
  temporalState       String?
  dimensionalAlignment Decimal? @db.Decimal(32, 8)
  settlementTime      Int?     // Milliseconds
  status              String   @default("pending") // pending, settled, failed
  allCommitsMatched   Boolean  @default(false)
  settledAt           DateTime?
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  commitment          GasCommitment?
  routingDecision     GasRoutingDecision? @relation("GasSettlementRouting", fields: [routeId], references: [routeId], onDelete: SetNull)

  @@index([gasSettlementId])
  @@index([settlementId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([networkType])
  @@index([status])
  @@index([allCommitsMatched])
  @@map("gas_settlements")
}

model GasCommitment {
  id                String   @id @default(uuid())
  commitmentId      String   @unique
  gasSettlementId   String?  @unique
  settlementId      String
  scbCommit         String
  dbisCommit        String
  fxCommit          String?
  assetCommit       String?
  temporalState     String?
  commitmentHash    String
  status            String   @default("pending") // pending, verified, failed
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  gasSettlement     GasSettlement? @relation(fields: [gasSettlementId], references: [gasSettlementId], onDelete: SetNull)

  @@index([commitmentId])
  @@index([settlementId])
  @@index([gasSettlementId])
  @@index([status])
  @@map("gas_commitments")
}

model GasRoutingDecision {
  id                  String   @id @default(uuid())
  routeId             String   @unique
  settlementId        String?
  sourceBankId        String
  destinationBankId   String
  amount              Decimal  @db.Decimal(32, 8)
  currencyCode        String
  assetType           String
  networkType         String   // classical, cbdc, commodity, security, quantum, multiversal
  routingEngine       String   // sire, caso, arifx, hybrid
  optimalRoute        Json     // Calculated optimal route
  cost                Decimal  @db.Decimal(32, 12)
  latency             Int      // Milliseconds
  dimensionalAlignment Decimal @db.Decimal(32, 8)
  status              String   @default("active") // active, applied, expired
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  gasSettlements      GasSettlement[] @relation("GasSettlementRouting")

  @@index([routeId])
  @@index([settlementId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([networkType])
  @@index([routingEngine])
  @@index([status])
  @@map("gas_routing_decisions")
}

// Sub-Volume B: Global Reserve Unit (GRU) Integration

model GruUnit {
  id                String   @id @default(uuid())
  gruUnitId         String   @unique
  sovereignBankId   String
  unitType          String   // M00, M0, M1
  amount            Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, locked, redeemed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bonds             GruBond[]
  triangulations    GruTriangulation[]

  @@index([gruUnitId])
  @@index([sovereignBankId])
  @@index([unitType])
  @@index([status])
  @@map("gru_units")
}

model GruConversion {
  id                String   @id @default(uuid())
  conversionId      String   @unique
  sourceAmount      Decimal  @db.Decimal(32, 8)
  sourceType        String   // M00, M0, M1
  targetAmount      Decimal  @db.Decimal(32, 8)
  targetType        String   // M00, M0, M1
  conversionRate    Decimal  @db.Decimal(32, 12)
  status            String   @default("completed") // completed, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([conversionId])
  @@index([sourceType])
  @@index([targetType])
  @@index([status])
  @@map("gru_conversions")
}

model GruComposition {
  id                String   @id @default(uuid())
  compositionId     String   @unique
  m00Amount         Decimal  @db.Decimal(32, 8)
  m0Amount          Decimal  @db.Decimal(32, 8)
  m1Amount          Decimal  @db.Decimal(32, 8)
  totalM00Equivalent Decimal @db.Decimal(32, 8)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([compositionId])
  @@index([status])
  @@map("gru_compositions")
}

model GruTriangulation {
  id                String   @id @default(uuid())
  triangulationId   String   @unique
  gruUnitId         String
  gruAmount         Decimal  @db.Decimal(32, 8)
  gruType           String   // M00, M0, M1
  xauValue          Decimal  @db.Decimal(32, 8) // Value in XAU (gold)
  targetValue       Decimal  @db.Decimal(32, 8)
  targetAssetType   String   // fiat, commodity, cbdc, tokenized
  targetCurrencyCode String?
  targetCommodityType String?
  triangulationRate Decimal  @db.Decimal(32, 12)
  status            String   @default("completed")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  gruUnit           GruUnit @relation(fields: [gruUnitId], references: [id], onDelete: Cascade)

  @@index([triangulationId])
  @@index([gruUnitId])
  @@index([targetAssetType])
  @@index([status])
  @@map("gru_triangulations")
}

model GruBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondType          String   // Li99PpOsB10, Li99PpAvB10
  principalAmount   Decimal  @db.Decimal(32, 8)
  gruUnitId         String
  sovereignBankId   String
  maturityDate      DateTime
  interestRate      Decimal  @db.Decimal(32, 8)
  couponRate         Decimal  @db.Decimal(32, 8)
  finalValue        Decimal? @db.Decimal(32, 8)
  status            String   @default("active") // active, redeemed, defaulted
  issuedAt          DateTime @default(now())
  redeemedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  gruUnit           GruUnit @relation(fields: [gruUnitId], references: [id], onDelete: Cascade)
  coupons           GruBondCoupon[]
  // Volume III relations
  syntheticBonds    SyntheticGruBond[] @relation("SyntheticGruBondToGruBond")
  settlements       GruBondSettlement[] @relation("GruBondSettlementToGruBond")
  pricing           GruBondPricing[] @relation("GruBondPricingToGruBond")
  pricingHistory    BondPricingHistory[] @relation("BondPricingHistoryToGruBond")
  riskAssessments   BondRiskAssessment[] @relation("BondRiskAssessmentToGruBond")

  @@index([bondId])
  @@index([bondType])
  @@index([gruUnitId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("gru_bonds")
}

model GruBondCoupon {
  id                String   @id @default(uuid())
  paymentId         String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  status            String   @default("paid") // paid, pending, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([paymentId])
  @@index([bondId])
  @@index([status])
  @@map("gru_bond_coupons")
}

model GruLiquidityLoop {
  id                String   @id @default(uuid())
  loopId            String   @unique
  sourceBankId      String
  destinationBankId String
  initialAmount     Decimal  @db.Decimal(32, 8)
  targetAmount      Decimal  @db.Decimal(32, 8)
  targetNetValue    Decimal  @db.Decimal(32, 8)
  currentAmount     Decimal? @db.Decimal(32, 8)
  currentNetValue    Decimal? @db.Decimal(32, 8)
  finalAmount       Decimal? @db.Decimal(32, 8)
  finalNetValue      Decimal? @db.Decimal(32, 8)
  iterations        Int      @default(0)
  targetReached     Boolean  @default(false)
  lastTransactionId String?
  status            String   @default("running") // running, completed, max_iterations_reached, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([loopId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@map("gru_liquidity_loops")
}

// GRU Masterbook: Index System (LiXAU, LiPMG, LiBMG1-3)

model GruIndex {
  id                String   @id @default(uuid())
  indexId           String   @unique
  indexCode         String   @unique // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  indexName         String
  description       String   @db.Text
  baseValue         Decimal  @db.Decimal(32, 12)
  currentValue      Decimal  @db.Decimal(32, 12)
  calculationMethod String   // xau_based, pgm_based, bmg_weighted
  weightings        Json?    // Weightings for composite indexes
  updateFrequency   String   @default("real_time") // real_time, hourly, daily
  status            String   @default("active") // active, suspended
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  priceHistory      GruIndexPriceHistory[]

  @@index([indexId])
  @@index([indexCode])
  @@index([status])
  @@index([lastUpdated])
  @@map("gru_indexes")
}

model GruIndexPriceHistory {
  id                String   @id @default(uuid())
  historyId         String   @unique
  indexId           String
  indexCode         String
  indexValue        Decimal  @db.Decimal(32, 12)
  changePercent     Decimal? @db.Decimal(32, 8)
  volume            Decimal? @db.Decimal(32, 8)
  metadata          Json?    // Additional calculation details
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())

  index             GruIndex @relation(fields: [indexId], references: [id], onDelete: Cascade)

  @@index([historyId])
  @@index([indexId])
  @@index([indexCode])
  @@index([timestamp])
  @@map("gru_index_price_history")
}

// GRU Masterbook: Derivatives & Futures Market

model GruDerivative {
  id                String   @id @default(uuid())
  derivativeId      String   @unique
  derivativeType    String   // spot, futures, swap, option
  instrumentType    String   // GRU_SPOT, GRU_FUTURES, GRU_SWAP, GRU_OPTION
  sovereignBankId   String
  counterpartyBankId String?
  notionalAmount    Decimal  @db.Decimal(32, 8)
  contractPrice     Decimal  @db.Decimal(32, 12)
  markToMarket      Decimal? @db.Decimal(32, 12)
  settlementCurrency String
  status            String   @default("active") // active, expired, settled, closed
  contractDate      DateTime @default(now())
  expirationDate    DateTime?
  settlementDate    DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  futuresContract   GruFuturesContract?
  swap              GruSwap?
  option            GruOption?

  @@index([derivativeId])
  @@index([derivativeType])
  @@index([sovereignBankId])
  @@index([status])
  @@index([expirationDate])
  @@map("gru_derivatives")
}

model GruFuturesContract {
  id                String   @id @default(uuid())
  futuresId         String   @unique
  derivativeId      String   @unique
  contractType      String   // front_month, quarterly, annual
  marginClass       String   // GRF-A, GRF-B, GRF-C
  marginRequirement Decimal  @db.Decimal(32, 8)
  maintenanceMargin Decimal  @db.Decimal(32, 8)
  initialMargin     Decimal  @db.Decimal(32, 8)
  contractSize      Decimal  @db.Decimal(32, 8)
  tickSize          Decimal  @db.Decimal(32, 12)
  settlementPrice   Decimal? @db.Decimal(32, 12)
  lastPrice         Decimal? @db.Decimal(32, 12)
  openInterest      Decimal? @db.Decimal(32, 8)
  volume            Decimal? @db.Decimal(32, 8)
  deliveryDate      DateTime
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        GruDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)

  @@index([futuresId])
  @@index([derivativeId])
  @@index([marginClass])
  @@index([deliveryDate])
  @@map("gru_futures_contracts")
}

model GruSwap {
  id                String   @id @default(uuid())
  swapId            String   @unique
  derivativeId      String   @unique
  swapType          String   // GRU_USD, GRU_XAU, GRU_SSU
  fixedRate         Decimal  @db.Decimal(32, 12)
  floatingRateIndex String
  paymentFrequency  String   // daily, weekly, monthly, quarterly, annually
  notionalAmount    Decimal  @db.Decimal(32, 8)
  nextPaymentDate   DateTime
  maturityDate      DateTime
  lastResetDate     DateTime?
  accruedInterest   Decimal? @db.Decimal(32, 8)
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        GruDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)
  payments          GruSwapPayment[]

  @@index([swapId])
  @@index([derivativeId])
  @@index([swapType])
  @@index([maturityDate])
  @@map("gru_swaps")
}

model GruSwapPayment {
  id                String   @id @default(uuid())
  paymentId         String   @unique
  swapId            String
  paymentDate       DateTime
  paymentAmount     Decimal  @db.Decimal(32, 8)
  fixedLegAmount    Decimal  @db.Decimal(32, 8)
  floatingLegAmount Decimal  @db.Decimal(32, 8)
  netAmount         Decimal  @db.Decimal(32, 8)
  status            String   @default("pending") // pending, paid, failed
  paidAt            DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  swap              GruSwap @relation(fields: [swapId], references: [id], onDelete: Cascade)

  @@index([paymentId])
  @@index([swapId])
  @@index([paymentDate])
  @@index([status])
  @@map("gru_swap_payments")
}

model GruOption {
  id                String   @id @default(uuid())
  optionId          String   @unique
  derivativeId      String   @unique
  optionType        String   // call, put
  underlyingIndex   String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  strikePrice       Decimal  @db.Decimal(32, 12)
  premium           Decimal  @db.Decimal(32, 12)
  expirationDate    DateTime
  exerciseType      String   // american, european
  settlementType    String   // physical, cash
  settlementCurrency String
  quantity          Decimal  @db.Decimal(32, 8)
  intrinsicValue    Decimal? @db.Decimal(32, 12)
  timeValue         Decimal? @db.Decimal(32, 12)
  delta             Decimal? @db.Decimal(32, 12)
  gamma             Decimal? @db.Decimal(32, 12)
  theta             Decimal? @db.Decimal(32, 12)
  vega              Decimal? @db.Decimal(32, 12)
  exercisedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  derivative        GruDerivative @relation(fields: [derivativeId], references: [id], onDelete: Cascade)

  @@index([optionId])
  @@index([derivativeId])
  @@index([underlyingIndex])
  @@index([expirationDate])
  @@map("gru_options")
}

model GruYieldCurve {
  id                String   @id @default(uuid())
  curveId           String   @unique
  curveType         String   // sovereign, synthetic, bond_implied
  curveName         String
  effectiveDate     DateTime @default(now())
  maturityPoints    Json     // Array of { maturity, yield }
  interpolationMethod String @default("linear") // linear, cubic, spline
  status            String   @default("active") // active, historical
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  points            GruYieldCurvePoint[]

  @@index([curveId])
  @@index([curveType])
  @@index([effectiveDate])
  @@index([status])
  @@map("gru_yield_curves")
}

model GruYieldCurvePoint {
  id                String   @id @default(uuid())
  pointId           String   @unique
  curveId           String
  maturityMonths    Int      // Maturity in months
  yield             Decimal  @db.Decimal(32, 12)
  discountFactor    Decimal? @db.Decimal(32, 12)
  forwardRate       Decimal? @db.Decimal(32, 12)
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())

  curve             GruYieldCurve @relation(fields: [curveId], references: [id], onDelete: Cascade)

  @@index([pointId])
  @@index([curveId])
  @@index([maturityMonths])
  @@map("gru_yield_curve_points")
}

// GRU Masterbook: Legal Framework & Issuance Standards

model GruIssuance {
  id                String   @id @default(uuid())
  issuanceId        String   @unique
  gruUnitId         String
  sovereignBankId   String
  issuanceClass     String   // Class_I, Class_II, Class_III, Class_IV
  issuanceType      String   // sovereign_grade, institutional_grade, commercial, observational
  amount            Decimal  @db.Decimal(32, 8)
  unitType          String   // M00, M0, M1
  metalIndexLink    String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  xauTriangulationAuditId String?
  indexSignatureConsistency Boolean @default(false)
  registrarOfficeId String
  // Volume II: Supranational fields
  supranationalEntityId String?
  reserveClass      String?  // SR-1, SR-2, SR-3
  regulatoryClass   String?  // SR-1, SR-2, SR-3, M0, M1 (from GRU Institutional Whitepaper)
  eligibilityStatus String?  // eligible, pending_review, ineligible
  smiaCompliance    Boolean  @default(false) // Sovereign Monetary Instruments Act compliance
  ilieCompliance    Boolean  @default(false) // ILIE (causality-stable sovereign identity) compliance
  status            String   @default("pending") // pending, approved, issued, suspended, revoked
  issuedAt          DateTime?
  approvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            SupranationalEntity? @relation(fields: [supranationalEntityId], references: [id], onDelete: SetNull)
  legalRegistrations GruLegalRegistration[]
  audits            GruIssuanceAudit[]
  complianceRecords GruComplianceRecord[]

  @@index([issuanceId])
  @@index([sovereignBankId])
  @@index([issuanceClass])
  @@index([status])
  @@index([metalIndexLink])
  @@index([supranationalEntityId])
  @@index([reserveClass])
  @@index([regulatoryClass])
  settlementPipelines GruSettlementPipeline[]
  @@map("gru_issuances")
}

model GruLegalRegistration {
  id                String   @id @default(uuid())
  registrationId    String   @unique
  issuanceId        String
  registrationType  String   // ISIN, CUSIP, QTID
  registrationCode  String   @unique
  checkDigit        String?
  registrationDate  DateTime @default(now())
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  issuance          GruIssuance @relation(fields: [issuanceId], references: [id], onDelete: Cascade)

  @@index([registrationId])
  @@index([issuanceId])
  @@index([registrationType])
  @@index([registrationCode])
  @@map("gru_legal_registrations")
}

model GruIssuanceAudit {
  id                String   @id @default(uuid())
  auditId           String   @unique
  issuanceId        String
  auditType         String   // xau_triangulation, index_signature, metal_link_verification
  auditResult       String   // passed, failed, warning
  auditDetails      Json?    // Detailed audit results
  auditorId          String
  auditDate         DateTime @default(now())
  nextAuditDate     DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  issuance          GruIssuance @relation(fields: [issuanceId], references: [id], onDelete: Cascade)

  @@index([auditId])
  @@index([issuanceId])
  @@index([auditType])
  @@index([auditResult])
  @@index([auditDate])
  @@map("gru_issuance_audits")
}

// GRU Masterbook: Stress Testing Models

model GruStressTest {
  id                String   @id @default(uuid())
  testId            String   @unique
  testName          String
  regimeId          String?
  stressRegime      String   // metal_shock, fx_cascade, liquidity_grid_collapse, gru_loop_instability, sovereign_default_correlation, temporal, quantum, metaverse
  testType          String   // standard, temporal, quantum, metaverse
  sovereignBankId   String?
  parameters        Json     // Test-specific parameters
  status            String   @default("running") // running, completed, failed, cancelled
  startedAt         DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  regime            GruStressRegime? @relation(fields: [regimeId], references: [id], onDelete: SetNull)
  results           GruStressTestResult[]

  @@index([testId])
  @@index([stressRegime])
  @@index([testType])
  @@index([sovereignBankId])
  @@index([status])
  @@map("gru_stress_tests")
}

model GruStressRegime {
  id                String   @id @default(uuid())
  regimeId          String   @unique
  regimeName        String
  regimeType        String   // metal_shock, fx_cascade, liquidity_grid_collapse, gru_loop_instability, sovereign_default_correlation
  description       String   @db.Text
  parameters        Json     // Regime-specific parameters
  severity          String   // low, medium, high, extreme
  status            String   @default("active") // active, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  tests             GruStressTest[]

  @@index([regimeId])
  @@index([regimeType])
  @@index([severity])
  @@map("gru_stress_regimes")
}

// GRU Masterbook: Multi-Timeline Settlement System

model GruTemporalSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  gruUnitId         String?
  settlementType    String   // classical, retro, future, omega
  temporalState     String   // t0, t-n, t+n, tΩ
  temporalOffset    Int?     // Offset from t0 (negative for retro, positive for future)
  classicalState    Json?    // Classical timeline state
  retroState        Json?    // Retrospective timeline state
  futureState       Json?    // Future predictive state
  omegaState        Json?    // Ω-Layer merged state
  mergedState       Json?    // Final merged state
  status            String   @default("pending") // pending, merged, settled, failed
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  states            GruTemporalState[]
  chronoFx          GruChronoFx[]

  @@index([settlementId])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([temporalState])
  @@index([status])
  @@map("gru_temporal_settlements")
}

model GruTemporalState {
  id                String   @id @default(uuid())
  stateId           String   @unique
  settlementId      String
  temporalState     String   // t0, t-n, t+n, tΩ
  temporalOffset    Int?     // Offset from t0
  stateData         Json     // State data
  stateHash         String   // Hash of state data
  verified          Boolean  @default(false)
  verifiedAt        DateTime?
  createdAt         DateTime @default(now())

  settlement        GruTemporalSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([stateId])
  @@index([settlementId])
  @@index([temporalState])
  @@index([stateHash])
  @@map("gru_temporal_states")
}

model GruChronoFx {
  id                String   @id @default(uuid())
  chronoFxId        String   @unique
  settlementId      String
  sourceCurrency    String
  targetCurrency    String
  baseRate          Decimal  @db.Decimal(32, 12)
  timeDilation      Decimal  @db.Decimal(32, 12) // Relativistic time dilation factor
  delaySeconds      Int?     // Transmission delay (for interplanetary)
  adjustedRate      Decimal  @db.Decimal(32, 12)
  relativityFactor  Decimal? @db.Decimal(32, 12)
  calculationMethod String   // time_dilation, interplanetary, relativistic
  status            String   @default("calculated") // calculated, applied, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        GruTemporalSettlement @relation(fields: [settlementId], references: [id], onDelete: Cascade)

  @@index([chronoFxId])
  @@index([settlementId])
  @@index([sourceCurrency, targetCurrency])
  @@map("gru_chrono_fx")
}

// GRU Masterbook Volume II: Supranational Reserve Framework

model GruSupranationalReserve {
  id                String   @id @default(uuid())
  reserveId         String   @unique
  reserveClass      String   // SR-1, SR-2, SR-3
  reserveName       String
  reserveType       String   // global_reserve, regional_reserve, commodity_reserve
  jurisdiction      String?  // Global, EU, AU, ASEAN, GCC, etc.
  totalReserves     Decimal  @db.Decimal(32, 8)
  allocatedReserves Decimal  @db.Decimal(32, 8)
  availableReserves Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, suspended, archived
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  allocations       GruReserveAllocation[]
  stabilizationFunds GruRegionalStabilizationFund[]

  @@index([reserveId])
  @@index([reserveClass])
  @@index([reserveType])
  @@index([jurisdiction])
  @@index([status])
  @@map("gru_supranational_reserves")
}

model GruReserveAllocation {
  id                String   @id @default(uuid())
  allocationId      String   @unique
  reserveId         String
  sovereignBankId   String
  allocationQuota   Decimal  @db.Decimal(32, 8)
  allocatedAmount   Decimal  @db.Decimal(32, 8)
  utilizationRate   Decimal? @db.Decimal(32, 8)
  status            String   @default("active") // active, suspended, revoked
  allocatedAt       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserve           GruSupranationalReserve @relation(fields: [reserveId], references: [id], onDelete: Cascade)

  @@index([allocationId])
  @@index([reserveId])
  @@index([sovereignBankId])
  @@index([status])
  reserveClass              GruSupranationalReserveClass[]
  pool                      GruReservePool[]
  @@map("gru_reserve_allocations")
}

model GruRegionalStabilizationFund {
  id                String   @id @default(uuid())
  fundId            String   @unique
  reserveId         String
  fundName          String
  region            String   // EU, AU, ASEAN, GCC, etc.
  fundSize          Decimal  @db.Decimal(32, 8)
  availableFunds    Decimal  @db.Decimal(32, 8)
  utilizationRate   Decimal? @db.Decimal(32, 8)
  status            String   @default("active") // active, depleted, suspended
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reserve           GruSupranationalReserve @relation(fields: [reserveId], references: [id], onDelete: Cascade)

  @@index([fundId])
  @@index([reserveId])
  @@index([region])
  @@index([status])
  @@map("gru_regional_stabilization_funds")
}

model GruSdrAlternative {
  id                String   @id @default(uuid())
  sdrId             String   @unique
  compositionType   String   // GRU_BACKED_SDR
  gruWeight         Decimal  @db.Decimal(32, 8) // 0.4 (40%)
  xauWeight         Decimal  @db.Decimal(32, 8) // 0.3 (30%)
  basketWeight      Decimal  @db.Decimal(32, 8) // 0.3 (30%)
  basketCurrencies  Json     // Array of currencies and weights
  baseValue         Decimal  @db.Decimal(32, 12)
  currentValue      Decimal  @db.Decimal(32, 12)
  status            String   @default("active") // active, suspended
  effectiveDate     DateTime @default(now())
  updatedAt         DateTime @updatedAt
  createdAt         DateTime @default(now())

  @@index([sdrId])
  @@index([compositionType])
  @@index([status])
  @@map("gru_sdr_alternatives")
}

model GruStressTestResult {
  id                String   @id @default(uuid())
  resultId          String   @unique
  testId            String
  testName          String
  stressRegime      String
  metricName        String
  metricValue       Decimal  @db.Decimal(32, 12)
  threshold         Decimal? @db.Decimal(32, 12)
  passed            Boolean?
  impactLevel       String?  // low, medium, high, critical
  details           Json?    // Detailed result data
  timestamp         DateTime @default(now())
  temporalOffset    Int?     // For temporal tests: t-12 to t+60
  createdAt         DateTime @default(now())

  test              GruStressTest @relation(fields: [testId], references: [id], onDelete: Cascade)

  @@index([resultId])
  @@index([testId])
  @@index([stressRegime])
  @@index([metricName])
  @@index([timestamp])
  @@map("gru_stress_test_results")
}

model GruMonetaryCouncil {
  id                String   @id @default(uuid())
  councilId         String   @unique
  councilName       String
  authorityLevel    String   // DBIS, OMDN_CB, GRU_MONETARY_COUNCIL
  jurisdiction      String?
  issuanceAuthority Boolean @default(true)
  approvalRequired  Boolean @default(true)
  status            String   @default("active") // active, suspended
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([councilId])
  @@index([authorityLevel])
  @@index([status])
  @@map("gru_monetary_councils")
}

// ============================================================================
// DBIS GRU Volume II: Supranational Reserve Framework
// ============================================================================

model SupranationalEntity {
  id                String   @id @default(uuid())
  entityId          String   @unique
  entityCode        String   @unique // EU, AU, ASEAN, GCC, MERCOSUR, Indo-Pacific
  entityName        String
  entityType        String   // regional_union, monetary_alliance, strategic_cluster
  description       String   @db.Text
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  reservePools      GruReservePool[]
  members           SupranationalEntityMember[]

  @@index([entityId])
  @@index([entityCode])
  @@index([entityType])
  @@index([status])
  issuances                 GruIssuance[]
  reserveClasses            GruSupranationalReserveClass[]
  @@map("supranational_entities")
}

model SupranationalEntityMember {
  id                String   @id @default(uuid())
  memberId          String   @unique
  entityId          String
  sovereignBankId   String
  membershipType    String   // full_member, associate_member, observer
  status            String   @default("active") // active, suspended
  joinedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            SupranationalEntity @relation(fields: [entityId], references: [id], onDelete: Cascade)
  sovereignBank     SovereignBank @relation(fields: [sovereignBankId], references: [id], onDelete: Cascade)

  @@index([memberId])
  @@index([entityId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("supranational_entity_members")
}

model GruSupranationalReserveClass {
  id                String   @id @default(uuid())
  reserveClassId    String   @unique
  classType         String   @unique // SR-1, SR-2, SR-3
  className         String
  description       String   @db.Text
  roles             Json     // Array of roles (anchor unit, crisis stabilization, etc.)
  functions         Json     // Array of functions (regional reserve pooling, FX corridor stabilization, etc.)
  entityId          String?
  status            String   @default("active") // active, suspended
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            SupranationalEntity? @relation(fields: [entityId], references: [id], onDelete: SetNull)
  allocations       GruReserveAllocation[]

  @@index([reserveClassId])
  @@index([classType])
  @@index([entityId])
  @@index([status])
  @@map("gru_supranational_reserve_classes")
}

model GruReservePool {
  id                String   @id @default(uuid())
  poolId            String   @unique
  poolType          String   // global, regional, strategic
  poolName          String
  entityId          String?
  totalReserves     Decimal  @default(0) @db.Decimal(32, 8)
  availableReserves Decimal  @default(0) @db.Decimal(32, 8)
  reservedReserves  Decimal  @default(0) @db.Decimal(32, 8)
  currencyCode      String?
  assetType         String   // multi_asset, gru_only, commodity_backed
  status            String   @default("active") // active, suspended, closed
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            SupranationalEntity? @relation(fields: [entityId], references: [id], onDelete: SetNull)
  allocations       GruReserveAllocation[]
  settlements       GruSupranationalSettlement[]
  certificates      GruReserveCertificate[]

  @@index([poolId])
  @@index([poolType])
  @@index([entityId])
  @@index([status])
  withdrawals               GruReserveWithdrawal[]
  bonds                     GruReserveBond[]
  @@map("gru_reserve_pools")
}

model GruReserveWithdrawal {
  id                String   @id @default(uuid())
  withdrawalId      String   @unique
  poolId            String
  sovereignBankId   String?
  entityId          String?
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String?
  withdrawalType    String   // liquidity_access, crisis_intervention, fx_stabilization
  approvalStatus    String   @default("pending") // pending, approved, rejected, executed
  approvedAt        DateTime?
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GruReservePool @relation(fields: [poolId], references: [id], onDelete: Cascade)

  @@index([withdrawalId])
  @@index([poolId])
  @@index([sovereignBankId])
  @@index([entityId])
  @@map("gru_reserve_withdrawals")
}

model GruSdrInstrument {
  id                String   @id @default(uuid())
  sdrId             String   @unique
  sdrName           String   @default("SDR_GRU")
  gruWeight         Decimal  @default(0.40) @db.Decimal(32, 8) // 40%
  xauWeight         Decimal  @default(0.30) @db.Decimal(32, 8) // 30%
  fxBasketWeight    Decimal  @default(0.30) @db.Decimal(32, 8) // 30%
  composition       Json     // Detailed composition breakdown
  currentValue      Decimal  @db.Decimal(32, 12)
  valuationDate     DateTime @default(now())
  fxBasket          Json     // USD/EUR/CNY/etc. weights
  status            String   @default("active") // active, suspended
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  valuations        GruSdrValuation[]
  transactions      GruSdrTransaction[]

  @@index([sdrId])
  @@index([status])
  @@index([valuationDate])
  @@map("gru_sdr_instruments")
}

model GruSdrValuation {
  id                String   @id @default(uuid())
  valuationId       String   @unique
  sdrId             String
  gruValue          Decimal  @db.Decimal(32, 12)
  xauValue          Decimal  @db.Decimal(32, 12)
  fxBasketValue     Decimal  @db.Decimal(32, 12)
  totalValue        Decimal  @db.Decimal(32, 12)
  valuationDate     DateTime @default(now())
  metadata          Json?    // Additional valuation details
  createdAt         DateTime @default(now())

  sdr               GruSdrInstrument @relation(fields: [sdrId], references: [id], onDelete: Cascade)

  @@index([valuationId])
  @@index([sdrId])
  @@index([valuationDate])
  @@map("gru_sdr_valuations")
}

model GruSdrTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  sdrId             String
  transactionType   String   // conversion, allocation, redemption
  amount            Decimal  @db.Decimal(32, 8)
  sourceCurrency    String?
  targetCurrency    String?
  conversionRate    Decimal? @db.Decimal(32, 12)
  status            String   @default("pending") // pending, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sdr               GruSdrInstrument @relation(fields: [sdrId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([sdrId])
  @@index([transactionType])
  @@index([status])
  @@map("gru_sdr_transactions")
}

model GruReserveCertificate {
  id                String   @id @default(uuid())
  certificateId     String   @unique
  certificateCode   String   @unique // GRC-XXXX-XXXX
  poolId            String
  allocationId      String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String?
  assetType         String?
  holderId          String   // sovereignBankId or entityId
  holderType        String   // sovereign_bank, supranational_entity
  status            String   @default("active") // active, redeemed, suspended
  issuedAt          DateTime @default(now())
  redeemedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GruReservePool @relation(fields: [poolId], references: [id], onDelete: Cascade)

  @@index([certificateId])
  @@index([certificateCode])
  @@index([poolId])
  @@index([allocationId])
  @@index([holderId])
  @@index([status])
  @@map("gru_reserve_certificates")
}

model GruReserveBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondCode          String   @unique // GRB-XXXX-XXXX
  poolId            String?
  entityId          String?
  principalAmount   Decimal  @db.Decimal(32, 8)
  maturityYears     Int      // 5-50 years
  maturityDate      DateTime
  interestRate      Decimal  @db.Decimal(32, 8)
  couponRate         Decimal  @db.Decimal(32, 8)
  couponFrequency   String   // quarterly, semi_annual, annual
  bondType          String   // supranational_reserve_bond
  status            String   @default("active") // active, matured, defaulted, redeemed
  issuedAt          DateTime @default(now())
  redeemedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GruReservePool? @relation(fields: [poolId], references: [id], onDelete: SetNull)
  coupons           GruReserveBondCoupon[]

  @@index([bondId])
  @@index([bondCode])
  @@index([poolId])
  @@index([entityId])
  @@index([status])
  @@index([maturityDate])
  @@map("gru_reserve_bonds")
}

model GruReserveBondCoupon {
  id                String   @id @default(uuid())
  couponId          String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  status            String   @default("pending") // pending, paid, failed
  paidAt            DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruReserveBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([couponId])
  @@index([bondId])
  @@index([paymentDate])
  @@index([status])
  @@map("gru_reserve_bond_coupons")
}

model GruSupranationalSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  poolId            String
  atomicSettlementId String?
  gruIndexState     Json     // GRU index state snapshot
  xauState          Json     // XAU state snapshot
  regionalFxBasket  Json     // Regional FX basket state
  omegaLayerState   Json?    // Ω-Layer truth state
  gasConfirmation   String?  // GAS atomic confirmation
  gqlTruthSample    String?  // GQL truth sampling
  settlementAmount  Decimal  @db.Decimal(32, 8)
  currencyCode      String
  status            String   @default("pending") // pending, merged, confirmed, failed
  mergedAt          DateTime?
  confirmedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pool              GruReservePool @relation(fields: [poolId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([poolId])
  @@index([atomicSettlementId])
  @@index([status])
  @@map("gru_supranational_settlements")
}

// GRU Institutional Whitepaper: Regulatory Classifications & Governance

model GruRegulatoryClassification {
  id                String   @id @default(uuid())
  classificationId  String   @unique
  entityId          String   // Sovereign bank ID or supranational entity ID
  entityType        String   // sovereign_bank, supranational_council, regional_union, institution, commercial
  regulatoryClass   String   // SR-1, SR-2, SR-3, M0, M1
  accessLevel       String   // global_reserve, stabilization, commodity_reserves, operational_liquidity, market_instruments
  eligibilityStatus String  @default("pending") // pending, eligible, ineligible, suspended
  eligibilityReviewDate DateTime?
  reserveAdequacy   Boolean  @default(false)
  legalRecognition  Boolean  @default(false) // Legal recognition of DBIS oversight
  ilieVerified      Boolean  @default(false) // ILIE identity verification
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            GruSupranationalEntity? @relation(fields: [entityId], references: [id], onDelete: Cascade)
  reviews           GruEligibilityReview[]

  @@index([classificationId])
  @@index([entityId])
  @@index([regulatoryClass])
  @@index([eligibilityStatus])
  @@index([status])
  @@map("gru_regulatory_classifications")
}

model GruSupranationalEntity {
  id                String   @id @default(uuid())
  entityId          String   @unique
  entityName        String
  entityType        String   // supranational_council, regional_union, dbis, regional_reserve_council
  region            String?
  memberSovereigns  Json?    // Array of sovereign bank IDs
  ilieIdentityId     String?  // ILIE identity reference
  status            String   @default("active") // active, suspended, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  classifications   GruRegulatoryClassification[]
  applications      GruIssuanceApplication[]

  @@index([entityId])
  @@index([entityType])
  @@index([status])
  @@map("gru_supranational_entities")
}

// GRU Institutional Whitepaper: Legal Framework

model GruLegalFramework {
  id                String   @id @default(uuid())
  frameworkId       String   @unique
  frameworkType     String   // SMIA, DRGC, IMCP
  frameworkName     String
  description       String   @db.Text
  complianceRequired Boolean @default(true)
  status            String   @default("active") // active, superseded, deprecated
  effectiveDate     DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  complianceRecords GruComplianceRecord[]

  @@index([frameworkId])
  @@index([frameworkType])
  @@index([status])
  @@map("gru_legal_frameworks")
}

model GruComplianceRecord {
  id                String   @id @default(uuid())
  recordId          String   @unique
  issuanceId        String?
  frameworkId       String
  complianceType    String   // ISO_4217, ISO_6166, ICC_UCP_600, FATF_AML_CTF, SMIA, DRGC, IMCP
  complianceStatus  String   @default("pending") // pending, compliant, non_compliant, exempt
  verificationDate DateTime?
  verifiedBy        String?  // System or auditor ID
  details           Json?    // Compliance verification details
  notes             String?  @db.Text
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  issuance          GruIssuance? @relation(fields: [issuanceId], references: [issuanceId], onDelete: SetNull)
  framework         GruLegalFramework @relation(fields: [frameworkId], references: [frameworkId], onDelete: Cascade)

  @@index([recordId])
  @@index([issuanceId])
  @@index([frameworkId])
  @@index([complianceType])
  @@index([complianceStatus])
  @@map("gru_compliance_records")
}

// GRU Institutional Whitepaper: Issuance Governance

model GruIssuanceApplication {
  id                String   @id @default(uuid())
  applicationId     String   @unique
  entityId          String   // Supranational entity or sovereign bank ID
  entityType        String   // supranational_entity, sovereign_bank
  requestedAmount   Decimal  @db.Decimal(32, 8)
  requestedUnitType String   // M00, M0, M1
  requestedIndexLink String  // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  regulatoryClass   String?  // SR-1, SR-2, SR-3, M0, M1
  status            String   @default("submitted") // submitted, eligibility_review, index_validation, allocation, registration, gas_settlement, omega_finality, approved, rejected
  currentStep       String   @default("application") // application, eligibility_review, index_validation, allocation, registration, gas_settlement, omega_finality
  submittedAt       DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  entity            GruSupranationalEntity? @relation(fields: [entityId], references: [id], onDelete: Cascade)
  eligibilityReview GruEligibilityReview?
  indexValidation   GruIndexValidation?
  allocation        GruAllocationRecord?

  @@index([applicationId])
  @@index([entityId])
  @@index([status])
  @@index([currentStep])
  @@map("gru_issuance_applications")
}

model GruEligibilityReview {
  id                String   @id @default(uuid())
  reviewId          String   @unique
  applicationId     String?  @unique
  classificationId  String?
  reviewType        String   // initial, periodic, appeal
  sovereignStatus   Boolean  @default(false) // Sovereign or recognized supranational entity
  reserveAdequacy    Boolean  @default(false)
  legalRecognition   Boolean  @default(false) // Legal recognition of DBIS oversight
  ilieVerification   Boolean  @default(false) // Identity verification via ILIE
  reviewResult      String   @default("pending") // pending, approved, rejected, conditional
  reviewNotes       String?  @db.Text
  reviewedBy        String?  // System or reviewer ID
  reviewedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  application       GruIssuanceApplication? @relation(fields: [applicationId], references: [applicationId], onDelete: Cascade)
  classification    GruRegulatoryClassification? @relation(fields: [classificationId], references: [classificationId], onDelete: SetNull)

  @@index([reviewId])
  @@index([applicationId])
  @@index([reviewResult])
  @@map("gru_eligibility_reviews")
}

model GruIndexValidation {
  id                String   @id @default(uuid())
  validationId      String   @unique
  applicationId     String?  @unique
  indexCode         String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  indexValue        Decimal  @db.Decimal(32, 12)
  validationResult   String   @default("pending") // pending, valid, invalid, requires_review
  validationNotes    String?  @db.Text
  validatedBy        String?  // System or validator ID
  validatedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  application       GruIssuanceApplication? @relation(fields: [applicationId], references: [applicationId], onDelete: Cascade)

  @@index([validationId])
  @@index([applicationId])
  @@index([indexCode])
  @@map("gru_index_validations")
}

model GruAllocationRecord {
  id                String   @id @default(uuid())
  allocationId      String   @unique
  applicationId     String?  @unique
  issuanceId        String?
  allocatedAmount   Decimal  @db.Decimal(32, 8)
  allocatedUnitType String   // M00, M0, M1
  allocationDate    DateTime @default(now())
  status            String   @default("allocated") // allocated, registered, settled
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  application       GruIssuanceApplication? @relation(fields: [applicationId], references: [applicationId], onDelete: Cascade)

  @@index([allocationId])
  @@index([applicationId])
  @@index([issuanceId])
  @@map("gru_allocation_records")
}

// GRU Institutional Whitepaper: Settlement Pipeline

model GruSettlementPipeline {
  id                String   @id @default(uuid())
  pipelineId        String   @unique
  issuanceId        String?
  applicationId     String?
  pipelineStage     String   @default("classical") // classical, quantum, omega_layer, completed
  classicalState    Json?    // Classical settlement state
  quantumState      Json?    // Quantum settlement state
  omegaLayerState   Json?    // Ω-Layer finality state
  gasSettlementId   String?  // GAS atomic network settlement ID
  omegaFinalityId    String?  // Ω-Layer finality record ID
  status            String   @default("pending") // pending, classical_initiated, quantum_initiated, omega_initiated, completed, failed
  initiatedAt       DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  gasSettlement     GruGasSettlement?
  omegaFinality     GruOmegaLayerFinality?

  @@index([pipelineId])
  @@index([issuanceId])
  @@index([applicationId])
  @@index([pipelineStage])
  @@index([status])
  issuance                  GruIssuance? @relation(fields: [issuanceId], references: [id], onDelete: SetNull)
  @@map("gru_settlement_pipelines")
}

model GruGasSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  pipelineId        String?  @unique
  gasTransactionId  String   // GAS atomic network transaction ID
  atomicNetwork     String   // GAS atomic network identifier
  settlementAmount  Decimal  @db.Decimal(32, 8)
  currencyCode      String
  atomicConfirmation String? // GAS atomic confirmation hash
  status            String   @default("pending") // pending, atomic_confirmed, failed
  confirmedAt      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pipeline          GruSettlementPipeline? @relation(fields: [pipelineId], references: [pipelineId], onDelete: Cascade)

  @@index([settlementId])
  @@index([pipelineId])
  @@index([gasTransactionId])
  @@index([status])
  @@map("gru_gas_settlements")
}

model GruOmegaLayerFinality {
  id                String   @id @default(uuid())
  finalityId        String   @unique
  pipelineId        String?  @unique
  omegaLayerId      String   // Ω-Layer identifier
  mergeOperationId  String?  // Ω-Layer merge operation ID
  finalityProof     String?  // Ω-Layer finality proof
  causalityStable   Boolean  @default(false) // Causality stabilization verified
  multiRealityReconciled Boolean @default(false) // Multi-reality reconciliation verified
  status            String   @default("pending") // pending, merged, finalized, failed
  mergedAt          DateTime?
  finalizedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  pipeline          GruSettlementPipeline? @relation(fields: [pipelineId], references: [pipelineId], onDelete: Cascade)

  @@index([finalityId])
  @@index([pipelineId])
  @@index([omegaLayerId])
  @@index([status])
  @@map("gru_omega_layer_finalities")
}

// GRU Institutional Whitepaper: Transparency & Disclosure

model GruTransparencyReport {
  id                String   @id @default(uuid())
  reportId          String   @unique
  reportType        String   // daily_price_fixing, liquidity_report, bond_health, stress_test, omega_proof
  reportDate        DateTime @default(now())
  reportData        Json     // Report-specific data structure
  status            String   @default("generated") // generated, published, archived
  publishedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([reportId])
  @@index([reportType])
  @@index([reportDate])
  @@index([status])
  @@map("gru_transparency_reports")
}

// GRU Institutional Whitepaper: International Adoption

model GruAdoption {
  id                String   @id @default(uuid())
  adoptionId        String   @unique
  entityId          String   // Sovereign bank or supranational entity ID
  entityType        String   // sovereign_bank, supranational_entity, regional_union
  currentPhase      String   @default("alignment") // alignment, integration, expansion
  alignmentStatus   String   @default("pending") // pending, in_progress, completed
  integrationStatus String   @default("pending") // pending, in_progress, completed
  expansionStatus    String   @default("pending") // pending, in_progress, completed
  regulatorySyncDate DateTime?
  reserveConversionDate DateTime?
  regionalPoolJoinDate DateTime?
  status            String   @default("active") // active, completed, suspended
  initiatedAt       DateTime @default(now())
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([adoptionId])
  @@index([entityId])
  @@index([currentPhase])
  @@index([status])
  @@map("gru_adoptions")
}

// ============================================================================
// GRU Banking Operations Manual (Volume IV): Account Structure & Operations
// ============================================================================

// GRU Account Classes (GRA-0 through GRA-6)
model GruAccount {
  id                String   @id @default(uuid())
  accountId         String   @unique
  accountClass      String   // GRA-0, GRA-1, GRA-2, GRA-3, GRA-4, GRA-5, GRA-6
  entityId          String   // DBIS, SCB, Supranational, Bank, Enterprise ID
  entityType        String   // dbis, scb, supranational, tier1_bank, tier2_bank, enterprise, observational
  accountNumber     String   @unique
  balance           Decimal  @default(0) @db.Decimal(32, 8)
  availableBalance  Decimal  @default(0) @db.Decimal(32, 8)
  reservedBalance   Decimal  @default(0) @db.Decimal(32, 8)
  currencyCode      String   @default("GRU")
  status            String   @default("active") // active, suspended, closed
  openedAt          DateTime @default(now())
  closedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  accountClassDef   GruAccountClass @relation(fields: [accountClass], references: [accountClass], onDelete: Restrict)
  transactions      GruAccountTransaction[]
  reconciliations   GruAccountReconciliation[]

  @@index([accountId])
  @@index([accountClass])
  @@index([entityId])
  @@index([accountNumber])
  @@index([status])
  @@map("gru_accounts")
}

model GruAccountClass {
  accountClass      String   @id // GRA-0, GRA-1, GRA-2, GRA-3, GRA-4, GRA-5, GRA-6
  className         String
  entityType        String   // dbis, scb, supranational, tier1_bank, tier2_bank, enterprise, observational
  purpose           String   @db.Text
  permissions       Json     // Account class permissions and restrictions
  status            String   @default("active") // active, deprecated
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  accounts          GruAccount[]

  @@map("gru_account_classes")
}

model GruAccountTransaction {
  id                String   @id @default(uuid())
  transactionId     String   @unique
  accountId         String
  transactionType   String   // spot_conversion, fx_ssu_routing, bond_purchase, bond_redemption, reserve_adjustment, metaverse_on_ramp, metaverse_off_ramp, temporal_settlement
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  referenceId       String?  // Reference to related transaction
  status            String   @default("pending") // pending, completed, failed, reversed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  account           GruAccount @relation(fields: [accountId], references: [id], onDelete: Cascade)

  @@index([transactionId])
  @@index([accountId])
  @@index([transactionType])
  @@index([status])
  @@map("gru_account_transactions")
}

model GruAccountReconciliation {
  id                String   @id @default(uuid())
  reconciliationId String   @unique
  accountId         String
  reconciliationDate DateTime @default(now())
  openingBalance    Decimal  @db.Decimal(32, 8)
  closingBalance    Decimal  @db.Decimal(32, 8)
  expectedBalance   Decimal  @db.Decimal(32, 8)
  variance          Decimal? @db.Decimal(32, 8)
  variancePercent   Decimal? @db.Decimal(32, 8)
  status            String   @default("pending") // pending, reconciled, variance_detected, resolved
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  account           GruAccount @relation(fields: [accountId], references: [id], onDelete: Cascade)

  @@index([reconciliationId])
  @@index([accountId])
  @@index([reconciliationDate])
  @@index([status])
  @@map("gru_account_reconciliations")
}

// Daily Operations Models
model GruDailyOperations {
  id                String   @id @default(uuid())
  operationId       String   @unique
  operationDate     DateTime @default(now())
  operationType     String   // opening, closeout
  ledgerNodesInitialized Boolean @default(false)
  indexEngineSynced Boolean @default(false)
  qekVerified       Boolean @default(false)
  omegaDiagnosticRun Boolean @default(false)
  gasReconciled     Boolean @default(false)
  quantumDriftCorrected Boolean @default(false)
  sovereignExposureUpdated Boolean @default(false)
  complianceSnapshotGenerated Boolean @default(false)
  status            String   @default("in_progress") // in_progress, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  ledgerNodes       GruLedgerNode[]
  indexSyncs        GruIndexSync[]
  qekVerifications  GruQuantumEnvelopeKey[]
  omegaDiagnostics  GruOmegaDiagnostic[]
  closeouts         GruEndOfDayCloseout[]

  @@index([operationId])
  @@index([operationDate])
  @@index([operationType])
  @@index([status])
  @@map("gru_daily_operations")
}

model GruLedgerNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  operationId       String
  nodeType          String   // master, sovereign, regional
  nodeStatus        String   @default("initializing") // initializing, synchronized, failed
  lastSyncAt        DateTime?
  syncStatus        String   @default("pending") // pending, syncing, completed, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  operation         GruDailyOperations @relation(fields: [operationId], references: [id], onDelete: Cascade)

  @@index([nodeId])
  @@index([operationId])
  @@index([nodeStatus])
  @@map("gru_ledger_nodes")
}

model GruIndexSync {
  id                String   @id @default(uuid())
  syncId            String   @unique
  operationId       String
  indexCode         String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  syncStatus        String   @default("pending") // pending, syncing, completed, failed
  lastSyncedValue   Decimal? @db.Decimal(32, 12)
  syncTimestamp     DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  operation         GruDailyOperations @relation(fields: [operationId], references: [id], onDelete: Cascade)

  @@index([syncId])
  @@index([operationId])
  @@index([indexCode])
  @@index([syncStatus])
  @@map("gru_index_syncs")
}

model GruQuantumEnvelopeKey {
  id                String   @id @default(uuid())
  qekId             String   @unique
  operationId       String
  keyId             String
  verificationStatus String @default("pending") // pending, verified, failed
  verificationTimestamp DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  operation         GruDailyOperations @relation(fields: [operationId], references: [id], onDelete: Cascade)

  @@index([qekId])
  @@index([operationId])
  @@index([keyId])
  @@index([verificationStatus])
  @@map("gru_quantum_envelope_keys")
}

model GruOmegaDiagnostic {
  id                String   @id @default(uuid())
  diagnosticId     String   @unique
  operationId       String
  layerId           String   // Ω0, Ω1, Ω2, Ω3, Ω4
  diagnosticStatus  String   @default("pending") // pending, running, completed, failed
  diagnosticResult  Json?    // Diagnostic results
  runTimestamp      DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  operation         GruDailyOperations @relation(fields: [operationId], references: [id], onDelete: Cascade)

  @@index([diagnosticId])
  @@index([operationId])
  @@index([layerId])
  @@index([diagnosticStatus])
  @@map("gru_omega_diagnostics")
}

model GruEndOfDayCloseout {
  id                String   @id @default(uuid())
  closeoutId        String   @unique
  operationId       String
  closeoutDate      DateTime @default(now())
  gasReconciliationStatus String @default("pending") // pending, completed, failed
  quantumDriftCorrectionStatus String @default("pending") // pending, completed, failed
  sovereignExposureUpdateStatus String @default("pending") // pending, completed, failed
  complianceSnapshotStatus String @default("pending") // pending, completed, failed
  status            String   @default("in_progress") // in_progress, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  operation         GruDailyOperations @relation(fields: [operationId], references: [id], onDelete: Cascade)

  @@index([closeoutId])
  @@index([operationId])
  @@index([closeoutDate])
  @@index([status])
  @@map("gru_end_of_day_closeouts")
}

// Liquidity Management Models
model GruLiquidityMonitoring {
  id                String   @id @default(uuid())
  monitoringId      String   @unique
  monitoringDate    DateTime @default(now())
  xauAnchorValue     Decimal  @db.Decimal(32, 8)
  xauAnchorStability Decimal  @db.Decimal(32, 8) // Stability score 0-100
  stabilityStatus   String   @default("stable") // stable, volatile, critical
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([monitoringId])
  @@index([monitoringDate])
  @@index([stabilityStatus])
  @@map("gru_liquidity_monitoring")
}

model GruLiquidityDemand {
  id                String   @id @default(uuid())
  demandId          String   @unique
  demandDate        DateTime @default(now())
  indexCode         String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  demandLevel       Decimal  @db.Decimal(32, 8)
  demandType        String   // normal, elevated, critical
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([demandId])
  @@index([demandDate])
  @@index([indexCode])
  @@map("gru_liquidity_demand")
}

model GruLiquidityPrediction {
  id                String   @id @default(uuid())
  predictionId      String   @unique
  predictionDate    DateTime @default(now())
  timeHorizon       String   // t+1, t+7, t+30, t+90, t+180, t+365
  predictedLiquidity Decimal  @db.Decimal(32, 8)
  confidenceLevel   Decimal  @db.Decimal(32, 8) // 0-100
  modelVersion      String
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([predictionId])
  @@index([predictionDate])
  @@index([timeHorizon])
  @@map("gru_liquidity_predictions")
}

model GruReserveBuffer {
  id                String   @id @default(uuid())
  bufferId          String   @unique
  reserveType       String   // supranational, regional, sovereign
  bufferAmount      Decimal  @db.Decimal(32, 8)
  allocatedAmount   Decimal  @default(0) @db.Decimal(32, 8)
  availableAmount   Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, depleted, replenished
  lastAllocatedAt   DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([bufferId])
  @@index([reserveType])
  @@index([status])
  @@map("gru_reserve_buffers")
}

// Risk Management Models
model GruRiskControl {
  id                String   @id @default(uuid())
  controlId         String   @unique
  controlDate       DateTime @default(now())
  controlType       String   // daily_volatility_screening, sovereign_correlation, fx_corridor, synthetic_market_stress
  controlStatus     String   @default("pending") // pending, passed, failed, warning
  controlResult     Json?    // Control results and metrics
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([controlId])
  @@index([controlDate])
  @@index([controlType])
  @@index([controlStatus])
  @@map("gru_risk_controls")
}

model GruVolatilityScreening {
  id                String   @id @default(uuid())
  screeningId       String   @unique
  screeningDate     DateTime @default(now())
  indexCode         String   // LiXAU, LiPMG, LiBMG1, LiBMG2, LiBMG3
  volatilityLevel   Decimal  @db.Decimal(32, 8)
  volatilityStatus  String   @default("normal") // normal, elevated, critical
  threshold         Decimal? @db.Decimal(32, 8)
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([screeningId])
  @@index([screeningDate])
  @@index([indexCode])
  @@index([volatilityStatus])
  @@map("gru_volatility_screening")
}

model GruSovereignCorrelation {
  id                String   @id @default(uuid())
  correlationId     String   @unique
  correlationDate   DateTime @default(now())
  sovereignBankId1  String
  sovereignBankId2  String
  correlationValue  Decimal  @db.Decimal(32, 8) // -1 to 1
  correlationStatus String @default("normal") // normal, elevated, critical
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([correlationId])
  @@index([correlationDate])
  @@index([sovereignBankId1])
  @@index([sovereignBankId2])
  @@map("gru_sovereign_correlations")
}

model GruFxCorridor {
  id                String   @id @default(uuid())
  corridorId        String   @unique
  monitoringDate    DateTime @default(now())
  currencyPair      String   // e.g., GRU/USD, GRU/EUR
  currentRate       Decimal  @db.Decimal(32, 12)
  upperBound        Decimal  @db.Decimal(32, 12)
  lowerBound         Decimal  @db.Decimal(32, 12)
  corridorStatus    String   @default("within") // within, upper_breach, lower_breach
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([corridorId])
  @@index([monitoringDate])
  @@index([currencyPair])
  @@index([corridorStatus])
  @@map("gru_fx_corridors")
}

model GruSyntheticMarketFlag {
  id                String   @id @default(uuid())
  flagId            String   @unique
  flagDate          DateTime @default(now())
  marketType        String   // synthetic_derivatives, synthetic_liquidity, synthetic_reserves
  stressLevel       String   @default("normal") // normal, elevated, critical
  flagReason        String   @db.Text
  status            String   @default("active") // active, resolved, false_positive
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([flagId])
  @@index([flagDate])
  @@index([marketType])
  @@index([stressLevel])
  @@index([status])
  @@map("gru_synthetic_market_flags")
}

// Compliance & Reporting Models
model GruComplianceSnapshot {
  id                String   @id @default(uuid())
  snapshotId        String   @unique
  snapshotDate      DateTime @default(now())
  snapshotType      String   // daily, monthly, annual
  snapshotData      Json     // Compliance data snapshot
  ariSubmissionStatus String @default("pending") // pending, submitted, confirmed
  ariSubmissionId   String?
  submittedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([snapshotId])
  @@index([snapshotDate])
  @@index([snapshotType])
  @@index([ariSubmissionStatus])
  @@map("gru_compliance_snapshots")
}

// Sub-Volume E: Quantum Proxy Server (QPS)

model QuantumProxyTransaction {
  id                  String   @id @default(uuid())
  proxyTransactionId  String   @unique
  legacyTransactionId String
  legacyProtocol      String   // SWIFT, ISO20022, ACH, SEPA, PRIVATE_BANK
  quantumEnvelopeId   String?
  translationId       String?
  dbisQfsTransactionId String?
  sourceBankId        String
  destinationBankId   String
  amount              Decimal  @db.Decimal(32, 8)
  currencyCode        String
  status              String   @default("pending") // pending, bridged, failed
  bridgedAt           DateTime?
  createdAt           DateTime @default(now())
  updatedAt           DateTime @updatedAt

  envelope            QuantumEnvelope? @relation(fields: [quantumEnvelopeId], references: [envelopeId], onDelete: SetNull)
  translation         QuantumTranslation? @relation(fields: [translationId], references: [translationId], onDelete: SetNull)

  @@index([proxyTransactionId])
  @@index([legacyTransactionId])
  @@index([legacyProtocol])
  @@index([sourceBankId])
  @@index([destinationBankId])
  @@index([status])
  @@map("quantum_proxy_transactions")
}

model QuantumEnvelope {
  id                        String   @id @default(uuid())
  envelopeId                String   @unique
  legacyTransactionId       String
  legacyProtocol            String
  quantumHash               String
  causalConsistencyHash     String
  dimensionalHarmonizationHash String
  transactionData           Json
  status                    String   @default("created") // created, verified, failed
  createdAt                 DateTime @default(now())
  updatedAt                 DateTime @updatedAt

  proxyTransactions         QuantumProxyTransaction[]

  @@index([envelopeId])
  @@index([legacyTransactionId])
  @@index([legacyProtocol])
  @@index([status])
  @@map("quantum_envelopes")
}

model QuantumTranslation {
  id                String   @id @default(uuid())
  translationId     String   @unique
  legacyProtocol    String
  legacyAmount      Decimal  @db.Decimal(32, 8)
  legacyCurrency    String
  quantumAmount     Decimal  @db.Decimal(32, 8)
  quantumCurrency   String
  fxRate            Decimal  @db.Decimal(32, 12)
  riskScore         Decimal  @db.Decimal(32, 8)
  protocolMapping   Json
  transactionData   Json
  status            String   @default("completed") // completed, failed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  proxyTransactions QuantumProxyTransaction[]

  @@index([translationId])
  @@index([legacyProtocol])
  @@index([status])
  @@map("quantum_translations")
}

model LegacyProtocolMapping {
  id                String   @id @default(uuid())
  mappingId         String   @unique
  legacyProtocol    String   // SWIFT, ISO20022, ACH, SEPA, PRIVATE_BANK
  mappingConfig     Json     // Protocol-specific mapping configuration
  status            String   @default("active") // active, deprecated
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([mappingId])
  @@index([legacyProtocol])
  @@index([status])
  @@map("legacy_protocol_mappings")
}

// Sub-Volume C: Metaverse Integration

model MetaverseNode {
  id                      String   @id @default(uuid())
  nodeId                  String   @unique
  metaverseName           String   // e.g., "MetaverseDubai"
  metaverseType           String   // sovereign, private, hybrid
  settlementEndpoint      String
  cbdcOnRampEnabled       Boolean  @default(false)
  cbdcOffRampEnabled      Boolean  @default(false)
  gruOnRampEnabled        Boolean  @default(false)
  gruOffRampEnabled       Boolean  @default(false)
  identityLayer           String   // L3, L4 (ILIE identity layers)
  assetTokenizationEnabled Boolean @default(false)
  status                  String   @default("active") // active, suspended
  createdAt               DateTime @default(now())
  updatedAt               DateTime @updatedAt

  settlements             MetaverseSettlement[]
  identities              MetaverseIdentity[]
  assets                  MetaverseAsset[]
  bridges                 MetaverseBridge[]
  fxTransactionsSource    MetaverseFxTransaction[] @relation("MetaverseFxSource")
  fxTransactionsTarget    MetaverseFxTransaction[] @relation("MetaverseFxTarget")
  dsez                    DigitalSovereignEconomicZone[]
  rampTransactions        MetaverseRampTransaction[]
  computeNodes            MetaverseComputeNode[]

  @@index([nodeId])
  @@index([metaverseName])
  @@index([status])
  @@map("metaverse_nodes")
}

model MetaverseSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  metaverseNodeId   String
  gasSettlementId   String
  sourceBankId      String
  destinationBankId String
  virtualLandId     String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  assetType         String   // virtual_land, virtual_asset, nft
  status            String   @default("pending") // pending, settled, failed
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)

  @@index([settlementId])
  @@index([metaverseNodeId])
  @@index([virtualLandId])
  @@index([status])
  @@map("metaverse_settlements")
}

model MetaverseIdentity {
  id                String   @id @default(uuid())
  identityId        String   @unique
  metaverseNodeId   String
  avatarId          String
  identityLayer     String   // L3, L4
  sovereignBankId   String?
  identityHash       String
  identityData      Json
  status            String   @default("active") // active, suspended, revoked
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)

  @@index([identityId])
  @@index([metaverseNodeId])
  @@index([avatarId])
  @@index([identityLayer])
  @@map("metaverse_identities")
}

model MetaverseAsset {
  id                String   @id @default(uuid())
  assetId           String   @unique
  metaverseNodeId   String
  assetType         String   // virtual_land, virtual_building, nft, token
  assetName         String
  tokenId           String?
  ownerAvatarId     String?
  value             Decimal? @db.Decimal(32, 8)
  currencyCode      String?
  tokenClass        String?  // virtual_land, avatar_asset, business_license, event_rights, data_ownership, ai_companion
  businessLicenseId String?
  eventRights       Json?    // Event rights data
  dataOwnershipTokenId String?
  aiCompanionId     String?
  status            String   @default("active") // active, locked, transferred
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)

  @@index([assetId])
  @@index([metaverseNodeId])
  @@index([assetType])
  @@index([tokenId])
  @@map("metaverse_assets")
}

model MetaverseTokenClass {
  id                String   @id @default(uuid())
  tokenClassId      String   @unique
  tokenClass        String   @unique // virtual_land, avatar_asset, business_license, event_rights, data_ownership, ai_companion
  className         String
  description       String   @db.Text
  metadata          Json?
  status            String   @default("active") // active, deprecated
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([tokenClassId])
  @@index([tokenClass])
  @@map("metaverse_token_classes")
}

model MetaverseFxTransaction {
  id                    String   @id @default(uuid())
  fxTransactionId       String   @unique
  sourceMetaverseNodeId String
  targetMetaverseNodeId String
  sourceAmount          Decimal  @db.Decimal(32, 8)
  targetAmount          Decimal  @db.Decimal(32, 8)
  sourceCurrency        String
  targetCurrency        String
  exchangeRate          Decimal  @db.Decimal(32, 12)
  conversionMethod      String   // ssu, qmu, hmu, direct
  realityType           String?  // classical, quantum, simulated, holographic
  status                String   @default("completed") // completed, failed
  createdAt             DateTime @default(now())
  updatedAt             DateTime @updatedAt

  sourceNode            MetaverseNode @relation("MetaverseFxSource", fields: [sourceMetaverseNodeId], references: [id], onDelete: Cascade)
  targetNode            MetaverseNode @relation("MetaverseFxTarget", fields: [targetMetaverseNodeId], references: [id], onDelete: Cascade)

  @@index([fxTransactionId])
  @@index([sourceMetaverseNodeId])
  @@index([targetMetaverseNodeId])
  @@index([status])
  @@map("metaverse_fx_transactions")
}

model MetaverseBridge {
  id                String   @id @default(uuid())
  bridgeId          String   @unique
  metaverseNodeId   String
  bridgeType        String   // nft_commodity, virtual_securitization, hybrid
  virtualAssetId    String
  physicalAssetId   String?
  nftTokenId        String?
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  status            String   @default("active") // active, dissolved
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)

  @@index([bridgeId])
  @@index([metaverseNodeId])
  @@index([bridgeType])
  @@index([virtualAssetId])
  @@index([nftTokenId])
  @@map("metaverse_bridges")
}

// ============================================================================
// DBIS Supplement B: MetaverseDubai Integration Framework - D-SEZ Model
// ============================================================================

model DigitalSovereignEconomicZone {
  id                      String   @id @default(uuid())
  dsezId                  String   @unique
  metaverseNodeId         String
  sovereignBankId         String?
  virtualCitizenshipEnabled Boolean @default(false)
  digitalLandEnabled      Boolean  @default(false)
  tokenizedFxEnabled      Boolean  @default(false)
  liquidityFlowEnabled    Boolean  @default(false)
  status                  String   @default("active") // active, suspended, inactive
  metadata                Json?
  createdAt               DateTime @default(now())
  updatedAt               DateTime @updatedAt

  node                    MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)
  sovereignBank           SovereignBank? @relation(fields: [sovereignBankId], references: [id], onDelete: SetNull)
  rampTransactions        MetaverseRampTransaction[]
  consistencyChecks       MetaverseConsistencyCheck[]

  @@index([dsezId])
  @@index([metaverseNodeId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("digital_sovereign_economic_zones")
}

model MetaverseRampTransaction {
  id                String   @id @default(uuid())
  rampId            String   @unique
  dsezId            String
  rampType          String   // on_ramp, off_ramp
  sourceType        String   // fiat, cbdc, gru, ssu, virtual_currency, tokenized_asset
  targetType        String   // fiat, cbdc, gru, ssu, virtual_currency, tokenized_asset
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  metaverseNodeId   String
  sourceBankId      String?
  destinationBankId String?
  exchangeRate      Decimal? @db.Decimal(32, 12)
  status            String   @default("pending") // pending, processing, completed, failed
  validationHash    String?
  complianceCheck   Boolean  @default(false)
  processedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  dsez              DigitalSovereignEconomicZone @relation(fields: [dsezId], references: [id], onDelete: Cascade)
  node              MetaverseNode @relation(fields: [metaverseNodeId], references: [id], onDelete: Cascade)

  @@index([rampId])
  @@index([dsezId])
  @@index([metaverseNodeId])
  @@index([rampType])
  @@index([status])
  @@index([createdAt])
  @@map("metaverse_ramp_transactions")
}

model MetaverseComputeNode {
  id                String   @id @default(uuid())
  nodeId            String   @unique
  nodeType          String   // MGN, SAN, ZKN, QGN
  regionId          String
  metaverseNodeId   String?
  latency           Int      // milliseconds
  gpuCapacity       Int      // GPU units
  networkAddress    String
  sixGEnabled       Boolean  @default(false)
  zkVerificationEnabled Boolean @default(false)
  holographicRenderingEnabled Boolean @default(false)
  status            String   @default("active") // active, degraded, offline
  metadata          Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              MetaverseNode? @relation(fields: [metaverseNodeId], references: [id], onDelete: SetNull)

  @@index([nodeId])
  @@index([nodeType])
  @@index([regionId])
  @@index([metaverseNodeId])
  @@index([status])
  @@map("metaverse_compute_nodes")
}

model MetaverseConsistencyCheck {
  id                String   @id @default(uuid())
  checkId           String   @unique
  dsezId            String
  mdxState          Json?    // MetaverseDubai state
  primeState        Json?    // DBIS Prime state
  parallelState     Json?    // Parallel state
  mergedState       Json?    // Ω-Merge result
  consistencyStatus String   @default("pending") // pending, consistent, inconsistent
  identityCoherence Boolean  @default(false)
  assetRealityMapping Boolean @default(false)
  omegaValidation   Boolean  @default(false)
  checkedAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  dsez              DigitalSovereignEconomicZone @relation(fields: [dsezId], references: [id], onDelete: Cascade)

  @@index([checkId])
  @@index([dsezId])
  @@index([consistencyStatus])
  @@index([checkedAt])
  @@map("metaverse_consistency_checks")
}

// Sub-Volume D: Edge/Last-Mile GPU for Metaverse in 325 Regions over 6G

model GpuEdgeNode {
  id                        String   @id @default(uuid())
  nodeId                    String   @unique
  nodeType                  String   // MGN, QGN, ZKN, SAN
  regionId                  String
  nodeName                  String
  gpuCapacity               Int      // GPU units
  networkAddress            String
  quantumSafeTunnelingEnabled Boolean @default(false)
  status                    String   @default("active") // active, degraded, offline
  createdAt                 DateTime @default(now())
  updatedAt                 DateTime @updatedAt

  region                    GpuEdgeRegion @relation(fields: [regionId], references: [regionId], onDelete: Cascade)
  tasks                     GpuEdgeTask[]

  @@index([nodeId])
  @@index([nodeType])
  @@index([regionId])
  @@index([status])
  @@map("gpu_edge_nodes")
}

model GpuEdgeRegion {
  id                String   @id @default(uuid())
  regionId          String   @unique
  regionName        String
  status            String   @default("active") // active, inactive
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  nodes             GpuEdgeNode[]
  deployments       GpuEdgeDeployment[]

  @@index([regionId])
  @@index([status])
  @@map("gpu_edge_regions")
}

model GpuEdgeDeployment {
  id                String   @id @default(uuid())
  deploymentId      String   @unique
  regionId          String
  nodeTypes         Json     // Array of node types
  nodesCreated      Json     // Array of node IDs
  status            String   @default("pending") // pending, completed, failed
  deployedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  region            GpuEdgeRegion @relation(fields: [regionId], references: [regionId], onDelete: Cascade)

  @@index([deploymentId])
  @@index([regionId])
  @@index([status])
  @@map("gpu_edge_deployments")
}

model GpuEdgeTask {
  id                String   @id @default(uuid())
  taskId            String   @unique
  nodeId            String
  taskType          String   // metaverse_rendering, quantum_proxy, zk_validation, ai_behavioral, health_check
  status            String   @default("pending") // pending, running, completed, failed
  result            Json?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  node              GpuEdgeNode @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@index([taskId])
  @@index([nodeId])
  @@index([taskType])
  @@index([status])
  @@map("gpu_edge_tasks")
}

model GpuEdgeNetwork {
  id                String   @id @default(uuid())
  routeId           String   @unique
  sourceRegionId    String
  targetRegionId    String
  sourceNodeId      String
  targetNodeId      String
  path              Json     // Array of node IDs
  estimatedLatency  Decimal  @db.Decimal(32, 8) // Milliseconds
  quantumSafe       Boolean  @default(false)
  latencyRequirement Decimal @db.Decimal(32, 8) // <1ms default
  status            String   @default("active") // active, expired
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([routeId])
  @@index([sourceRegionId])
  @@index([targetRegionId])
  @@index([status])
  @@map("gpu_edge_networks")
}

// Sub-Volume F: System Gap Audit & Technology Completion Engine

model GapAudit {
  id                String   @id @default(uuid())
  auditId           String   @unique
  auditScope        Json     // Array of system scopes
  gapsFound         Int      @default(0)
  modulesGenerated  Int      @default(0)
  recommendationsCount Int   @default(0)
  status            String   @default("pending") // pending, running, completed, failed
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  detections        GapDetection[]
  recommendations   SystemRecommendation[]

  @@index([auditId])
  @@index([status])
  @@map("gap_audits")
}

model GapDetection {
  id                String   @id @default(uuid())
  detectionId       String   @unique
  auditId           String
  gapType           String   // multiverse_settlement_layer, quantum_financial_interface, etc.
  systemScope       String   // multiverse, temporal, quantum, cognitive, dlt, metaverse
  description       String   @db.Text
  severity          String   // low, medium, high, critical
  status            String   @default("detected") // detected, resolved, ignored
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  audit             GapAudit @relation(fields: [auditId], references: [id], onDelete: Cascade)

  @@index([detectionId])
  @@index([auditId])
  @@index([gapType])
  @@index([systemScope])
  @@index([severity])
  @@map("gap_detections")
}

model GeneratedModule {
  id                String   @id @default(uuid())
  moduleId          String   @unique
  gapType           String
  moduleType        String   // settlement, quantum, metaverse, fx, identity
  status            String   @default("generated") // generated, implemented, deprecated
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([moduleId])
  @@index([gapType])
  @@index([moduleType])
  @@index([status])
  @@map("generated_modules")
}

model SystemRecommendation {
  id                String   @id @default(uuid())
  recommendationId String   @unique
  auditId           String
  recommendationType String  // settlement_layer, synthetic_assets, ai_supervisory, etc.
  title             String
  description       String   @db.Text
  priority          String   // low, medium, high, critical
  status            String   @default("pending") // pending, approved, implemented, rejected
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  audit             GapAudit @relation(fields: [auditId], references: [id], onDelete: Cascade)

  @@index([auditId])
  @@index([recommendationType])
  @@index([priority])
  @@index([status])
  @@map("system_recommendations")
}

model GapType {
  id                String   @id @default(uuid())
  gapTypeId         String   @unique
  gapType           String   @unique
  description       String   @db.Text
  autoGenerate      Boolean  @default(false)
  status            String   @default("active")
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([gapTypeId])
  @@index([gapType])
  @@index([status])
  @@map("gap_types")
}

// ============================================================================
// DBIS Volume III: Global Bond Markets & Synthetic Liquidity Systems
// ============================================================================

// Synthetic GRU Bond Instruments
model SyntheticGruBond {
  id                String   @id @default(uuid())
  syntheticBondId   String   @unique
  instrumentType    String   // sGRU-BND, sGRU-ETF, sGRU-FWD, sGRU-SWAP
  bondId            String?  // Reference to underlying GRU bond
  underlyingBonds   Json?    // Array of underlying bond IDs for basket/ETF
  principalAmount   Decimal  @db.Decimal(32, 8)
  currentPrice      Decimal? @db.Decimal(32, 12)
  nav               Decimal? @db.Decimal(32, 12) // For ETF
  forwardPrice      Decimal? @db.Decimal(32, 12) // For FWD
  swapRate          Decimal? @db.Decimal(32, 12) // For SWAP
  sovereignBankId   String
  issuerId          String?  // Synthetic instrument issuer
  maturityDate      DateTime?
  settlementDate    DateTime? // For forward contracts
  status            String   @default("active") // active, expired, settled, closed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruBond? @relation("SyntheticGruBondToGruBond", fields: [bondId], references: [bondId], onDelete: SetNull)
  pricing            GruBondPricing[] @relation("GruBondPricingToSynthetic")
  pricingHistory     BondPricingHistory[] @relation("BondPricingHistoryToSynthetic")
  settlements        GruBondSettlement[] @relation("GruBondSettlementToSynthetic")
  riskAssessments    BondRiskAssessment[] @relation("BondRiskAssessmentToSynthetic")

  @@index([syntheticBondId])
  @@index([instrumentType])
  @@index([bondId])
  @@index([sovereignBankId])
  @@index([status])
  @@map("synthetic_gru_bonds")
}

// GRU Bond Market Structure
model GruBondMarket {
  id                String   @id @default(uuid())
  marketId          String   @unique
  marketLayer       String   // primary, supranational, sovereign, institutional, retail
  marketName        String
  description       String   @db.Text
  minInvestment     Decimal? @db.Decimal(32, 8)
  maxInvestment     Decimal? @db.Decimal(32, 8)
  participantTypes  Json     // Array of allowed participant types
  status            String   @default("active") // active, suspended, closed
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  participants      BondMarketParticipant[]
  bondListings      BondMarketListing[]

  @@index([marketId])
  @@index([marketLayer])
  @@index([status])
  @@map("gru_bond_markets")
}

model BondMarketParticipant {
  id                String   @id @default(uuid())
  participantId     String   @unique
  marketId          String
  sovereignBankId   String?
  participantType   String   // scb, supranational, institutional, retail, quantum_node, holographic_node
  participantName   String
  accessLevel       String   // full, limited, synthetic_only
  status            String   @default("active") // active, suspended, revoked
  approvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  market            GruBondMarket @relation(fields: [marketId], references: [id], onDelete: Cascade)
  sovereignBank     SovereignBank? @relation("BondMarketParticipantToSovereignBank", fields: [sovereignBankId], references: [id], onDelete: SetNull)

  @@index([participantId])
  @@index([marketId])
  @@index([sovereignBankId])
  @@index([participantType])
  @@index([status])
  @@map("bond_market_participants")
}

model BondMarketListing {
  id                String   @id @default(uuid())
  listingId         String   @unique
  marketId           String
  bondId             String?  // GRU bond ID
  syntheticBondId    String?  // Synthetic bond ID
  listingType        String   // primary, secondary
  listingPrice       Decimal? @db.Decimal(32, 12)
  quantity           Decimal? @db.Decimal(32, 8)
  status             String   @default("active") // active, filled, cancelled, expired
  listedAt           DateTime @default(now())
  filledAt           DateTime?
  createdAt          DateTime @default(now())
  updatedAt          DateTime @updatedAt

  market             GruBondMarket @relation(fields: [marketId], references: [id], onDelete: Cascade)

  @@index([listingId])
  @@index([marketId])
  @@index([bondId])
  @@index([syntheticBondId])
  @@index([status])
  @@map("bond_market_listings")
}

// GRU Bond Pricing
model GruBondPricing {
  id                String   @id @default(uuid())
  pricingId         String   @unique
  bondId            String?  // GRU bond ID
  syntheticBondId   String?  // Synthetic bond ID
  pricingModel      String   // base, discounted_acquisition, liquidity_loop_linked
  basePrice         Decimal  @db.Decimal(32, 12)
  indexAdjustment   Decimal? @db.Decimal(32, 12)
  liquidityAdjustment Decimal? @db.Decimal(32, 12)
  riskAdjustment    Decimal? @db.Decimal(32, 12)
  finalPrice        Decimal  @db.Decimal(32, 12)
  yield              Decimal? @db.Decimal(32, 12)
  discountRate      Decimal? @db.Decimal(32, 12)
  calculationDetails Json?   // Detailed calculation breakdown
  calculatedAt      DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruBond? @relation("GruBondPricingToGruBond", fields: [bondId], references: [bondId], onDelete: SetNull)
  syntheticBond     SyntheticGruBond? @relation("GruBondPricingToSynthetic", fields: [syntheticBondId], references: [syntheticBondId], onDelete: SetNull)

  @@index([pricingId])
  @@index([bondId])
  @@index([syntheticBondId])
  @@index([pricingModel])
  @@index([calculatedAt])
  @@map("gru_bond_pricing")
}

model BondPricingHistory {
  id                String   @id @default(uuid())
  historyId         String   @unique
  bondId            String?
  syntheticBondId   String?
  price             Decimal  @db.Decimal(32, 12)
  yield             Decimal? @db.Decimal(32, 12)
  volume            Decimal? @db.Decimal(32, 8)
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())

  bond              GruBond? @relation("BondPricingHistoryToGruBond", fields: [bondId], references: [bondId], onDelete: SetNull)
  syntheticBond     SyntheticGruBond? @relation("BondPricingHistoryToSynthetic", fields: [syntheticBondId], references: [syntheticBondId], onDelete: SetNull)

  @@index([historyId])
  @@index([bondId])
  @@index([syntheticBondId])
  @@index([timestamp])
  @@map("bond_pricing_history")
}

// Synthetic Liquidity Systems
model SyntheticLiquidityEngine {
  id                String   @id @default(uuid())
  engineId          String   @unique
  engineType        String   // GSE, GLP, ID-SLG, TRLM
  engineName        String
  description       String   @db.Text
  totalLiquidity     Decimal  @default(0) @db.Decimal(32, 8)
  availableLiquidity Decimal @default(0) @db.Decimal(32, 8)
  reservedLiquidity Decimal  @default(0) @db.Decimal(32, 8)
  commodityVector   Json?    // Commodity vector data
  fxVector          Json?     // FX vector data
  temporalVector    Json?     // Temporal/quantum vector data
  status            String   @default("active") // active, suspended, maintenance
  lastUpdated       DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  liquidityOperations LiquidityOperation[]
  tensorStates      LiquidityTensor[]

  @@index([engineId])
  @@index([engineType])
  @@index([status])
  @@map("synthetic_liquidity_engines")
}

model LiquidityTensor {
  id                String   @id @default(uuid())
  tensorId          String   @unique
  engineId           String
  commodityIndex    Int      // Commodity vector index
  fxIndex           Int       // FX vector index
  temporalIndex     Int       // Temporal/quantum vector index
  liquidityValue    Decimal  @db.Decimal(32, 8)
  metadata          Json?
  timestamp         DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  engine            SyntheticLiquidityEngine @relation(fields: [engineId], references: [id], onDelete: Cascade)

  @@index([tensorId])
  @@index([engineId])
  @@index([commodityIndex, fxIndex, temporalIndex])
  @@index([timestamp])
  @@map("liquidity_tensors")
}

model LiquidityOperation {
  id                String   @id @default(uuid())
  operationId       String   @unique
  engineId           String
  operationType     String   // swap, contribution, withdrawal, rebalance
  amount            Decimal  @db.Decimal(32, 8)
  sourceAsset       String?
  targetAsset       String?
  status            String   @default("pending") // pending, completed, failed
  executedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  engine            SyntheticLiquidityEngine @relation(fields: [engineId], references: [id], onDelete: Cascade)

  @@index([operationId])
  @@index([engineId])
  @@index([operationType])
  @@index([status])
  @@map("liquidity_operations")
}

// Bond Settlement
model GruBondSettlement {
  id                String   @id @default(uuid())
  settlementId      String   @unique
  bondId            String?
  syntheticBondId   String?
  transactionId     String?
  sourceBankId      String
  destinationBankId String
  amount            Decimal  @db.Decimal(32, 8)
  currencyCode      String
  settlementStage   String   // issuance, qps, gas, omega_layer, prime_ledger
  qpsTransactionId  String?  // QPS transaction reference
  gasSettlementId   String?  // GAS settlement reference
  omegaLayerHash    String?  // Ω-Layer finality hash
  primeLedgerHash   String?  // DBIS Prime Ledger hash
  perpetualState    Json?    // Perpetual state reconciliation data
  status            String   @default("pending") // pending, qps_complete, gas_complete, omega_complete, settled, failed
  qpsCompletedAt    DateTime?
  gasCompletedAt    DateTime?
  omegaCompletedAt  DateTime?
  settledAt         DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruBond? @relation("GruBondSettlementToGruBond", fields: [bondId], references: [bondId], onDelete: SetNull)
  syntheticBond     SyntheticGruBond? @relation("GruBondSettlementToSynthetic", fields: [syntheticBondId], references: [syntheticBondId], onDelete: SetNull)
  pipelineSteps     BondSettlementPipeline[]

  @@index([settlementId])
  @@index([bondId])
  @@index([syntheticBondId])
  @@index([transactionId])
  @@index([status])
  @@index([settlementStage])
  @@map("gru_bond_settlements")
}

model BondSettlementPipeline {
  id                String   @id @default(uuid())
  pipelineId        String   @unique
  settlementId      String
  stage             String   // issuance, qps, gas, omega_layer, prime_ledger
  stageStatus       String   @default("pending") // pending, in_progress, completed, failed
  stageData         Json?    // Stage-specific data
  errorMessage      String?  @db.Text
  startedAt         DateTime?
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  settlement        GruBondSettlement @relation(fields: [settlementId], references: [settlementId], onDelete: Cascade)

  @@index([pipelineId])
  @@index([settlementId])
  @@index([stage])
  @@index([stageStatus])
  @@map("bond_settlement_pipelines")
}

// Supranational Bonds
model SupranationalBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondType          String   // GRB, CRB
  bondName          String
  principalAmount   Decimal  @db.Decimal(32, 8)
  supranationalCouncilId String
  reserveBacking    Json     // Reserve backing details
  commodityIndex    String?  // For CRB: XAU, PGM, BMG1, BMG2, BMG3
  maturityDate      DateTime
  couponRate        Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, matured, redeemed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  coupons           SupranationalBondCoupon[]
  reserveVerifications ReserveVerification[]

  @@index([bondId])
  @@index([bondType])
  @@index([supranationalCouncilId])
  @@index([status])
  @@map("supranational_bonds")
}

model SupranationalBondCoupon {
  id                String   @id @default(uuid())
  couponId          String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  status            String   @default("pending") // pending, paid, failed
  paidAt            DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              SupranationalBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([couponId])
  @@index([bondId])
  @@index([status])
  @@map("supranational_bond_coupons")
}

model ReserveVerification {
  id                String   @id @default(uuid())
  verificationId    String   @unique
  bondId            String
  verificationType  String   // physical_audit, certificate_verification, custodian_verification
  reserveAmount      Decimal  @db.Decimal(32, 8)
  reserveType       String   // gru_reserve, commodity_reserve
  commodityType     String?  // For commodity reserves
  custodianId       String?
  certificateHash   String?  // HASH256 certificate
  verificationStatus String  @default("pending") // pending, verified, rejected
  verifiedAt        DateTime?
  nextVerificationDate DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              SupranationalBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([verificationId])
  @@index([bondId])
  @@index([verificationStatus])
  @@map("reserve_verifications")
}

// Metaverse & Holographic Bonds
model AvatarLinkedBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondName          String
  principalAmount   Decimal  @db.Decimal(32, 8)
  avatarId          String   // Digital identity/avatar ID
  metaverseNodeId   String?
  digitalIdentityId String
  metaverseAssetPortfolio Json? // Metaverse asset portfolio backing
  maturityDate      DateTime
  couponRate        Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, matured, redeemed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  coupons           AvatarBondCoupon[]

  @@index([bondId])
  @@index([avatarId])
  @@index([digitalIdentityId])
  @@index([metaverseNodeId])
  @@index([status])
  @@map("avatar_linked_bonds")
}

model AvatarBondCoupon {
  id                String   @id @default(uuid())
  couponId          String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  status            String   @default("pending") // pending, paid, failed
  paidAt            DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              AvatarLinkedBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([couponId])
  @@index([bondId])
  @@index([status])
  @@map("avatar_bond_coupons")
}

model HolographicBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondName          String
  principalAmount   Decimal  @db.Decimal(32, 8)
  holographicEconomyId String
  simulatedEconomyId String?
  certificateHash   String   // Holographic certificate hash
  holographicData   Json?    // 3D certificate representation data
  maturityDate      DateTime
  couponRate        Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, matured, redeemed
  issuedAt          DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  coupons           HolographicBondCoupon[]

  @@index([bondId])
  @@index([holographicEconomyId])
  @@index([simulatedEconomyId])
  @@index([status])
  @@map("holographic_bonds")
}

model HolographicBondCoupon {
  id                String   @id @default(uuid())
  couponId          String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  status            String   @default("pending") // pending, paid, failed
  paidAt            DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              HolographicBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([couponId])
  @@index([bondId])
  @@index([status])
  @@map("holographic_bond_coupons")
}

// Quantum Bond Systems
model QuantumBond {
  id                String   @id @default(uuid())
  bondId            String   @unique
  bondName          String
  principalAmount   Decimal  @db.Decimal(32, 8)
  bondType          String   // q_bond, timeline_synchronized
  quantumState      Json?    // Quantum state data
  truthSamplingHash String?  // Quantum truth sampling hash
  observerCount     Int      @default(0) // Double-observer mitigation
  timelineStates    Json?    // Timeline state data (t0, t-Δ, t+Δ)
  mergedState       Json?    // Merged state: Bond_tΩ = Merge(Bond_t0, Bond_t−Δ, Bond_t+Δ)
  maturityDate      DateTime
  couponRate        Decimal  @db.Decimal(32, 8)
  status            String   @default("active") // active, collapsed, settled, merged
  issuedAt          DateTime @default(now())
  collapsedAt       DateTime?
  mergedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  coupons           QuantumBondCoupon[]
  timelineSyncs     TimelineSynchronizedBond[]

  @@index([bondId])
  @@index([bondType])
  @@index([status])
  @@map("quantum_bonds")
}

model QuantumBondCoupon {
  id                String   @id @default(uuid())
  couponId          String   @unique
  bondId            String
  couponAmount      Decimal  @db.Decimal(32, 8)
  paymentDate       DateTime
  quantumSettled    Boolean  @default(false)
  truthSamplingHash String?
  status            String   @default("pending") // pending, quantum_settled, paid, failed
  settledAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              QuantumBond @relation(fields: [bondId], references: [id], onDelete: Cascade)

  @@index([couponId])
  @@index([bondId])
  @@index([status])
  @@map("quantum_bond_coupons")
}

model TimelineSynchronizedBond {
  id                String   @id @default(uuid())
  syncId            String   @unique
  quantumBondId     String
  timelineType      String   // t0, t_minus_delta, t_plus_delta
  timelineState     Json     // State data for this timeline
  syncStatus        String   @default("pending") // pending, synced, merged
  syncedAt          DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  quantumBond       QuantumBond @relation(fields: [quantumBondId], references: [id], onDelete: Cascade)

  @@index([syncId])
  @@index([quantumBondId])
  @@index([timelineType])
  @@index([syncStatus])
  @@map("timeline_synchronized_bonds")
}

// Bond Risk & Oversight
model BondRiskAssessment {
  id                String   @id @default(uuid())
  assessmentId      String   @unique
  bondId            String?
  syntheticBondId   String?
  assessmentType    String   // sare, ari, composite
  sovereignDefaultExposure Decimal? @db.Decimal(32, 8)
  fxLinkedRisk      Decimal? @db.Decimal(32, 8)
  metalIndexDependency Decimal? @db.Decimal(32, 8)
  creditRisk        Decimal? @db.Decimal(32, 8)
  marketRisk        Decimal? @db.Decimal(32, 8)
  liquidityRisk     Decimal? @db.Decimal(32, 8)
  operationalRisk   Decimal? @db.Decimal(32, 8)
  compositeRiskScore Decimal  @db.Decimal(32, 8)
  riskTier          String   // low, medium, high, critical
  sareScore         Decimal? @db.Decimal(32, 8)
  ariCompliance     Boolean  @default(true)
  assessmentDetails Json?    // Detailed assessment data
  assessedAt        DateTime @default(now())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  bond              GruBond? @relation("BondRiskAssessmentToGruBond", fields: [bondId], references: [bondId], onDelete: SetNull)
  syntheticBond     SyntheticGruBond? @relation("BondRiskAssessmentToSynthetic", fields: [syntheticBondId], references: [syntheticBondId], onDelete: SetNull)
  complianceRecords BondComplianceRecord[]

  @@index([assessmentId])
  @@index([bondId])
  @@index([syntheticBondId])
  @@index([assessmentType])
  @@index([riskTier])
  @@index([assessedAt])
  @@map("bond_risk_assessments")
}

model BondComplianceRecord {
  id                String   @id @default(uuid())
  recordId          String   @unique
  assessmentId      String
  complianceType    String   // regulatory, synthetic_market_integrity, general
  complianceStatus  String   @default("compliant") // compliant, violation, warning
  violationType     String?
  violationDetails  Json?
  ariAction         String?  // Automated ARI action taken
  resolvedAt        DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  assessment        BondRiskAssessment @relation(fields: [assessmentId], references: [id], onDelete: Cascade)

  @@index([recordId])
  @@index([assessmentId])
  @@index([complianceStatus])
  @@index([complianceType])
  @@map("bond_compliance_records")
}

// Bond Market Integration
model BondMarketIntegration {
  id                String   @id @default(uuid())
  integrationId     String   @unique
  integrationType   String   // commodity_exchange, sovereign_platform, metaverse_market, quantum_dlt
  externalSystemId  String
  externalSystemName String
  integrationStatus String   @default("active") // active, suspended, disconnected
  lastSyncAt        DateTime?
  syncFrequency     String   @default("real_time") // real_time, hourly, daily
  integrationConfig Json?    // Integration configuration
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  @@index([integrationId])
  @@index([integrationType])
  @@index([integrationStatus])
  @@map("bond_market_integrations")
}

// ============================================================================
// Nostro/Vostro Network - DBIS Integration Layer
// ============================================================================

model NostroVostroParticipant {
  id                String   @id @default(uuid())
  participantId     String   @unique
  name              String
  bic               String?  @unique
  lei               String?  @unique
  country           String   // ISO 3166-1 alpha-2
  regulatoryTier    String   // SCB, Tier1, Tier2, PSP
  sovereignBankId   String?  // Link to SovereignBank if applicable
  status            String   @default("active") // active, suspended, inactive
  metadata          Json?    // Additional participant data
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  sovereignBank     SovereignBank? @relation("NostroVostroParticipantToSovereignBank", fields: [sovereignBankId], references: [id], onDelete: SetNull)
  accounts          NostroVostroAccount[]
  transfers         NostroVostroTransfer[] @relation("TransferFromParticipant")
  transfersTo       NostroVostroTransfer[] @relation("TransferToParticipant")
  reconciliations   NostroVostroReconciliation[]
  webhookSubscriptions NostroVostroWebhookSubscription[]

  @@index([participantId])
  @@index([bic])
  @@index([lei])
  @@index([regulatoryTier])
  @@index([country])
  @@index([status])
  @@map("nostro_vostro_participants")
}

model NostroVostroAccount {
  id                      String   @id @default(uuid())
  accountId               String   @unique
  ownerParticipantId      String
  counterpartyParticipantId String
  ibanOrLocalAccount      String?  // IBAN or local account identifier
  currency                String   // ISO 4217
  accountType             String   // NOSTRO, VOSTRO
  status                  String   @default("ACTIVE") // ACTIVE, SUSPENDED, CLOSED
  currentBalance          Decimal  @default(0) @db.Decimal(32, 8)
  availableLiquidity      Decimal  @default(0) @db.Decimal(32, 8)
  holdAmount              Decimal  @default(0) @db.Decimal(32, 8)
  lastUpdatedAt           DateTime @default(now())
  metadata                Json?    // Additional account data
  createdAt               DateTime @default(now())
  updatedAt               DateTime @updatedAt

  ownerParticipant        NostroVostroParticipant @relation(fields: [ownerParticipantId], references: [id], onDelete: Cascade)
  transfers               NostroVostroTransfer[] @relation("TransferFromAccount")
  transfersTo             NostroVostroTransfer[] @relation("TransferToAccount")
  balanceHistory          NostroVostroBalanceHistory[]

  @@index([accountId])
  @@index([ownerParticipantId])
  @@index([counterpartyParticipantId])
  @@index([accountType])
  @@index([currency])
  @@index([status])
  @@map("nostro_vostro_accounts")
}

model NostroVostroBalanceHistory {
  id                String   @id @default(uuid())
  accountId         String
  balance           Decimal  @db.Decimal(32, 8)
  availableLiquidity Decimal @db.Decimal(32, 8)
  holdAmount        Decimal  @db.Decimal(32, 8)
  recordedAt        DateTime @default(now())

  account           NostroVostroAccount @relation(fields: [accountId], references: [id], onDelete: Cascade)

  @@index([accountId])
  @@index([recordedAt])
  @@map("nostro_vostro_balance_history")
}

model NostroVostroTransfer {
  id                String   @id @default(uuid())
  transferId       String   @unique
  fromAccountId    String
  toAccountId      String
  fromParticipantId String
  toParticipantId  String
  amount           Decimal  @db.Decimal(32, 8)
  currency         String   // ISO 4217
  settlementAsset  String   @default("FIAT") // FIAT, GRU, SSU, CBDC
  valueDate        DateTime
  fxDetails        Json?    // FX rate, conversion details
  status           String   @default("PENDING") // PENDING, ACCEPTED, SETTLED, REJECTED, CANCELLED
  rejectionReason  String?
  idempotencyKey   String?  @unique
  reference        String?  // External reference
  metadata         Json?    // Additional transfer data
  settledAt        DateTime?
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt

  fromAccount      NostroVostroAccount @relation("TransferFromAccount", fields: [fromAccountId], references: [id])
  toAccount        NostroVostroAccount @relation("TransferToAccount", fields: [toAccountId], references: [id])
  fromParticipant  NostroVostroParticipant @relation("TransferFromParticipant", fields: [fromParticipantId], references: [id])
  toParticipant    NostroVostroParticipant @relation("TransferToParticipant", fields: [toParticipantId], references: [id])
  reconciliation   NostroVostroReconciliationTransfer?

  @@index([transferId])
  @@index([fromAccountId])
  @@index([toAccountId])
  @@index([fromParticipantId])
  @@index([toParticipantId])
  @@index([status])
  @@index([valueDate])
  @@index([idempotencyKey])
  @@index([settlementAsset])
  @@map("nostro_vostro_transfers")
}

model NostroVostroReconciliation {
  id                String   @id @default(uuid())
  reportId          String   @unique
  participantId     String
  asOfDate          DateTime
  openingBalance    Decimal  @db.Decimal(32, 8)
  closingBalance    Decimal  @db.Decimal(32, 8)
  totalDebits       Decimal  @default(0) @db.Decimal(32, 8)
  totalCredits      Decimal  @default(0) @db.Decimal(32, 8)
  breakCount        Int      @default(0)
  status            String   @default("PENDING") // PENDING, COMPLETED, FAILED
  breaks            Json?    // Array of reconciliation breaks
  metadata          Json?    // Additional reconciliation data
  completedAt       DateTime?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  participant       NostroVostroParticipant @relation(fields: [participantId], references: [id], onDelete: Cascade)
  transfer          NostroVostroReconciliationTransfer?

  @@index([reportId])
  @@index([participantId])
  @@index([asOfDate])
  @@index([status])
  @@map("nostro_vostro_reconciliations")
}

model NostroVostroReconciliationTransfer {
  id                String   @id @default(uuid())
  reconciliationId  String   @unique
  transferId        String   @unique
  matched           Boolean  @default(false)
  matchDetails      Json?    // Matching details
  createdAt         DateTime @default(now())

  reconciliation    NostroVostroReconciliation @relation(fields: [reconciliationId], references: [id], onDelete: Cascade)
  transfer          NostroVostroTransfer @relation(fields: [transferId], references: [id], onDelete: Cascade)

  @@index([reconciliationId])
  @@index([transferId])
  @@map("nostro_vostro_reconciliation_transfers")
}

model NostroVostroWebhookSubscription {
  id                String   @id @default(uuid())
  subscriptionId    String   @unique
  participantId     String
  webhookUrl        String
  eventTypes        String[] // Array of event types to subscribe to
  secret            String   // Webhook signature secret
  status            String   @default("ACTIVE") // ACTIVE, SUSPENDED, INACTIVE
  lastDeliveryAt    DateTime?
  failureCount      Int      @default(0)
  metadata          Json?    // Additional subscription data
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  participant       NostroVostroParticipant @relation(fields: [participantId], references: [id], onDelete: Cascade)
  events            NostroVostroWebhookEvent[]

  @@index([subscriptionId])
  @@index([participantId])
  @@index([status])
  @@map("nostro_vostro_webhook_subscriptions")
}

model NostroVostroWebhookEvent {
  id                String   @id @default(uuid())
  eventId           String   @unique
  subscriptionId    String
  eventType         String   // TRANSFER_CREATED, TRANSFER_SETTLED, ACCOUNT_UPDATED, etc.
  payload           Json     // Event payload
  status            String   @default("PENDING") // PENDING, DELIVERED, FAILED, RETRYING
  deliveryAttempts  Int      @default(0)
  lastAttemptAt     DateTime?
  deliveredAt       DateTime?
  errorMessage      String?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt

  subscription      NostroVostroWebhookSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)

  @@index([eventId])
  @@index([subscriptionId])
  @@index([eventType])
  @@index([status])
  @@index([createdAt])
  @@map("nostro_vostro_webhook_events")
}

