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,426 @@
|
|
|
1
|
+
# 🗳️ Dubs API - Democratic Voting Guide
|
|
2
|
+
|
|
3
|
+
## 📦 **Postman Collection**
|
|
4
|
+
|
|
5
|
+
**Import:** `Dubs-API-v1-With-Voting.postman_collection.json`
|
|
6
|
+
|
|
7
|
+
This collection includes **ALL endpoints** for the complete Dubs wager game system with democratic voting!
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🌐 **Base URLs**
|
|
12
|
+
|
|
13
|
+
### **Devnet (Current)**
|
|
14
|
+
```
|
|
15
|
+
https://dubs-server-dev-55d1fba09a97.herokuapp.com
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### **Local Development**
|
|
19
|
+
```
|
|
20
|
+
http://localhost:3001
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 📋 **Complete Endpoint List**
|
|
26
|
+
|
|
27
|
+
### **Health & Info**
|
|
28
|
+
```
|
|
29
|
+
GET / - API overview
|
|
30
|
+
GET /health - Health check
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### **Production API (`/api/v1/prod/`)**
|
|
34
|
+
|
|
35
|
+
#### **Game Management:**
|
|
36
|
+
```
|
|
37
|
+
GET /api/v1/prod/game/:gameId
|
|
38
|
+
Returns: Game state, players, pot, votes, votingEnabled
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
#### **Game Creation:**
|
|
42
|
+
```
|
|
43
|
+
POST /api/v1/prod/transaction/build/create
|
|
44
|
+
Body: {
|
|
45
|
+
creatorAddress: string,
|
|
46
|
+
buyIn: number (SOL),
|
|
47
|
+
maxPlayers: number (2-20),
|
|
48
|
+
operatorFee: number (0-100),
|
|
49
|
+
operatorAddress?: string (optional),
|
|
50
|
+
votingEnabled: boolean ← NEW!
|
|
51
|
+
}
|
|
52
|
+
Returns: Unsigned transaction, gameId, gameAddress
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### **Join Game:**
|
|
56
|
+
```
|
|
57
|
+
POST /api/v1/prod/transaction/build/join
|
|
58
|
+
Body: {
|
|
59
|
+
playerAddress: string,
|
|
60
|
+
gameId: string (UUID)
|
|
61
|
+
}
|
|
62
|
+
Returns: Unsigned transaction
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### **Democratic Voting (NEW!):**
|
|
66
|
+
```
|
|
67
|
+
POST /api/v1/prod/transaction/build/cast-vote
|
|
68
|
+
Body: {
|
|
69
|
+
voterAddress: string,
|
|
70
|
+
gameId: string,
|
|
71
|
+
votedFor: string (player address)
|
|
72
|
+
}
|
|
73
|
+
Returns: Unsigned vote transaction
|
|
74
|
+
|
|
75
|
+
POST /api/v1/prod/transaction/build/distribute-by-vote
|
|
76
|
+
Body: {
|
|
77
|
+
creatorAddress: string,
|
|
78
|
+
gameId: string
|
|
79
|
+
}
|
|
80
|
+
Returns: Unsigned transaction, winners[], voteCounts{}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### **Manual Distribution:**
|
|
84
|
+
```
|
|
85
|
+
POST /api/v1/prod/transaction/build/distribute
|
|
86
|
+
Body: {
|
|
87
|
+
creatorAddress: string,
|
|
88
|
+
gameId: string,
|
|
89
|
+
winners: string[] (player addresses)
|
|
90
|
+
}
|
|
91
|
+
Returns: Unsigned transaction
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### **Transaction Submission:**
|
|
95
|
+
```
|
|
96
|
+
POST /api/v1/prod/transaction/submit
|
|
97
|
+
Body: {
|
|
98
|
+
signedTransaction: string (base64)
|
|
99
|
+
}
|
|
100
|
+
Returns: Transaction signature, confirmation
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### **Demo API (`/api/v1/demo/`)** - Server-Managed Wallets
|
|
104
|
+
```
|
|
105
|
+
GET /api/v1/demo/game/:gameId
|
|
106
|
+
GET /api/v1/demo/wallets
|
|
107
|
+
POST /api/v1/demo/game/create
|
|
108
|
+
POST /api/v1/demo/game/join
|
|
109
|
+
POST /api/v1/demo/game/distribute
|
|
110
|
+
POST /api/v1/demo/airdrop
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 🎮 **Workflow Examples**
|
|
116
|
+
|
|
117
|
+
### **Workflow 1: Standard Game (No Voting)**
|
|
118
|
+
|
|
119
|
+
1. **Build Create Transaction**
|
|
120
|
+
```json
|
|
121
|
+
POST /api/v1/prod/transaction/build/create
|
|
122
|
+
{
|
|
123
|
+
"creatorAddress": "YourAddress",
|
|
124
|
+
"buyIn": 0.5,
|
|
125
|
+
"maxPlayers": 4,
|
|
126
|
+
"operatorFee": 10,
|
|
127
|
+
"votingEnabled": false
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
→ Sign with Phantom
|
|
131
|
+
→ Submit via `/transaction/submit`
|
|
132
|
+
|
|
133
|
+
2. **Players Join**
|
|
134
|
+
→ Each player builds join transaction
|
|
135
|
+
→ Signs and submits
|
|
136
|
+
|
|
137
|
+
3. **Creator Distributes**
|
|
138
|
+
```json
|
|
139
|
+
POST /api/v1/prod/transaction/build/distribute
|
|
140
|
+
{
|
|
141
|
+
"creatorAddress": "YourAddress",
|
|
142
|
+
"gameId": "saved-game-id",
|
|
143
|
+
"winners": ["Player1", "Player2"]
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### **Workflow 2: Democratic Game (With Voting)**
|
|
150
|
+
|
|
151
|
+
1. **Create Game with Voting**
|
|
152
|
+
```json
|
|
153
|
+
POST /api/v1/prod/transaction/build/create
|
|
154
|
+
{
|
|
155
|
+
"creatorAddress": "YourAddress",
|
|
156
|
+
"buyIn": 0.5,
|
|
157
|
+
"maxPlayers": 3,
|
|
158
|
+
"operatorFee": 10,
|
|
159
|
+
"votingEnabled": true ← Enable democracy!
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
2. **Players Join**
|
|
164
|
+
→ Same as above
|
|
165
|
+
|
|
166
|
+
3. **Players Vote** (NEW!)
|
|
167
|
+
```json
|
|
168
|
+
POST /api/v1/prod/transaction/build/cast-vote
|
|
169
|
+
{
|
|
170
|
+
"voterAddress": "Player1Address",
|
|
171
|
+
"gameId": "saved-game-id",
|
|
172
|
+
"votedFor": "Player2Address"
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
→ Repeat for each player
|
|
176
|
+
→ Need majority (50%+) to distribute
|
|
177
|
+
|
|
178
|
+
4. **Check Voting Progress**
|
|
179
|
+
```json
|
|
180
|
+
GET /api/v1/prod/game/:gameId
|
|
181
|
+
|
|
182
|
+
Response includes:
|
|
183
|
+
{
|
|
184
|
+
"votes": [
|
|
185
|
+
{"voter": "Player1...", "votedFor": "Player2..."},
|
|
186
|
+
{"voter": "Player2...", "votedFor": "Player2..."}
|
|
187
|
+
],
|
|
188
|
+
"votingEnabled": true
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
5. **Distribute by Vote** (When Majority Reached)
|
|
193
|
+
```json
|
|
194
|
+
POST /api/v1/prod/transaction/build/distribute-by-vote
|
|
195
|
+
{
|
|
196
|
+
"creatorAddress": "YourAddress",
|
|
197
|
+
"gameId": "saved-game-id"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
Response:
|
|
201
|
+
{
|
|
202
|
+
"transaction": "...",
|
|
203
|
+
"winners": ["Player2Address"],
|
|
204
|
+
"voteCounts": {
|
|
205
|
+
"Player1Address": 1,
|
|
206
|
+
"Player2Address": 2
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 🗳️ **Voting Rules**
|
|
214
|
+
|
|
215
|
+
### **Majority Calculation:**
|
|
216
|
+
```javascript
|
|
217
|
+
Total Players: 3
|
|
218
|
+
Majority: (3 / 2) + 1 = 2 votes
|
|
219
|
+
|
|
220
|
+
Total Players: 4
|
|
221
|
+
Majority: (4 / 2) + 1 = 3 votes
|
|
222
|
+
|
|
223
|
+
Total Players: 2
|
|
224
|
+
Majority: (2 / 2) + 1 = 2 votes (both must vote)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### **Tie Handling:**
|
|
228
|
+
```
|
|
229
|
+
If multiple players tied for most votes:
|
|
230
|
+
→ Prize split equally among tied winners
|
|
231
|
+
|
|
232
|
+
Example:
|
|
233
|
+
Player A: 2 votes
|
|
234
|
+
Player B: 2 votes
|
|
235
|
+
→ Both win, 50/50 split
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### **Vote Changes:**
|
|
239
|
+
```
|
|
240
|
+
✅ Players can change votes before majority
|
|
241
|
+
✅ Latest vote overwrites previous vote
|
|
242
|
+
✅ Votes stored on-chain
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 🔧 **Setup Instructions**
|
|
248
|
+
|
|
249
|
+
### **1. Import Collection**
|
|
250
|
+
```
|
|
251
|
+
1. Open Postman
|
|
252
|
+
2. File → Import
|
|
253
|
+
3. Select: Dubs-API-v1-With-Voting.postman_collection.json
|
|
254
|
+
4. Collection imported!
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### **2. Set Variables**
|
|
258
|
+
```
|
|
259
|
+
baseUrl: https://dubs-server-dev-55d1fba09a97.herokuapp.com
|
|
260
|
+
walletAddress: YOUR_SOLANA_WALLET_ADDRESS
|
|
261
|
+
gameId: (auto-saved after creating game)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### **3. Test Flow**
|
|
265
|
+
```
|
|
266
|
+
Production API → Democratic Game Flow →
|
|
267
|
+
1️⃣ Build Create Game (Voting ON)
|
|
268
|
+
→ Copy transaction
|
|
269
|
+
→ Sign with Phantom
|
|
270
|
+
→ Submit via transaction/submit
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 📊 **Response Formats**
|
|
276
|
+
|
|
277
|
+
### **Game Info (With Voting):**
|
|
278
|
+
```json
|
|
279
|
+
{
|
|
280
|
+
"exists": true,
|
|
281
|
+
"game": {
|
|
282
|
+
"gameId": 12345,
|
|
283
|
+
"authority": "CreatorAddress...",
|
|
284
|
+
"buyIn": 0.5,
|
|
285
|
+
"maxPlayers": 3,
|
|
286
|
+
"operatorWallet": "OperatorAddress...",
|
|
287
|
+
"operatorFeePercentage": 10,
|
|
288
|
+
"players": ["Player1...", "Player2...", "Player3..."],
|
|
289
|
+
"totalPot": 1.5,
|
|
290
|
+
"isActive": true,
|
|
291
|
+
"votes": [
|
|
292
|
+
{"voter": "Player1...", "votedFor": "Player2..."},
|
|
293
|
+
{"voter": "Player2...", "votedFor": "Player2..."}
|
|
294
|
+
],
|
|
295
|
+
"votingEnabled": true
|
|
296
|
+
},
|
|
297
|
+
"calculated": {
|
|
298
|
+
"operatorFeeAmount": "0.1500",
|
|
299
|
+
"prizePool": "1.3500"
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### **Distribute by Vote Response:**
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"success": true,
|
|
308
|
+
"transaction": "BASE64_UNSIGNED_TRANSACTION",
|
|
309
|
+
"winners": ["Player2Address..."],
|
|
310
|
+
"voteCounts": {
|
|
311
|
+
"Player1Address": 1,
|
|
312
|
+
"Player2Address": 2,
|
|
313
|
+
"Player3Address": 0
|
|
314
|
+
},
|
|
315
|
+
"instructions": "Sign this transaction..."
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## 🎯 **Testing Tips**
|
|
322
|
+
|
|
323
|
+
### **For Manual Testing:**
|
|
324
|
+
1. Use Demo API for quick testing
|
|
325
|
+
2. Use Production API for real wallet testing
|
|
326
|
+
3. Save gameId from create response (auto-saved in collection)
|
|
327
|
+
4. Copy player addresses from game info for voting
|
|
328
|
+
|
|
329
|
+
### **For Voting Tests:**
|
|
330
|
+
1. Create game with `votingEnabled: true`
|
|
331
|
+
2. Get player addresses from game info
|
|
332
|
+
3. Build vote transactions for each player
|
|
333
|
+
4. Check voting progress in game info
|
|
334
|
+
5. When majority reached, distribute by vote
|
|
335
|
+
|
|
336
|
+
### **For Tie Testing:**
|
|
337
|
+
```
|
|
338
|
+
Create 4-player game
|
|
339
|
+
Have 2 vote for Player A
|
|
340
|
+
Have 2 vote for Player B
|
|
341
|
+
→ Test equal split distribution
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 🚨 **Common Errors**
|
|
347
|
+
|
|
348
|
+
### **Insufficient Lamports:**
|
|
349
|
+
```
|
|
350
|
+
Error: Transfer: insufficient lamports...
|
|
351
|
+
|
|
352
|
+
Fix: Use smaller buy-in or airdrop more SOL
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### **Voting Incomplete:**
|
|
356
|
+
```
|
|
357
|
+
Error: Voting incomplete - need majority
|
|
358
|
+
|
|
359
|
+
Fix: Need (players/2)+1 votes before distributing
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### **Game Not Found:**
|
|
363
|
+
```
|
|
364
|
+
Error: Game does not exist
|
|
365
|
+
|
|
366
|
+
Fix: Check gameId, might be from old program version
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 🌟 **New Features in v1.1**
|
|
372
|
+
|
|
373
|
+
```
|
|
374
|
+
✅ Democratic voting system
|
|
375
|
+
✅ cast-vote endpoint
|
|
376
|
+
✅ distribute-by-vote endpoint
|
|
377
|
+
✅ Majority rules logic
|
|
378
|
+
✅ Tie handling
|
|
379
|
+
✅ votingEnabled flag in game creation
|
|
380
|
+
✅ votes array in game state
|
|
381
|
+
✅ Vote count tallying
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 📖 **Full Documentation**
|
|
387
|
+
|
|
388
|
+
- **API Docs:** See `../README.md`
|
|
389
|
+
- **Smart Contract:** See `../../dubs/programs/hello_world/src/lib.rs`
|
|
390
|
+
- **Mobile Integration:** See Jelli Wallet SDK docs
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## 🎊 **Collection Organization**
|
|
395
|
+
|
|
396
|
+
```
|
|
397
|
+
├── Health Check
|
|
398
|
+
├── Production API (Real Wallets)
|
|
399
|
+
│ ├── 1. Game Management
|
|
400
|
+
│ ├── 2. Game Creation
|
|
401
|
+
│ ├── 3. Join Game
|
|
402
|
+
│ ├── 4. Democratic Voting (NEW!)
|
|
403
|
+
│ ├── 5. Manual Distribution
|
|
404
|
+
│ └── 6. Transaction Submission
|
|
405
|
+
├── Demo/Test API (Server-Managed)
|
|
406
|
+
├── Complete Workflows
|
|
407
|
+
│ ├── 🎮 Standard Game Flow
|
|
408
|
+
│ └── 🗳️ Democratic Game Flow (NEW!)
|
|
409
|
+
└── Examples & Documentation
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## 🚀 **Quick Start**
|
|
415
|
+
|
|
416
|
+
1. Import collection
|
|
417
|
+
2. Set `baseUrl` to devnet URL
|
|
418
|
+
3. Run "Complete Workflows" → "Democratic Game Flow"
|
|
419
|
+
4. Watch democracy in action! 🗳️
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
**Happy Testing! 🎮**
|
|
424
|
+
|
|
425
|
+
*Built with ❤️ on Solana with democratic principles* 🗳️⛓️
|
|
426
|
+
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Animation System Refactor
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Optimizing the Dubs animation system for mobile performance and better UX.
|
|
5
|
+
|
|
6
|
+
**Date**: 2025-02-01
|
|
7
|
+
**Status**: In Progress
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Current Architecture
|
|
12
|
+
|
|
13
|
+
### Files
|
|
14
|
+
| File | Lines | Purpose |
|
|
15
|
+
|------|-------|---------|
|
|
16
|
+
| `AnimationOverlay.tsx` | 150 | Master controller |
|
|
17
|
+
| `MakeItRainAnimation.tsx` | 104 | Falling Solana logos |
|
|
18
|
+
| `MuhahaAnimation.tsx` | 116 | Evil laugh + particles |
|
|
19
|
+
| `GameTimeAnimation.tsx` | 298 | Countdown + team badges |
|
|
20
|
+
| `PaymentReceivedAnimation.tsx` | 291 | Payment celebrations |
|
|
21
|
+
| `PaymentAnimationOverlay.tsx` | 101 | Payment event listener |
|
|
22
|
+
|
|
23
|
+
**Location**: `app/v2/components/animations/`
|
|
24
|
+
|
|
25
|
+
### Available Animations
|
|
26
|
+
| Animation | Hashtag | Duration | Particle Count |
|
|
27
|
+
|-----------|---------|----------|----------------|
|
|
28
|
+
| makeitrain | #makeitrain | 5s | 30-50 |
|
|
29
|
+
| muhaha | #muhaha | 4s | 30 |
|
|
30
|
+
| explosion | #boom | 3s | 1 |
|
|
31
|
+
| confetti | #party | 4s | 100 |
|
|
32
|
+
| fire | #fire | 4s | 30 |
|
|
33
|
+
| gametime | #gametime | 6s | 70 |
|
|
34
|
+
|
|
35
|
+
### Trigger Flow
|
|
36
|
+
```
|
|
37
|
+
User sends message with #animation
|
|
38
|
+
↓
|
|
39
|
+
ChatSocket → Backend broadcasts animation:trigger
|
|
40
|
+
↓
|
|
41
|
+
ChatContext dispatches window event
|
|
42
|
+
↓
|
|
43
|
+
AnimationOverlay renders component
|
|
44
|
+
↓
|
|
45
|
+
Auto-closes after duration
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Issues Identified
|
|
51
|
+
|
|
52
|
+
### 1. Mobile Performance
|
|
53
|
+
- **Too many particles**: 30-100 elements animating simultaneously
|
|
54
|
+
- **Fixed particle counts**: Same on iPhone SE as on desktop
|
|
55
|
+
- **No device detection**: Same animations for all devices
|
|
56
|
+
- **Long durations**: 5-6s feels slow on mobile
|
|
57
|
+
|
|
58
|
+
### 2. Mobile Responsiveness
|
|
59
|
+
- **Text overflow**: "GAME TIME!" at 8rem overflows small screens
|
|
60
|
+
- **Fixed positioning**: Particles use `Math.random() * 100%` regardless of viewport
|
|
61
|
+
- **No orientation handling**: Landscape vs portrait not considered
|
|
62
|
+
|
|
63
|
+
### 3. Accessibility
|
|
64
|
+
- **No `prefers-reduced-motion`**: Motion-sensitive users can't disable
|
|
65
|
+
- **No skip button**: Users must wait for animation to complete
|
|
66
|
+
- **High contrast issues**: Some animations may be hard to see
|
|
67
|
+
|
|
68
|
+
### 4. Performance Overhead
|
|
69
|
+
- **Math.random() on render**: Creates new values each render
|
|
70
|
+
- **No memoization**: Particle arrays regenerated
|
|
71
|
+
- **setTimeout chains**: Less predictable than requestAnimationFrame
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Optimization Plan
|
|
76
|
+
|
|
77
|
+
### Phase 1: Mobile Particle Reduction
|
|
78
|
+
- [ ] Detect mobile devices
|
|
79
|
+
- [ ] Reduce particle counts by 50% on mobile
|
|
80
|
+
- [ ] Shorter durations on mobile (5s → 3s)
|
|
81
|
+
|
|
82
|
+
### Phase 2: Accessibility
|
|
83
|
+
- [ ] Add `prefers-reduced-motion` support
|
|
84
|
+
- [ ] Simpler/static animation for reduced motion users
|
|
85
|
+
- [ ] Optional skip button
|
|
86
|
+
|
|
87
|
+
### Phase 3: Performance
|
|
88
|
+
- [ ] Memoize particle arrays with useMemo
|
|
89
|
+
- [ ] Use CSS `contain: strict` for paint isolation
|
|
90
|
+
- [ ] Add `will-change` hints
|
|
91
|
+
|
|
92
|
+
### Phase 4: Mobile UX
|
|
93
|
+
- [ ] Viewport-aware particle positioning
|
|
94
|
+
- [ ] Responsive text sizes that don't overflow
|
|
95
|
+
- [ ] Touch-to-dismiss option
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Implementation Progress
|
|
100
|
+
|
|
101
|
+
### 2025-02-01: Mobile Optimization
|
|
102
|
+
|
|
103
|
+
**Created**: `app/v2/utils/animationConfig.ts`
|
|
104
|
+
- Device detection utilities (`isMobileDevice`, `prefersReducedMotion`)
|
|
105
|
+
- Centralized particle counts for desktop/mobile
|
|
106
|
+
- Helper functions for optimized values
|
|
107
|
+
|
|
108
|
+
**Optimized**: `MakeItRainAnimation.tsx`
|
|
109
|
+
- Desktop: 35 particles → Mobile: 15 particles
|
|
110
|
+
- Desktop: 5s duration → Mobile: 3s duration
|
|
111
|
+
- Added `prefers-reduced-motion` support
|
|
112
|
+
- Responsive text sizing
|
|
113
|
+
|
|
114
|
+
**Optimized**: `PaymentReceivedAnimation.tsx`
|
|
115
|
+
- Coins: 40 → 15 on mobile
|
|
116
|
+
- Dollar signs: 20 → 8 on mobile
|
|
117
|
+
- Sparkles: 30 → 10 on mobile
|
|
118
|
+
- **Total: 90 elements → 33 elements (63% reduction)**
|
|
119
|
+
- Pre-generated particles (no Math.random() in render)
|
|
120
|
+
- Added `prefers-reduced-motion` support
|
|
121
|
+
|
|
122
|
+
**Optimized**: `MuhahaAnimation.tsx`
|
|
123
|
+
- Smoke particles: 20 → 8 on mobile
|
|
124
|
+
- Emojis: 10 → 5 on mobile
|
|
125
|
+
- Pre-generated particles
|
|
126
|
+
- Responsive text sizing
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Files Modified
|
|
131
|
+
|
|
132
|
+
| File | Changes |
|
|
133
|
+
|------|---------|
|
|
134
|
+
| `app/v2/utils/animationConfig.ts` | NEW - Device detection & config |
|
|
135
|
+
| `MakeItRainAnimation.tsx` | Mobile particle reduction, responsive text |
|
|
136
|
+
| `PaymentReceivedAnimation.tsx` | 63% particle reduction on mobile |
|
|
137
|
+
| `MuhahaAnimation.tsx` | Mobile particle reduction, responsive text |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Testing Checklist
|
|
142
|
+
|
|
143
|
+
- [ ] iPhone SE (small screen)
|
|
144
|
+
- [ ] iPhone Pro Max (large screen)
|
|
145
|
+
- [ ] Android mid-range device
|
|
146
|
+
- [ ] Desktop Chrome
|
|
147
|
+
- [ ] Reduced motion preference enabled
|
|
148
|
+
- [ ] Low-end device performance
|