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.
- package/.claude/settings.local.json +280 -0
- package/CLAUDE.md +46 -0
- package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
- package/CURRENT_SESSION.md +171 -0
- package/CURRENT_SESSION_DRAW.md +516 -0
- package/MARCH_MADNESS_SURVIVOR.md +254 -0
- package/PANDA.md +166 -0
- package/Procfile +4 -0
- package/README.md +476 -0
- package/controllers/livescoresController.js +376 -0
- package/controllers/pickemController.js +554 -0
- package/controllers/survivorAdminController.js +887 -0
- package/controllers/survivorController.js +623 -0
- package/cron/oracleMonitor.js +77 -0
- package/cron/pickemOracleMonitor.js +73 -0
- package/data/jackpot-history.json +952 -0
- package/data/ncaaTeams.js +406 -0
- package/documentation/API_SECURITY_GUIDE.md +327 -0
- package/documentation/ARCADE_API.md +593 -0
- package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
- package/documentation/ARCADE_QUICKSTART.md +242 -0
- package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
- package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
- package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
- package/documentation/CLAIM_STATUS_FIX.md +67 -0
- package/documentation/CLI_TOOL_GUIDE.md +372 -0
- package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
- package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
- package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
- package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
- package/documentation/DATABASE_QUERIES.md +269 -0
- package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
- package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
- package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
- package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
- package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
- package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
- package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
- package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
- package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
- package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
- package/documentation/HEROKU_DEPLOYMENT.md +134 -0
- package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
- package/documentation/JACKPOT_API.md +521 -0
- package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
- package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
- package/documentation/JWT_QUICK_SETUP.md +268 -0
- package/documentation/JWT_TESTING_GUIDE.md +404 -0
- package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
- package/documentation/KEEPER_SETUP.md +206 -0
- package/documentation/KEEPER_STATE_MACHINE.md +423 -0
- package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
- package/documentation/LOCAL_VOTING_TEST.md +279 -0
- package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
- package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
- package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
- package/documentation/PNL_TRACKING_SETUP.md +189 -0
- package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
- package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
- package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
- package/documentation/QUICK_AUTH_SETUP.md +99 -0
- package/documentation/QUICK_DEPLOY.md +224 -0
- package/documentation/QUICK_FIX.md +114 -0
- package/documentation/QUICK_START.md +152 -0
- package/documentation/REFEREE_MODE_GUIDE.md +392 -0
- package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
- package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
- package/documentation/RUN_MIGRATION_NOW.md +39 -0
- package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
- package/documentation/SETUP_GUIDE.md +184 -0
- package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
- package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
- package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
- package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
- package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
- package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
- package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
- package/ecosystem.config.js +65 -0
- package/env.template +125 -0
- package/middleware/apiKeyAuth.js +136 -0
- package/middleware/authenticate.js +214 -0
- package/middleware/developerUserAuth.js +76 -0
- package/middleware/socketAuth.js +69 -0
- package/package.json +49 -0
- package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
- package/postman/Dubs-API-v1.postman_collection.json +205 -0
- package/postman/Dubs_Developer_API.postman_collection.json +662 -0
- package/postman/QUICKSTART.md +118 -0
- package/postman/QUICK_REFERENCE.md +246 -0
- package/postman/README.md +71 -0
- package/postman/VOTING_API_GUIDE.md +426 -0
- package/refactor/Animations.md +148 -0
- package/refactor/Chat.md +252 -0
- package/routes/actionsRoutes.js +699 -0
- package/routes/adminRoutes.js +370 -0
- package/routes/analyticsRoutes.js +1262 -0
- package/routes/arcadeRoutes.js +557 -0
- package/routes/authRoutes.js +2310 -0
- package/routes/avatarRoutes.js +85 -0
- package/routes/botRoutes.js +211 -0
- package/routes/chatRoutes.js +377 -0
- package/routes/cryptoPriceRoutes.js +105 -0
- package/routes/developerRoutes.js +4201 -0
- package/routes/deviceRoutes.js +214 -0
- package/routes/dmRoutes.js +167 -0
- package/routes/esportsRoutes.js +806 -0
- package/routes/exchangeRateRoutes.js +233 -0
- package/routes/gamesRoutes.js +3028 -0
- package/routes/jackpotRoutes.js +754 -0
- package/routes/keeperMonitoringRoutes.js +156 -0
- package/routes/keeperWebhookRoutes.js +466 -0
- package/routes/livescoresRoutes.js +31 -0
- package/routes/pickemAdminRoutes.js +199 -0
- package/routes/pickemRoutes.js +231 -0
- package/routes/playerStatsRoutes.js +147 -0
- package/routes/portfolioRoutes.js +217 -0
- package/routes/promoRoutes.js +418 -0
- package/routes/referralEarningsRoutes.js +392 -0
- package/routes/socialRoutes.js +459 -0
- package/routes/sportsRoutes.js +1271 -0
- package/routes/survivorAdminRoutes.js +345 -0
- package/routes/survivorRoutes.js +756 -0
- package/routes/uploadRoutes.js +256 -0
- package/routes/userProfileRoutes.js +244 -0
- package/routes/whatsNewRoutes.js +331 -0
- package/scripts/.claude/settings.local.json +15 -0
- package/scripts/README.md +170 -0
- package/scripts/RESTART_EVERYTHING.sh +104 -0
- package/scripts/add-claim-columns.sql +48 -0
- package/scripts/add-crypto-prices-cache.sql +27 -0
- package/scripts/add-exchange-rates-cache.sql +40 -0
- package/scripts/add-game-invite-column.sql +23 -0
- package/scripts/add-game-invite-notification.sql +33 -0
- package/scripts/add-game-invite-telegram-pref.sql +16 -0
- package/scripts/add-game-joined-notification.sql +16 -0
- package/scripts/add-game-joined-pref.js +40 -0
- package/scripts/add-game-joined-preference.sql +6 -0
- package/scripts/add-game-start-notifications.sql +41 -0
- package/scripts/add-notification-flags-to-games.sql +55 -0
- package/scripts/add-pending-game-dismissals.sql +19 -0
- package/scripts/add-preferred-currency.sql +34 -0
- package/scripts/add-winner-columns.js +61 -0
- package/scripts/add_mention_system.sql +53 -0
- package/scripts/add_payment_system.sql +96 -0
- package/scripts/add_sports_event_id_column.sql +22 -0
- package/scripts/analyze-cohort-data-heroku.js +276 -0
- package/scripts/analyze-cohort-data.js +295 -0
- package/scripts/analyze-prod-cohorts.sh +10 -0
- package/scripts/backfill-matchup-images.js +245 -0
- package/scripts/backfill-missing-signatures.js +175 -0
- package/scripts/backfill-referral-earnings.js +202 -0
- package/scripts/check-chat-schema.js +130 -0
- package/scripts/check-db.sh +14 -0
- package/scripts/check_oracle_in_game.js +54 -0
- package/scripts/cleanup-database.js +193 -0
- package/scripts/clear-notification-cache.js +85 -0
- package/scripts/convert-mnemonic.js +50 -0
- package/scripts/create-users-table.sql +44 -0
- package/scripts/debug-cohort-counts.js +248 -0
- package/scripts/debug-winner-calc.js +84 -0
- package/scripts/deploy-payment-system.sh +118 -0
- package/scripts/deploy-to-heroku.sh +63 -0
- package/scripts/diagnose-locked-round.js +143 -0
- package/scripts/dubs-cli.js +720 -0
- package/scripts/dump-account.js +65 -0
- package/scripts/find-vrf-offset.js +48 -0
- package/scripts/fix-chat-notifications-constraint.sql +122 -0
- package/scripts/fix-claim-columns.js +124 -0
- package/scripts/fix-constraint-now.js +44 -0
- package/scripts/fix-lock-timestamps.js +96 -0
- package/scripts/fix-locked-round.sh +126 -0
- package/scripts/fix-missing-badges.sql +91 -0
- package/scripts/fix-payment-notifications.sql +41 -0
- package/scripts/force-new-round.js +55 -0
- package/scripts/force-resolve-and-claim.js +278 -0
- package/scripts/important/README.md +115 -0
- package/scripts/important/authority-force-lock.js +197 -0
- package/scripts/important/authority-resolve-game.js +267 -0
- package/scripts/important/check-game-status.js +373 -0
- package/scripts/important/list-pending-games-by-version.js +270 -0
- package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
- package/scripts/initialize-jackpot.js +111 -0
- package/scripts/jackpot/.claude/settings.local.json +10 -0
- package/scripts/jackpot/force-reset.js +84 -0
- package/scripts/jackpot/initialize-mainnet.js +100 -0
- package/scripts/jackpot/keeper.js +742 -0
- package/scripts/jackpot/status.js +107 -0
- package/scripts/jackpot/update-round-duration.js +143 -0
- package/scripts/keeper-bot.js +112 -0
- package/scripts/list-pending-games.js +131 -0
- package/scripts/migrate-chat-v2.js +127 -0
- package/scripts/migrate-chat-winners.js +84 -0
- package/scripts/migrate-chat.sh +17 -0
- package/scripts/migrate-game-invite.js +83 -0
- package/scripts/migrate-heroku-game-notifications.sh +159 -0
- package/scripts/migrations/001_analytics_tables.sql +422 -0
- package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
- package/scripts/migrations/003_referral_earnings.sql +208 -0
- package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
- package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
- package/scripts/migrations/005_push_notifications.sql +55 -0
- package/scripts/migrations/006_add_draw_team_players.sql +28 -0
- package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
- package/scripts/migrations/007_add_gif_url.sql +8 -0
- package/scripts/migrations/008_add_connect4_columns.sql +139 -0
- package/scripts/migrations/008_add_pool_tracking.sql +22 -0
- package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
- package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
- package/scripts/migrations/011_create_developer_tables.sql +67 -0
- package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
- package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
- package/scripts/migrations/013_add_network_mode.sql +18 -0
- package/scripts/migrations/014_create_developer_app_users.sql +19 -0
- package/scripts/migrations/015_add_ui_config.sql +4 -0
- package/scripts/migrations/016_add_resolution_secret.sql +4 -0
- package/scripts/migrations/017_add_external_game_id.sql +3 -0
- package/scripts/migrations/018_create_pickem_tables.sql +115 -0
- package/scripts/migrations/019_expo_push_tokens.sql +19 -0
- package/scripts/migrations/create_whats_new_tables.sql +88 -0
- package/scripts/migrations/drop_live_games_tables.sql +34 -0
- package/scripts/open-jackpot-round.js +85 -0
- package/scripts/purge-all-data.sh +329 -0
- package/scripts/purge-all-data.sql +142 -0
- package/scripts/purge-heroku-data.sh +149 -0
- package/scripts/purge-heroku-data.sql +62 -0
- package/scripts/rebuild-heroku-database.sh +113 -0
- package/scripts/recover-funds.js +357 -0
- package/scripts/regenerate-epl-images.js +278 -0
- package/scripts/resize-s3-matchup-images.js +374 -0
- package/scripts/resolve-direct.js +88 -0
- package/scripts/resolve-mock-game.js +124 -0
- package/scripts/resolve-pickem-game.js +55 -0
- package/scripts/resolve-round-manual.js +83 -0
- package/scripts/resolve-stuck-game.js +382 -0
- package/scripts/resolve-stuck-round.js +42 -0
- package/scripts/run-connect4-migration.sh +16 -0
- package/scripts/run-mention-migration.sh +32 -0
- package/scripts/run-payment-migration.sh +51 -0
- package/scripts/run-preferred-currency-migration.sh +31 -0
- package/scripts/run-referral-earnings-migration.sh +32 -0
- package/scripts/run-survivor-outcome-migration.sh +16 -0
- package/scripts/seed-test-users.js +346 -0
- package/scripts/setup-auth-tables.js +78 -0
- package/scripts/setup-complete-database.sql +992 -0
- package/scripts/setup-database-fresh.sh +359 -0
- package/scripts/setup-heroku-keeper.sh +48 -0
- package/scripts/setup-keeper-database.js +83 -0
- package/scripts/setup-keeper-state-db.sql +110 -0
- package/scripts/setup-oracle.sh +39 -0
- package/scripts/setup-pnl-tracking.js +111 -0
- package/scripts/start-devnet.sh +14 -0
- package/scripts/test-arcade-devnet.sh +160 -0
- package/scripts/test-arcade-match.sh +109 -0
- package/scripts/test-automatic-mode.sh +239 -0
- package/scripts/test-connect4-cancel-claim.js +370 -0
- package/scripts/test-connect4-e2e.js +369 -0
- package/scripts/test-connect4-resolve.js +369 -0
- package/scripts/test-game-state-endpoint.js +136 -0
- package/scripts/test-invite-notification.js +86 -0
- package/scripts/test-jackpot-api.sh +71 -0
- package/scripts/test-poll-confirmation.js +267 -0
- package/scripts/test-resolve-game.js +271 -0
- package/scripts/test-resolve-signature.js +223 -0
- package/scripts/test-signature-preservation.js +124 -0
- package/scripts/test-state-machine.js +291 -0
- package/scripts/test-webhook-receiver.js +60 -0
- package/scripts/update-notification-constraint.js +52 -0
- package/scripts/verify-account-layout.js +145 -0
- package/scripts/verify-winner-algorithm.js +278 -0
- package/server.js +5259 -0
- package/services/arcadeMatchService.js +763 -0
- package/services/automaticGameOracle.js +1596 -0
- package/services/chatService.js +1612 -0
- package/services/connect4GameService.js +1049 -0
- package/services/connect4NotificationService.js +374 -0
- package/services/cryptoPriceService.js +223 -0
- package/services/customGameResolver.js +260 -0
- package/services/db.js +79 -0
- package/services/directMessageService.js +389 -0
- package/services/discordNotifications.js +160 -0
- package/services/exchangeRateService.js +289 -0
- package/services/expoPushService.js +314 -0
- package/services/gamesCacheService.js +539 -0
- package/services/jackpotHistory.js +331 -0
- package/services/jackpotService.js +856 -0
- package/services/keeperStateService.js +355 -0
- package/services/matchupImageService.js +591 -0
- package/services/notificationCacheService.js +407 -0
- package/services/pickemOracle.js +440 -0
- package/services/playerStatsService.js +389 -0
- package/services/portfolioService.js +555 -0
- package/services/promoService.js +757 -0
- package/services/promoTreasuryService.js +239 -0
- package/services/pushNotifications.js +353 -0
- package/services/redisService.js +422 -0
- package/services/referralEarningsService.js +728 -0
- package/services/s3Service.js +396 -0
- package/services/socialService.js +1202 -0
- package/services/survivorOracle.js +469 -0
- package/services/survivorSimulator.js +475 -0
- package/services/telegramNotifications.js +461 -0
- package/services/userProfileStatsService.js +1185 -0
- package/services/whatsNewService.js +388 -0
- 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
|
+
|