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,362 @@
1
+ # 🎰 Jackpot Deployment Guide
2
+
3
+ Complete guide for deploying the Jackpot system to Heroku (devnet & mainnet).
4
+
5
+ ## Overview
6
+
7
+ | Environment | Heroku App | Solana Network | Program ID |
8
+ |-------------|------------|----------------|------------|
9
+ | **Development** | `dubs-server-dev` | Devnet | `BHidyz25KWkNPdTHgeANzMg25MM2KEiNnG4yE5F46XUz` |
10
+ | **Production** | `dubs-server-prod` | Mainnet | `<DEPLOY TO MAINNET>` |
11
+
12
+ ## Pre-Deployment Checklist
13
+
14
+ ### 1. Solana Program (On-Chain)
15
+
16
+ - [ ] Program deployed to target network
17
+ - [ ] Config PDA initialized with fee settings
18
+ - [ ] Config PDA funded (minimum 0.5 SOL for keeper rewards)
19
+ - [ ] Round PDA funded (minimum 0.01 SOL for rent)
20
+
21
+ ### 2. Wallet Setup
22
+
23
+ - [ ] Oracle wallet created (or reuse existing)
24
+ - [ ] Oracle wallet funded (for transaction fees)
25
+ - [ ] Private key exported for Heroku
26
+
27
+ ### 3. Heroku App
28
+
29
+ - [ ] App created on Heroku
30
+ - [ ] PostgreSQL addon attached
31
+ - [ ] Environment variables configured
32
+
33
+ ---
34
+
35
+ ## Step 1: Deploy Solana Program (if needed)
36
+
37
+ ### Devnet (Already Done ✅)
38
+
39
+ ```bash
40
+ # Program already deployed at:
41
+ # BHidyz25KWkNPdTHgeANzMg25MM2KEiNnG4yE5F46XUz
42
+ ```
43
+
44
+ ### Mainnet (New Deployment Required)
45
+
46
+ ```bash
47
+ cd /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs
48
+
49
+ # Build the program
50
+ cargo build-sbf
51
+
52
+ # Deploy to mainnet (requires SOL for deployment ~2-3 SOL)
53
+ solana program deploy \
54
+ target/deploy/dubs_jackpot_program.so \
55
+ --url mainnet-beta \
56
+ --keypair ~/.config/solana/id.json \
57
+ --program-id target/deploy/dubs_jackpot_program-keypair.json
58
+
59
+ # Save the program ID!
60
+ # Example: ABCxyz123...
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Step 2: Initialize Program Config
66
+
67
+ ### For New Deployment (One-Time Setup)
68
+
69
+ ```bash
70
+ # You'll need to call the initialize instruction
71
+ # This sets up:
72
+ # - Fee percentage (e.g., 500 = 5%)
73
+ # - Round duration in slots (e.g., 150 = ~1 minute)
74
+ # - Treasury wallet for fees
75
+
76
+ # Use the CLI or a script to initialize
77
+ ```
78
+
79
+ ### Fund the PDAs
80
+
81
+ ```bash
82
+ # Get PDA addresses
83
+ CONFIG_PDA="6CtBNYPTkQWBuAR25n5PwJWCkfHM8WDjy4FhNPgK4wDs" # Devnet
84
+ ROUND_PDA="Ba7qZWQ42kPStqkz4htMHiYNwwBDCoPMrTQGo4d2T2ET" # Devnet
85
+
86
+ # Fund Config PDA (for keeper rewards)
87
+ # Each played round costs 0.003 SOL, empty rounds are FREE
88
+ solana transfer $CONFIG_PDA 1.0 --url devnet
89
+
90
+ # Fund Round PDA (for rent)
91
+ solana transfer $ROUND_PDA 0.01 --url devnet
92
+ ```
93
+
94
+ ---
95
+
96
+ ## Step 3: Export Keeper Private Key
97
+
98
+ ```bash
99
+ # Get the private key as JSON array
100
+ cat /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs-server/wallets/oracle.json
101
+
102
+ # Output will look like:
103
+ # [123,45,67,89,...] (64 numbers)
104
+
105
+ # Copy this ENTIRE array including brackets
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Step 4: Configure Heroku Environment Variables
111
+
112
+ ### For Devnet (dubs-server-dev)
113
+
114
+ ```bash
115
+ # Set Solana network
116
+ heroku config:set SOLANA_NETWORK=https://api.devnet.solana.com -a dubs-server-dev
117
+
118
+ # Set Jackpot Program ID (devnet)
119
+ heroku config:set JACKPOT_PROGRAM_ID=BHidyz25KWkNPdTHgeANzMg25MM2KEiNnG4yE5F46XUz -a dubs-server-dev
120
+
121
+ # Set Oracle Wallet
122
+ heroku config:set JACKPOT_ORACLE_WALLET=FWUJCthDfPcgmTvdQWM5uofxxiYjqJFMMwiLYvS7LBFa -a dubs-server-dev
123
+
124
+ # Set Keeper Private Key (CRITICAL!)
125
+ # Paste the ENTIRE JSON array from oracle.json
126
+ heroku config:set KEEPER_PRIVATE_KEY='[123,45,67,89,...]' -a dubs-server-dev
127
+
128
+ # Set API Base URL (for keeper to call server)
129
+ heroku config:set API_BASE_URL=https://dubs-server-dev.herokuapp.com -a dubs-server-dev
130
+ ```
131
+
132
+ ### For Mainnet (dubs-server-prod)
133
+
134
+ ```bash
135
+ # Set Solana network
136
+ heroku config:set SOLANA_NETWORK=https://api.mainnet-beta.solana.com -a dubs-server-prod
137
+
138
+ # Set Jackpot Program ID (MAINNET - deploy first!)
139
+ heroku config:set JACKPOT_PROGRAM_ID=<YOUR_MAINNET_PROGRAM_ID> -a dubs-server-prod
140
+
141
+ # Set Oracle Wallet (can be same or different for mainnet)
142
+ heroku config:set JACKPOT_ORACLE_WALLET=<YOUR_MAINNET_ORACLE_WALLET> -a dubs-server-prod
143
+
144
+ # Set Keeper Private Key (use MAINNET wallet!)
145
+ heroku config:set KEEPER_PRIVATE_KEY='[...]' -a dubs-server-prod
146
+
147
+ # Set API Base URL
148
+ heroku config:set API_BASE_URL=https://dubs-server-prod.herokuapp.com -a dubs-server-prod
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Step 5: Deploy to Heroku
154
+
155
+ ### Deploy Code
156
+
157
+ ```bash
158
+ cd /Users/adamdahan/Developer/iheartsolana/solana-programs/dubs-server
159
+
160
+ # Commit changes
161
+ git add .
162
+ git commit -m "Jackpot deployment ready"
163
+
164
+ # Deploy to devnet
165
+ git push heroku-dev main
166
+
167
+ # Deploy to mainnet
168
+ git push heroku-prod main
169
+ ```
170
+
171
+ ### Enable Keeper Dyno
172
+
173
+ ```bash
174
+ # For devnet
175
+ heroku ps:scale jackpot-keeper=1 -a dubs-server-dev
176
+
177
+ # For mainnet
178
+ heroku ps:scale jackpot-keeper=1 -a dubs-server-prod
179
+ ```
180
+
181
+ ---
182
+
183
+ ## Step 6: Verify Deployment
184
+
185
+ ### Health Checks
186
+
187
+ ```bash
188
+ # Devnet
189
+ curl https://dubs-server-dev.herokuapp.com/jackpot/health | jq .
190
+ curl https://dubs-server-dev.herokuapp.com/jackpot/round/current | jq .
191
+
192
+ # Mainnet
193
+ curl https://dubs-server-prod.herokuapp.com/jackpot/health | jq .
194
+ curl https://dubs-server-prod.herokuapp.com/jackpot/round/current | jq .
195
+ ```
196
+
197
+ ### Check Logs
198
+
199
+ ```bash
200
+ # Devnet keeper logs
201
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-dev
202
+
203
+ # Mainnet keeper logs
204
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-prod
205
+ ```
206
+
207
+ ### Expected Log Output
208
+
209
+ ```
210
+ 🤖 Complete Jackpot Keeper Bot
211
+ Wallet: FWUJCthDfPcgmTvdQWM5uofxxiYjqJFMMwiLYvS7LBFa
212
+
213
+ 🚀 Keeper bot started!
214
+
215
+ 🔧 Checking for stuck rounds...
216
+ ✅ No stuck rounds found
217
+
218
+ ⏳ Round 117 in progress...
219
+ Status: Open
220
+ Time remaining: 45 slots
221
+ Entries: 0
222
+ Pot: 0 SOL
223
+ ```
224
+
225
+ ---
226
+
227
+ ## Environment Variables Reference
228
+
229
+ | Variable | Required | Description | Example |
230
+ |----------|----------|-------------|---------|
231
+ | `SOLANA_NETWORK` | ✅ | RPC endpoint | `https://api.devnet.solana.com` |
232
+ | `JACKPOT_PROGRAM_ID` | ✅ | On-chain program ID | `BHidyz25...` |
233
+ | `JACKPOT_ORACLE_WALLET` | ✅ | Oracle public key | `DU4CHE...` |
234
+ | `KEEPER_PRIVATE_KEY` | ✅ | Oracle secret key (JSON) | `[1,2,3,...]` |
235
+ | `API_BASE_URL` | ✅ | Server URL for keeper | `https://...` |
236
+ | `DATABASE_URL` | ✅ | PostgreSQL connection | Auto-set by Heroku |
237
+
238
+ ---
239
+
240
+ ## Dyno Configuration
241
+
242
+ | Process | Purpose | Scale |
243
+ |---------|---------|-------|
244
+ | `web` | API server | 1 |
245
+ | `oracle` | Sports betting oracle | 0-1 |
246
+ | `jackpot-keeper` | Jackpot round manager | 1 |
247
+
248
+ ### Scale Commands
249
+
250
+ ```bash
251
+ # Check current scaling
252
+ heroku ps -a dubs-server-dev
253
+
254
+ # Scale up/down
255
+ heroku ps:scale web=1 oracle=1 jackpot-keeper=1 -a dubs-server-dev
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Costs & Economics
261
+
262
+ ### Keeper Rewards (from Config PDA)
263
+
264
+ | Round Type | Cost | Notes |
265
+ |------------|------|-------|
266
+ | Empty round | **FREE** | No keeper reward paid |
267
+ | Played round | 0.003 SOL | lock + resolve + reset |
268
+
269
+ ### Self-Sustaining Model
270
+
271
+ - Played rounds replenish Config via 20% of fees
272
+ - With 5% fee on 1 SOL pot: 0.01 SOL back to Config
273
+ - Net profit per played round: ~0.007 SOL
274
+
275
+ ### Recommended Funding
276
+
277
+ | Environment | Config PDA | Round PDA |
278
+ |-------------|------------|-----------|
279
+ | Devnet | 1.0 SOL | 0.01 SOL |
280
+ | Mainnet | 5.0 SOL | 0.1 SOL |
281
+
282
+ ---
283
+
284
+ ## Troubleshooting
285
+
286
+ ### Keeper Not Starting
287
+
288
+ ```bash
289
+ # Check if private key is set
290
+ heroku config:get KEEPER_PRIVATE_KEY -a dubs-server-dev
291
+
292
+ # Check logs for errors
293
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-dev
294
+ ```
295
+
296
+ ### "InsufficientFundsForRent" Error
297
+
298
+ Config PDA is depleted. Fund it:
299
+
300
+ ```bash
301
+ solana transfer 6CtBNYPTkQWBuAR25n5PwJWCkfHM8WDjy4FhNPgK4wDs 1.0 --url devnet
302
+ ```
303
+
304
+ ### Rounds Not Advancing
305
+
306
+ 1. Check keeper logs
307
+ 2. Verify program ID matches
308
+ 3. Check PDA balances
309
+ 4. Restart keeper: `heroku ps:restart jackpot-keeper -a dubs-server-dev`
310
+
311
+ ---
312
+
313
+ ## Mainnet Deployment Checklist
314
+
315
+ Before going live on mainnet:
316
+
317
+ - [ ] Deploy Solana program to mainnet-beta
318
+ - [ ] Initialize program config with production settings
319
+ - [ ] Create/fund mainnet oracle wallet
320
+ - [ ] Fund Config PDA with 5+ SOL
321
+ - [ ] Fund Round PDA with 0.1+ SOL
322
+ - [ ] Configure dubs-server-prod with mainnet env vars
323
+ - [ ] Deploy and enable jackpot-keeper dyno
324
+ - [ ] Test with small amounts first
325
+ - [ ] Monitor logs for 24 hours
326
+ - [ ] Set up alerts for PDA balance monitoring
327
+
328
+ ---
329
+
330
+ ## Quick Commands Reference
331
+
332
+ ```bash
333
+ # === DEVNET ===
334
+ # Deploy
335
+ git push heroku-dev main
336
+
337
+ # Logs
338
+ heroku logs --tail -a dubs-server-dev
339
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-dev
340
+
341
+ # Restart
342
+ heroku ps:restart jackpot-keeper -a dubs-server-dev
343
+
344
+ # Scale
345
+ heroku ps:scale jackpot-keeper=1 -a dubs-server-dev
346
+
347
+ # === MAINNET ===
348
+ # Deploy
349
+ git push heroku-prod main
350
+
351
+ # Logs
352
+ heroku logs --tail -a dubs-server-prod
353
+ heroku logs --tail --ps jackpot-keeper -a dubs-server-prod
354
+
355
+ # Restart
356
+ heroku ps:restart jackpot-keeper -a dubs-server-prod
357
+
358
+ # Scale
359
+ heroku ps:scale jackpot-keeper=1 -a dubs-server-prod
360
+ ```
361
+
362
+