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,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
|
+
|