@levrbet/shared 0.1.98 → 0.1.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/prisma/generated/edge.js +3 -4
- package/dist/core/prisma/generated/index-browser.js +0 -1
- package/dist/core/prisma/generated/index.d.ts +1 -28
- package/dist/core/prisma/generated/index.js +3 -4
- package/dist/core/prisma/generated/package.json +1 -1
- package/dist/core/prisma/generated/schema.prisma +1 -2
- package/dist/core/prisma/generated/wasm.js +3 -4
- package/dist/core/types/auth.types.d.ts +1 -1
- package/dist/server/middleware/auth/cloudflare.handler.d.ts +1 -1
- package/dist/server/middleware/auth/cloudflare.handler.js.map +1 -1
- package/dist/server/middleware/auth/hmac.handler.d.ts +1 -8
- package/dist/server/middleware/auth/hmac.handler.js +34 -16
- package/dist/server/middleware/auth/hmac.handler.js.map +1 -1
- package/dist/server/middleware/auth/privy.handler.d.ts +1 -1
- package/dist/server/middleware/auth/privy.handler.js.map +1 -1
- package/dist/server/middleware/multiAuth.examples.d.ts +7 -4
- package/dist/server/middleware/multiAuth.examples.js +7 -4
- package/dist/server/middleware/multiAuth.examples.js.map +1 -1
- package/dist/server/middleware/multiAuth.middleware.js.map +1 -1
- package/dist/server/services/crypto.service.js +19 -14
- package/dist/server/services/crypto.service.js.map +1 -1
- package/dist/server/services/hmac.service.d.ts +27 -0
- package/dist/server/services/hmac.service.js +36 -0
- package/dist/server/services/hmac.service.js.map +1 -0
- package/dist/server/services/index.d.ts +1 -0
- package/dist/server/services/index.js +1 -0
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/types/auth.types.d.ts +8 -0
- package/dist/server/types/auth.types.js +2 -0
- package/dist/server/types/auth.types.js.map +1 -0
- package/dist/server/types/express.types.d.ts +0 -1
- package/dist/server/types/index.d.ts +1 -0
- package/dist/server/types/index.js +1 -0
- package/dist/server/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -277,7 +277,6 @@ exports.Prisma.ApiKeyScalarFieldEnum = {
|
|
|
277
277
|
name: 'name',
|
|
278
278
|
ciphertext: 'ciphertext',
|
|
279
279
|
kmsKeyId: 'kmsKeyId',
|
|
280
|
-
isService: 'isService',
|
|
281
280
|
service: 'service',
|
|
282
281
|
scopes: 'scopes',
|
|
283
282
|
isActive: 'isActive',
|
|
@@ -427,13 +426,13 @@ const config = {
|
|
|
427
426
|
}
|
|
428
427
|
}
|
|
429
428
|
},
|
|
430
|
-
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"linux-musl-openssl-3.0.x\"]\n output = \"generated\"\n}\n\ndatasource db {\n provider = \"mongodb\"\n url = env(\"MONGO_URI\")\n}\n\nenum GamePhase {\n PreGame\n LiveGame\n PostGame\n Cancelled\n}\n\nenum MarketTypes {\n FullTimeWinner\n OverUnder\n}\n\nenum MarketStatus {\n Open\n Closed\n Settled\n Refunded\n}\n\nenum ScoringType {\n Points\n Goals\n}\n\nenum FixtureStatus {\n Scheduled\n Cancelled\n}\n\nenum SportGroup {\n Football\n Basketball\n Baseball\n AmericanFootball\n}\n\nenum LevrService {\n Auth\n Orderbook\n OracleCore\n OraclePeriphery\n OracleProcessor\n Leaderboard\n Lab\n}\n\nmodel Provider {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n name String @unique\n providerUrl String @unique\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Tournament {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrTournamentId String @unique\n chainId Int\n name String\n description String\n bannerUrl String\n startDate DateTime\n endDate DateTime\n\n games LevrGame[]\n leagues League[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([chainId, name])\n @@unique([chainId, description])\n @@unique([chainId, bannerUrl])\n @@index([name])\n}\n\nmodel Sport {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrSportId String @unique\n name String @unique\n periodType String\n scoringType ScoringType\n standardDurationMs Int\n standardPeriods Int\n periodDuration Int?\n hasDrawMarket Boolean\n sportGroup SportGroup\n\n leagues League[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel League {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n name String @unique\n abbreviation String\n country String\n levrLeagueId String @unique\n opticOddsLeagueId String @unique\n lsportsLeagueId String @unique\n\n tournamentObjectId String @db.ObjectId\n tournament Tournament @relation(fields: [tournamentObjectId], references: [objectId])\n sportObjectId String @db.ObjectId\n sport Sport @relation(fields: [sportObjectId], references: [objectId])\n levrSportId String\n\n games LevrGame[]\n fixtures Fixture[]\n teams TeamData[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel TeamData {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrTeamName String\n levrTeamOfficialAbbreviation String\n lsportsTeamName String\n opticOddsTeamName String\n lsportsTeamId String @unique\n opticOddsTeamId String @unique\n levrTeamId String @unique\n opticOddsTeamLogoUrl String @unique\n levrTeamLogoUrlAsHome String @unique\n levrTeamLogoUrlAsAway String @unique\n leagueObjectId String @db.ObjectId\n levrleagueId String\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n @@unique([levrTeamId, levrTeamName, leagueObjectId])\n}\n\nmodel Fixture {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrFixtureId String @unique\n opticOddsFixtureId String? @unique\n lsportsFixtureId String? @unique\n seasonType String\n venue String\n eventName String\n location String\n venueLocation String\n fixtureDate DateTime\n lastUpdated DateTime\n homeTeam Json\n awayTeam Json\n fixtureStatus FixtureStatus\n\n leagueObjectId String @db.ObjectId\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([fixtureDate])\n @@index([leagueObjectId])\n @@index([eventName])\n}\n\nmodel Scores {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n scoresByPeriodHome Json\n scoresByPeriodAway Json\n totalScoresHome Float\n totalScoresAway Float\n\n fixtureObjectId String @unique @db.ObjectId\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel LevrGame {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n gameId Int @unique\n txHash String @unique\n chainId Int\n seasonType String\n venue String\n eventName String\n location String\n venueLocation String\n gameClock String\n paused Boolean @default(false)\n fixtureDate DateTime\n wentLiveAt DateTime?\n homeTeam Json // as defined in sample-data/lever/levr-game.json\n awayTeam Json // as defined in sample-data/lever/levr-game.json\n currentPeriod Int @default(0)\n actualDuration Float @default(0) // in milliseconds\n normalizationFactor Float\n gamePhase GamePhase @default(PreGame)\n levrFixtureId String\n opticOddsFixtureId String?\n lsportsFixtureId String?\n sportGroup SportGroup\n\n fixtureObjectId String @db.ObjectId\n\n tournamentObjectId String @db.ObjectId\n tournament Tournament @relation(fields: [tournamentObjectId], references: [objectId])\n leagueObjectId String @db.ObjectId\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n markets Market[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([opticOddsFixtureId])\n @@index([lsportsFixtureId])\n @@index([eventName])\n @@index([fixtureDate])\n}\n\nmodel Odds {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n txHash String\n odds Json // define for the specific market type\n prices Json\n timestamp DateTime\n marketType MarketTypes\n details Json? // the unique details for the odds\n gamePhase GamePhase\n gamePeriod Int\n gameClock Int\n chainId Int\n marketPhase MarketStatus\n\n levrGameObjectId String @db.ObjectId\n marketObjectId String @db.ObjectId\n gameMarketId String\n market Market @relation(fields: [marketObjectId], references: [objectId])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Market {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n chainId Int\n gameId Int\n levrMarketId String\n levrMarketContract String\n gameMarketId String @unique\n txHash String\n maturedAt DateTime?\n leveraged Boolean @default(false)\n isMatured Boolean @default(false)\n normalizationFactor Float\n marketDetails Json\n marketRiskAllocation Json\n providers Json\n activeProvider Json\n marketType MarketTypes\n status MarketStatus\n\n levrGameObjectId String @db.ObjectId // new unique identifier\n levrGame LevrGame @relation(fields: [levrGameObjectId], references: [objectId])\n\n odds Odds[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum UserOddsPreference {\n American\n Decimal\n European\n}\n\nmodel User {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n walletAddress String @unique\n userName String @unique\n timeZone DateTime\n preferredTimeZone DateTime\n userOddsPreference UserOddsPreference\n profileImageUrl String\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ApiKeyScope {\n Read\n Write\n}\n\nmodel ApiKey {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n apiKeyId String @unique\n userId String\n ethAddress String?\n name String\n ciphertext String\n kmsKeyId String\n
|
|
431
|
-
"inlineSchemaHash": "
|
|
429
|
+
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"linux-musl-openssl-3.0.x\"]\n output = \"generated\"\n}\n\ndatasource db {\n provider = \"mongodb\"\n url = env(\"MONGO_URI\")\n}\n\nenum GamePhase {\n PreGame\n LiveGame\n PostGame\n Cancelled\n}\n\nenum MarketTypes {\n FullTimeWinner\n OverUnder\n}\n\nenum MarketStatus {\n Open\n Closed\n Settled\n Refunded\n}\n\nenum ScoringType {\n Points\n Goals\n}\n\nenum FixtureStatus {\n Scheduled\n Cancelled\n}\n\nenum SportGroup {\n Football\n Basketball\n Baseball\n AmericanFootball\n}\n\nenum LevrService {\n Auth\n Orderbook\n OracleCore\n OraclePeriphery\n OracleProcessor\n Leaderboard\n Lab\n}\n\nmodel Provider {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n name String @unique\n providerUrl String @unique\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Tournament {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrTournamentId String @unique\n chainId Int\n name String\n description String\n bannerUrl String\n startDate DateTime\n endDate DateTime\n\n games LevrGame[]\n leagues League[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([chainId, name])\n @@unique([chainId, description])\n @@unique([chainId, bannerUrl])\n @@index([name])\n}\n\nmodel Sport {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrSportId String @unique\n name String @unique\n periodType String\n scoringType ScoringType\n standardDurationMs Int\n standardPeriods Int\n periodDuration Int?\n hasDrawMarket Boolean\n sportGroup SportGroup\n\n leagues League[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel League {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n name String @unique\n abbreviation String\n country String\n levrLeagueId String @unique\n opticOddsLeagueId String @unique\n lsportsLeagueId String @unique\n\n tournamentObjectId String @db.ObjectId\n tournament Tournament @relation(fields: [tournamentObjectId], references: [objectId])\n sportObjectId String @db.ObjectId\n sport Sport @relation(fields: [sportObjectId], references: [objectId])\n levrSportId String\n\n games LevrGame[]\n fixtures Fixture[]\n teams TeamData[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel TeamData {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrTeamName String\n levrTeamOfficialAbbreviation String\n lsportsTeamName String\n opticOddsTeamName String\n lsportsTeamId String @unique\n opticOddsTeamId String @unique\n levrTeamId String @unique\n opticOddsTeamLogoUrl String @unique\n levrTeamLogoUrlAsHome String @unique\n levrTeamLogoUrlAsAway String @unique\n leagueObjectId String @db.ObjectId\n levrleagueId String\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n @@unique([levrTeamId, levrTeamName, leagueObjectId])\n}\n\nmodel Fixture {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n levrFixtureId String @unique\n opticOddsFixtureId String? @unique\n lsportsFixtureId String? @unique\n seasonType String\n venue String\n eventName String\n location String\n venueLocation String\n fixtureDate DateTime\n lastUpdated DateTime\n homeTeam Json\n awayTeam Json\n fixtureStatus FixtureStatus\n\n leagueObjectId String @db.ObjectId\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([fixtureDate])\n @@index([leagueObjectId])\n @@index([eventName])\n}\n\nmodel Scores {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n scoresByPeriodHome Json\n scoresByPeriodAway Json\n totalScoresHome Float\n totalScoresAway Float\n\n fixtureObjectId String @unique @db.ObjectId\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel LevrGame {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n gameId Int @unique\n txHash String @unique\n chainId Int\n seasonType String\n venue String\n eventName String\n location String\n venueLocation String\n gameClock String\n paused Boolean @default(false)\n fixtureDate DateTime\n wentLiveAt DateTime?\n homeTeam Json // as defined in sample-data/lever/levr-game.json\n awayTeam Json // as defined in sample-data/lever/levr-game.json\n currentPeriod Int @default(0)\n actualDuration Float @default(0) // in milliseconds\n normalizationFactor Float\n gamePhase GamePhase @default(PreGame)\n levrFixtureId String\n opticOddsFixtureId String?\n lsportsFixtureId String?\n sportGroup SportGroup\n\n fixtureObjectId String @db.ObjectId\n\n tournamentObjectId String @db.ObjectId\n tournament Tournament @relation(fields: [tournamentObjectId], references: [objectId])\n leagueObjectId String @db.ObjectId\n league League @relation(fields: [leagueObjectId], references: [objectId])\n\n markets Market[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([opticOddsFixtureId])\n @@index([lsportsFixtureId])\n @@index([eventName])\n @@index([fixtureDate])\n}\n\nmodel Odds {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n txHash String\n odds Json // define for the specific market type\n prices Json\n timestamp DateTime\n marketType MarketTypes\n details Json? // the unique details for the odds\n gamePhase GamePhase\n gamePeriod Int\n gameClock Int\n chainId Int\n marketPhase MarketStatus\n\n levrGameObjectId String @db.ObjectId\n marketObjectId String @db.ObjectId\n gameMarketId String\n market Market @relation(fields: [marketObjectId], references: [objectId])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Market {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n chainId Int\n gameId Int\n levrMarketId String\n levrMarketContract String\n gameMarketId String @unique\n txHash String\n maturedAt DateTime?\n leveraged Boolean @default(false)\n isMatured Boolean @default(false)\n normalizationFactor Float\n marketDetails Json\n marketRiskAllocation Json\n providers Json\n activeProvider Json\n marketType MarketTypes\n status MarketStatus\n\n levrGameObjectId String @db.ObjectId // new unique identifier\n levrGame LevrGame @relation(fields: [levrGameObjectId], references: [objectId])\n\n odds Odds[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum UserOddsPreference {\n American\n Decimal\n European\n}\n\nmodel User {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n walletAddress String @unique\n userName String @unique\n timeZone DateTime\n preferredTimeZone DateTime\n userOddsPreference UserOddsPreference\n profileImageUrl String\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ApiKeyScope {\n Read\n Write\n}\n\nmodel ApiKey {\n objectId String @id @default(auto()) @map(\"_id\") @db.ObjectId\n apiKeyId String @unique\n userId String\n ethAddress String?\n name String\n ciphertext String\n kmsKeyId String\n service LevrService? // Optional: restrict key to a specific service\n scopes ApiKeyScope[]\n isActive Boolean @default(true)\n expiresAt DateTime?\n lastUsedAt DateTime?\n usageCount Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([userId, name, isActive])\n}\n\nmodel AuditLog {\n objectId String @id @default(cuid()) @map(\"_id\")\n action String // e.g., \"api_key.created\", \"application.created\", \"token.validated\"\n resourceId String? // ID of the resource being acted upon\n metadata Json @default(\"{}\")\n ipAddress String?\n userAgent String?\n timestamp DateTime @default(now())\n // Relations\n userId String\n\n @@index([action])\n @@index([timestamp])\n @@index([userId])\n}\n",
|
|
430
|
+
"inlineSchemaHash": "cfac5e5839ca43ca36a9a9154b84a2ddc4da99af9ede5fde22c7cd8c1c981e6c",
|
|
432
431
|
"copyEngine": true
|
|
433
432
|
}
|
|
434
433
|
config.dirname = '/'
|
|
435
434
|
|
|
436
|
-
config.runtimeDataModel = JSON.parse("{\"models\":{\"Provider\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Tournament\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrTournamentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bannerUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"games\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LevrGameToTournament\"},{\"name\":\"leagues\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToTournament\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Sport\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrSportId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"periodType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scoringType\",\"kind\":\"enum\",\"type\":\"ScoringType\"},{\"name\":\"standardDurationMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"standardPeriods\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"periodDuration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hasDrawMarket\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sportGroup\",\"kind\":\"enum\",\"type\":\"SportGroup\"},{\"name\":\"leagues\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToSport\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"League\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournamentObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournament\",\"kind\":\"object\",\"type\":\"Tournament\",\"relationName\":\"LeagueToTournament\"},{\"name\":\"sportObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"LeagueToSport\"},{\"name\":\"levrSportId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"games\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LeagueToLevrGame\"},{\"name\":\"fixtures\",\"kind\":\"object\",\"type\":\"Fixture\",\"relationName\":\"FixtureToLeague\"},{\"name\":\"teams\",\"kind\":\"object\",\"type\":\"TeamData\",\"relationName\":\"LeagueToTeamData\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TeamData\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamOfficialAbbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamLogoUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamLogoUrlAsHome\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamLogoUrlAsAway\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrleagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToTeamData\"}],\"dbName\":null},\"Fixture\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seasonType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venueLocation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixtureDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastUpdated\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"homeTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"awayTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"fixtureStatus\",\"kind\":\"enum\",\"type\":\"FixtureStatus\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"FixtureToLeague\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Scores\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"scoresByPeriodHome\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"scoresByPeriodAway\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"totalScoresHome\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"totalScoresAway\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"fixtureObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"LevrGame\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"gameId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venueLocation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameClock\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paused\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"fixtureDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"wentLiveAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"homeTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"awayTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"currentPeriod\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"actualDuration\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"normalizationFactor\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"gamePhase\",\"kind\":\"enum\",\"type\":\"GamePhase\"},{\"name\":\"levrFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sportGroup\",\"kind\":\"enum\",\"type\":\"SportGroup\"},{\"name\":\"fixtureObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournamentObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournament\",\"kind\":\"object\",\"type\":\"Tournament\",\"relationName\":\"LevrGameToTournament\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToLevrGame\"},{\"name\":\"markets\",\"kind\":\"object\",\"type\":\"Market\",\"relationName\":\"LevrGameToMarket\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Odds\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"odds\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"prices\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"marketType\",\"kind\":\"enum\",\"type\":\"MarketTypes\"},{\"name\":\"details\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"gamePhase\",\"kind\":\"enum\",\"type\":\"GamePhase\"},{\"name\":\"gamePeriod\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"gameClock\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"marketPhase\",\"kind\":\"enum\",\"type\":\"MarketStatus\"},{\"name\":\"levrGameObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"marketObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"market\",\"kind\":\"object\",\"type\":\"Market\",\"relationName\":\"MarketToOdds\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Market\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"gameId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"levrMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrMarketContract\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maturedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"leveraged\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isMatured\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"normalizationFactor\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"marketDetails\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"marketRiskAllocation\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"providers\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"activeProvider\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"marketType\",\"kind\":\"enum\",\"type\":\"MarketTypes\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"MarketStatus\"},{\"name\":\"levrGameObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrGame\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LevrGameToMarket\"},{\"name\":\"odds\",\"kind\":\"object\",\"type\":\"Odds\",\"relationName\":\"MarketToOdds\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"User\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"walletAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timeZone\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"preferredTimeZone\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userOddsPreference\",\"kind\":\"enum\",\"type\":\"UserOddsPreference\"},{\"name\":\"profileImageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"apiKeyId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ethAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ciphertext\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kmsKeyId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isService\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"service\",\"kind\":\"enum\",\"type\":\"LevrService\"},{\"name\":\"scopes\",\"kind\":\"enum\",\"type\":\"ApiKeyScope\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastUsedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"usageCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"AuditLog\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
|
|
435
|
+
config.runtimeDataModel = JSON.parse("{\"models\":{\"Provider\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Tournament\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrTournamentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bannerUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"games\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LevrGameToTournament\"},{\"name\":\"leagues\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToTournament\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Sport\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrSportId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"periodType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scoringType\",\"kind\":\"enum\",\"type\":\"ScoringType\"},{\"name\":\"standardDurationMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"standardPeriods\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"periodDuration\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hasDrawMarket\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sportGroup\",\"kind\":\"enum\",\"type\":\"SportGroup\"},{\"name\":\"leagues\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToSport\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"League\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"abbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsLeagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournamentObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournament\",\"kind\":\"object\",\"type\":\"Tournament\",\"relationName\":\"LeagueToTournament\"},{\"name\":\"sportObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"LeagueToSport\"},{\"name\":\"levrSportId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"games\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LeagueToLevrGame\"},{\"name\":\"fixtures\",\"kind\":\"object\",\"type\":\"Fixture\",\"relationName\":\"FixtureToLeague\"},{\"name\":\"teams\",\"kind\":\"object\",\"type\":\"TeamData\",\"relationName\":\"LeagueToTeamData\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TeamData\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamOfficialAbbreviation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsTeamLogoUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamLogoUrlAsHome\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrTeamLogoUrlAsAway\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrleagueId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToTeamData\"}],\"dbName\":null},\"Fixture\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"levrFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seasonType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venueLocation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fixtureDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastUpdated\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"homeTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"awayTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"fixtureStatus\",\"kind\":\"enum\",\"type\":\"FixtureStatus\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"FixtureToLeague\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Scores\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"scoresByPeriodHome\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"scoresByPeriodAway\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"totalScoresHome\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"totalScoresAway\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"fixtureObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"LevrGame\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"gameId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"venueLocation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameClock\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paused\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"fixtureDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"wentLiveAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"homeTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"awayTeam\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"currentPeriod\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"actualDuration\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"normalizationFactor\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"gamePhase\",\"kind\":\"enum\",\"type\":\"GamePhase\"},{\"name\":\"levrFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"opticOddsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lsportsFixtureId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sportGroup\",\"kind\":\"enum\",\"type\":\"SportGroup\"},{\"name\":\"fixtureObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournamentObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tournament\",\"kind\":\"object\",\"type\":\"Tournament\",\"relationName\":\"LevrGameToTournament\"},{\"name\":\"leagueObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"league\",\"kind\":\"object\",\"type\":\"League\",\"relationName\":\"LeagueToLevrGame\"},{\"name\":\"markets\",\"kind\":\"object\",\"type\":\"Market\",\"relationName\":\"LevrGameToMarket\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Odds\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"odds\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"prices\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"marketType\",\"kind\":\"enum\",\"type\":\"MarketTypes\"},{\"name\":\"details\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"gamePhase\",\"kind\":\"enum\",\"type\":\"GamePhase\"},{\"name\":\"gamePeriod\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"gameClock\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"marketPhase\",\"kind\":\"enum\",\"type\":\"MarketStatus\"},{\"name\":\"levrGameObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"marketObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"market\",\"kind\":\"object\",\"type\":\"Market\",\"relationName\":\"MarketToOdds\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Market\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"chainId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"gameId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"levrMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrMarketContract\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"gameMarketId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"txHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maturedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"leveraged\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isMatured\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"normalizationFactor\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"marketDetails\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"marketRiskAllocation\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"providers\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"activeProvider\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"marketType\",\"kind\":\"enum\",\"type\":\"MarketTypes\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"MarketStatus\"},{\"name\":\"levrGameObjectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"levrGame\",\"kind\":\"object\",\"type\":\"LevrGame\",\"relationName\":\"LevrGameToMarket\"},{\"name\":\"odds\",\"kind\":\"object\",\"type\":\"Odds\",\"relationName\":\"MarketToOdds\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"User\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"walletAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timeZone\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"preferredTimeZone\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userOddsPreference\",\"kind\":\"enum\",\"type\":\"UserOddsPreference\"},{\"name\":\"profileImageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"apiKeyId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ethAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ciphertext\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"kmsKeyId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"service\",\"kind\":\"enum\",\"type\":\"LevrService\"},{\"name\":\"scopes\",\"kind\":\"enum\",\"type\":\"ApiKeyScope\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastUsedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"usageCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"AuditLog\":{\"fields\":[{\"name\":\"objectId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"_id\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
|
|
437
436
|
defineDmmfProperty(exports.Prisma, config.runtimeDataModel)
|
|
438
437
|
config.engineWasm = {
|
|
439
438
|
getRuntime: async () => require('./query_engine_bg.js'),
|
|
@@ -15,7 +15,7 @@ export interface MultiAuthOptions {
|
|
|
15
15
|
methods: LevrAuth[];
|
|
16
16
|
/**
|
|
17
17
|
* Required API key scopes (applies to HMAC and SERVICE_HMAC auth only).
|
|
18
|
-
* If specified, the API key must have
|
|
18
|
+
* If specified, the API key must have all of these scopes.
|
|
19
19
|
*/
|
|
20
20
|
requiredScopes?: ApiKeyScope[];
|
|
21
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/cloudflare.handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"cloudflare.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/cloudflare.handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,OAAO,2BAA2B,CAAA;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAY;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,CAAA;IAE9D,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wCAAwC;YAC/C,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;IAED,IAAI,CAAC;QACD,MAAM,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC1C,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;QACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACjE,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAA;QAC7D,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,QAAQ,EAAE;YAC5C,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;AACL,CAAC"}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import type { Request } from "express";
|
|
2
2
|
import { MultiAuthOptions } from "../../../core";
|
|
3
|
+
import type { AuthResult } from "../../types/auth.types";
|
|
3
4
|
import "../../types/express.types";
|
|
4
|
-
/**
|
|
5
|
-
* Authentication result from individual auth handlers
|
|
6
|
-
*/
|
|
7
|
-
export interface AuthResult {
|
|
8
|
-
success: boolean;
|
|
9
|
-
error?: string;
|
|
10
|
-
statusCode?: number;
|
|
11
|
-
}
|
|
12
5
|
/**
|
|
13
6
|
* Handles HMAC authentication (user API keys)
|
|
14
7
|
*/
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import crypto from "crypto";
|
|
2
2
|
import ms from "ms";
|
|
3
3
|
import { ApiKeyScope, LevrAuth } from "../../../core";
|
|
4
|
+
import { redisClientManager } from "../../config";
|
|
4
5
|
import { apiKeyRepository } from "../../repositories";
|
|
5
6
|
import { cryptoService } from "../../services";
|
|
6
7
|
import "../../types/express.types";
|
|
7
8
|
/**
|
|
8
|
-
* Validates that the API key has the required scopes
|
|
9
|
+
* Validates that the API key has all the required scopes
|
|
9
10
|
*/
|
|
10
11
|
function validateScopes(apiKeyScopes, requiredScopes) {
|
|
11
12
|
if (!requiredScopes || requiredScopes.length === 0)
|
|
12
13
|
return true;
|
|
13
|
-
return requiredScopes.
|
|
14
|
+
return requiredScopes.every((scope) => apiKeyScopes.includes(scope));
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Determines required scopes based on HTTP method and options
|
|
@@ -25,6 +26,22 @@ function getRequiredScopes(method, options) {
|
|
|
25
26
|
}
|
|
26
27
|
return scopes;
|
|
27
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Prevents nonce replay attacks by ensuring each nonce is only used once per API key
|
|
31
|
+
*/
|
|
32
|
+
async function validateNonce(apiKeyId, nonce) {
|
|
33
|
+
const key = `hmac_nonce:${apiKeyId}:${nonce}`;
|
|
34
|
+
try {
|
|
35
|
+
// Set nonce with 2 minute expiry, NX ensures it's only set if it doesn't exist
|
|
36
|
+
const result = await redisClientManager.primaryClient.set(key, "1", "EX", 120, "NX");
|
|
37
|
+
return result === "OK"; // Returns OK only if key was set (nonce not used before)
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error("Nonce validation error:", err);
|
|
41
|
+
// Fail open on Redis errors to avoid blocking legitimate requests
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
28
45
|
/**
|
|
29
46
|
* Shared HMAC authentication logic for both user and service API keys
|
|
30
47
|
*/
|
|
@@ -44,14 +61,13 @@ async function handleHmacAuthBase(req, options, isServiceAuth) {
|
|
|
44
61
|
}
|
|
45
62
|
// Fetch API key
|
|
46
63
|
const apiKey = await apiKeyRepository.getApiKey({ apiKeyId });
|
|
47
|
-
if (!apiKey)
|
|
64
|
+
if (!apiKey)
|
|
48
65
|
return { success: false, error: "Unknown API key", statusCode: 401 };
|
|
49
|
-
}
|
|
50
66
|
// Validate key type matches auth method
|
|
51
|
-
if (isServiceAuth && !apiKey.
|
|
67
|
+
if (isServiceAuth && !apiKey.service) {
|
|
52
68
|
return { success: false, error: "This endpoint requires a service API key", statusCode: 403 };
|
|
53
69
|
}
|
|
54
|
-
if (!isServiceAuth && apiKey.
|
|
70
|
+
if (!isServiceAuth && apiKey.service) {
|
|
55
71
|
return { success: false, error: "Service API keys cannot be used with HMAC auth", statusCode: 403 };
|
|
56
72
|
}
|
|
57
73
|
// Check expiration
|
|
@@ -83,15 +99,16 @@ async function handleHmacAuthBase(req, options, isServiceAuth) {
|
|
|
83
99
|
const method = req.method.toUpperCase();
|
|
84
100
|
const path = req.originalUrl.split("?")[0];
|
|
85
101
|
const timestamp = req.header("x-request-timestamp");
|
|
86
|
-
const nonce = req.header("x-request-nonce")
|
|
102
|
+
const nonce = req.header("x-request-nonce");
|
|
87
103
|
if (!timestamp) {
|
|
88
104
|
return { success: false, error: "Missing x-request-timestamp header", statusCode: 400 };
|
|
89
105
|
}
|
|
106
|
+
if (!nonce) {
|
|
107
|
+
return { success: false, error: "Missing x-request-nonce header", statusCode: 400 };
|
|
108
|
+
}
|
|
90
109
|
const ts = parseInt(timestamp, 10);
|
|
91
|
-
if (Number.isNaN(ts))
|
|
110
|
+
if (Number.isNaN(ts))
|
|
92
111
|
return { success: false, error: "Invalid timestamp format", statusCode: 400 };
|
|
93
|
-
}
|
|
94
|
-
// Prevent replay attacks (2 minutes window)
|
|
95
112
|
// TODO: change back to 2m
|
|
96
113
|
if (Math.abs(Date.now() - ts) > ms("1 year")) {
|
|
97
114
|
return { success: false, error: "Request timestamp expired", statusCode: 401 };
|
|
@@ -99,19 +116,20 @@ async function handleHmacAuthBase(req, options, isServiceAuth) {
|
|
|
99
116
|
const expectedSig = cryptoService.signRequest({ method, path, ts, body: req.body, nonce, secretKey });
|
|
100
117
|
const providedSig = sigB64;
|
|
101
118
|
const ok = crypto.timingSafeEqual(Buffer.from(expectedSig, "base64"), Buffer.from(providedSig, "base64"));
|
|
102
|
-
if (!ok)
|
|
119
|
+
if (!ok)
|
|
103
120
|
return { success: false, error: "Invalid signature", statusCode: 401 };
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
121
|
+
// Prevent nonce replay attacks
|
|
122
|
+
const nonceValid = await validateNonce(apiKeyId, nonce);
|
|
123
|
+
if (!nonceValid)
|
|
124
|
+
return { success: false, error: "Nonce has already been used", statusCode: 401 };
|
|
125
|
+
req.apiUser = { id: apiKey.userId, service: apiKey.service };
|
|
107
126
|
req.ethAddress = apiKey.ethAddress;
|
|
108
127
|
req.authMethod = isServiceAuth ? LevrAuth.SERVICE_HMAC : LevrAuth.HMAC;
|
|
109
|
-
// Update last used timestamp
|
|
110
128
|
await apiKeyRepository.updateApiKey({ apiKeyId }, { lastUsedAt: new Date(), usageCount: { increment: 1 } });
|
|
111
129
|
return { success: true };
|
|
112
130
|
}
|
|
113
131
|
catch (err) {
|
|
114
|
-
console.error(
|
|
132
|
+
console.error(`HMAC verification error:`, err);
|
|
115
133
|
return { success: false, error: "Signature verification failed", statusCode: 401 };
|
|
116
134
|
}
|
|
117
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmac.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/hmac.handler.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAoB,MAAM,eAAe,CAAA;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"hmac.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/hmac.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Request } from "express";
|
|
2
2
|
import { LevrAuth, PrivyRole } from "../../../core";
|
|
3
|
+
import type { AuthResult } from "../../types/auth.types";
|
|
3
4
|
import "../../types/express.types";
|
|
4
|
-
import type { AuthResult } from "./hmac.handler";
|
|
5
5
|
/**
|
|
6
6
|
* Handles Privy authentication (User or Admin)
|
|
7
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privy.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/privy.handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAY,yBAAyB,EAAE,qBAAqB,EAAa,MAAM,eAAe,CAAA;AACzH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"privy.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/privy.handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAY,yBAAyB,EAAE,qBAAqB,EAAa,MAAM,eAAe,CAAA;AACzH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,2BAA2B,CAAA;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,IAAe,EAAE,QAAkB;IACnF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrE,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAA;IACnE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAA;IAE9D,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/B,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,WAAW,yBAAyB,OAAO,qBAAqB,SAAS;YAChF,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IAEjG,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,UAAU,EAAE,GAAG,EAAE,CAAA;IACpF,CAAC;IAED,mBAAmB;IACnB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAA;IACzB,GAAG,CAAC,UAAU,GAAG,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACzH,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAA;IAEzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC"}
|
|
@@ -20,24 +20,27 @@ declare const router: import("express-serve-static-core").Router;
|
|
|
20
20
|
* }
|
|
21
21
|
* ```
|
|
22
22
|
*
|
|
23
|
-
* For HMAC API Key:
|
|
23
|
+
* For HMAC API Key (user API keys):
|
|
24
24
|
* ```
|
|
25
25
|
* headers: {
|
|
26
26
|
* 'x-levr-auth-type': 'hmac',
|
|
27
27
|
* 'Authorization': 'HMAC <api-key-id>:<signature>',
|
|
28
28
|
* 'x-request-timestamp': '1234567890',
|
|
29
|
-
* 'x-request-nonce': 'random-string'
|
|
29
|
+
* 'x-request-nonce': 'random-string'
|
|
30
30
|
* }
|
|
31
31
|
* ```
|
|
32
32
|
*
|
|
33
|
-
* For Service HMAC:
|
|
33
|
+
* For Service HMAC (backend service API keys):
|
|
34
34
|
* ```
|
|
35
35
|
* headers: {
|
|
36
36
|
* 'x-levr-auth-type': 'serviceHmac',
|
|
37
37
|
* 'Authorization': 'HMAC <api-key-id>:<signature>',
|
|
38
38
|
* 'x-request-timestamp': '1234567890',
|
|
39
|
-
* 'x-request-nonce': 'random-string'
|
|
39
|
+
* 'x-request-nonce': 'random-string'
|
|
40
40
|
* }
|
|
41
41
|
* ```
|
|
42
|
+
*
|
|
43
|
+
* Note: Service API keys are distinguished by having a 'service' field set.
|
|
44
|
+
* User API keys have service=null. The auth handler validates this automatically.
|
|
42
45
|
*/
|
|
43
46
|
export default router;
|
|
@@ -90,25 +90,28 @@ router.get("/private-data", multiAuth({
|
|
|
90
90
|
* }
|
|
91
91
|
* ```
|
|
92
92
|
*
|
|
93
|
-
* For HMAC API Key:
|
|
93
|
+
* For HMAC API Key (user API keys):
|
|
94
94
|
* ```
|
|
95
95
|
* headers: {
|
|
96
96
|
* 'x-levr-auth-type': 'hmac',
|
|
97
97
|
* 'Authorization': 'HMAC <api-key-id>:<signature>',
|
|
98
98
|
* 'x-request-timestamp': '1234567890',
|
|
99
|
-
* 'x-request-nonce': 'random-string'
|
|
99
|
+
* 'x-request-nonce': 'random-string'
|
|
100
100
|
* }
|
|
101
101
|
* ```
|
|
102
102
|
*
|
|
103
|
-
* For Service HMAC:
|
|
103
|
+
* For Service HMAC (backend service API keys):
|
|
104
104
|
* ```
|
|
105
105
|
* headers: {
|
|
106
106
|
* 'x-levr-auth-type': 'serviceHmac',
|
|
107
107
|
* 'Authorization': 'HMAC <api-key-id>:<signature>',
|
|
108
108
|
* 'x-request-timestamp': '1234567890',
|
|
109
|
-
* 'x-request-nonce': 'random-string'
|
|
109
|
+
* 'x-request-nonce': 'random-string'
|
|
110
110
|
* }
|
|
111
111
|
* ```
|
|
112
|
+
*
|
|
113
|
+
* Note: Service API keys are distinguished by having a 'service' field set.
|
|
114
|
+
* User API keys have service=null. The auth handler validates this automatically.
|
|
112
115
|
*/
|
|
113
116
|
export default router;
|
|
114
117
|
//# sourceMappingURL=multiAuth.examples.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiAuth.examples.js","sourceRoot":"","sources":["../../../src/server/middleware/multiAuth.examples.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"multiAuth.examples.js","sourceRoot":"","sources":["../../../src/server/middleware/multiAuth.examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiAuth.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/multiAuth.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAoB,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"multiAuth.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/multiAuth.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAoB,SAAS,EAAE,MAAM,YAAY,CAAA;AAEpF,OAAO,wBAAwB,CAAA;AAC/B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAA;AAErG;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IAC/C,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;QAC5E,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAEtD,oCAAoC;QACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,WAAW,gBAAgB,SAAS;gBAC3C,gBAAgB,EAAE,OAAO,CAAC,OAAO;aACpC,CAAC,CAAA;YACF,OAAM;QACV,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAA6B,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,4BAA4B,iBAAiB,EAAE;gBACtD,gBAAgB,EAAE,OAAO,CAAC,OAAO;aACpC,CAAC,CAAA;YACF,OAAM;QACV,CAAC;QAED,IAAI,MAAkB,CAAA;QAEtB,oCAAoC;QACpC,QAAQ,iBAAiB,EAAE,CAAC;YACxB,KAAK,QAAQ,CAAC,IAAI;gBACd,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBAC3C,MAAK;YAET,KAAK,QAAQ,CAAC,YAAY;gBACtB,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBAClD,MAAK;YAET,KAAK,QAAQ,CAAC,UAAU;gBACpB,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;gBACxE,MAAK;YAET,KAAK,QAAQ,CAAC,WAAW;gBACrB,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;gBAC1E,MAAK;YAET,KAAK,QAAQ,CAAC,UAAU;gBACpB,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAK;YAET;gBACI,MAAM,GAAG;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,wBAAwB,iBAAiB,EAAE;oBAClD,UAAU,EAAE,GAAG;iBAClB,CAAA;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YAClE,OAAM;QACV,CAAC;QAED,IAAI,EAAE,CAAA;IACV,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { DecryptCommand, GenerateDataKeyCommand } from "@aws-sdk/client-kms";
|
|
2
2
|
import crypto from "crypto";
|
|
3
3
|
import _ from "lodash";
|
|
4
|
-
import { kmsClientManager } from "../config";
|
|
5
|
-
//
|
|
6
|
-
const keyCache = new Map();
|
|
4
|
+
import { kmsClientManager, redisClientManager } from "../config";
|
|
5
|
+
const CACHE_TTL = 5 * 60; // 5 minutes in seconds
|
|
7
6
|
export const cryptoService = {
|
|
8
7
|
CMK_ID: "b6050d0f-be5b-418c-9056-c53c1d982dec", // TODO: make per env
|
|
9
8
|
async generateDataKey() {
|
|
@@ -24,17 +23,23 @@ export const cryptoService = {
|
|
|
24
23
|
return h.digest("base64");
|
|
25
24
|
},
|
|
26
25
|
async getSecretKey(apiKeyId, ciphertextBase64) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
const cacheKey = `api_key_secret:${apiKeyId}`;
|
|
27
|
+
try {
|
|
28
|
+
const cached = await redisClientManager.primaryClient.get(cacheKey);
|
|
29
|
+
if (cached)
|
|
30
|
+
return cached;
|
|
31
|
+
const ciphertext = Buffer.from(ciphertextBase64, "base64");
|
|
32
|
+
const resp = await kmsClientManager.client.send(new DecryptCommand({ CiphertextBlob: ciphertext }));
|
|
33
|
+
if (!resp.Plaintext)
|
|
34
|
+
throw new Error("KMS Decrypt failed: No plaintext returned");
|
|
35
|
+
const secretKey = Buffer.from(resp.Plaintext).toString("base64");
|
|
36
|
+
await redisClientManager.primaryClient.setex(cacheKey, CACHE_TTL, secretKey);
|
|
37
|
+
return secretKey;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error("Failed to get secret key:", err);
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
38
43
|
},
|
|
39
44
|
};
|
|
40
45
|
//# sourceMappingURL=crypto.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.service.js","sourceRoot":"","sources":["../../../src/server/services/crypto.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"crypto.service.js","sourceRoot":"","sources":["../../../src/server/services/crypto.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface GenerateAuthHeadersParams {
|
|
2
|
+
apiKeyId: string;
|
|
3
|
+
secretKey: string;
|
|
4
|
+
method: string;
|
|
5
|
+
path: string;
|
|
6
|
+
body?: any;
|
|
7
|
+
nonce?: string;
|
|
8
|
+
isService?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface HmacAuthHeaders {
|
|
11
|
+
"x-levr-auth-type": string;
|
|
12
|
+
Authorization: string;
|
|
13
|
+
"x-request-timestamp": string;
|
|
14
|
+
"x-request-nonce": string;
|
|
15
|
+
}
|
|
16
|
+
declare class HmacService {
|
|
17
|
+
/**
|
|
18
|
+
* Generates HMAC authentication headers for making authenticated requests
|
|
19
|
+
*/
|
|
20
|
+
generateAuthHeaders({ apiKeyId, secretKey, method, path, body, nonce, isService, }: GenerateAuthHeadersParams): HmacAuthHeaders;
|
|
21
|
+
/**
|
|
22
|
+
* Generates service-to-service HMAC authentication headers
|
|
23
|
+
*/
|
|
24
|
+
generateServiceAuthHeaders(params: Omit<GenerateAuthHeadersParams, "isService">): HmacAuthHeaders;
|
|
25
|
+
}
|
|
26
|
+
export declare const hmacService: HmacService;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { LevrAuth } from "../../core";
|
|
3
|
+
import { cryptoService } from "./crypto.service";
|
|
4
|
+
class HmacService {
|
|
5
|
+
/**
|
|
6
|
+
* Generates HMAC authentication headers for making authenticated requests
|
|
7
|
+
*/
|
|
8
|
+
generateAuthHeaders({ apiKeyId, secretKey, method, path, body, nonce, isService = false, }) {
|
|
9
|
+
const ts = Date.now();
|
|
10
|
+
const actualNonce = nonce || crypto.randomBytes(16).toString("hex");
|
|
11
|
+
// Generate signature using the crypto service
|
|
12
|
+
const signature = cryptoService.signRequest({
|
|
13
|
+
method: method.toUpperCase(),
|
|
14
|
+
path,
|
|
15
|
+
ts,
|
|
16
|
+
body,
|
|
17
|
+
nonce: actualNonce,
|
|
18
|
+
secretKey,
|
|
19
|
+
});
|
|
20
|
+
const headers = {
|
|
21
|
+
"x-levr-auth-type": isService ? LevrAuth.SERVICE_HMAC : LevrAuth.HMAC,
|
|
22
|
+
Authorization: `HMAC ${apiKeyId}:${signature}`,
|
|
23
|
+
"x-request-timestamp": ts.toString(),
|
|
24
|
+
"x-request-nonce": actualNonce,
|
|
25
|
+
};
|
|
26
|
+
return headers;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generates service-to-service HMAC authentication headers
|
|
30
|
+
*/
|
|
31
|
+
generateServiceAuthHeaders(params) {
|
|
32
|
+
return this.generateAuthHeaders({ ...params, isService: true });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export const hmacService = new HmacService();
|
|
36
|
+
//# sourceMappingURL=hmac.service.js.map
|