dubs-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/.claude/settings.local.json +280 -0
  2. package/CLAUDE.md +46 -0
  3. package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
  4. package/CURRENT_SESSION.md +171 -0
  5. package/CURRENT_SESSION_DRAW.md +516 -0
  6. package/MARCH_MADNESS_SURVIVOR.md +254 -0
  7. package/PANDA.md +166 -0
  8. package/Procfile +4 -0
  9. package/README.md +476 -0
  10. package/controllers/livescoresController.js +376 -0
  11. package/controllers/pickemController.js +554 -0
  12. package/controllers/survivorAdminController.js +887 -0
  13. package/controllers/survivorController.js +623 -0
  14. package/cron/oracleMonitor.js +77 -0
  15. package/cron/pickemOracleMonitor.js +73 -0
  16. package/data/jackpot-history.json +952 -0
  17. package/data/ncaaTeams.js +406 -0
  18. package/documentation/API_SECURITY_GUIDE.md +327 -0
  19. package/documentation/ARCADE_API.md +593 -0
  20. package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
  21. package/documentation/ARCADE_QUICKSTART.md +242 -0
  22. package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
  23. package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
  24. package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
  25. package/documentation/CLAIM_STATUS_FIX.md +67 -0
  26. package/documentation/CLI_TOOL_GUIDE.md +372 -0
  27. package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
  28. package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
  29. package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
  30. package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
  31. package/documentation/DATABASE_QUERIES.md +269 -0
  32. package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
  33. package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
  34. package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
  35. package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
  36. package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
  37. package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
  38. package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
  39. package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
  40. package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
  41. package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
  42. package/documentation/HEROKU_DEPLOYMENT.md +134 -0
  43. package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
  44. package/documentation/JACKPOT_API.md +521 -0
  45. package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
  46. package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
  47. package/documentation/JWT_QUICK_SETUP.md +268 -0
  48. package/documentation/JWT_TESTING_GUIDE.md +404 -0
  49. package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
  50. package/documentation/KEEPER_SETUP.md +206 -0
  51. package/documentation/KEEPER_STATE_MACHINE.md +423 -0
  52. package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
  53. package/documentation/LOCAL_VOTING_TEST.md +279 -0
  54. package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
  55. package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
  56. package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
  57. package/documentation/PNL_TRACKING_SETUP.md +189 -0
  58. package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
  59. package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
  60. package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
  61. package/documentation/QUICK_AUTH_SETUP.md +99 -0
  62. package/documentation/QUICK_DEPLOY.md +224 -0
  63. package/documentation/QUICK_FIX.md +114 -0
  64. package/documentation/QUICK_START.md +152 -0
  65. package/documentation/REFEREE_MODE_GUIDE.md +392 -0
  66. package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
  67. package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
  68. package/documentation/RUN_MIGRATION_NOW.md +39 -0
  69. package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
  70. package/documentation/SETUP_GUIDE.md +184 -0
  71. package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
  72. package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
  73. package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
  74. package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
  75. package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
  76. package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
  77. package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
  78. package/ecosystem.config.js +65 -0
  79. package/env.template +125 -0
  80. package/middleware/apiKeyAuth.js +136 -0
  81. package/middleware/authenticate.js +214 -0
  82. package/middleware/developerUserAuth.js +76 -0
  83. package/middleware/socketAuth.js +69 -0
  84. package/package.json +49 -0
  85. package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
  86. package/postman/Dubs-API-v1.postman_collection.json +205 -0
  87. package/postman/Dubs_Developer_API.postman_collection.json +662 -0
  88. package/postman/QUICKSTART.md +118 -0
  89. package/postman/QUICK_REFERENCE.md +246 -0
  90. package/postman/README.md +71 -0
  91. package/postman/VOTING_API_GUIDE.md +426 -0
  92. package/refactor/Animations.md +148 -0
  93. package/refactor/Chat.md +252 -0
  94. package/routes/actionsRoutes.js +699 -0
  95. package/routes/adminRoutes.js +370 -0
  96. package/routes/analyticsRoutes.js +1262 -0
  97. package/routes/arcadeRoutes.js +557 -0
  98. package/routes/authRoutes.js +2310 -0
  99. package/routes/avatarRoutes.js +85 -0
  100. package/routes/botRoutes.js +211 -0
  101. package/routes/chatRoutes.js +377 -0
  102. package/routes/cryptoPriceRoutes.js +105 -0
  103. package/routes/developerRoutes.js +4201 -0
  104. package/routes/deviceRoutes.js +214 -0
  105. package/routes/dmRoutes.js +167 -0
  106. package/routes/esportsRoutes.js +806 -0
  107. package/routes/exchangeRateRoutes.js +233 -0
  108. package/routes/gamesRoutes.js +3028 -0
  109. package/routes/jackpotRoutes.js +754 -0
  110. package/routes/keeperMonitoringRoutes.js +156 -0
  111. package/routes/keeperWebhookRoutes.js +466 -0
  112. package/routes/livescoresRoutes.js +31 -0
  113. package/routes/pickemAdminRoutes.js +199 -0
  114. package/routes/pickemRoutes.js +231 -0
  115. package/routes/playerStatsRoutes.js +147 -0
  116. package/routes/portfolioRoutes.js +217 -0
  117. package/routes/promoRoutes.js +418 -0
  118. package/routes/referralEarningsRoutes.js +392 -0
  119. package/routes/socialRoutes.js +459 -0
  120. package/routes/sportsRoutes.js +1271 -0
  121. package/routes/survivorAdminRoutes.js +345 -0
  122. package/routes/survivorRoutes.js +756 -0
  123. package/routes/uploadRoutes.js +256 -0
  124. package/routes/userProfileRoutes.js +244 -0
  125. package/routes/whatsNewRoutes.js +331 -0
  126. package/scripts/.claude/settings.local.json +15 -0
  127. package/scripts/README.md +170 -0
  128. package/scripts/RESTART_EVERYTHING.sh +104 -0
  129. package/scripts/add-claim-columns.sql +48 -0
  130. package/scripts/add-crypto-prices-cache.sql +27 -0
  131. package/scripts/add-exchange-rates-cache.sql +40 -0
  132. package/scripts/add-game-invite-column.sql +23 -0
  133. package/scripts/add-game-invite-notification.sql +33 -0
  134. package/scripts/add-game-invite-telegram-pref.sql +16 -0
  135. package/scripts/add-game-joined-notification.sql +16 -0
  136. package/scripts/add-game-joined-pref.js +40 -0
  137. package/scripts/add-game-joined-preference.sql +6 -0
  138. package/scripts/add-game-start-notifications.sql +41 -0
  139. package/scripts/add-notification-flags-to-games.sql +55 -0
  140. package/scripts/add-pending-game-dismissals.sql +19 -0
  141. package/scripts/add-preferred-currency.sql +34 -0
  142. package/scripts/add-winner-columns.js +61 -0
  143. package/scripts/add_mention_system.sql +53 -0
  144. package/scripts/add_payment_system.sql +96 -0
  145. package/scripts/add_sports_event_id_column.sql +22 -0
  146. package/scripts/analyze-cohort-data-heroku.js +276 -0
  147. package/scripts/analyze-cohort-data.js +295 -0
  148. package/scripts/analyze-prod-cohorts.sh +10 -0
  149. package/scripts/backfill-matchup-images.js +245 -0
  150. package/scripts/backfill-missing-signatures.js +175 -0
  151. package/scripts/backfill-referral-earnings.js +202 -0
  152. package/scripts/check-chat-schema.js +130 -0
  153. package/scripts/check-db.sh +14 -0
  154. package/scripts/check_oracle_in_game.js +54 -0
  155. package/scripts/cleanup-database.js +193 -0
  156. package/scripts/clear-notification-cache.js +85 -0
  157. package/scripts/convert-mnemonic.js +50 -0
  158. package/scripts/create-users-table.sql +44 -0
  159. package/scripts/debug-cohort-counts.js +248 -0
  160. package/scripts/debug-winner-calc.js +84 -0
  161. package/scripts/deploy-payment-system.sh +118 -0
  162. package/scripts/deploy-to-heroku.sh +63 -0
  163. package/scripts/diagnose-locked-round.js +143 -0
  164. package/scripts/dubs-cli.js +720 -0
  165. package/scripts/dump-account.js +65 -0
  166. package/scripts/find-vrf-offset.js +48 -0
  167. package/scripts/fix-chat-notifications-constraint.sql +122 -0
  168. package/scripts/fix-claim-columns.js +124 -0
  169. package/scripts/fix-constraint-now.js +44 -0
  170. package/scripts/fix-lock-timestamps.js +96 -0
  171. package/scripts/fix-locked-round.sh +126 -0
  172. package/scripts/fix-missing-badges.sql +91 -0
  173. package/scripts/fix-payment-notifications.sql +41 -0
  174. package/scripts/force-new-round.js +55 -0
  175. package/scripts/force-resolve-and-claim.js +278 -0
  176. package/scripts/important/README.md +115 -0
  177. package/scripts/important/authority-force-lock.js +197 -0
  178. package/scripts/important/authority-resolve-game.js +267 -0
  179. package/scripts/important/check-game-status.js +373 -0
  180. package/scripts/important/list-pending-games-by-version.js +270 -0
  181. package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
  182. package/scripts/initialize-jackpot.js +111 -0
  183. package/scripts/jackpot/.claude/settings.local.json +10 -0
  184. package/scripts/jackpot/force-reset.js +84 -0
  185. package/scripts/jackpot/initialize-mainnet.js +100 -0
  186. package/scripts/jackpot/keeper.js +742 -0
  187. package/scripts/jackpot/status.js +107 -0
  188. package/scripts/jackpot/update-round-duration.js +143 -0
  189. package/scripts/keeper-bot.js +112 -0
  190. package/scripts/list-pending-games.js +131 -0
  191. package/scripts/migrate-chat-v2.js +127 -0
  192. package/scripts/migrate-chat-winners.js +84 -0
  193. package/scripts/migrate-chat.sh +17 -0
  194. package/scripts/migrate-game-invite.js +83 -0
  195. package/scripts/migrate-heroku-game-notifications.sh +159 -0
  196. package/scripts/migrations/001_analytics_tables.sql +422 -0
  197. package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
  198. package/scripts/migrations/003_referral_earnings.sql +208 -0
  199. package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
  200. package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
  201. package/scripts/migrations/005_push_notifications.sql +55 -0
  202. package/scripts/migrations/006_add_draw_team_players.sql +28 -0
  203. package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
  204. package/scripts/migrations/007_add_gif_url.sql +8 -0
  205. package/scripts/migrations/008_add_connect4_columns.sql +139 -0
  206. package/scripts/migrations/008_add_pool_tracking.sql +22 -0
  207. package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
  208. package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
  209. package/scripts/migrations/011_create_developer_tables.sql +67 -0
  210. package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
  211. package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
  212. package/scripts/migrations/013_add_network_mode.sql +18 -0
  213. package/scripts/migrations/014_create_developer_app_users.sql +19 -0
  214. package/scripts/migrations/015_add_ui_config.sql +4 -0
  215. package/scripts/migrations/016_add_resolution_secret.sql +4 -0
  216. package/scripts/migrations/017_add_external_game_id.sql +3 -0
  217. package/scripts/migrations/018_create_pickem_tables.sql +115 -0
  218. package/scripts/migrations/019_expo_push_tokens.sql +19 -0
  219. package/scripts/migrations/create_whats_new_tables.sql +88 -0
  220. package/scripts/migrations/drop_live_games_tables.sql +34 -0
  221. package/scripts/open-jackpot-round.js +85 -0
  222. package/scripts/purge-all-data.sh +329 -0
  223. package/scripts/purge-all-data.sql +142 -0
  224. package/scripts/purge-heroku-data.sh +149 -0
  225. package/scripts/purge-heroku-data.sql +62 -0
  226. package/scripts/rebuild-heroku-database.sh +113 -0
  227. package/scripts/recover-funds.js +357 -0
  228. package/scripts/regenerate-epl-images.js +278 -0
  229. package/scripts/resize-s3-matchup-images.js +374 -0
  230. package/scripts/resolve-direct.js +88 -0
  231. package/scripts/resolve-mock-game.js +124 -0
  232. package/scripts/resolve-pickem-game.js +55 -0
  233. package/scripts/resolve-round-manual.js +83 -0
  234. package/scripts/resolve-stuck-game.js +382 -0
  235. package/scripts/resolve-stuck-round.js +42 -0
  236. package/scripts/run-connect4-migration.sh +16 -0
  237. package/scripts/run-mention-migration.sh +32 -0
  238. package/scripts/run-payment-migration.sh +51 -0
  239. package/scripts/run-preferred-currency-migration.sh +31 -0
  240. package/scripts/run-referral-earnings-migration.sh +32 -0
  241. package/scripts/run-survivor-outcome-migration.sh +16 -0
  242. package/scripts/seed-test-users.js +346 -0
  243. package/scripts/setup-auth-tables.js +78 -0
  244. package/scripts/setup-complete-database.sql +992 -0
  245. package/scripts/setup-database-fresh.sh +359 -0
  246. package/scripts/setup-heroku-keeper.sh +48 -0
  247. package/scripts/setup-keeper-database.js +83 -0
  248. package/scripts/setup-keeper-state-db.sql +110 -0
  249. package/scripts/setup-oracle.sh +39 -0
  250. package/scripts/setup-pnl-tracking.js +111 -0
  251. package/scripts/start-devnet.sh +14 -0
  252. package/scripts/test-arcade-devnet.sh +160 -0
  253. package/scripts/test-arcade-match.sh +109 -0
  254. package/scripts/test-automatic-mode.sh +239 -0
  255. package/scripts/test-connect4-cancel-claim.js +370 -0
  256. package/scripts/test-connect4-e2e.js +369 -0
  257. package/scripts/test-connect4-resolve.js +369 -0
  258. package/scripts/test-game-state-endpoint.js +136 -0
  259. package/scripts/test-invite-notification.js +86 -0
  260. package/scripts/test-jackpot-api.sh +71 -0
  261. package/scripts/test-poll-confirmation.js +267 -0
  262. package/scripts/test-resolve-game.js +271 -0
  263. package/scripts/test-resolve-signature.js +223 -0
  264. package/scripts/test-signature-preservation.js +124 -0
  265. package/scripts/test-state-machine.js +291 -0
  266. package/scripts/test-webhook-receiver.js +60 -0
  267. package/scripts/update-notification-constraint.js +52 -0
  268. package/scripts/verify-account-layout.js +145 -0
  269. package/scripts/verify-winner-algorithm.js +278 -0
  270. package/server.js +5259 -0
  271. package/services/arcadeMatchService.js +763 -0
  272. package/services/automaticGameOracle.js +1596 -0
  273. package/services/chatService.js +1612 -0
  274. package/services/connect4GameService.js +1049 -0
  275. package/services/connect4NotificationService.js +374 -0
  276. package/services/cryptoPriceService.js +223 -0
  277. package/services/customGameResolver.js +260 -0
  278. package/services/db.js +79 -0
  279. package/services/directMessageService.js +389 -0
  280. package/services/discordNotifications.js +160 -0
  281. package/services/exchangeRateService.js +289 -0
  282. package/services/expoPushService.js +314 -0
  283. package/services/gamesCacheService.js +539 -0
  284. package/services/jackpotHistory.js +331 -0
  285. package/services/jackpotService.js +856 -0
  286. package/services/keeperStateService.js +355 -0
  287. package/services/matchupImageService.js +591 -0
  288. package/services/notificationCacheService.js +407 -0
  289. package/services/pickemOracle.js +440 -0
  290. package/services/playerStatsService.js +389 -0
  291. package/services/portfolioService.js +555 -0
  292. package/services/promoService.js +757 -0
  293. package/services/promoTreasuryService.js +239 -0
  294. package/services/pushNotifications.js +353 -0
  295. package/services/redisService.js +422 -0
  296. package/services/referralEarningsService.js +728 -0
  297. package/services/s3Service.js +396 -0
  298. package/services/socialService.js +1202 -0
  299. package/services/survivorOracle.js +469 -0
  300. package/services/survivorSimulator.js +475 -0
  301. package/services/telegramNotifications.js +461 -0
  302. package/services/userProfileStatsService.js +1185 -0
  303. package/services/whatsNewService.js +388 -0
  304. package/utils/urlHelper.js +95 -0
@@ -0,0 +1,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