dubs-server 1.0.0

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.
Files changed (304) hide show
  1. package/.claude/settings.local.json +280 -0
  2. package/CLAUDE.md +46 -0
  3. package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
  4. package/CURRENT_SESSION.md +171 -0
  5. package/CURRENT_SESSION_DRAW.md +516 -0
  6. package/MARCH_MADNESS_SURVIVOR.md +254 -0
  7. package/PANDA.md +166 -0
  8. package/Procfile +4 -0
  9. package/README.md +476 -0
  10. package/controllers/livescoresController.js +376 -0
  11. package/controllers/pickemController.js +554 -0
  12. package/controllers/survivorAdminController.js +887 -0
  13. package/controllers/survivorController.js +623 -0
  14. package/cron/oracleMonitor.js +77 -0
  15. package/cron/pickemOracleMonitor.js +73 -0
  16. package/data/jackpot-history.json +952 -0
  17. package/data/ncaaTeams.js +406 -0
  18. package/documentation/API_SECURITY_GUIDE.md +327 -0
  19. package/documentation/ARCADE_API.md +593 -0
  20. package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
  21. package/documentation/ARCADE_QUICKSTART.md +242 -0
  22. package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
  23. package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
  24. package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
  25. package/documentation/CLAIM_STATUS_FIX.md +67 -0
  26. package/documentation/CLI_TOOL_GUIDE.md +372 -0
  27. package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
  28. package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
  29. package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
  30. package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
  31. package/documentation/DATABASE_QUERIES.md +269 -0
  32. package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
  33. package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
  34. package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
  35. package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
  36. package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
  37. package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
  38. package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
  39. package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
  40. package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
  41. package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
  42. package/documentation/HEROKU_DEPLOYMENT.md +134 -0
  43. package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
  44. package/documentation/JACKPOT_API.md +521 -0
  45. package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
  46. package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
  47. package/documentation/JWT_QUICK_SETUP.md +268 -0
  48. package/documentation/JWT_TESTING_GUIDE.md +404 -0
  49. package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
  50. package/documentation/KEEPER_SETUP.md +206 -0
  51. package/documentation/KEEPER_STATE_MACHINE.md +423 -0
  52. package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
  53. package/documentation/LOCAL_VOTING_TEST.md +279 -0
  54. package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
  55. package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
  56. package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
  57. package/documentation/PNL_TRACKING_SETUP.md +189 -0
  58. package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
  59. package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
  60. package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
  61. package/documentation/QUICK_AUTH_SETUP.md +99 -0
  62. package/documentation/QUICK_DEPLOY.md +224 -0
  63. package/documentation/QUICK_FIX.md +114 -0
  64. package/documentation/QUICK_START.md +152 -0
  65. package/documentation/REFEREE_MODE_GUIDE.md +392 -0
  66. package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
  67. package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
  68. package/documentation/RUN_MIGRATION_NOW.md +39 -0
  69. package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
  70. package/documentation/SETUP_GUIDE.md +184 -0
  71. package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
  72. package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
  73. package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
  74. package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
  75. package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
  76. package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
  77. package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
  78. package/ecosystem.config.js +65 -0
  79. package/env.template +125 -0
  80. package/middleware/apiKeyAuth.js +136 -0
  81. package/middleware/authenticate.js +214 -0
  82. package/middleware/developerUserAuth.js +76 -0
  83. package/middleware/socketAuth.js +69 -0
  84. package/package.json +49 -0
  85. package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
  86. package/postman/Dubs-API-v1.postman_collection.json +205 -0
  87. package/postman/Dubs_Developer_API.postman_collection.json +662 -0
  88. package/postman/QUICKSTART.md +118 -0
  89. package/postman/QUICK_REFERENCE.md +246 -0
  90. package/postman/README.md +71 -0
  91. package/postman/VOTING_API_GUIDE.md +426 -0
  92. package/refactor/Animations.md +148 -0
  93. package/refactor/Chat.md +252 -0
  94. package/routes/actionsRoutes.js +699 -0
  95. package/routes/adminRoutes.js +370 -0
  96. package/routes/analyticsRoutes.js +1262 -0
  97. package/routes/arcadeRoutes.js +557 -0
  98. package/routes/authRoutes.js +2310 -0
  99. package/routes/avatarRoutes.js +85 -0
  100. package/routes/botRoutes.js +211 -0
  101. package/routes/chatRoutes.js +377 -0
  102. package/routes/cryptoPriceRoutes.js +105 -0
  103. package/routes/developerRoutes.js +4201 -0
  104. package/routes/deviceRoutes.js +214 -0
  105. package/routes/dmRoutes.js +167 -0
  106. package/routes/esportsRoutes.js +806 -0
  107. package/routes/exchangeRateRoutes.js +233 -0
  108. package/routes/gamesRoutes.js +3028 -0
  109. package/routes/jackpotRoutes.js +754 -0
  110. package/routes/keeperMonitoringRoutes.js +156 -0
  111. package/routes/keeperWebhookRoutes.js +466 -0
  112. package/routes/livescoresRoutes.js +31 -0
  113. package/routes/pickemAdminRoutes.js +199 -0
  114. package/routes/pickemRoutes.js +231 -0
  115. package/routes/playerStatsRoutes.js +147 -0
  116. package/routes/portfolioRoutes.js +217 -0
  117. package/routes/promoRoutes.js +418 -0
  118. package/routes/referralEarningsRoutes.js +392 -0
  119. package/routes/socialRoutes.js +459 -0
  120. package/routes/sportsRoutes.js +1271 -0
  121. package/routes/survivorAdminRoutes.js +345 -0
  122. package/routes/survivorRoutes.js +756 -0
  123. package/routes/uploadRoutes.js +256 -0
  124. package/routes/userProfileRoutes.js +244 -0
  125. package/routes/whatsNewRoutes.js +331 -0
  126. package/scripts/.claude/settings.local.json +15 -0
  127. package/scripts/README.md +170 -0
  128. package/scripts/RESTART_EVERYTHING.sh +104 -0
  129. package/scripts/add-claim-columns.sql +48 -0
  130. package/scripts/add-crypto-prices-cache.sql +27 -0
  131. package/scripts/add-exchange-rates-cache.sql +40 -0
  132. package/scripts/add-game-invite-column.sql +23 -0
  133. package/scripts/add-game-invite-notification.sql +33 -0
  134. package/scripts/add-game-invite-telegram-pref.sql +16 -0
  135. package/scripts/add-game-joined-notification.sql +16 -0
  136. package/scripts/add-game-joined-pref.js +40 -0
  137. package/scripts/add-game-joined-preference.sql +6 -0
  138. package/scripts/add-game-start-notifications.sql +41 -0
  139. package/scripts/add-notification-flags-to-games.sql +55 -0
  140. package/scripts/add-pending-game-dismissals.sql +19 -0
  141. package/scripts/add-preferred-currency.sql +34 -0
  142. package/scripts/add-winner-columns.js +61 -0
  143. package/scripts/add_mention_system.sql +53 -0
  144. package/scripts/add_payment_system.sql +96 -0
  145. package/scripts/add_sports_event_id_column.sql +22 -0
  146. package/scripts/analyze-cohort-data-heroku.js +276 -0
  147. package/scripts/analyze-cohort-data.js +295 -0
  148. package/scripts/analyze-prod-cohorts.sh +10 -0
  149. package/scripts/backfill-matchup-images.js +245 -0
  150. package/scripts/backfill-missing-signatures.js +175 -0
  151. package/scripts/backfill-referral-earnings.js +202 -0
  152. package/scripts/check-chat-schema.js +130 -0
  153. package/scripts/check-db.sh +14 -0
  154. package/scripts/check_oracle_in_game.js +54 -0
  155. package/scripts/cleanup-database.js +193 -0
  156. package/scripts/clear-notification-cache.js +85 -0
  157. package/scripts/convert-mnemonic.js +50 -0
  158. package/scripts/create-users-table.sql +44 -0
  159. package/scripts/debug-cohort-counts.js +248 -0
  160. package/scripts/debug-winner-calc.js +84 -0
  161. package/scripts/deploy-payment-system.sh +118 -0
  162. package/scripts/deploy-to-heroku.sh +63 -0
  163. package/scripts/diagnose-locked-round.js +143 -0
  164. package/scripts/dubs-cli.js +720 -0
  165. package/scripts/dump-account.js +65 -0
  166. package/scripts/find-vrf-offset.js +48 -0
  167. package/scripts/fix-chat-notifications-constraint.sql +122 -0
  168. package/scripts/fix-claim-columns.js +124 -0
  169. package/scripts/fix-constraint-now.js +44 -0
  170. package/scripts/fix-lock-timestamps.js +96 -0
  171. package/scripts/fix-locked-round.sh +126 -0
  172. package/scripts/fix-missing-badges.sql +91 -0
  173. package/scripts/fix-payment-notifications.sql +41 -0
  174. package/scripts/force-new-round.js +55 -0
  175. package/scripts/force-resolve-and-claim.js +278 -0
  176. package/scripts/important/README.md +115 -0
  177. package/scripts/important/authority-force-lock.js +197 -0
  178. package/scripts/important/authority-resolve-game.js +267 -0
  179. package/scripts/important/check-game-status.js +373 -0
  180. package/scripts/important/list-pending-games-by-version.js +270 -0
  181. package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
  182. package/scripts/initialize-jackpot.js +111 -0
  183. package/scripts/jackpot/.claude/settings.local.json +10 -0
  184. package/scripts/jackpot/force-reset.js +84 -0
  185. package/scripts/jackpot/initialize-mainnet.js +100 -0
  186. package/scripts/jackpot/keeper.js +742 -0
  187. package/scripts/jackpot/status.js +107 -0
  188. package/scripts/jackpot/update-round-duration.js +143 -0
  189. package/scripts/keeper-bot.js +112 -0
  190. package/scripts/list-pending-games.js +131 -0
  191. package/scripts/migrate-chat-v2.js +127 -0
  192. package/scripts/migrate-chat-winners.js +84 -0
  193. package/scripts/migrate-chat.sh +17 -0
  194. package/scripts/migrate-game-invite.js +83 -0
  195. package/scripts/migrate-heroku-game-notifications.sh +159 -0
  196. package/scripts/migrations/001_analytics_tables.sql +422 -0
  197. package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
  198. package/scripts/migrations/003_referral_earnings.sql +208 -0
  199. package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
  200. package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
  201. package/scripts/migrations/005_push_notifications.sql +55 -0
  202. package/scripts/migrations/006_add_draw_team_players.sql +28 -0
  203. package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
  204. package/scripts/migrations/007_add_gif_url.sql +8 -0
  205. package/scripts/migrations/008_add_connect4_columns.sql +139 -0
  206. package/scripts/migrations/008_add_pool_tracking.sql +22 -0
  207. package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
  208. package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
  209. package/scripts/migrations/011_create_developer_tables.sql +67 -0
  210. package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
  211. package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
  212. package/scripts/migrations/013_add_network_mode.sql +18 -0
  213. package/scripts/migrations/014_create_developer_app_users.sql +19 -0
  214. package/scripts/migrations/015_add_ui_config.sql +4 -0
  215. package/scripts/migrations/016_add_resolution_secret.sql +4 -0
  216. package/scripts/migrations/017_add_external_game_id.sql +3 -0
  217. package/scripts/migrations/018_create_pickem_tables.sql +115 -0
  218. package/scripts/migrations/019_expo_push_tokens.sql +19 -0
  219. package/scripts/migrations/create_whats_new_tables.sql +88 -0
  220. package/scripts/migrations/drop_live_games_tables.sql +34 -0
  221. package/scripts/open-jackpot-round.js +85 -0
  222. package/scripts/purge-all-data.sh +329 -0
  223. package/scripts/purge-all-data.sql +142 -0
  224. package/scripts/purge-heroku-data.sh +149 -0
  225. package/scripts/purge-heroku-data.sql +62 -0
  226. package/scripts/rebuild-heroku-database.sh +113 -0
  227. package/scripts/recover-funds.js +357 -0
  228. package/scripts/regenerate-epl-images.js +278 -0
  229. package/scripts/resize-s3-matchup-images.js +374 -0
  230. package/scripts/resolve-direct.js +88 -0
  231. package/scripts/resolve-mock-game.js +124 -0
  232. package/scripts/resolve-pickem-game.js +55 -0
  233. package/scripts/resolve-round-manual.js +83 -0
  234. package/scripts/resolve-stuck-game.js +382 -0
  235. package/scripts/resolve-stuck-round.js +42 -0
  236. package/scripts/run-connect4-migration.sh +16 -0
  237. package/scripts/run-mention-migration.sh +32 -0
  238. package/scripts/run-payment-migration.sh +51 -0
  239. package/scripts/run-preferred-currency-migration.sh +31 -0
  240. package/scripts/run-referral-earnings-migration.sh +32 -0
  241. package/scripts/run-survivor-outcome-migration.sh +16 -0
  242. package/scripts/seed-test-users.js +346 -0
  243. package/scripts/setup-auth-tables.js +78 -0
  244. package/scripts/setup-complete-database.sql +992 -0
  245. package/scripts/setup-database-fresh.sh +359 -0
  246. package/scripts/setup-heroku-keeper.sh +48 -0
  247. package/scripts/setup-keeper-database.js +83 -0
  248. package/scripts/setup-keeper-state-db.sql +110 -0
  249. package/scripts/setup-oracle.sh +39 -0
  250. package/scripts/setup-pnl-tracking.js +111 -0
  251. package/scripts/start-devnet.sh +14 -0
  252. package/scripts/test-arcade-devnet.sh +160 -0
  253. package/scripts/test-arcade-match.sh +109 -0
  254. package/scripts/test-automatic-mode.sh +239 -0
  255. package/scripts/test-connect4-cancel-claim.js +370 -0
  256. package/scripts/test-connect4-e2e.js +369 -0
  257. package/scripts/test-connect4-resolve.js +369 -0
  258. package/scripts/test-game-state-endpoint.js +136 -0
  259. package/scripts/test-invite-notification.js +86 -0
  260. package/scripts/test-jackpot-api.sh +71 -0
  261. package/scripts/test-poll-confirmation.js +267 -0
  262. package/scripts/test-resolve-game.js +271 -0
  263. package/scripts/test-resolve-signature.js +223 -0
  264. package/scripts/test-signature-preservation.js +124 -0
  265. package/scripts/test-state-machine.js +291 -0
  266. package/scripts/test-webhook-receiver.js +60 -0
  267. package/scripts/update-notification-constraint.js +52 -0
  268. package/scripts/verify-account-layout.js +145 -0
  269. package/scripts/verify-winner-algorithm.js +278 -0
  270. package/server.js +5259 -0
  271. package/services/arcadeMatchService.js +763 -0
  272. package/services/automaticGameOracle.js +1596 -0
  273. package/services/chatService.js +1612 -0
  274. package/services/connect4GameService.js +1049 -0
  275. package/services/connect4NotificationService.js +374 -0
  276. package/services/cryptoPriceService.js +223 -0
  277. package/services/customGameResolver.js +260 -0
  278. package/services/db.js +79 -0
  279. package/services/directMessageService.js +389 -0
  280. package/services/discordNotifications.js +160 -0
  281. package/services/exchangeRateService.js +289 -0
  282. package/services/expoPushService.js +314 -0
  283. package/services/gamesCacheService.js +539 -0
  284. package/services/jackpotHistory.js +331 -0
  285. package/services/jackpotService.js +856 -0
  286. package/services/keeperStateService.js +355 -0
  287. package/services/matchupImageService.js +591 -0
  288. package/services/notificationCacheService.js +407 -0
  289. package/services/pickemOracle.js +440 -0
  290. package/services/playerStatsService.js +389 -0
  291. package/services/portfolioService.js +555 -0
  292. package/services/promoService.js +757 -0
  293. package/services/promoTreasuryService.js +239 -0
  294. package/services/pushNotifications.js +353 -0
  295. package/services/redisService.js +422 -0
  296. package/services/referralEarningsService.js +728 -0
  297. package/services/s3Service.js +396 -0
  298. package/services/socialService.js +1202 -0
  299. package/services/survivorOracle.js +469 -0
  300. package/services/survivorSimulator.js +475 -0
  301. package/services/telegramNotifications.js +461 -0
  302. package/services/userProfileStatsService.js +1185 -0
  303. package/services/whatsNewService.js +388 -0
  304. package/utils/urlHelper.js +95 -0
@@ -0,0 +1,521 @@
1
+ # 🎰 Dubs Jackpot API Documentation
2
+
3
+ RESTful API for interacting with the Dubs Jackpot program (Solpot-style continuous jackpot).
4
+
5
+ Base URL: `http://localhost:3001/jackpot` (or your deployed URL)
6
+
7
+ ## Overview
8
+
9
+ The Jackpot API provides endpoints for:
10
+ - Initializing the protocol
11
+ - Opening new rounds
12
+ - Entering rounds with weighted odds
13
+ - Locking rounds with commit-reveal randomness
14
+ - Oracle randomness submission
15
+ - Resolving rounds and paying winners
16
+ - Querying round state and statistics
17
+
18
+ ## Authentication
19
+
20
+ Most endpoints return **unsigned transactions** that must be signed by the appropriate wallet on the frontend.
21
+
22
+ The oracle endpoint requires the oracle keypair to be present in `wallets/jackpot_oracle.json`.
23
+
24
+ ---
25
+
26
+ ## Endpoints
27
+
28
+ ### 🏥 Health Check
29
+
30
+ #### GET `/jackpot/health`
31
+
32
+ Check if the jackpot service is running.
33
+
34
+ **Response:**
35
+ ```json
36
+ {
37
+ "status": "healthy",
38
+ "service": "jackpot",
39
+ "programId": "bqoSjTSPLweMuqNG6jy39jmzGyZvZdWjsr4csGfD8F6",
40
+ "oracleWallet": "FWUJCthDfPcgmTvdQWM5uofxxiYjqJFMMwiLYvS7LBFa",
41
+ "timestamp": "2024-11-16T00:00:00.000Z"
42
+ }
43
+ ```
44
+
45
+ ---
46
+
47
+ ### 📊 Query Endpoints
48
+
49
+ #### GET `/jackpot/config`
50
+
51
+ Get protocol configuration.
52
+
53
+ **Response:**
54
+ ```json
55
+ {
56
+ "success": true,
57
+ "config": {
58
+ "address": "52yV2WqLXzL7PMJKHTwQfqr5a1zsqsfVkQomtLXWqf9r",
59
+ "authority": "57voP1Y8U4ztX2YAcHveK3JFvVRn1n6T6iUnHdAW6xr9",
60
+ "treasury": "BVZXwZpfgyzTBdRFHohkHZppPHnAyqyctRsKy3vWfQib",
61
+ "feeBasisPoints": 500,
62
+ "roundDurationSlots": 1800,
63
+ "currentRoundId": "3",
64
+ "totalVolume": "5000000000",
65
+ "totalFeesCollected": "250000000",
66
+ "initialized": true
67
+ }
68
+ }
69
+ ```
70
+
71
+ #### GET `/jackpot/round/current`
72
+
73
+ Get current active round information.
74
+
75
+ **Response:**
76
+ ```json
77
+ {
78
+ "success": true,
79
+ "round": {
80
+ "address": "...",
81
+ "roundId": "3",
82
+ "status": "Open",
83
+ "startSlot": "421837200",
84
+ "endSlot": "421839000",
85
+ "totalPotLamports": "500000000",
86
+ "totalWeight": "500000000",
87
+ "entryCount": 5,
88
+ "currentSlot": "421837500",
89
+ "timeRemainingSlots": 1500
90
+ }
91
+ }
92
+ ```
93
+
94
+ #### GET `/jackpot/round/:roundId`
95
+
96
+ Get specific round information.
97
+
98
+ **Parameters:**
99
+ - `roundId` (path) - Round ID
100
+
101
+ **Response:** Same as current round
102
+
103
+ #### GET `/jackpot/round/:roundId/entries`
104
+
105
+ Get all entries for a round with odds.
106
+
107
+ **Response:**
108
+ ```json
109
+ {
110
+ "success": true,
111
+ "roundId": "3",
112
+ "entries": [
113
+ {
114
+ "player": "ABC123...",
115
+ "weight": "100000000",
116
+ "cumulativeTo": "100000000",
117
+ "oddsPercent": "20.00"
118
+ },
119
+ {
120
+ "player": "DEF456...",
121
+ "weight": "400000000",
122
+ "cumulativeTo": "500000000",
123
+ "oddsPercent": "80.00"
124
+ }
125
+ ],
126
+ "totalEntries": 2
127
+ }
128
+ ```
129
+
130
+ #### GET `/jackpot/stats`
131
+
132
+ Get overall jackpot statistics.
133
+
134
+ **Response:**
135
+ ```json
136
+ {
137
+ "success": true,
138
+ "initialized": true,
139
+ "config": { ... },
140
+ "currentRound": { ... },
141
+ "timestamp": "2024-11-16T00:00:00.000Z"
142
+ }
143
+ ```
144
+
145
+ ---
146
+
147
+ ### 🏗️ Build Transaction Endpoints
148
+
149
+ All build endpoints return base64-encoded unsigned transactions.
150
+
151
+ #### POST `/jackpot/build/initialize`
152
+
153
+ Initialize the protocol (admin only, one-time setup).
154
+
155
+ **Request:**
156
+ ```json
157
+ {
158
+ "adminAddress": "57voP1Y8U4ztX2YAcHveK3JFvVRn1n6T6iUnHdAW6xr9",
159
+ "treasuryAddress": "BVZXwZpfgyzTBdRFHohkHZppPHnAyqyctRsKy3vWfQib",
160
+ "feeBasisPoints": 500,
161
+ "roundDurationSlots": 1800
162
+ }
163
+ ```
164
+
165
+ **Response:**
166
+ ```json
167
+ {
168
+ "transaction": "base64_encoded_transaction",
169
+ "configPda": "52yV2WqLXzL7PMJKHTwQfqr5a1zsqsfVkQomtLXWqf9r"
170
+ }
171
+ ```
172
+
173
+ **Frontend Flow:**
174
+ ```javascript
175
+ // 1. Call API
176
+ const { transaction } = await fetch('/jackpot/build/initialize', {...});
177
+
178
+ // 2. Deserialize
179
+ const tx = Transaction.from(Buffer.from(transaction, 'base64'));
180
+
181
+ // 3. Sign with wallet
182
+ await wallet.signTransaction(tx);
183
+
184
+ // 4. Send
185
+ await connection.sendRawTransaction(tx.serialize());
186
+ ```
187
+
188
+ #### POST `/jackpot/build/open-round`
189
+
190
+ Open a new round (permissionless keeper).
191
+
192
+ **Request:**
193
+ ```json
194
+ {
195
+ "keeperAddress": "ABC123..."
196
+ }
197
+ ```
198
+
199
+ **Response:**
200
+ ```json
201
+ {
202
+ "transaction": "base64_encoded_transaction",
203
+ "roundId": "4",
204
+ "roundPda": "...",
205
+ "entriesPda": "..."
206
+ }
207
+ ```
208
+
209
+ #### POST `/jackpot/build/enter`
210
+
211
+ Enter the current round with a bet.
212
+
213
+ **Request:**
214
+ ```json
215
+ {
216
+ "playerAddress": "ABC123...",
217
+ "amount": 100000000,
218
+ "roundId": null
219
+ }
220
+ ```
221
+
222
+ **Fields:**
223
+ - `playerAddress` - Player's wallet address
224
+ - `amount` - Bet amount in lamports (min: 10,000)
225
+ - `roundId` - Optional, uses current round if omitted
226
+
227
+ **Response:**
228
+ ```json
229
+ {
230
+ "transaction": "base64_encoded_transaction",
231
+ "roundId": "3",
232
+ "amount": "100000000"
233
+ }
234
+ ```
235
+
236
+ #### POST `/jackpot/build/lock-round`
237
+
238
+ Lock the round when timer expires (commit phase).
239
+
240
+ **Request:**
241
+ ```json
242
+ {
243
+ "keeperAddress": "ABC123...",
244
+ "serverSeed": "optional_32_byte_hex_string",
245
+ "roundId": null
246
+ }
247
+ ```
248
+
249
+ **Fields:**
250
+ - `keeperAddress` - Keeper's wallet
251
+ - `serverSeed` - Optional secret seed (auto-generated if omitted)
252
+ - `roundId` - Optional, uses current round if omitted
253
+
254
+ **Response:**
255
+ ```json
256
+ {
257
+ "transaction": "base64_encoded_transaction",
258
+ "roundId": "3",
259
+ "serverSeedHash": "abc123...",
260
+ "serverSeed": "secret123..."
261
+ }
262
+ ```
263
+
264
+ **⚠️ IMPORTANT:** Store `serverSeed` for provably fair verification!
265
+
266
+ #### POST `/jackpot/build/resolve`
267
+
268
+ Resolve the round and pay winner.
269
+
270
+ **Request:**
271
+ ```json
272
+ {
273
+ "keeperAddress": "ABC123...",
274
+ "roundId": null
275
+ }
276
+ ```
277
+
278
+ **Response:**
279
+ ```json
280
+ {
281
+ "transaction": "base64_encoded_transaction",
282
+ "roundId": "3",
283
+ "winner": "DEF456..."
284
+ }
285
+ ```
286
+
287
+ ---
288
+
289
+ ### 🤖 Oracle Endpoints
290
+
291
+ #### POST `/jackpot/oracle/reveal`
292
+
293
+ Oracle submits random seed (reveal phase). **Server-side only** - requires oracle keypair.
294
+
295
+ **Request:**
296
+ ```json
297
+ {
298
+ "roundId": "3",
299
+ "oracleSeed": "optional_32_byte_hex"
300
+ }
301
+ ```
302
+
303
+ **Response:**
304
+ ```json
305
+ {
306
+ "success": true,
307
+ "signature": "5x7y...",
308
+ "roundId": "3",
309
+ "oracleSeed": "fed789..."
310
+ }
311
+ ```
312
+
313
+ **Note:** In production, `oracleSeed` should come from Random.org API.
314
+
315
+ ---
316
+
317
+ ## Complete Round Flow
318
+
319
+ ### 1. Initialize Protocol (One-time)
320
+
321
+ ```bash
322
+ curl -X POST http://localhost:3001/jackpot/build/initialize \
323
+ -H "Content-Type: application/json" \
324
+ -d '{
325
+ "adminAddress": "YOUR_ADMIN_WALLET",
326
+ "treasuryAddress": "YOUR_TREASURY_WALLET",
327
+ "feeBasisPoints": 500,
328
+ "roundDurationSlots": 1800
329
+ }'
330
+ ```
331
+
332
+ ### 2. Open Round (Keeper)
333
+
334
+ ```bash
335
+ curl -X POST http://localhost:3001/jackpot/build/open-round \
336
+ -H "Content-Type: application/json" \
337
+ -d '{"keeperAddress": "YOUR_KEEPER_WALLET"}'
338
+ ```
339
+
340
+ ### 3. Players Enter
341
+
342
+ ```bash
343
+ curl -X POST http://localhost:3001/jackpot/build/enter \
344
+ -H "Content-Type: application/json" \
345
+ -d '{
346
+ "playerAddress": "PLAYER_WALLET",
347
+ "amount": 100000000
348
+ }'
349
+ ```
350
+
351
+ ### 4. Check Round Status
352
+
353
+ ```bash
354
+ curl http://localhost:3001/jackpot/round/current
355
+ ```
356
+
357
+ ### 5. Lock Round (Keeper, when timer expires)
358
+
359
+ ```bash
360
+ curl -X POST http://localhost:3001/jackpot/build/lock-round \
361
+ -H "Content-Type: application/json" \
362
+ -d '{"keeperAddress": "YOUR_KEEPER_WALLET"}'
363
+ ```
364
+
365
+ **Save the `serverSeed` from response!**
366
+
367
+ ### 6. Oracle Reveals
368
+
369
+ ```bash
370
+ curl -X POST http://localhost:3001/jackpot/oracle/reveal \
371
+ -H "Content-Type: application/json" \
372
+ -d '{"roundId": "3"}'
373
+ ```
374
+
375
+ ### 7. Resolve Round (Keeper)
376
+
377
+ ```bash
378
+ curl -X POST http://localhost:3001/jackpot/build/resolve \
379
+ -H "Content-Type: application/json" \
380
+ -d '{"keeperAddress": "YOUR_KEEPER_WALLET"}'
381
+ ```
382
+
383
+ ### 8. Repeat
384
+
385
+ Go back to step 2!
386
+
387
+ ---
388
+
389
+ ## Frontend Integration Example
390
+
391
+ ```javascript
392
+ import { Connection, Transaction } from '@solana/web3.js';
393
+
394
+ // Initialize the protocol
395
+ async function initializeJackpot(wallet) {
396
+ const response = await fetch('http://localhost:3001/jackpot/build/initialize', {
397
+ method: 'POST',
398
+ headers: { 'Content-Type': 'application/json' },
399
+ body: JSON.stringify({
400
+ adminAddress: wallet.publicKey.toString(),
401
+ treasuryAddress: 'YOUR_TREASURY',
402
+ feeBasisPoints: 500,
403
+ roundDurationSlots: 1800,
404
+ }),
405
+ });
406
+
407
+ const { transaction } = await response.json();
408
+
409
+ // Deserialize and sign
410
+ const tx = Transaction.from(Buffer.from(transaction, 'base64'));
411
+ const signed = await wallet.signTransaction(tx);
412
+
413
+ // Send
414
+ const connection = new Connection('https://api.devnet.solana.com');
415
+ const signature = await connection.sendRawTransaction(signed.serialize());
416
+ await connection.confirmTransaction(signature);
417
+
418
+ console.log('✅ Initialized:', signature);
419
+ }
420
+
421
+ // Enter a round
422
+ async function enterRound(wallet, amountSOL) {
423
+ const response = await fetch('http://localhost:3001/jackpot/build/enter', {
424
+ method: 'POST',
425
+ headers: { 'Content-Type': 'application/json' },
426
+ body: JSON.stringify({
427
+ playerAddress: wallet.publicKey.toString(),
428
+ amount: amountSOL * 1e9, // Convert SOL to lamports
429
+ }),
430
+ });
431
+
432
+ const { transaction, roundId } = await response.json();
433
+
434
+ // Sign and send
435
+ const tx = Transaction.from(Buffer.from(transaction, 'base64'));
436
+ const signed = await wallet.signTransaction(tx);
437
+ const connection = new Connection('https://api.devnet.solana.com');
438
+ const signature = await connection.sendRawTransaction(signed.serialize());
439
+ await connection.confirmTransaction(signature);
440
+
441
+ console.log('✅ Entered round', roundId, ':', signature);
442
+ }
443
+
444
+ // Check current round
445
+ async function getCurrentRound() {
446
+ const response = await fetch('http://localhost:3001/jackpot/round/current');
447
+ const { round } = await response.json();
448
+
449
+ console.log('Current Round:', round.roundId);
450
+ console.log('Status:', round.status);
451
+ console.log('Pot:', round.totalPotLamports / 1e9, 'SOL');
452
+ console.log('Entries:', round.entryCount);
453
+
454
+ return round;
455
+ }
456
+
457
+ // Get entries and odds
458
+ async function getEntries(roundId) {
459
+ const response = await fetch(`http://localhost:3001/jackpot/round/${roundId}/entries`);
460
+ const { entries } = await response.json();
461
+
462
+ entries.forEach((entry, i) => {
463
+ console.log(`${i+1}. ${entry.player.slice(0,8)}... - ${entry.weight / 1e9} SOL (${entry.oddsPercent}% chance)`);
464
+ });
465
+
466
+ return entries;
467
+ }
468
+ ```
469
+
470
+ ---
471
+
472
+ ## Error Responses
473
+
474
+ All endpoints return errors in this format:
475
+
476
+ ```json
477
+ {
478
+ "error": "Error message here"
479
+ }
480
+ ```
481
+
482
+ **Common HTTP Status Codes:**
483
+ - `400` - Bad request (validation error)
484
+ - `404` - Resource not found
485
+ - `500` - Server error
486
+
487
+ ---
488
+
489
+ ## Rate Limits
490
+
491
+ No rate limits currently implemented. Add as needed for production.
492
+
493
+ ---
494
+
495
+ ## Webhooks / Events
496
+
497
+ To be implemented - will notify when:
498
+ - Round opens
499
+ - Round locks
500
+ - Winner selected
501
+ - Large entries placed
502
+
503
+ ---
504
+
505
+ ## Program Info
506
+
507
+ - **Program ID**: `bqoSjTSPLweMuqNG6jy39jmzGyZvZdWjsr4csGfD8F6`
508
+ - **Network**: Devnet (update for mainnet)
509
+ - **Oracle**: `FWUJCthDfPcgmTvdQWM5uofxxiYjqJFMMwiLYvS7LBFa`
510
+ - **Min Entry**: 10,000 lamports (0.00001 SOL)
511
+ - **Max Entries**: 1,000 per round
512
+
513
+ ---
514
+
515
+ ## Testing
516
+
517
+ See `scripts/test-jackpot-api.sh` for complete API test examples.
518
+
519
+
520
+
521
+