@openora/core 0.4.1-canary.17 → 0.4.1-canary.170

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 (2415) hide show
  1. package/README.md +10 -10
  2. package/bin/migrate.mjs +55 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/admin-console/__tests__/backoffice.router.test.js +82 -51
  5. package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
  6. package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts +2 -0
  7. package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts.map +1 -0
  8. package/dist/admin-console/__tests__/backoffice.service.int.test.js +351 -0
  9. package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -0
  10. package/dist/admin-console/contract/index.d.ts +302 -28
  11. package/dist/admin-console/contract/index.d.ts.map +1 -1
  12. package/dist/admin-console/contract/index.js +74 -6
  13. package/dist/admin-console/contract/index.js.map +1 -1
  14. package/dist/admin-console/plugin.d.ts +186 -1
  15. package/dist/admin-console/plugin.d.ts.map +1 -1
  16. package/dist/admin-console/plugin.js +6 -6
  17. package/dist/admin-console/plugin.js.map +1 -1
  18. package/dist/admin-console/router/index.d.ts +135 -18
  19. package/dist/admin-console/router/index.d.ts.map +1 -1
  20. package/dist/admin-console/router/index.js +18 -2
  21. package/dist/admin-console/router/index.js.map +1 -1
  22. package/dist/admin-console/service/backoffice.service.d.ts +70 -10
  23. package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
  24. package/dist/admin-console/service/backoffice.service.js +67 -11
  25. package/dist/admin-console/service/backoffice.service.js.map +1 -1
  26. package/dist/analytics/__tests__/analytics.contract.test.d.ts +2 -0
  27. package/dist/analytics/__tests__/analytics.contract.test.d.ts.map +1 -0
  28. package/dist/analytics/__tests__/analytics.contract.test.js +36 -0
  29. package/dist/analytics/__tests__/analytics.contract.test.js.map +1 -0
  30. package/dist/analytics/__tests__/analytics.router.test.d.ts +2 -0
  31. package/dist/analytics/__tests__/analytics.router.test.d.ts.map +1 -0
  32. package/dist/analytics/__tests__/analytics.router.test.js +56 -0
  33. package/dist/analytics/__tests__/analytics.router.test.js.map +1 -0
  34. package/dist/analytics/__tests__/financial-analytics.service.test.d.ts +2 -0
  35. package/dist/analytics/__tests__/financial-analytics.service.test.d.ts.map +1 -0
  36. package/dist/analytics/__tests__/financial-analytics.service.test.js +87 -0
  37. package/dist/analytics/__tests__/financial-analytics.service.test.js.map +1 -0
  38. package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts +2 -0
  39. package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts.map +1 -0
  40. package/dist/analytics/__tests__/funnel-analytics.service.test.js +42 -0
  41. package/dist/analytics/__tests__/funnel-analytics.service.test.js.map +1 -0
  42. package/dist/analytics/contract/financial.d.ts +121 -0
  43. package/dist/analytics/contract/financial.d.ts.map +1 -0
  44. package/dist/analytics/contract/financial.js +45 -0
  45. package/dist/analytics/contract/financial.js.map +1 -0
  46. package/dist/analytics/contract/funnel.d.ts +52 -0
  47. package/dist/analytics/contract/funnel.d.ts.map +1 -0
  48. package/dist/analytics/contract/funnel.js +24 -0
  49. package/dist/analytics/contract/funnel.js.map +1 -0
  50. package/dist/analytics/contract/index.d.ts +68 -0
  51. package/dist/analytics/contract/index.d.ts.map +1 -0
  52. package/dist/analytics/contract/index.js +9 -0
  53. package/dist/analytics/contract/index.js.map +1 -0
  54. package/dist/analytics/index.d.ts +2 -0
  55. package/dist/analytics/index.d.ts.map +1 -0
  56. package/dist/analytics/index.js +2 -0
  57. package/dist/analytics/index.js.map +1 -0
  58. package/dist/analytics/plugin.d.ts +188 -0
  59. package/dist/analytics/plugin.d.ts.map +1 -0
  60. package/dist/analytics/plugin.js +13 -0
  61. package/dist/analytics/plugin.js.map +1 -0
  62. package/dist/analytics/router/index.d.ts +69 -0
  63. package/dist/analytics/router/index.d.ts.map +1 -0
  64. package/dist/analytics/router/index.js +24 -0
  65. package/dist/analytics/router/index.js.map +1 -0
  66. package/dist/analytics/server.d.ts +5 -0
  67. package/dist/analytics/server.d.ts.map +1 -0
  68. package/dist/analytics/server.js +5 -0
  69. package/dist/analytics/server.js.map +1 -0
  70. package/dist/analytics/service/financial-analytics.service.d.ts +14 -0
  71. package/dist/analytics/service/financial-analytics.service.d.ts.map +1 -0
  72. package/dist/analytics/service/financial-analytics.service.js +146 -0
  73. package/dist/analytics/service/financial-analytics.service.js.map +1 -0
  74. package/dist/analytics/service/funnel-analytics.service.d.ts +11 -0
  75. package/dist/analytics/service/funnel-analytics.service.d.ts.map +1 -0
  76. package/dist/analytics/service/funnel-analytics.service.js +83 -0
  77. package/dist/analytics/service/funnel-analytics.service.js.map +1 -0
  78. package/dist/audit/__tests__/audit.service.int.test.d.ts +2 -0
  79. package/dist/audit/__tests__/audit.service.int.test.d.ts.map +1 -0
  80. package/dist/audit/__tests__/audit.service.int.test.js +906 -0
  81. package/dist/audit/__tests__/audit.service.int.test.js.map +1 -0
  82. package/dist/audit/__tests__/map-event.test.d.ts +2 -0
  83. package/dist/audit/__tests__/map-event.test.d.ts.map +1 -0
  84. package/dist/audit/__tests__/map-event.test.js +349 -0
  85. package/dist/audit/__tests__/map-event.test.js.map +1 -0
  86. package/dist/audit/contract/index.d.ts +154 -10
  87. package/dist/audit/contract/index.d.ts.map +1 -1
  88. package/dist/audit/contract/index.js +45 -5
  89. package/dist/audit/contract/index.js.map +1 -1
  90. package/dist/audit/migrate.d.ts.map +1 -1
  91. package/dist/audit/migrate.js +12 -0
  92. package/dist/audit/migrate.js.map +1 -1
  93. package/dist/audit/plugin.d.ts +187 -1
  94. package/dist/audit/plugin.d.ts.map +1 -1
  95. package/dist/audit/plugin.js +797 -54
  96. package/dist/audit/plugin.js.map +1 -1
  97. package/dist/audit/router/index.d.ts +73 -5
  98. package/dist/audit/router/index.d.ts.map +1 -1
  99. package/dist/audit/router/index.js +2 -5
  100. package/dist/audit/router/index.js.map +1 -1
  101. package/dist/audit/service/audit.service.d.ts +40 -14
  102. package/dist/audit/service/audit.service.d.ts.map +1 -1
  103. package/dist/audit/service/audit.service.js +86 -16
  104. package/dist/audit/service/audit.service.js.map +1 -1
  105. package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts +2 -0
  106. package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts.map +1 -0
  107. package/dist/casino/gaming/__tests__/admin-reporting.int.test.js +143 -0
  108. package/dist/casino/gaming/__tests__/admin-reporting.int.test.js.map +1 -0
  109. package/dist/casino/gaming/__tests__/game-category.service.int.test.d.ts +2 -0
  110. package/dist/casino/gaming/__tests__/game-category.service.int.test.d.ts.map +1 -0
  111. package/dist/casino/gaming/__tests__/game-category.service.int.test.js +134 -0
  112. package/dist/casino/gaming/__tests__/game-category.service.int.test.js.map +1 -0
  113. package/dist/casino/gaming/__tests__/game-provider.service.int.test.d.ts +2 -0
  114. package/dist/casino/gaming/__tests__/game-provider.service.int.test.d.ts.map +1 -0
  115. package/dist/casino/gaming/__tests__/game-provider.service.int.test.js +274 -0
  116. package/dist/casino/gaming/__tests__/game-provider.service.int.test.js.map +1 -0
  117. package/dist/casino/gaming/__tests__/game-tag.service.int.test.d.ts +2 -0
  118. package/dist/casino/gaming/__tests__/game-tag.service.int.test.d.ts.map +1 -0
  119. package/dist/casino/gaming/__tests__/game-tag.service.int.test.js +143 -0
  120. package/dist/casino/gaming/__tests__/game-tag.service.int.test.js.map +1 -0
  121. package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.d.ts +2 -0
  122. package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.d.ts.map +1 -0
  123. package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.js +278 -0
  124. package/dist/casino/gaming/__tests__/gaming-catalog-admin.router.int.test.js.map +1 -0
  125. package/dist/casino/gaming/__tests__/gaming-migration.int.test.d.ts +2 -0
  126. package/dist/casino/gaming/__tests__/gaming-migration.int.test.d.ts.map +1 -0
  127. package/dist/casino/gaming/__tests__/gaming-migration.int.test.js +171 -0
  128. package/dist/casino/gaming/__tests__/gaming-migration.int.test.js.map +1 -0
  129. package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts +2 -0
  130. package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts.map +1 -0
  131. package/dist/casino/gaming/__tests__/gaming.service.int.test.js +803 -0
  132. package/dist/casino/gaming/__tests__/gaming.service.int.test.js.map +1 -0
  133. package/dist/casino/gaming/adapters/mock/mock-game-adapter.d.ts.map +1 -1
  134. package/dist/casino/gaming/adapters/mock/mock-game-adapter.js +3 -1
  135. package/dist/casino/gaming/adapters/mock/mock-game-adapter.js.map +1 -1
  136. package/dist/casino/gaming/admin-reporting.d.ts +9 -0
  137. package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
  138. package/dist/casino/gaming/admin-reporting.js +79 -0
  139. package/dist/casino/gaming/admin-reporting.js.map +1 -0
  140. package/dist/casino/gaming/contract/index.d.ts +802 -15
  141. package/dist/casino/gaming/contract/index.d.ts.map +1 -1
  142. package/dist/casino/gaming/contract/index.js +236 -5
  143. package/dist/casino/gaming/contract/index.js.map +1 -1
  144. package/dist/casino/gaming/drizzle/migrations/0002_yummy_lifeguard.sql +4 -0
  145. package/dist/casino/gaming/drizzle/migrations/0003_wealthy_greymalkin.sql +2 -0
  146. package/dist/casino/gaming/drizzle/migrations/0004_serious_storm.sql +4 -0
  147. package/dist/casino/gaming/drizzle/migrations/0005_natural_thunderbolt_ross.sql +223 -0
  148. package/dist/casino/gaming/drizzle/migrations/0006_young_wrecker.sql +25 -0
  149. package/dist/casino/gaming/drizzle/migrations/meta/0002_snapshot.json +237 -0
  150. package/dist/casino/gaming/drizzle/migrations/meta/0003_snapshot.json +259 -0
  151. package/dist/casino/gaming/drizzle/migrations/meta/0004_snapshot.json +259 -0
  152. package/dist/casino/gaming/drizzle/migrations/meta/0005_snapshot.json +680 -0
  153. package/dist/casino/gaming/drizzle/migrations/meta/0006_snapshot.json +885 -0
  154. package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +35 -0
  155. package/dist/casino/gaming/plugin.d.ts +187 -1
  156. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  157. package/dist/casino/gaming/plugin.js +24 -5
  158. package/dist/casino/gaming/plugin.js.map +1 -1
  159. package/dist/casino/gaming/router/index.d.ts +549 -14
  160. package/dist/casino/gaming/router/index.d.ts.map +1 -1
  161. package/dist/casino/gaming/router/index.js +101 -7
  162. package/dist/casino/gaming/router/index.js.map +1 -1
  163. package/dist/casino/gaming/schema/index.d.ts +747 -27
  164. package/dist/casino/gaming/schema/index.d.ts.map +1 -1
  165. package/dist/casino/gaming/schema/index.js +118 -8
  166. package/dist/casino/gaming/schema/index.js.map +1 -1
  167. package/dist/casino/gaming/service/game-category.service.d.ts +105 -0
  168. package/dist/casino/gaming/service/game-category.service.d.ts.map +1 -0
  169. package/dist/casino/gaming/service/game-category.service.js +176 -0
  170. package/dist/casino/gaming/service/game-category.service.js.map +1 -0
  171. package/dist/casino/gaming/service/game-provider.service.d.ts +114 -0
  172. package/dist/casino/gaming/service/game-provider.service.d.ts.map +1 -0
  173. package/dist/casino/gaming/service/game-provider.service.js +251 -0
  174. package/dist/casino/gaming/service/game-provider.service.js.map +1 -0
  175. package/dist/casino/gaming/service/game-tag.service.d.ts +63 -0
  176. package/dist/casino/gaming/service/game-tag.service.d.ts.map +1 -0
  177. package/dist/casino/gaming/service/game-tag.service.js +140 -0
  178. package/dist/casino/gaming/service/game-tag.service.js.map +1 -0
  179. package/dist/casino/gaming/service/gaming.service.d.ts +225 -19
  180. package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
  181. package/dist/casino/gaming/service/gaming.service.js +441 -41
  182. package/dist/casino/gaming/service/gaming.service.js.map +1 -1
  183. package/dist/casino/lobby/__tests__/lobby-contract.test.d.ts +2 -0
  184. package/dist/casino/lobby/__tests__/lobby-contract.test.d.ts.map +1 -0
  185. package/dist/casino/lobby/__tests__/lobby-contract.test.js +39 -0
  186. package/dist/casino/lobby/__tests__/lobby-contract.test.js.map +1 -0
  187. package/dist/casino/lobby/__tests__/lobby-layout.int.test.d.ts +2 -0
  188. package/dist/casino/lobby/__tests__/lobby-layout.int.test.d.ts.map +1 -0
  189. package/dist/casino/lobby/__tests__/lobby-layout.int.test.js +145 -0
  190. package/dist/casino/lobby/__tests__/lobby-layout.int.test.js.map +1 -0
  191. package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts +2 -0
  192. package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts.map +1 -0
  193. package/dist/casino/lobby/__tests__/lobby.cache.int.test.js +249 -0
  194. package/dist/casino/lobby/__tests__/lobby.cache.int.test.js.map +1 -0
  195. package/dist/casino/lobby/contract/index.d.ts +204 -8
  196. package/dist/casino/lobby/contract/index.d.ts.map +1 -1
  197. package/dist/casino/lobby/contract/index.js +42 -3
  198. package/dist/casino/lobby/contract/index.js.map +1 -1
  199. package/dist/casino/lobby/drizzle/migrations/0001_true_clea.sql +20 -0
  200. package/dist/casino/lobby/drizzle/migrations/meta/0001_snapshot.json +343 -0
  201. package/dist/casino/lobby/drizzle/migrations/meta/_journal.json +7 -0
  202. package/dist/casino/lobby/plugin.d.ts +185 -1
  203. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  204. package/dist/casino/lobby/plugin.js +9 -5
  205. package/dist/casino/lobby/plugin.js.map +1 -1
  206. package/dist/casino/lobby/router/index.d.ts +102 -6
  207. package/dist/casino/lobby/router/index.d.ts.map +1 -1
  208. package/dist/casino/lobby/router/index.js +13 -2
  209. package/dist/casino/lobby/router/index.js.map +1 -1
  210. package/dist/casino/lobby/schema/index.d.ts +222 -0
  211. package/dist/casino/lobby/schema/index.d.ts.map +1 -1
  212. package/dist/casino/lobby/schema/index.js +21 -1
  213. package/dist/casino/lobby/schema/index.js.map +1 -1
  214. package/dist/casino/lobby/service/lobby.service.d.ts +87 -8
  215. package/dist/casino/lobby/service/lobby.service.d.ts.map +1 -1
  216. package/dist/casino/lobby/service/lobby.service.js +328 -38
  217. package/dist/casino/lobby/service/lobby.service.js.map +1 -1
  218. package/dist/casino/server.d.ts +1 -0
  219. package/dist/casino/server.d.ts.map +1 -1
  220. package/dist/casino/server.js +1 -0
  221. package/dist/casino/server.js.map +1 -1
  222. package/dist/casino/shared/game-catalog.d.ts +54 -0
  223. package/dist/casino/shared/game-catalog.d.ts.map +1 -0
  224. package/dist/casino/shared/game-catalog.js +87 -0
  225. package/dist/casino/shared/game-catalog.js.map +1 -0
  226. package/dist/cms/__tests__/cms.reads.int.test.d.ts +2 -0
  227. package/dist/cms/__tests__/cms.reads.int.test.d.ts.map +1 -0
  228. package/dist/cms/__tests__/cms.reads.int.test.js +66 -0
  229. package/dist/cms/__tests__/cms.reads.int.test.js.map +1 -0
  230. package/dist/cms/__tests__/cms.router.int.test.d.ts +2 -0
  231. package/dist/cms/__tests__/cms.router.int.test.d.ts.map +1 -0
  232. package/dist/cms/__tests__/cms.router.int.test.js +356 -0
  233. package/dist/cms/__tests__/cms.router.int.test.js.map +1 -0
  234. package/dist/cms/__tests__/cms.service.int.test.d.ts +2 -0
  235. package/dist/cms/__tests__/cms.service.int.test.d.ts.map +1 -0
  236. package/dist/cms/__tests__/cms.service.int.test.js +908 -0
  237. package/dist/cms/__tests__/cms.service.int.test.js.map +1 -0
  238. package/dist/cms/contract/index.d.ts +413 -42
  239. package/dist/cms/contract/index.d.ts.map +1 -1
  240. package/dist/cms/contract/index.js +161 -35
  241. package/dist/cms/contract/index.js.map +1 -1
  242. package/dist/cms/drizzle/migrations/0001_steep_starjammers.sql +29 -0
  243. package/dist/cms/drizzle/migrations/0002_naive_kingpin.sql +14 -0
  244. package/dist/cms/drizzle/migrations/0003_worthless_titanium_man.sql +2 -0
  245. package/dist/cms/drizzle/migrations/meta/0001_snapshot.json +303 -0
  246. package/dist/cms/drizzle/migrations/meta/0002_snapshot.json +412 -0
  247. package/dist/cms/drizzle/migrations/meta/0003_snapshot.json +442 -0
  248. package/dist/cms/drizzle/migrations/meta/_journal.json +21 -0
  249. package/dist/cms/moderation/validate-banner-image-url.d.ts +8 -0
  250. package/dist/cms/moderation/validate-banner-image-url.d.ts.map +1 -0
  251. package/dist/cms/moderation/validate-banner-image-url.js +20 -0
  252. package/dist/cms/moderation/validate-banner-image-url.js.map +1 -0
  253. package/dist/cms/plugin.d.ts +185 -1
  254. package/dist/cms/plugin.d.ts.map +1 -1
  255. package/dist/cms/plugin.js +5 -5
  256. package/dist/cms/plugin.js.map +1 -1
  257. package/dist/cms/router/index.d.ts +219 -37
  258. package/dist/cms/router/index.d.ts.map +1 -1
  259. package/dist/cms/router/index.js +83 -21
  260. package/dist/cms/router/index.js.map +1 -1
  261. package/dist/cms/schema/index.d.ts +283 -28
  262. package/dist/cms/schema/index.d.ts.map +1 -1
  263. package/dist/cms/schema/index.js +57 -7
  264. package/dist/cms/schema/index.js.map +1 -1
  265. package/dist/cms/server.d.ts +1 -1
  266. package/dist/cms/server.d.ts.map +1 -1
  267. package/dist/cms/server.js +1 -1
  268. package/dist/cms/server.js.map +1 -1
  269. package/dist/cms/service/cms.service.d.ts +229 -45
  270. package/dist/cms/service/cms.service.d.ts.map +1 -1
  271. package/dist/cms/service/cms.service.js +702 -67
  272. package/dist/cms/service/cms.service.js.map +1 -1
  273. package/dist/common/errors/__tests__/errors.mapper.test.d.ts +2 -0
  274. package/dist/common/errors/__tests__/errors.mapper.test.d.ts.map +1 -0
  275. package/dist/common/errors/__tests__/errors.mapper.test.js +59 -0
  276. package/dist/common/errors/__tests__/errors.mapper.test.js.map +1 -0
  277. package/dist/common/errors/errors.classes.js +3 -3
  278. package/dist/common/errors/errors.classes.js.map +1 -1
  279. package/dist/common/errors/errors.mapper.js +1 -1
  280. package/dist/common/errors/errors.mapper.js.map +1 -1
  281. package/dist/compliance/__tests__/assert.test.d.ts +2 -0
  282. package/dist/compliance/__tests__/assert.test.d.ts.map +1 -0
  283. package/dist/compliance/__tests__/assert.test.js +34 -0
  284. package/dist/compliance/__tests__/assert.test.js.map +1 -0
  285. package/dist/compliance/__tests__/compliance.service.int.test.d.ts +2 -0
  286. package/dist/compliance/__tests__/compliance.service.int.test.d.ts.map +1 -0
  287. package/dist/compliance/__tests__/compliance.service.int.test.js +453 -0
  288. package/dist/compliance/__tests__/compliance.service.int.test.js.map +1 -0
  289. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts +2 -0
  290. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts.map +1 -0
  291. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js +82 -0
  292. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js.map +1 -0
  293. package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts +2 -0
  294. package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts.map +1 -0
  295. package/dist/compliance/__tests__/kyc-admin.router.int.test.js +198 -0
  296. package/dist/compliance/__tests__/kyc-admin.router.int.test.js.map +1 -0
  297. package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts +2 -0
  298. package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts.map +1 -0
  299. package/dist/compliance/__tests__/kyc-webhook.router.int.test.js +177 -0
  300. package/dist/compliance/__tests__/kyc-webhook.router.int.test.js.map +1 -0
  301. package/dist/compliance/__tests__/kyc.service.int.test.d.ts +2 -0
  302. package/dist/compliance/__tests__/kyc.service.int.test.d.ts.map +1 -0
  303. package/dist/compliance/__tests__/kyc.service.int.test.js +397 -0
  304. package/dist/compliance/__tests__/kyc.service.int.test.js.map +1 -0
  305. package/dist/compliance/__tests__/limits.contract.test.d.ts +2 -0
  306. package/dist/compliance/__tests__/limits.contract.test.d.ts.map +1 -0
  307. package/dist/compliance/__tests__/limits.contract.test.js +83 -0
  308. package/dist/compliance/__tests__/limits.contract.test.js.map +1 -0
  309. package/dist/compliance/__tests__/regulatory-overview.router.int.test.d.ts +2 -0
  310. package/dist/compliance/__tests__/regulatory-overview.router.int.test.d.ts.map +1 -0
  311. package/dist/compliance/__tests__/regulatory-overview.router.int.test.js +102 -0
  312. package/dist/compliance/__tests__/regulatory-overview.router.int.test.js.map +1 -0
  313. package/dist/compliance/__tests__/rg-eval.test.js +28 -1
  314. package/dist/compliance/__tests__/rg-eval.test.js.map +1 -1
  315. package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts +2 -0
  316. package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts.map +1 -0
  317. package/dist/compliance/__tests__/rg-monitoring.service.int.test.js +526 -0
  318. package/dist/compliance/__tests__/rg-monitoring.service.int.test.js.map +1 -0
  319. package/dist/compliance/__tests__/rg-self-service.int.test.d.ts +2 -0
  320. package/dist/compliance/__tests__/rg-self-service.int.test.d.ts.map +1 -0
  321. package/dist/compliance/__tests__/rg-self-service.int.test.js +539 -0
  322. package/dist/compliance/__tests__/rg-self-service.int.test.js.map +1 -0
  323. package/dist/compliance/__tests__/rg.contract.test.js +60 -20
  324. package/dist/compliance/__tests__/rg.contract.test.js.map +1 -1
  325. package/dist/compliance/__tests__/rg.router.int.test.d.ts +2 -0
  326. package/dist/compliance/__tests__/rg.router.int.test.d.ts.map +1 -0
  327. package/dist/compliance/__tests__/rg.router.int.test.js +325 -0
  328. package/dist/compliance/__tests__/rg.router.int.test.js.map +1 -0
  329. package/dist/compliance/__tests__/rg.service.int.test.d.ts +2 -0
  330. package/dist/compliance/__tests__/rg.service.int.test.d.ts.map +1 -0
  331. package/dist/compliance/__tests__/rg.service.int.test.js +747 -0
  332. package/dist/compliance/__tests__/rg.service.int.test.js.map +1 -0
  333. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts +16 -3
  334. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts.map +1 -1
  335. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js +47 -5
  336. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js.map +1 -1
  337. package/dist/compliance/adapters/rg-limit-gate.d.ts +17 -0
  338. package/dist/compliance/adapters/rg-limit-gate.d.ts.map +1 -0
  339. package/dist/compliance/adapters/rg-limit-gate.js +107 -0
  340. package/dist/compliance/adapters/rg-limit-gate.js.map +1 -0
  341. package/dist/compliance/contract/index.d.ts +1451 -124
  342. package/dist/compliance/contract/index.d.ts.map +1 -1
  343. package/dist/compliance/contract/index.js +178 -9
  344. package/dist/compliance/contract/index.js.map +1 -1
  345. package/dist/compliance/contract/limits.d.ts +52 -0
  346. package/dist/compliance/contract/limits.d.ts.map +1 -1
  347. package/dist/compliance/contract/limits.js +27 -7
  348. package/dist/compliance/contract/limits.js.map +1 -1
  349. package/dist/compliance/contract/rg.d.ts +337 -7
  350. package/dist/compliance/contract/rg.d.ts.map +1 -1
  351. package/dist/compliance/contract/rg.js +61 -15
  352. package/dist/compliance/contract/rg.js.map +1 -1
  353. package/dist/compliance/drizzle/migrations/0002_condemned_monster_badoon.sql +3 -0
  354. package/dist/compliance/drizzle/migrations/0003_public_spirit.sql +1 -0
  355. package/dist/compliance/drizzle/migrations/0004_military_silk_fever.sql +2 -0
  356. package/dist/compliance/drizzle/migrations/0005_reflective_magma.sql +13 -0
  357. package/dist/compliance/drizzle/migrations/0006_backfill_session_limit_currency.sql +15 -0
  358. package/dist/compliance/drizzle/migrations/0007_romantic_toxin.sql +6 -0
  359. package/dist/compliance/drizzle/migrations/0008_omniscient_northstar.sql +14 -0
  360. package/dist/compliance/drizzle/migrations/0009_living_felicia_hardy.sql +12 -0
  361. package/dist/compliance/drizzle/migrations/meta/0002_snapshot.json +673 -0
  362. package/dist/compliance/drizzle/migrations/meta/0003_snapshot.json +679 -0
  363. package/dist/compliance/drizzle/migrations/meta/0004_snapshot.json +679 -0
  364. package/dist/compliance/drizzle/migrations/meta/0005_snapshot.json +754 -0
  365. package/dist/compliance/drizzle/migrations/meta/0006_snapshot.json +754 -0
  366. package/dist/compliance/drizzle/migrations/meta/0007_snapshot.json +785 -0
  367. package/dist/compliance/drizzle/migrations/meta/0008_snapshot.json +870 -0
  368. package/dist/compliance/drizzle/migrations/meta/0009_snapshot.json +974 -0
  369. package/dist/compliance/drizzle/migrations/meta/_journal.json +56 -0
  370. package/dist/compliance/plugin.d.ts +188 -1
  371. package/dist/compliance/plugin.d.ts.map +1 -1
  372. package/dist/compliance/plugin.js +86 -14
  373. package/dist/compliance/plugin.js.map +1 -1
  374. package/dist/compliance/router/index.d.ts +928 -67
  375. package/dist/compliance/router/index.d.ts.map +1 -1
  376. package/dist/compliance/router/index.js +148 -25
  377. package/dist/compliance/router/index.js.map +1 -1
  378. package/dist/compliance/schema/index.d.ts +515 -6
  379. package/dist/compliance/schema/index.d.ts.map +1 -1
  380. package/dist/compliance/schema/index.js +68 -6
  381. package/dist/compliance/schema/index.js.map +1 -1
  382. package/dist/compliance/server.d.ts +1 -1
  383. package/dist/compliance/server.d.ts.map +1 -1
  384. package/dist/compliance/server.js +1 -1
  385. package/dist/compliance/server.js.map +1 -1
  386. package/dist/compliance/service/compliance.service.d.ts +121 -37
  387. package/dist/compliance/service/compliance.service.d.ts.map +1 -1
  388. package/dist/compliance/service/compliance.service.js +341 -55
  389. package/dist/compliance/service/compliance.service.js.map +1 -1
  390. package/dist/compliance/service/kyc.service.d.ts +228 -10
  391. package/dist/compliance/service/kyc.service.d.ts.map +1 -1
  392. package/dist/compliance/service/kyc.service.js +566 -62
  393. package/dist/compliance/service/kyc.service.js.map +1 -1
  394. package/dist/compliance/service/rg-eval.d.ts +7 -2
  395. package/dist/compliance/service/rg-eval.d.ts.map +1 -1
  396. package/dist/compliance/service/rg-eval.js +10 -2
  397. package/dist/compliance/service/rg-eval.js.map +1 -1
  398. package/dist/compliance/service/rg-monitoring.service.d.ts +24 -6
  399. package/dist/compliance/service/rg-monitoring.service.d.ts.map +1 -1
  400. package/dist/compliance/service/rg-monitoring.service.js +109 -20
  401. package/dist/compliance/service/rg-monitoring.service.js.map +1 -1
  402. package/dist/compliance/service/rg-self-service.service.d.ts +84 -0
  403. package/dist/compliance/service/rg-self-service.service.d.ts.map +1 -0
  404. package/dist/compliance/service/rg-self-service.service.js +449 -0
  405. package/dist/compliance/service/rg-self-service.service.js.map +1 -0
  406. package/dist/compliance/service/rg.service.d.ts +103 -15
  407. package/dist/compliance/service/rg.service.d.ts.map +1 -1
  408. package/dist/compliance/service/rg.service.js +331 -61
  409. package/dist/compliance/service/rg.service.js.map +1 -1
  410. package/dist/contracts/__tests__/compose-contract.test.d.ts +2 -0
  411. package/dist/contracts/__tests__/compose-contract.test.d.ts.map +1 -0
  412. package/dist/contracts/__tests__/compose-contract.test.js +27 -0
  413. package/dist/contracts/__tests__/compose-contract.test.js.map +1 -0
  414. package/dist/contracts/__tests__/identity.test.d.ts +2 -0
  415. package/dist/contracts/__tests__/identity.test.d.ts.map +1 -0
  416. package/dist/contracts/__tests__/identity.test.js +54 -0
  417. package/dist/contracts/__tests__/identity.test.js.map +1 -0
  418. package/dist/contracts/__tests__/kit.test.js +21 -1
  419. package/dist/contracts/__tests__/kit.test.js.map +1 -1
  420. package/dist/contracts/__tests__/player.test.d.ts +2 -0
  421. package/dist/contracts/__tests__/player.test.d.ts.map +1 -0
  422. package/dist/contracts/__tests__/player.test.js +51 -0
  423. package/dist/contracts/__tests__/player.test.js.map +1 -0
  424. package/dist/contracts/adapters/__tests__/geo-ip.test.d.ts +2 -0
  425. package/dist/contracts/adapters/__tests__/geo-ip.test.d.ts.map +1 -0
  426. package/dist/contracts/adapters/__tests__/geo-ip.test.js +13 -0
  427. package/dist/contracts/adapters/__tests__/geo-ip.test.js.map +1 -0
  428. package/dist/contracts/adapters/__tests__/lobby-section-catalog.test.d.ts +2 -0
  429. package/dist/contracts/adapters/__tests__/lobby-section-catalog.test.d.ts.map +1 -0
  430. package/dist/contracts/adapters/__tests__/lobby-section-catalog.test.js +25 -0
  431. package/dist/contracts/adapters/__tests__/lobby-section-catalog.test.js.map +1 -0
  432. package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts +2 -0
  433. package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts.map +1 -0
  434. package/dist/contracts/adapters/__tests__/rate-limit.test.js +13 -0
  435. package/dist/contracts/adapters/__tests__/rate-limit.test.js.map +1 -0
  436. package/dist/contracts/adapters/__tests__/token.test.d.ts +2 -0
  437. package/dist/contracts/adapters/__tests__/token.test.d.ts.map +1 -0
  438. package/dist/contracts/adapters/__tests__/token.test.js +14 -0
  439. package/dist/contracts/adapters/__tests__/token.test.js.map +1 -0
  440. package/dist/contracts/adapters/admin-game-reporting.d.ts +43 -0
  441. package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -0
  442. package/dist/contracts/adapters/admin-game-reporting.js +17 -0
  443. package/dist/contracts/adapters/admin-game-reporting.js.map +1 -0
  444. package/dist/contracts/adapters/admin-permission.d.ts +11 -0
  445. package/dist/contracts/adapters/admin-permission.d.ts.map +1 -1
  446. package/dist/contracts/adapters/admin-permission.js +6 -4
  447. package/dist/contracts/adapters/admin-permission.js.map +1 -1
  448. package/dist/contracts/adapters/admin-player-activity.d.ts +51 -0
  449. package/dist/contracts/adapters/admin-player-activity.d.ts.map +1 -0
  450. package/dist/contracts/adapters/admin-player-activity.js +3 -0
  451. package/dist/contracts/adapters/admin-player-activity.js.map +1 -0
  452. package/dist/contracts/adapters/admin-role-assignment-directory.d.ts +12 -0
  453. package/dist/contracts/adapters/admin-role-assignment-directory.d.ts.map +1 -0
  454. package/dist/contracts/adapters/admin-role-assignment-directory.js +3 -0
  455. package/dist/contracts/adapters/admin-role-assignment-directory.js.map +1 -0
  456. package/dist/contracts/adapters/admin-security.d.ts +27 -0
  457. package/dist/contracts/adapters/admin-security.d.ts.map +1 -0
  458. package/dist/contracts/adapters/admin-security.js +9 -0
  459. package/dist/contracts/adapters/admin-security.js.map +1 -0
  460. package/dist/contracts/adapters/admin-user-directory.d.ts +52 -4
  461. package/dist/contracts/adapters/admin-user-directory.d.ts.map +1 -1
  462. package/dist/contracts/adapters/admin-user-directory.js +8 -0
  463. package/dist/contracts/adapters/admin-user-directory.js.map +1 -1
  464. package/dist/contracts/adapters/admin-wallet-reporting.d.ts +11 -0
  465. package/dist/contracts/adapters/admin-wallet-reporting.d.ts.map +1 -1
  466. package/dist/contracts/adapters/admin-wallet-reporting.js +9 -0
  467. package/dist/contracts/adapters/admin-wallet-reporting.js.map +1 -1
  468. package/dist/contracts/adapters/aggregator.d.ts +12 -0
  469. package/dist/contracts/adapters/aggregator.d.ts.map +1 -1
  470. package/dist/contracts/adapters/aggregator.js +5 -3
  471. package/dist/contracts/adapters/aggregator.js.map +1 -1
  472. package/dist/contracts/adapters/audit.d.ts +30 -4
  473. package/dist/contracts/adapters/audit.d.ts.map +1 -1
  474. package/dist/contracts/adapters/audit.js.map +1 -1
  475. package/dist/contracts/adapters/broker.d.ts +23 -0
  476. package/dist/contracts/adapters/broker.d.ts.map +1 -1
  477. package/dist/contracts/adapters/broker.js +8 -6
  478. package/dist/contracts/adapters/broker.js.map +1 -1
  479. package/dist/contracts/adapters/cache.d.ts +11 -0
  480. package/dist/contracts/adapters/cache.d.ts.map +1 -1
  481. package/dist/contracts/adapters/cache.js +8 -6
  482. package/dist/contracts/adapters/cache.js.map +1 -1
  483. package/dist/contracts/adapters/chat-block-writer.d.ts +18 -0
  484. package/dist/contracts/adapters/chat-block-writer.d.ts.map +1 -0
  485. package/dist/contracts/adapters/chat-block-writer.js +7 -0
  486. package/dist/contracts/adapters/chat-block-writer.js.map +1 -0
  487. package/dist/contracts/adapters/chat-moderation.d.ts +75 -0
  488. package/dist/contracts/adapters/chat-moderation.d.ts.map +1 -0
  489. package/dist/contracts/adapters/chat-moderation.js +3 -0
  490. package/dist/contracts/adapters/chat-moderation.js.map +1 -0
  491. package/dist/contracts/adapters/chat-room-access.d.ts +6 -0
  492. package/dist/contracts/adapters/chat-room-access.d.ts.map +1 -0
  493. package/dist/contracts/adapters/chat-room-access.js +3 -0
  494. package/dist/contracts/adapters/chat-room-access.js.map +1 -0
  495. package/dist/contracts/adapters/chat-system-writer.d.ts +19 -0
  496. package/dist/contracts/adapters/chat-system-writer.d.ts.map +1 -0
  497. package/dist/contracts/adapters/chat-system-writer.js +3 -0
  498. package/dist/contracts/adapters/chat-system-writer.js.map +1 -0
  499. package/dist/contracts/adapters/email-template.d.ts +12 -0
  500. package/dist/contracts/adapters/email-template.d.ts.map +1 -0
  501. package/dist/contracts/adapters/email-template.js +3 -0
  502. package/dist/contracts/adapters/email-template.js.map +1 -0
  503. package/dist/contracts/adapters/error-tracking.d.ts +12 -0
  504. package/dist/contracts/adapters/error-tracking.d.ts.map +1 -0
  505. package/dist/contracts/adapters/error-tracking.js +3 -0
  506. package/dist/contracts/adapters/error-tracking.js.map +1 -0
  507. package/dist/contracts/adapters/exchange-rate-provider.d.ts +14 -0
  508. package/dist/contracts/adapters/exchange-rate-provider.d.ts.map +1 -0
  509. package/dist/contracts/adapters/exchange-rate-provider.js +5 -0
  510. package/dist/contracts/adapters/exchange-rate-provider.js.map +1 -0
  511. package/dist/contracts/adapters/exchange-rate-reader.d.ts +16 -0
  512. package/dist/contracts/adapters/exchange-rate-reader.d.ts.map +1 -0
  513. package/dist/contracts/adapters/exchange-rate-reader.js +3 -0
  514. package/dist/contracts/adapters/exchange-rate-reader.js.map +1 -0
  515. package/dist/contracts/adapters/game-geo-check.d.ts +33 -0
  516. package/dist/contracts/adapters/game-geo-check.d.ts.map +1 -0
  517. package/dist/contracts/adapters/game-geo-check.js +23 -0
  518. package/dist/contracts/adapters/game-geo-check.js.map +1 -0
  519. package/dist/contracts/adapters/game.d.ts +13 -1
  520. package/dist/contracts/adapters/game.d.ts.map +1 -1
  521. package/dist/contracts/adapters/game.js +4 -2
  522. package/dist/contracts/adapters/game.js.map +1 -1
  523. package/dist/contracts/adapters/gaming-commands.d.ts +25 -0
  524. package/dist/contracts/adapters/gaming-commands.d.ts.map +1 -0
  525. package/dist/contracts/adapters/gaming-commands.js +8 -0
  526. package/dist/contracts/adapters/gaming-commands.js.map +1 -0
  527. package/dist/contracts/adapters/geo-check-commands.d.ts +8 -0
  528. package/dist/contracts/adapters/geo-check-commands.d.ts.map +1 -0
  529. package/dist/contracts/adapters/geo-check-commands.js +3 -0
  530. package/dist/contracts/adapters/geo-check-commands.js.map +1 -0
  531. package/dist/contracts/adapters/geo-ip.d.ts +2 -0
  532. package/dist/contracts/adapters/geo-ip.d.ts.map +1 -1
  533. package/dist/contracts/adapters/geo-ip.js +13 -2
  534. package/dist/contracts/adapters/geo-ip.js.map +1 -1
  535. package/dist/contracts/adapters/identity-reader.d.ts +20 -4
  536. package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
  537. package/dist/contracts/adapters/identity-reader.js.map +1 -1
  538. package/dist/contracts/adapters/identity.d.ts +15 -0
  539. package/dist/contracts/adapters/identity.d.ts.map +1 -1
  540. package/dist/contracts/adapters/identity.js +5 -2
  541. package/dist/contracts/adapters/identity.js.map +1 -1
  542. package/dist/contracts/adapters/index.d.ts +80 -22
  543. package/dist/contracts/adapters/index.d.ts.map +1 -1
  544. package/dist/contracts/adapters/index.js +42 -14
  545. package/dist/contracts/adapters/index.js.map +1 -1
  546. package/dist/contracts/adapters/job-queue.d.ts +55 -0
  547. package/dist/contracts/adapters/job-queue.d.ts.map +1 -1
  548. package/dist/contracts/adapters/job-queue.js +11 -9
  549. package/dist/contracts/adapters/job-queue.js.map +1 -1
  550. package/dist/contracts/adapters/kyc.d.ts +110 -11
  551. package/dist/contracts/adapters/kyc.d.ts.map +1 -1
  552. package/dist/contracts/adapters/kyc.js +23 -0
  553. package/dist/contracts/adapters/kyc.js.map +1 -1
  554. package/dist/contracts/adapters/lobby-section-catalog.d.ts +39 -0
  555. package/dist/contracts/adapters/lobby-section-catalog.d.ts.map +1 -0
  556. package/dist/contracts/adapters/lobby-section-catalog.js +34 -0
  557. package/dist/contracts/adapters/lobby-section-catalog.js.map +1 -0
  558. package/dist/contracts/adapters/login-enforcement.d.ts +8 -0
  559. package/dist/contracts/adapters/login-enforcement.d.ts.map +1 -1
  560. package/dist/contracts/adapters/login-enforcement.js +8 -6
  561. package/dist/contracts/adapters/login-enforcement.js.map +1 -1
  562. package/dist/contracts/adapters/mail-recipient-directory.d.ts +17 -0
  563. package/dist/contracts/adapters/mail-recipient-directory.d.ts.map +1 -0
  564. package/dist/contracts/adapters/mail-recipient-directory.js +3 -0
  565. package/dist/contracts/adapters/mail-recipient-directory.js.map +1 -0
  566. package/dist/contracts/adapters/mail.d.ts +32 -0
  567. package/dist/contracts/adapters/mail.d.ts.map +1 -0
  568. package/dist/contracts/adapters/mail.js +4 -0
  569. package/dist/contracts/adapters/mail.js.map +1 -0
  570. package/dist/contracts/adapters/outbox.d.ts +14 -0
  571. package/dist/contracts/adapters/outbox.d.ts.map +1 -1
  572. package/dist/contracts/adapters/outbox.js +14 -12
  573. package/dist/contracts/adapters/outbox.js.map +1 -1
  574. package/dist/contracts/adapters/payment.d.ts +141 -3
  575. package/dist/contracts/adapters/payment.d.ts.map +1 -1
  576. package/dist/contracts/adapters/payment.js +11 -3
  577. package/dist/contracts/adapters/payment.js.map +1 -1
  578. package/dist/contracts/adapters/play-eligibility.d.ts +15 -0
  579. package/dist/contracts/adapters/play-eligibility.d.ts.map +1 -0
  580. package/dist/contracts/adapters/play-eligibility.js +3 -0
  581. package/dist/contracts/adapters/play-eligibility.js.map +1 -0
  582. package/dist/contracts/adapters/player-activity.d.ts +6 -0
  583. package/dist/contracts/adapters/player-activity.d.ts.map +1 -0
  584. package/dist/contracts/adapters/player-activity.js +3 -0
  585. package/dist/contracts/adapters/player-activity.js.map +1 -0
  586. package/dist/contracts/adapters/player-provisioning.d.ts +29 -0
  587. package/dist/contracts/adapters/player-provisioning.d.ts.map +1 -0
  588. package/dist/contracts/adapters/player-provisioning.js +3 -0
  589. package/dist/contracts/adapters/player-provisioning.js.map +1 -0
  590. package/dist/contracts/adapters/player-tags.d.ts +4 -0
  591. package/dist/contracts/adapters/player-tags.d.ts.map +1 -1
  592. package/dist/contracts/adapters/player-tags.js.map +1 -1
  593. package/dist/contracts/adapters/rate-limit.d.ts +43 -3
  594. package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
  595. package/dist/contracts/adapters/rate-limit.js +31 -6
  596. package/dist/contracts/adapters/rate-limit.js.map +1 -1
  597. package/dist/contracts/adapters/realtime.d.ts +156 -7
  598. package/dist/contracts/adapters/realtime.d.ts.map +1 -1
  599. package/dist/contracts/adapters/realtime.js +33 -10
  600. package/dist/contracts/adapters/realtime.js.map +1 -1
  601. package/dist/contracts/adapters/rg-limits.d.ts +47 -0
  602. package/dist/contracts/adapters/rg-limits.d.ts.map +1 -0
  603. package/dist/contracts/adapters/rg-limits.js +18 -0
  604. package/dist/contracts/adapters/rg-limits.js.map +1 -0
  605. package/dist/contracts/adapters/rng.d.ts +11 -0
  606. package/dist/contracts/adapters/rng.d.ts.map +1 -1
  607. package/dist/contracts/adapters/rng.js +11 -9
  608. package/dist/contracts/adapters/rng.js.map +1 -1
  609. package/dist/contracts/adapters/session-idle-policy.d.ts +16 -0
  610. package/dist/contracts/adapters/session-idle-policy.d.ts.map +1 -0
  611. package/dist/contracts/adapters/session-idle-policy.js +13 -0
  612. package/dist/contracts/adapters/session-idle-policy.js.map +1 -0
  613. package/dist/contracts/adapters/sms.d.ts +15 -0
  614. package/dist/contracts/adapters/sms.d.ts.map +1 -0
  615. package/dist/contracts/adapters/sms.js +9 -0
  616. package/dist/contracts/adapters/sms.js.map +1 -0
  617. package/dist/contracts/adapters/social-commands.d.ts +12 -0
  618. package/dist/contracts/adapters/social-commands.d.ts.map +1 -0
  619. package/dist/contracts/adapters/social-commands.js +7 -0
  620. package/dist/contracts/adapters/social-commands.js.map +1 -0
  621. package/dist/contracts/adapters/swap.d.ts +80 -0
  622. package/dist/contracts/adapters/swap.d.ts.map +1 -0
  623. package/dist/contracts/adapters/swap.js +5 -0
  624. package/dist/contracts/adapters/swap.js.map +1 -0
  625. package/dist/contracts/adapters/tag-evaluation-commands.d.ts +20 -0
  626. package/dist/contracts/adapters/tag-evaluation-commands.d.ts.map +1 -0
  627. package/dist/contracts/adapters/tag-evaluation-commands.js +13 -0
  628. package/dist/contracts/adapters/tag-evaluation-commands.js.map +1 -0
  629. package/dist/contracts/adapters/token.d.ts +28 -5
  630. package/dist/contracts/adapters/token.d.ts.map +1 -1
  631. package/dist/contracts/adapters/token.js +10 -8
  632. package/dist/contracts/adapters/token.js.map +1 -1
  633. package/dist/contracts/adapters/wallet-asset-catalog.d.ts +34 -0
  634. package/dist/contracts/adapters/wallet-asset-catalog.d.ts.map +1 -0
  635. package/dist/contracts/adapters/wallet-asset-catalog.js +3 -0
  636. package/dist/contracts/adapters/wallet-asset-catalog.js.map +1 -0
  637. package/dist/contracts/adapters/wallet-commands.d.ts +25 -0
  638. package/dist/contracts/adapters/wallet-commands.d.ts.map +1 -1
  639. package/dist/contracts/adapters/wallet-commands.js.map +1 -1
  640. package/dist/contracts/adapters/wallet-reader.d.ts +43 -1
  641. package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
  642. package/dist/contracts/adapters/wallet-reader.js.map +1 -1
  643. package/dist/contracts/kit.d.ts +18 -0
  644. package/dist/contracts/kit.d.ts.map +1 -1
  645. package/dist/contracts/kit.js +9 -0
  646. package/dist/contracts/kit.js.map +1 -1
  647. package/dist/contracts/schemas/__tests__/common-schemas.test.js +33 -4
  648. package/dist/contracts/schemas/__tests__/common-schemas.test.js.map +1 -1
  649. package/dist/contracts/schemas/__tests__/events.test.d.ts +2 -0
  650. package/dist/contracts/schemas/__tests__/events.test.d.ts.map +1 -0
  651. package/dist/contracts/schemas/__tests__/events.test.js +263 -0
  652. package/dist/contracts/schemas/__tests__/events.test.js.map +1 -0
  653. package/dist/contracts/schemas/__tests__/game-schemas.test.d.ts +2 -0
  654. package/dist/contracts/schemas/__tests__/game-schemas.test.d.ts.map +1 -0
  655. package/dist/contracts/schemas/__tests__/game-schemas.test.js +69 -0
  656. package/dist/contracts/schemas/__tests__/game-schemas.test.js.map +1 -0
  657. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts +2 -0
  658. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts.map +1 -0
  659. package/dist/contracts/schemas/__tests__/igaming-config.test.js +38 -0
  660. package/dist/contracts/schemas/__tests__/igaming-config.test.js.map +1 -0
  661. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts +2 -0
  662. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts.map +1 -0
  663. package/dist/contracts/schemas/__tests__/platform-config.test.js +16 -0
  664. package/dist/contracts/schemas/__tests__/platform-config.test.js.map +1 -0
  665. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
  666. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
  667. package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
  668. package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
  669. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts +2 -0
  670. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts.map +1 -0
  671. package/dist/contracts/schemas/__tests__/tag-schemas.test.js +42 -0
  672. package/dist/contracts/schemas/__tests__/tag-schemas.test.js.map +1 -0
  673. package/dist/contracts/schemas/chat-attachment.d.ts +20 -0
  674. package/dist/contracts/schemas/chat-attachment.d.ts.map +1 -0
  675. package/dist/contracts/schemas/chat-attachment.js +14 -0
  676. package/dist/contracts/schemas/chat-attachment.js.map +1 -0
  677. package/dist/contracts/schemas/chat-command-metadata.d.ts +73 -0
  678. package/dist/contracts/schemas/chat-command-metadata.d.ts.map +1 -0
  679. package/dist/contracts/schemas/chat-command-metadata.js +67 -0
  680. package/dist/contracts/schemas/chat-command-metadata.js.map +1 -0
  681. package/dist/contracts/schemas/chat-command.d.ts +224 -0
  682. package/dist/contracts/schemas/chat-command.d.ts.map +1 -0
  683. package/dist/contracts/schemas/chat-command.js +55 -0
  684. package/dist/contracts/schemas/chat-command.js.map +1 -0
  685. package/dist/contracts/schemas/common.d.ts +36 -0
  686. package/dist/contracts/schemas/common.d.ts.map +1 -1
  687. package/dist/contracts/schemas/common.js +67 -2
  688. package/dist/contracts/schemas/common.js.map +1 -1
  689. package/dist/contracts/schemas/compliance.d.ts +24 -1
  690. package/dist/contracts/schemas/compliance.d.ts.map +1 -1
  691. package/dist/contracts/schemas/compliance.js +13 -0
  692. package/dist/contracts/schemas/compliance.js.map +1 -1
  693. package/dist/contracts/schemas/display-currency.d.ts +14 -0
  694. package/dist/contracts/schemas/display-currency.d.ts.map +1 -0
  695. package/dist/contracts/schemas/display-currency.js +45 -0
  696. package/dist/contracts/schemas/display-currency.js.map +1 -0
  697. package/dist/contracts/schemas/events.d.ts +1236 -12
  698. package/dist/contracts/schemas/events.d.ts.map +1 -1
  699. package/dist/contracts/schemas/events.js +781 -71
  700. package/dist/contracts/schemas/events.js.map +1 -1
  701. package/dist/contracts/schemas/game.d.ts +89 -0
  702. package/dist/contracts/schemas/game.d.ts.map +1 -0
  703. package/dist/contracts/schemas/game.js +55 -0
  704. package/dist/contracts/schemas/game.js.map +1 -0
  705. package/dist/contracts/schemas/iam.d.ts +32 -0
  706. package/dist/contracts/schemas/iam.d.ts.map +1 -1
  707. package/dist/contracts/schemas/iam.js +35 -0
  708. package/dist/contracts/schemas/iam.js.map +1 -1
  709. package/dist/contracts/schemas/identity.d.ts +250 -6
  710. package/dist/contracts/schemas/identity.d.ts.map +1 -1
  711. package/dist/contracts/schemas/identity.js +236 -9
  712. package/dist/contracts/schemas/identity.js.map +1 -1
  713. package/dist/contracts/schemas/igaming-config.d.ts +31 -1
  714. package/dist/contracts/schemas/igaming-config.d.ts.map +1 -1
  715. package/dist/contracts/schemas/igaming-config.js +9 -1
  716. package/dist/contracts/schemas/igaming-config.js.map +1 -1
  717. package/dist/contracts/schemas/index.d.ts +8 -0
  718. package/dist/contracts/schemas/index.d.ts.map +1 -1
  719. package/dist/contracts/schemas/index.js +8 -0
  720. package/dist/contracts/schemas/index.js.map +1 -1
  721. package/dist/contracts/schemas/lobby.d.ts +27 -0
  722. package/dist/contracts/schemas/lobby.d.ts.map +1 -0
  723. package/dist/contracts/schemas/lobby.js +22 -0
  724. package/dist/contracts/schemas/lobby.js.map +1 -0
  725. package/dist/contracts/schemas/mail.d.ts +306 -0
  726. package/dist/contracts/schemas/mail.d.ts.map +1 -0
  727. package/dist/contracts/schemas/mail.js +112 -0
  728. package/dist/contracts/schemas/mail.js.map +1 -0
  729. package/dist/contracts/schemas/platform-config.d.ts +211 -32
  730. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  731. package/dist/contracts/schemas/platform-config.js +239 -7
  732. package/dist/contracts/schemas/platform-config.js.map +1 -1
  733. package/dist/contracts/schemas/player.d.ts +96 -4
  734. package/dist/contracts/schemas/player.d.ts.map +1 -1
  735. package/dist/contracts/schemas/player.js +83 -9
  736. package/dist/contracts/schemas/player.js.map +1 -1
  737. package/dist/contracts/schemas/reporting.d.ts +20 -0
  738. package/dist/contracts/schemas/reporting.d.ts.map +1 -0
  739. package/dist/contracts/schemas/reporting.js +13 -0
  740. package/dist/contracts/schemas/reporting.js.map +1 -0
  741. package/dist/contracts/schemas/tag.d.ts +86 -2
  742. package/dist/contracts/schemas/tag.d.ts.map +1 -1
  743. package/dist/contracts/schemas/tag.js +13 -1
  744. package/dist/contracts/schemas/tag.js.map +1 -1
  745. package/dist/contracts/schemas/wallet-tx.d.ts +50 -3
  746. package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
  747. package/dist/contracts/schemas/wallet-tx.js +50 -3
  748. package/dist/contracts/schemas/wallet-tx.js.map +1 -1
  749. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts +2 -0
  750. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts.map +1 -0
  751. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js +155 -0
  752. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js.map +1 -0
  753. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts +2 -0
  754. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts.map +1 -0
  755. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js +81 -0
  756. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js.map +1 -0
  757. package/dist/engagement/chat/__tests__/chat.router.test.d.ts +2 -0
  758. package/dist/engagement/chat/__tests__/chat.router.test.d.ts.map +1 -0
  759. package/dist/engagement/chat/__tests__/chat.router.test.js +44 -0
  760. package/dist/engagement/chat/__tests__/chat.router.test.js.map +1 -0
  761. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts +2 -0
  762. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts.map +1 -0
  763. package/dist/engagement/chat/__tests__/chat.service.int.test.js +2349 -0
  764. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -0
  765. package/dist/engagement/chat/__tests__/contract.test.d.ts +2 -0
  766. package/dist/engagement/chat/__tests__/contract.test.d.ts.map +1 -0
  767. package/dist/engagement/chat/__tests__/contract.test.js +44 -0
  768. package/dist/engagement/chat/__tests__/contract.test.js.map +1 -0
  769. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts +2 -0
  770. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts.map +1 -0
  771. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js +100 -0
  772. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js.map +1 -0
  773. package/dist/engagement/chat/__tests__/moderation.test.js +2 -0
  774. package/dist/engagement/chat/__tests__/moderation.test.js.map +1 -1
  775. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts +2 -0
  776. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts.map +1 -0
  777. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js +736 -0
  778. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js.map +1 -0
  779. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts +2 -0
  780. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts.map +1 -0
  781. package/dist/engagement/chat/__tests__/validate-attachment.test.js +38 -0
  782. package/dist/engagement/chat/__tests__/validate-attachment.test.js.map +1 -0
  783. package/dist/engagement/chat/contract/constants.d.ts +15 -0
  784. package/dist/engagement/chat/contract/constants.d.ts.map +1 -0
  785. package/dist/engagement/chat/contract/constants.js +20 -0
  786. package/dist/engagement/chat/contract/constants.js.map +1 -0
  787. package/dist/engagement/chat/contract/index.d.ts +2190 -16
  788. package/dist/engagement/chat/contract/index.d.ts.map +1 -1
  789. package/dist/engagement/chat/contract/index.js +457 -12
  790. package/dist/engagement/chat/contract/index.js.map +1 -1
  791. package/dist/engagement/chat/drizzle/migrations/0001_cloudy_groot.sql +32 -0
  792. package/dist/engagement/chat/drizzle/migrations/0002_steep_zodiak.sql +3 -0
  793. package/dist/engagement/chat/drizzle/migrations/0003_stormy_king_bedlam.sql +9 -0
  794. package/dist/engagement/chat/drizzle/migrations/0004_panoramic_robin_chapel.sql +6 -0
  795. package/dist/engagement/chat/drizzle/migrations/0005_tranquil_gwen_stacy.sql +100 -0
  796. package/dist/engagement/chat/drizzle/migrations/0006_tiny_ultron.sql +3 -0
  797. package/dist/engagement/chat/drizzle/migrations/0007_seed_global_chat_room.sql +8 -0
  798. package/dist/engagement/chat/drizzle/migrations/0008_robust_korvac.sql +1 -0
  799. package/dist/engagement/chat/drizzle/migrations/0009_massive_bill_hollister.sql +1 -0
  800. package/dist/engagement/chat/drizzle/migrations/0010_backfill_role_assigned_at.sql +9 -0
  801. package/dist/engagement/chat/drizzle/migrations/0011_light_changeling.sql +1 -0
  802. package/dist/engagement/chat/drizzle/migrations/0012_strange_mephisto.sql +3 -0
  803. package/dist/engagement/chat/drizzle/migrations/0013_chilly_sprite.sql +6 -0
  804. package/dist/engagement/chat/drizzle/migrations/0014_chat_moderation_expiry_recorded.sql +19 -0
  805. package/dist/engagement/chat/drizzle/migrations/meta/0001_snapshot.json +557 -0
  806. package/dist/engagement/chat/drizzle/migrations/meta/0002_snapshot.json +576 -0
  807. package/dist/engagement/chat/drizzle/migrations/meta/0003_snapshot.json +652 -0
  808. package/dist/engagement/chat/drizzle/migrations/meta/0004_snapshot.json +666 -0
  809. package/dist/engagement/chat/drizzle/migrations/meta/0005_snapshot.json +1422 -0
  810. package/dist/engagement/chat/drizzle/migrations/meta/0006_snapshot.json +1456 -0
  811. package/dist/engagement/chat/drizzle/migrations/meta/0007_snapshot.json +1456 -0
  812. package/dist/engagement/chat/drizzle/migrations/meta/0008_snapshot.json +1462 -0
  813. package/dist/engagement/chat/drizzle/migrations/meta/0009_snapshot.json +1468 -0
  814. package/dist/engagement/chat/drizzle/migrations/meta/0010_snapshot.json +1468 -0
  815. package/dist/engagement/chat/drizzle/migrations/meta/0011_snapshot.json +1489 -0
  816. package/dist/engagement/chat/drizzle/migrations/meta/0012_snapshot.json +1517 -0
  817. package/dist/engagement/chat/drizzle/migrations/meta/0013_snapshot.json +1517 -0
  818. package/dist/engagement/chat/drizzle/migrations/meta/0014_snapshot.json +1544 -0
  819. package/dist/engagement/chat/drizzle/migrations/meta/_journal.json +98 -0
  820. package/dist/engagement/chat/index.d.ts +1 -2
  821. package/dist/engagement/chat/index.d.ts.map +1 -1
  822. package/dist/engagement/chat/index.js +1 -2
  823. package/dist/engagement/chat/index.js.map +1 -1
  824. package/dist/engagement/chat/moderation/index.d.ts +1 -0
  825. package/dist/engagement/chat/moderation/index.d.ts.map +1 -1
  826. package/dist/engagement/chat/moderation/index.js +1 -0
  827. package/dist/engagement/chat/moderation/index.js.map +1 -1
  828. package/dist/engagement/chat/moderation/profanity.d.ts.map +1 -1
  829. package/dist/engagement/chat/moderation/profanity.js +2 -0
  830. package/dist/engagement/chat/moderation/profanity.js.map +1 -1
  831. package/dist/engagement/chat/moderation/validate-attachment.d.ts +9 -0
  832. package/dist/engagement/chat/moderation/validate-attachment.d.ts.map +1 -0
  833. package/dist/engagement/chat/moderation/validate-attachment.js +27 -0
  834. package/dist/engagement/chat/moderation/validate-attachment.js.map +1 -0
  835. package/dist/engagement/chat/plugin.d.ts +187 -1
  836. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  837. package/dist/engagement/chat/plugin.js +211 -5
  838. package/dist/engagement/chat/plugin.js.map +1 -1
  839. package/dist/engagement/chat/router/index.d.ts +1662 -16
  840. package/dist/engagement/chat/router/index.d.ts.map +1 -1
  841. package/dist/engagement/chat/router/index.js +302 -27
  842. package/dist/engagement/chat/router/index.js.map +1 -1
  843. package/dist/engagement/chat/schema/index.d.ts +1621 -0
  844. package/dist/engagement/chat/schema/index.d.ts.map +1 -1
  845. package/dist/engagement/chat/schema/index.js +192 -4
  846. package/dist/engagement/chat/schema/index.js.map +1 -1
  847. package/dist/engagement/chat/service/chat-ban.service.d.ts +26 -0
  848. package/dist/engagement/chat/service/chat-ban.service.d.ts.map +1 -0
  849. package/dist/engagement/chat/service/chat-ban.service.js +144 -0
  850. package/dist/engagement/chat/service/chat-ban.service.js.map +1 -0
  851. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts +14 -0
  852. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts.map +1 -0
  853. package/dist/engagement/chat/service/chat-message-moderation.service.js +48 -0
  854. package/dist/engagement/chat/service/chat-message-moderation.service.js.map +1 -0
  855. package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts +22 -0
  856. package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts.map +1 -0
  857. package/dist/engagement/chat/service/chat-moderation-expiry.service.js +80 -0
  858. package/dist/engagement/chat/service/chat-moderation-expiry.service.js.map +1 -0
  859. package/dist/engagement/chat/service/chat-moderation.service.d.ts +30 -0
  860. package/dist/engagement/chat/service/chat-moderation.service.d.ts.map +1 -0
  861. package/dist/engagement/chat/service/chat-moderation.service.js +40 -0
  862. package/dist/engagement/chat/service/chat-moderation.service.js.map +1 -0
  863. package/dist/engagement/chat/service/chat-mute.service.d.ts +26 -0
  864. package/dist/engagement/chat/service/chat-mute.service.d.ts.map +1 -0
  865. package/dist/engagement/chat/service/chat-mute.service.js +159 -0
  866. package/dist/engagement/chat/service/chat-mute.service.js.map +1 -0
  867. package/dist/engagement/chat/service/chat-room-ban.service.d.ts +29 -0
  868. package/dist/engagement/chat/service/chat-room-ban.service.d.ts.map +1 -0
  869. package/dist/engagement/chat/service/chat-room-ban.service.js +107 -0
  870. package/dist/engagement/chat/service/chat-room-ban.service.js.map +1 -0
  871. package/dist/engagement/chat/service/chat-room-membership.service.d.ts +107 -0
  872. package/dist/engagement/chat/service/chat-room-membership.service.d.ts.map +1 -0
  873. package/dist/engagement/chat/service/chat-room-membership.service.js +536 -0
  874. package/dist/engagement/chat/service/chat-room-membership.service.js.map +1 -0
  875. package/dist/engagement/chat/service/chat-room-mute.service.d.ts +25 -0
  876. package/dist/engagement/chat/service/chat-room-mute.service.d.ts.map +1 -0
  877. package/dist/engagement/chat/service/chat-room-mute.service.js +89 -0
  878. package/dist/engagement/chat/service/chat-room-mute.service.js.map +1 -0
  879. package/dist/engagement/chat/service/chat-room-purge.service.d.ts +13 -0
  880. package/dist/engagement/chat/service/chat-room-purge.service.d.ts.map +1 -0
  881. package/dist/engagement/chat/service/chat-room-purge.service.js +75 -0
  882. package/dist/engagement/chat/service/chat-room-purge.service.js.map +1 -0
  883. package/dist/engagement/chat/service/chat.service.d.ts +1144 -35
  884. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  885. package/dist/engagement/chat/service/chat.service.js +1243 -70
  886. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  887. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts +42 -0
  888. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts.map +1 -0
  889. package/dist/engagement/chat/service/errors/chat-moderation.errors.js +32 -0
  890. package/dist/engagement/chat/service/errors/chat-moderation.errors.js.map +1 -0
  891. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts +2 -0
  892. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts.map +1 -0
  893. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js +98 -0
  894. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js.map +1 -0
  895. package/dist/engagement/chat-commands/contract/index.d.ts +201 -0
  896. package/dist/engagement/chat-commands/contract/index.d.ts.map +1 -0
  897. package/dist/engagement/chat-commands/contract/index.js +70 -0
  898. package/dist/engagement/chat-commands/contract/index.js.map +1 -0
  899. package/dist/engagement/chat-commands/drizzle/migrations/0000_daffy_lady_bullseye.sql +24 -0
  900. package/dist/engagement/chat-commands/drizzle/migrations/0001_sturdy_barracuda.sql +1 -0
  901. package/dist/engagement/chat-commands/drizzle/migrations/0002_single_currency_command_limits.sql +45 -0
  902. package/dist/engagement/chat-commands/drizzle/migrations/meta/0000_snapshot.json +164 -0
  903. package/dist/engagement/chat-commands/drizzle/migrations/meta/0001_snapshot.json +83 -0
  904. package/dist/engagement/chat-commands/drizzle/migrations/meta/0002_snapshot.json +83 -0
  905. package/dist/engagement/chat-commands/drizzle/migrations/meta/_journal.json +27 -0
  906. package/dist/engagement/chat-commands/drizzle.config.d.ts +4 -0
  907. package/dist/engagement/chat-commands/drizzle.config.d.ts.map +1 -0
  908. package/dist/engagement/chat-commands/drizzle.config.js +21 -0
  909. package/dist/engagement/chat-commands/drizzle.config.js.map +1 -0
  910. package/dist/engagement/chat-commands/migrate.d.ts +2 -0
  911. package/dist/engagement/chat-commands/migrate.d.ts.map +1 -0
  912. package/dist/engagement/chat-commands/migrate.js +20 -0
  913. package/dist/engagement/chat-commands/migrate.js.map +1 -0
  914. package/dist/engagement/chat-commands/plugin.d.ts +188 -0
  915. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -0
  916. package/dist/engagement/chat-commands/plugin.js +15 -0
  917. package/dist/engagement/chat-commands/plugin.js.map +1 -0
  918. package/dist/engagement/chat-commands/router/index.d.ts +137 -0
  919. package/dist/engagement/chat-commands/router/index.d.ts.map +1 -0
  920. package/dist/engagement/chat-commands/router/index.js +24 -0
  921. package/dist/engagement/chat-commands/router/index.js.map +1 -0
  922. package/dist/engagement/chat-commands/schema/index.d.ts +140 -0
  923. package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -0
  924. package/dist/engagement/chat-commands/schema/index.js +13 -0
  925. package/dist/engagement/chat-commands/schema/index.js.map +1 -0
  926. package/dist/engagement/chat-commands/seed/index.d.ts +3 -0
  927. package/dist/engagement/chat-commands/seed/index.d.ts.map +1 -0
  928. package/dist/engagement/chat-commands/seed/index.js +66 -0
  929. package/dist/engagement/chat-commands/seed/index.js.map +1 -0
  930. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts +2 -0
  931. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts.map +1 -0
  932. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js +157 -0
  933. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js.map +1 -0
  934. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts +60 -0
  935. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts.map +1 -0
  936. package/dist/engagement/chat-commands/service/chat-commands.service.js +147 -0
  937. package/dist/engagement/chat-commands/service/chat-commands.service.js.map +1 -0
  938. package/dist/engagement/contracts.d.ts +2 -0
  939. package/dist/engagement/contracts.d.ts.map +1 -1
  940. package/dist/engagement/contracts.js +2 -0
  941. package/dist/engagement/contracts.js.map +1 -1
  942. package/dist/engagement/index.d.ts +2 -0
  943. package/dist/engagement/index.d.ts.map +1 -1
  944. package/dist/engagement/index.js +2 -0
  945. package/dist/engagement/index.js.map +1 -1
  946. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts +2 -0
  947. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts.map +1 -0
  948. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js +184 -0
  949. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js.map +1 -0
  950. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts +2 -0
  951. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts.map +1 -0
  952. package/dist/engagement/notifications/__tests__/notification-event-map.test.js +337 -0
  953. package/dist/engagement/notifications/__tests__/notification-event-map.test.js.map +1 -0
  954. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts +2 -0
  955. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts.map +1 -0
  956. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js +148 -0
  957. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js.map +1 -0
  958. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts +2 -0
  959. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts.map +1 -0
  960. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +298 -0
  961. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -0
  962. package/dist/engagement/notifications/contract/index.d.ts +126 -13
  963. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  964. package/dist/engagement/notifications/contract/index.js +46 -5
  965. package/dist/engagement/notifications/contract/index.js.map +1 -1
  966. package/dist/engagement/notifications/drizzle/migrations/0001_classy_pixie.sql +1 -0
  967. package/dist/engagement/notifications/drizzle/migrations/0002_open_madame_web.sql +2 -0
  968. package/dist/engagement/notifications/drizzle/migrations/meta/0001_snapshot.json +98 -0
  969. package/dist/engagement/notifications/drizzle/migrations/meta/0002_snapshot.json +119 -0
  970. package/dist/engagement/notifications/drizzle/migrations/meta/_journal.json +14 -0
  971. package/dist/engagement/notifications/plugin.d.ts +204 -1
  972. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  973. package/dist/engagement/notifications/plugin.js +466 -46
  974. package/dist/engagement/notifications/plugin.js.map +1 -1
  975. package/dist/engagement/notifications/react/notifications.d.ts +20 -0
  976. package/dist/engagement/notifications/react/notifications.d.ts.map +1 -0
  977. package/dist/engagement/notifications/react/notifications.js +39 -0
  978. package/dist/engagement/notifications/react/notifications.js.map +1 -0
  979. package/dist/engagement/notifications/router/index.d.ts +74 -13
  980. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  981. package/dist/engagement/notifications/router/index.js +37 -16
  982. package/dist/engagement/notifications/router/index.js.map +1 -1
  983. package/dist/engagement/notifications/schema/index.d.ts +36 -0
  984. package/dist/engagement/notifications/schema/index.d.ts.map +1 -1
  985. package/dist/engagement/notifications/schema/index.js +7 -2
  986. package/dist/engagement/notifications/schema/index.js.map +1 -1
  987. package/dist/engagement/notifications/service/notifications.service.d.ts +33 -21
  988. package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
  989. package/dist/engagement/notifications/service/notifications.service.js +41 -11
  990. package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
  991. package/dist/engagement/react.d.ts +1 -1
  992. package/dist/engagement/react.d.ts.map +1 -1
  993. package/dist/engagement/react.js +2 -2
  994. package/dist/engagement/react.js.map +1 -1
  995. package/dist/engagement/server.d.ts +2 -0
  996. package/dist/engagement/server.d.ts.map +1 -1
  997. package/dist/engagement/server.js +2 -0
  998. package/dist/engagement/server.js.map +1 -1
  999. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts +2 -0
  1000. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts.map +1 -0
  1001. package/dist/engagement/social/__tests__/social.plugin.int.test.js +100 -0
  1002. package/dist/engagement/social/__tests__/social.plugin.int.test.js.map +1 -0
  1003. package/dist/engagement/social/__tests__/social.router.int.test.d.ts +2 -0
  1004. package/dist/engagement/social/__tests__/social.router.int.test.d.ts.map +1 -0
  1005. package/dist/engagement/social/__tests__/social.router.int.test.js +215 -0
  1006. package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -0
  1007. package/dist/engagement/social/__tests__/social.service.int.test.d.ts +2 -0
  1008. package/dist/engagement/social/__tests__/social.service.int.test.d.ts.map +1 -0
  1009. package/dist/engagement/social/__tests__/social.service.int.test.js +810 -0
  1010. package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -0
  1011. package/dist/engagement/social/contract/index.d.ts +187 -0
  1012. package/dist/engagement/social/contract/index.d.ts.map +1 -0
  1013. package/dist/engagement/social/contract/index.js +107 -0
  1014. package/dist/engagement/social/contract/index.js.map +1 -0
  1015. package/dist/engagement/social/drizzle/migrations/0000_fine_jamie_braddock.sql +24 -0
  1016. package/dist/engagement/social/drizzle/migrations/0001_lame_eddie_brock.sql +10 -0
  1017. package/dist/engagement/social/drizzle/migrations/0002_foamy_saracen.sql +1 -0
  1018. package/dist/engagement/social/drizzle/migrations/0003_fuzzy_shadow_king.sql +4 -0
  1019. package/dist/engagement/social/drizzle/migrations/0004_friendship-cancel-constraint.sql +2 -0
  1020. package/dist/engagement/social/drizzle/migrations/meta/0000_snapshot.json +232 -0
  1021. package/dist/engagement/social/drizzle/migrations/meta/0001_snapshot.json +129 -0
  1022. package/dist/engagement/social/drizzle/migrations/meta/0002_snapshot.json +134 -0
  1023. package/dist/engagement/social/drizzle/migrations/meta/0003_snapshot.json +145 -0
  1024. package/dist/engagement/social/drizzle/migrations/meta/0004_snapshot.json +145 -0
  1025. package/dist/engagement/social/drizzle/migrations/meta/_journal.json +41 -0
  1026. package/dist/engagement/social/drizzle.config.d.ts +4 -0
  1027. package/dist/engagement/social/drizzle.config.d.ts.map +1 -0
  1028. package/dist/engagement/social/drizzle.config.js +21 -0
  1029. package/dist/engagement/social/drizzle.config.js.map +1 -0
  1030. package/dist/engagement/social/index.d.ts +3 -0
  1031. package/dist/engagement/social/index.d.ts.map +1 -0
  1032. package/dist/engagement/social/index.js +6 -0
  1033. package/dist/engagement/social/index.js.map +1 -0
  1034. package/dist/engagement/social/migrate.d.ts +5 -0
  1035. package/dist/engagement/social/migrate.d.ts.map +1 -0
  1036. package/dist/engagement/social/migrate.js +17 -0
  1037. package/dist/engagement/social/migrate.js.map +1 -0
  1038. package/dist/engagement/social/plugin.d.ts +188 -0
  1039. package/dist/engagement/social/plugin.d.ts.map +1 -0
  1040. package/dist/engagement/social/plugin.js +17 -0
  1041. package/dist/engagement/social/plugin.js.map +1 -0
  1042. package/dist/engagement/social/router/index.d.ts +98 -0
  1043. package/dist/engagement/social/router/index.d.ts.map +1 -0
  1044. package/dist/engagement/social/router/index.js +68 -0
  1045. package/dist/engagement/social/router/index.js.map +1 -0
  1046. package/dist/engagement/social/schema/index.d.ts +145 -0
  1047. package/dist/engagement/social/schema/index.d.ts.map +1 -0
  1048. package/dist/engagement/social/schema/index.js +24 -0
  1049. package/dist/engagement/social/schema/index.js.map +1 -0
  1050. package/dist/engagement/social/service/social.service.d.ts +73 -0
  1051. package/dist/engagement/social/service/social.service.d.ts.map +1 -0
  1052. package/dist/engagement/social/service/social.service.js +479 -0
  1053. package/dist/engagement/social/service/social.service.js.map +1 -0
  1054. package/dist/fx/contracts.d.ts +2 -0
  1055. package/dist/fx/contracts.d.ts.map +1 -0
  1056. package/dist/fx/contracts.js +2 -0
  1057. package/dist/fx/contracts.js.map +1 -0
  1058. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts +2 -0
  1059. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts.map +1 -0
  1060. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js +236 -0
  1061. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js.map +1 -0
  1062. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts +2 -0
  1063. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts.map +1 -0
  1064. package/dist/fx/exchange-rate/__tests__/select-provider.test.js +26 -0
  1065. package/dist/fx/exchange-rate/__tests__/select-provider.test.js.map +1 -0
  1066. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts +61 -0
  1067. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts.map +1 -0
  1068. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js +227 -0
  1069. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js.map +1 -0
  1070. package/dist/fx/exchange-rate/contract/index.d.ts +44 -0
  1071. package/dist/fx/exchange-rate/contract/index.d.ts.map +1 -0
  1072. package/dist/fx/exchange-rate/contract/index.js +30 -0
  1073. package/dist/fx/exchange-rate/contract/index.js.map +1 -0
  1074. package/dist/fx/exchange-rate/drizzle/migrations/0000_hot_trauma.sql +10 -0
  1075. package/dist/fx/exchange-rate/drizzle/migrations/meta/0000_snapshot.json +92 -0
  1076. package/dist/fx/exchange-rate/drizzle/migrations/meta/_journal.json +13 -0
  1077. package/dist/fx/exchange-rate/drizzle.config.d.ts +4 -0
  1078. package/dist/fx/exchange-rate/drizzle.config.d.ts.map +1 -0
  1079. package/dist/fx/exchange-rate/drizzle.config.js +18 -0
  1080. package/dist/fx/exchange-rate/drizzle.config.js.map +1 -0
  1081. package/dist/fx/exchange-rate/index.d.ts +3 -0
  1082. package/dist/fx/exchange-rate/index.d.ts.map +1 -0
  1083. package/dist/fx/exchange-rate/index.js +3 -0
  1084. package/dist/fx/exchange-rate/index.js.map +1 -0
  1085. package/dist/fx/exchange-rate/migrate.d.ts +5 -0
  1086. package/dist/fx/exchange-rate/migrate.d.ts.map +1 -0
  1087. package/dist/fx/exchange-rate/migrate.js +14 -0
  1088. package/dist/fx/exchange-rate/migrate.js.map +1 -0
  1089. package/dist/fx/exchange-rate/plugin.d.ts +187 -0
  1090. package/dist/fx/exchange-rate/plugin.d.ts.map +1 -0
  1091. package/dist/fx/exchange-rate/plugin.js +42 -0
  1092. package/dist/fx/exchange-rate/plugin.js.map +1 -0
  1093. package/dist/fx/exchange-rate/react/exchange-rate.d.ts +12 -0
  1094. package/dist/fx/exchange-rate/react/exchange-rate.d.ts.map +1 -0
  1095. package/dist/fx/exchange-rate/react/exchange-rate.js +17 -0
  1096. package/dist/fx/exchange-rate/react/exchange-rate.js.map +1 -0
  1097. package/dist/fx/exchange-rate/router/index.d.ts +22 -0
  1098. package/dist/fx/exchange-rate/router/index.d.ts.map +1 -0
  1099. package/dist/fx/exchange-rate/router/index.js +18 -0
  1100. package/dist/fx/exchange-rate/router/index.js.map +1 -0
  1101. package/dist/fx/exchange-rate/schema/index.d.ts +116 -0
  1102. package/dist/fx/exchange-rate/schema/index.d.ts.map +1 -0
  1103. package/dist/fx/exchange-rate/schema/index.js +18 -0
  1104. package/dist/fx/exchange-rate/schema/index.js.map +1 -0
  1105. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts +22 -0
  1106. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts.map +1 -0
  1107. package/dist/fx/exchange-rate/service/exchange-rate.service.js +38 -0
  1108. package/dist/fx/exchange-rate/service/exchange-rate.service.js.map +1 -0
  1109. package/dist/fx/index.d.ts +2 -0
  1110. package/dist/fx/index.d.ts.map +1 -0
  1111. package/dist/fx/index.js +2 -0
  1112. package/dist/fx/index.js.map +1 -0
  1113. package/dist/fx/react.d.ts +2 -0
  1114. package/dist/fx/react.d.ts.map +1 -0
  1115. package/dist/fx/react.js +2 -0
  1116. package/dist/fx/react.js.map +1 -0
  1117. package/dist/fx/server.d.ts +2 -0
  1118. package/dist/fx/server.d.ts.map +1 -0
  1119. package/dist/fx/server.js +2 -0
  1120. package/dist/fx/server.js.map +1 -0
  1121. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts +2 -0
  1122. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts.map +1 -0
  1123. package/dist/iam/__tests__/admin-player-activity.int.test.js +119 -0
  1124. package/dist/iam/__tests__/admin-player-activity.int.test.js.map +1 -0
  1125. package/dist/iam/__tests__/iam.service.int.test.d.ts +2 -0
  1126. package/dist/iam/__tests__/iam.service.int.test.d.ts.map +1 -0
  1127. package/dist/iam/__tests__/iam.service.int.test.js +580 -0
  1128. package/dist/iam/__tests__/iam.service.int.test.js.map +1 -0
  1129. package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
  1130. package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
  1131. package/dist/iam/adapters/admin-player-activity.js +106 -0
  1132. package/dist/iam/adapters/admin-player-activity.js.map +1 -0
  1133. package/dist/iam/adapters/admin-role-assignment-directory.d.ts +8 -0
  1134. package/dist/iam/adapters/admin-role-assignment-directory.d.ts.map +1 -0
  1135. package/dist/iam/adapters/admin-role-assignment-directory.js +23 -0
  1136. package/dist/iam/adapters/admin-role-assignment-directory.js.map +1 -0
  1137. package/dist/iam/contract/index.d.ts +58 -0
  1138. package/dist/iam/contract/index.d.ts.map +1 -1
  1139. package/dist/iam/contract/index.js +30 -4
  1140. package/dist/iam/contract/index.js.map +1 -1
  1141. package/dist/iam/plugin.d.ts +187 -1
  1142. package/dist/iam/plugin.d.ts.map +1 -1
  1143. package/dist/iam/plugin.js +10 -5
  1144. package/dist/iam/plugin.js.map +1 -1
  1145. package/dist/iam/router/index.d.ts +37 -0
  1146. package/dist/iam/router/index.d.ts.map +1 -1
  1147. package/dist/iam/router/index.js +7 -1
  1148. package/dist/iam/router/index.js.map +1 -1
  1149. package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
  1150. package/dist/iam/seed/data/default-admin-roles.js +6 -0
  1151. package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
  1152. package/dist/iam/service/iam.service.d.ts +55 -26
  1153. package/dist/iam/service/iam.service.d.ts.map +1 -1
  1154. package/dist/iam/service/iam.service.js +122 -17
  1155. package/dist/iam/service/iam.service.js.map +1 -1
  1156. package/dist/mail/__tests__/default-email-template-renderer.test.d.ts +2 -0
  1157. package/dist/mail/__tests__/default-email-template-renderer.test.d.ts.map +1 -0
  1158. package/dist/mail/__tests__/default-email-template-renderer.test.js +212 -0
  1159. package/dist/mail/__tests__/default-email-template-renderer.test.js.map +1 -0
  1160. package/dist/mail/__tests__/mail.service.test.d.ts +2 -0
  1161. package/dist/mail/__tests__/mail.service.test.d.ts.map +1 -0
  1162. package/dist/mail/__tests__/mail.service.test.js +271 -0
  1163. package/dist/mail/__tests__/mail.service.test.js.map +1 -0
  1164. package/dist/mail/adapters/default-email-template-renderer.d.ts +5 -0
  1165. package/dist/mail/adapters/default-email-template-renderer.d.ts.map +1 -0
  1166. package/dist/mail/adapters/default-email-template-renderer.js +151 -0
  1167. package/dist/mail/adapters/default-email-template-renderer.js.map +1 -0
  1168. package/dist/mail/adapters/stdout-email-sender.d.ts +5 -0
  1169. package/dist/mail/adapters/stdout-email-sender.d.ts.map +1 -0
  1170. package/dist/mail/adapters/stdout-email-sender.js +8 -0
  1171. package/dist/mail/adapters/stdout-email-sender.js.map +1 -0
  1172. package/dist/mail/contract/index.d.ts +202 -0
  1173. package/dist/mail/contract/index.d.ts.map +1 -0
  1174. package/dist/mail/contract/index.js +23 -0
  1175. package/dist/mail/contract/index.js.map +1 -0
  1176. package/dist/mail/index.d.ts +5 -0
  1177. package/dist/mail/index.d.ts.map +1 -0
  1178. package/dist/mail/index.js +5 -0
  1179. package/dist/mail/index.js.map +1 -0
  1180. package/dist/mail/plugin.d.ts +187 -0
  1181. package/dist/mail/plugin.d.ts.map +1 -0
  1182. package/dist/mail/plugin.js +66 -0
  1183. package/dist/mail/plugin.js.map +1 -0
  1184. package/dist/mail/service/mail-payload.service.d.ts +8 -0
  1185. package/dist/mail/service/mail-payload.service.d.ts.map +1 -0
  1186. package/dist/mail/service/mail-payload.service.js +43 -0
  1187. package/dist/mail/service/mail-payload.service.js.map +1 -0
  1188. package/dist/mail/service/mail.service.d.ts +30 -0
  1189. package/dist/mail/service/mail.service.d.ts.map +1 -0
  1190. package/dist/mail/service/mail.service.js +165 -0
  1191. package/dist/mail/service/mail.service.js.map +1 -0
  1192. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts +2 -0
  1193. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts.map +1 -0
  1194. package/dist/pam/identity/__tests__/admin-security.int.test.js +153 -0
  1195. package/dist/pam/identity/__tests__/admin-security.int.test.js.map +1 -0
  1196. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts +2 -0
  1197. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts.map +1 -0
  1198. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js +234 -0
  1199. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js.map +1 -0
  1200. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts +2 -0
  1201. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts.map +1 -0
  1202. package/dist/pam/identity/__tests__/device-fingerprint.test.js +105 -0
  1203. package/dist/pam/identity/__tests__/device-fingerprint.test.js.map +1 -0
  1204. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts +2 -0
  1205. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts.map +1 -0
  1206. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +271 -0
  1207. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -0
  1208. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts +2 -0
  1209. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts.map +1 -0
  1210. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +119 -0
  1211. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -0
  1212. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts +2 -0
  1213. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts.map +1 -0
  1214. package/dist/pam/identity/__tests__/identity.service.int.test.js +1277 -0
  1215. package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -0
  1216. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts +2 -0
  1217. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts.map +1 -0
  1218. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js +99 -0
  1219. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js.map +1 -0
  1220. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts +2 -0
  1221. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts.map +1 -0
  1222. package/dist/pam/identity/__tests__/phone-login.service.int.test.js +394 -0
  1223. package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -0
  1224. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts +2 -0
  1225. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts.map +1 -0
  1226. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js +274 -0
  1227. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js.map +1 -0
  1228. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts +2 -0
  1229. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts.map +1 -0
  1230. package/dist/pam/identity/__tests__/play-eligibility.test.js +30 -0
  1231. package/dist/pam/identity/__tests__/play-eligibility.test.js.map +1 -0
  1232. package/dist/pam/identity/__tests__/rg-guard.test.d.ts +2 -0
  1233. package/dist/pam/identity/__tests__/rg-guard.test.d.ts.map +1 -0
  1234. package/dist/pam/identity/__tests__/rg-guard.test.js +21 -0
  1235. package/dist/pam/identity/__tests__/rg-guard.test.js.map +1 -0
  1236. package/dist/pam/identity/__tests__/session-idle.service.int.test.d.ts +2 -0
  1237. package/dist/pam/identity/__tests__/session-idle.service.int.test.d.ts.map +1 -0
  1238. package/dist/pam/identity/__tests__/session-idle.service.int.test.js +137 -0
  1239. package/dist/pam/identity/__tests__/session-idle.service.int.test.js.map +1 -0
  1240. package/dist/pam/identity/__tests__/session.service.int.test.d.ts +2 -0
  1241. package/dist/pam/identity/__tests__/session.service.int.test.d.ts.map +1 -0
  1242. package/dist/pam/identity/__tests__/session.service.int.test.js +127 -0
  1243. package/dist/pam/identity/__tests__/session.service.int.test.js.map +1 -0
  1244. package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts +2 -0
  1245. package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts.map +1 -0
  1246. package/dist/pam/identity/__tests__/two-factor-delivery.test.js +23 -0
  1247. package/dist/pam/identity/__tests__/two-factor-delivery.test.js.map +1 -0
  1248. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts +2 -0
  1249. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts.map +1 -0
  1250. package/dist/pam/identity/__tests__/user-commands.int.test.js +33 -0
  1251. package/dist/pam/identity/__tests__/user-commands.int.test.js.map +1 -0
  1252. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts +2 -0
  1253. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts.map +1 -0
  1254. package/dist/pam/identity/__tests__/username-backfill.int.test.js +103 -0
  1255. package/dist/pam/identity/__tests__/username-backfill.int.test.js.map +1 -0
  1256. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts +2 -0
  1257. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts.map +1 -0
  1258. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js +172 -0
  1259. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js.map +1 -0
  1260. package/dist/pam/identity/adapters/identity-reader.service.d.ts +9 -4
  1261. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  1262. package/dist/pam/identity/adapters/identity-reader.service.js +61 -2
  1263. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  1264. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts +3 -3
  1265. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts.map +1 -1
  1266. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js +3 -3
  1267. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js.map +1 -1
  1268. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts +8 -0
  1269. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts.map +1 -0
  1270. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js +7 -0
  1271. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js.map +1 -0
  1272. package/dist/pam/identity/admin-user-directory.d.ts +50 -8
  1273. package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
  1274. package/dist/pam/identity/admin-user-directory.js +111 -35
  1275. package/dist/pam/identity/admin-user-directory.js.map +1 -1
  1276. package/dist/pam/identity/contract/index.d.ts +526 -16
  1277. package/dist/pam/identity/contract/index.d.ts.map +1 -1
  1278. package/dist/pam/identity/contract/index.js +218 -10
  1279. package/dist/pam/identity/contract/index.js.map +1 -1
  1280. package/dist/pam/identity/drizzle/migrations/0001_rainy_peter_quill.sql +18 -0
  1281. package/dist/pam/identity/drizzle/migrations/0002_outstanding_patriot.sql +1 -0
  1282. package/dist/pam/identity/drizzle/migrations/0003_open_shotgun.sql +1 -0
  1283. package/dist/pam/identity/drizzle/migrations/0004_round_giant_girl.sql +1 -0
  1284. package/dist/pam/identity/drizzle/migrations/0005_daily_black_tom.sql +1 -0
  1285. package/dist/pam/identity/drizzle/migrations/0006_brave_sabra.sql +1 -0
  1286. package/dist/pam/identity/drizzle/migrations/0007_fuzzy_barracuda.sql +44 -0
  1287. package/dist/pam/identity/drizzle/migrations/0008_pink_bucky.sql +23 -0
  1288. package/dist/pam/identity/drizzle/migrations/0009_hard_sauron.sql +2 -0
  1289. package/dist/pam/identity/drizzle/migrations/0010_lying_young_avengers.sql +19 -0
  1290. package/dist/pam/identity/drizzle/migrations/0011_useful_the_executioner.sql +2 -0
  1291. package/dist/pam/identity/drizzle/migrations/0012_worried_nuke.sql +2 -0
  1292. package/dist/pam/identity/drizzle/migrations/0013_backfill_two_factor_method.sql +6 -0
  1293. package/dist/pam/identity/drizzle/migrations/0014_spicy_mephistopheles.sql +1 -0
  1294. package/dist/pam/identity/drizzle/migrations/0015_parallel_moira_mactaggert.sql +3 -0
  1295. package/dist/pam/identity/drizzle/migrations/meta/0001_snapshot.json +684 -0
  1296. package/dist/pam/identity/drizzle/migrations/meta/0002_snapshot.json +690 -0
  1297. package/dist/pam/identity/drizzle/migrations/meta/0003_snapshot.json +695 -0
  1298. package/dist/pam/identity/drizzle/migrations/meta/0004_snapshot.json +680 -0
  1299. package/dist/pam/identity/drizzle/migrations/meta/0005_snapshot.json +695 -0
  1300. package/dist/pam/identity/drizzle/migrations/meta/0006_snapshot.json +701 -0
  1301. package/dist/pam/identity/drizzle/migrations/meta/0007_snapshot.json +737 -0
  1302. package/dist/pam/identity/drizzle/migrations/meta/0008_snapshot.json +913 -0
  1303. package/dist/pam/identity/drizzle/migrations/meta/0009_snapshot.json +926 -0
  1304. package/dist/pam/identity/drizzle/migrations/meta/0010_snapshot.json +1066 -0
  1305. package/dist/pam/identity/drizzle/migrations/meta/0011_snapshot.json +1078 -0
  1306. package/dist/pam/identity/drizzle/migrations/meta/0012_snapshot.json +1090 -0
  1307. package/dist/pam/identity/drizzle/migrations/meta/0013_snapshot.json +1090 -0
  1308. package/dist/pam/identity/drizzle/migrations/meta/0014_snapshot.json +1096 -0
  1309. package/dist/pam/identity/drizzle/migrations/meta/0015_snapshot.json +1116 -0
  1310. package/dist/pam/identity/drizzle/migrations/meta/_journal.json +105 -0
  1311. package/dist/pam/identity/plugin.d.ts +187 -1
  1312. package/dist/pam/identity/plugin.d.ts.map +1 -1
  1313. package/dist/pam/identity/plugin.js +185 -20
  1314. package/dist/pam/identity/plugin.js.map +1 -1
  1315. package/dist/pam/identity/react/account.d.ts +89 -13
  1316. package/dist/pam/identity/react/account.d.ts.map +1 -1
  1317. package/dist/pam/identity/react/account.js +100 -6
  1318. package/dist/pam/identity/react/account.js.map +1 -1
  1319. package/dist/pam/identity/react/auth.d.ts +23 -13
  1320. package/dist/pam/identity/react/auth.d.ts.map +1 -1
  1321. package/dist/pam/identity/router/index.d.ts +490 -18
  1322. package/dist/pam/identity/router/index.d.ts.map +1 -1
  1323. package/dist/pam/identity/router/index.js +170 -20
  1324. package/dist/pam/identity/router/index.js.map +1 -1
  1325. package/dist/pam/identity/schema/index.d.ts +1083 -224
  1326. package/dist/pam/identity/schema/index.d.ts.map +1 -1
  1327. package/dist/pam/identity/schema/index.js +119 -3
  1328. package/dist/pam/identity/schema/index.js.map +1 -1
  1329. package/dist/pam/identity/service/admin-security.service.d.ts +84 -0
  1330. package/dist/pam/identity/service/admin-security.service.d.ts.map +1 -0
  1331. package/dist/pam/identity/service/admin-security.service.js +284 -0
  1332. package/dist/pam/identity/service/admin-security.service.js.map +1 -0
  1333. package/dist/pam/identity/service/capture-timezone.service.d.ts +10 -0
  1334. package/dist/pam/identity/service/capture-timezone.service.d.ts.map +1 -0
  1335. package/dist/pam/identity/service/capture-timezone.service.js +21 -0
  1336. package/dist/pam/identity/service/capture-timezone.service.js.map +1 -0
  1337. package/dist/pam/identity/service/device-fingerprint.service.d.ts +32 -0
  1338. package/dist/pam/identity/service/device-fingerprint.service.d.ts.map +1 -0
  1339. package/dist/pam/identity/service/device-fingerprint.service.js +79 -0
  1340. package/dist/pam/identity/service/device-fingerprint.service.js.map +1 -0
  1341. package/dist/pam/identity/service/fresh-reauthentication.service.d.ts +21 -0
  1342. package/dist/pam/identity/service/fresh-reauthentication.service.d.ts.map +1 -0
  1343. package/dist/pam/identity/service/fresh-reauthentication.service.js +45 -0
  1344. package/dist/pam/identity/service/fresh-reauthentication.service.js.map +1 -0
  1345. package/dist/pam/identity/service/identity.service.d.ts +250 -41
  1346. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  1347. package/dist/pam/identity/service/identity.service.js +1776 -131
  1348. package/dist/pam/identity/service/identity.service.js.map +1 -1
  1349. package/dist/pam/identity/service/lockout-policy.service.d.ts +30 -0
  1350. package/dist/pam/identity/service/lockout-policy.service.d.ts.map +1 -0
  1351. package/dist/pam/identity/service/lockout-policy.service.js +40 -0
  1352. package/dist/pam/identity/service/lockout-policy.service.js.map +1 -0
  1353. package/dist/pam/identity/service/phone-login.service.d.ts +65 -0
  1354. package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -0
  1355. package/dist/pam/identity/service/phone-login.service.js +393 -0
  1356. package/dist/pam/identity/service/phone-login.service.js.map +1 -0
  1357. package/dist/pam/identity/service/phone-verification.service.d.ts +39 -0
  1358. package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
  1359. package/dist/pam/identity/service/phone-verification.service.js +223 -0
  1360. package/dist/pam/identity/service/phone-verification.service.js.map +1 -0
  1361. package/dist/pam/identity/service/play-eligibility.service.d.ts +8 -0
  1362. package/dist/pam/identity/service/play-eligibility.service.d.ts.map +1 -0
  1363. package/dist/pam/identity/service/play-eligibility.service.js +21 -0
  1364. package/dist/pam/identity/service/play-eligibility.service.js.map +1 -0
  1365. package/dist/pam/identity/service/rg-guard.service.d.ts +37 -0
  1366. package/dist/pam/identity/service/rg-guard.service.d.ts.map +1 -0
  1367. package/dist/pam/identity/service/rg-guard.service.js +60 -0
  1368. package/dist/pam/identity/service/rg-guard.service.js.map +1 -0
  1369. package/dist/pam/identity/service/security-controls.service.d.ts +4 -0
  1370. package/dist/pam/identity/service/security-controls.service.d.ts.map +1 -0
  1371. package/dist/pam/identity/service/security-controls.service.js +38 -0
  1372. package/dist/pam/identity/service/security-controls.service.js.map +1 -0
  1373. package/dist/pam/identity/service/session-idle.service.d.ts +22 -0
  1374. package/dist/pam/identity/service/session-idle.service.d.ts.map +1 -0
  1375. package/dist/pam/identity/service/session-idle.service.js +101 -0
  1376. package/dist/pam/identity/service/session-idle.service.js.map +1 -0
  1377. package/dist/pam/identity/service/session.service.d.ts +63 -6
  1378. package/dist/pam/identity/service/session.service.d.ts.map +1 -1
  1379. package/dist/pam/identity/service/session.service.js +137 -23
  1380. package/dist/pam/identity/service/session.service.js.map +1 -1
  1381. package/dist/pam/identity/service/trusted-device.service.d.ts +57 -0
  1382. package/dist/pam/identity/service/trusted-device.service.d.ts.map +1 -0
  1383. package/dist/pam/identity/service/trusted-device.service.js +163 -0
  1384. package/dist/pam/identity/service/trusted-device.service.js.map +1 -0
  1385. package/dist/pam/identity/service/two-factor-challenge.service.d.ts +36 -0
  1386. package/dist/pam/identity/service/two-factor-challenge.service.d.ts.map +1 -0
  1387. package/dist/pam/identity/service/two-factor-challenge.service.js +30 -0
  1388. package/dist/pam/identity/service/two-factor-challenge.service.js.map +1 -0
  1389. package/dist/pam/identity/service/two-factor-delivery.service.d.ts +67 -0
  1390. package/dist/pam/identity/service/two-factor-delivery.service.d.ts.map +1 -0
  1391. package/dist/pam/identity/service/two-factor-delivery.service.js +135 -0
  1392. package/dist/pam/identity/service/two-factor-delivery.service.js.map +1 -0
  1393. package/dist/pam/identity/service/two-factor-lockout.service.d.ts +25 -0
  1394. package/dist/pam/identity/service/two-factor-lockout.service.d.ts.map +1 -0
  1395. package/dist/pam/identity/service/two-factor-lockout.service.js +121 -0
  1396. package/dist/pam/identity/service/two-factor-lockout.service.js.map +1 -0
  1397. package/dist/pam/identity/service/user-commands.service.d.ts +11 -0
  1398. package/dist/pam/identity/service/user-commands.service.d.ts.map +1 -0
  1399. package/dist/pam/identity/service/user-commands.service.js +32 -0
  1400. package/dist/pam/identity/service/user-commands.service.js.map +1 -0
  1401. package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts +3 -0
  1402. package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts.map +1 -0
  1403. package/dist/pam/identity/service/withdrawal-pin-hash.service.js +10 -0
  1404. package/dist/pam/identity/service/withdrawal-pin-hash.service.js.map +1 -0
  1405. package/dist/pam/identity/service/withdrawal-pin.service.d.ts +36 -0
  1406. package/dist/pam/identity/service/withdrawal-pin.service.d.ts.map +1 -0
  1407. package/dist/pam/identity/service/withdrawal-pin.service.js +132 -0
  1408. package/dist/pam/identity/service/withdrawal-pin.service.js.map +1 -0
  1409. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts +2 -0
  1410. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts.map +1 -0
  1411. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js +81 -0
  1412. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js.map +1 -0
  1413. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts +2 -0
  1414. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts.map +1 -0
  1415. package/dist/pam/player-management/__tests__/player.router.int.test.js +107 -0
  1416. package/dist/pam/player-management/__tests__/player.router.int.test.js.map +1 -0
  1417. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts +2 -0
  1418. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts.map +1 -0
  1419. package/dist/pam/player-management/__tests__/player.service.int.test.js +479 -0
  1420. package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -0
  1421. package/dist/pam/player-management/contract/index.d.ts +125 -15
  1422. package/dist/pam/player-management/contract/index.d.ts.map +1 -1
  1423. package/dist/pam/player-management/contract/index.js +35 -5
  1424. package/dist/pam/player-management/contract/index.js.map +1 -1
  1425. package/dist/pam/player-management/plugin.d.ts +186 -1
  1426. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  1427. package/dist/pam/player-management/plugin.js +11 -8
  1428. package/dist/pam/player-management/plugin.js.map +1 -1
  1429. package/dist/pam/player-management/router/index.d.ts +95 -15
  1430. package/dist/pam/player-management/router/index.d.ts.map +1 -1
  1431. package/dist/pam/player-management/router/index.js +54 -17
  1432. package/dist/pam/player-management/router/index.js.map +1 -1
  1433. package/dist/pam/player-management/service/kyc-status-writer.d.ts +5 -7
  1434. package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
  1435. package/dist/pam/player-management/service/kyc-status-writer.js +23 -19
  1436. package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
  1437. package/dist/pam/player-management/service/player.service.d.ts +65 -22
  1438. package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
  1439. package/dist/pam/player-management/service/player.service.js +148 -43
  1440. package/dist/pam/player-management/service/player.service.js.map +1 -1
  1441. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts +2 -0
  1442. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts.map +1 -0
  1443. package/dist/pam/player-note/__tests__/player-note.router.int.test.js +52 -0
  1444. package/dist/pam/player-note/__tests__/player-note.router.int.test.js.map +1 -0
  1445. package/dist/pam/player-note/contract/index.d.ts +14 -0
  1446. package/dist/pam/player-note/contract/index.d.ts.map +1 -1
  1447. package/dist/pam/player-note/contract/index.js +8 -2
  1448. package/dist/pam/player-note/contract/index.js.map +1 -1
  1449. package/dist/pam/player-note/plugin.d.ts +186 -1
  1450. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  1451. package/dist/pam/player-note/plugin.js +6 -4
  1452. package/dist/pam/player-note/plugin.js.map +1 -1
  1453. package/dist/pam/player-note/router/index.d.ts +10 -1
  1454. package/dist/pam/player-note/router/index.d.ts.map +1 -1
  1455. package/dist/pam/player-note/router/index.js +20 -3
  1456. package/dist/pam/player-note/router/index.js.map +1 -1
  1457. package/dist/pam/player-note/service/player-note.service.d.ts +5 -3
  1458. package/dist/pam/player-note/service/player-note.service.d.ts.map +1 -1
  1459. package/dist/pam/player-note/service/player-note.service.js +5 -3
  1460. package/dist/pam/player-note/service/player-note.service.js.map +1 -1
  1461. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts +2 -0
  1462. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts.map +1 -0
  1463. package/dist/pam/profile/__tests__/profile.service.int.test.js +296 -0
  1464. package/dist/pam/profile/__tests__/profile.service.int.test.js.map +1 -0
  1465. package/dist/pam/profile/contract/index.d.ts +74 -36
  1466. package/dist/pam/profile/contract/index.d.ts.map +1 -1
  1467. package/dist/pam/profile/contract/index.js +16 -1
  1468. package/dist/pam/profile/contract/index.js.map +1 -1
  1469. package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
  1470. package/dist/pam/profile/drizzle/migrations/0002_sour_alex_wilder.sql +7 -0
  1471. package/dist/pam/profile/drizzle/migrations/0003_absurd_morbius.sql +4 -0
  1472. package/dist/pam/profile/drizzle/migrations/0004_fuzzy_korvac.sql +1 -0
  1473. package/dist/pam/profile/drizzle/migrations/0005_moaning_rachel_grey.sql +2 -0
  1474. package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
  1475. package/dist/pam/profile/drizzle/migrations/meta/0002_snapshot.json +200 -0
  1476. package/dist/pam/profile/drizzle/migrations/meta/0003_snapshot.json +224 -0
  1477. package/dist/pam/profile/drizzle/migrations/meta/0004_snapshot.json +230 -0
  1478. package/dist/pam/profile/drizzle/migrations/meta/0005_snapshot.json +242 -0
  1479. package/dist/pam/profile/drizzle/migrations/meta/_journal.json +35 -0
  1480. package/dist/pam/profile/migrate.d.ts.map +1 -1
  1481. package/dist/pam/profile/migrate.js +3 -1
  1482. package/dist/pam/profile/migrate.js.map +1 -1
  1483. package/dist/pam/profile/plugin.d.ts +186 -1
  1484. package/dist/pam/profile/plugin.d.ts.map +1 -1
  1485. package/dist/pam/profile/plugin.js +8 -4
  1486. package/dist/pam/profile/plugin.js.map +1 -1
  1487. package/dist/pam/profile/react/profile.d.ts +34 -6
  1488. package/dist/pam/profile/react/profile.d.ts.map +1 -1
  1489. package/dist/pam/profile/react/profile.js +12 -0
  1490. package/dist/pam/profile/react/profile.js.map +1 -1
  1491. package/dist/pam/profile/router/index.d.ts +32 -4
  1492. package/dist/pam/profile/router/index.d.ts.map +1 -1
  1493. package/dist/pam/profile/router/index.js +4 -1
  1494. package/dist/pam/profile/router/index.js.map +1 -1
  1495. package/dist/pam/profile/schema/index.d.ts +193 -6
  1496. package/dist/pam/profile/schema/index.d.ts.map +1 -1
  1497. package/dist/pam/profile/schema/index.js +22 -10
  1498. package/dist/pam/profile/schema/index.js.map +1 -1
  1499. package/dist/pam/profile/service/profile.service.d.ts +55 -8
  1500. package/dist/pam/profile/service/profile.service.d.ts.map +1 -1
  1501. package/dist/pam/profile/service/profile.service.js +128 -23
  1502. package/dist/pam/profile/service/profile.service.js.map +1 -1
  1503. package/dist/pam/react.d.ts +2 -2
  1504. package/dist/pam/react.d.ts.map +1 -1
  1505. package/dist/pam/react.js +2 -2
  1506. package/dist/pam/react.js.map +1 -1
  1507. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts +2 -0
  1508. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts.map +1 -0
  1509. package/dist/pam/shared/__tests__/shared-mappers.test.js +61 -0
  1510. package/dist/pam/shared/__tests__/shared-mappers.test.js.map +1 -0
  1511. package/dist/pam/shared/language.d.ts +3 -1
  1512. package/dist/pam/shared/language.d.ts.map +1 -1
  1513. package/dist/pam/shared/language.js +6 -0
  1514. package/dist/pam/shared/language.js.map +1 -1
  1515. package/dist/pam/shared/otp.d.ts +3 -0
  1516. package/dist/pam/shared/otp.d.ts.map +1 -0
  1517. package/dist/pam/shared/otp.js +11 -0
  1518. package/dist/pam/shared/otp.js.map +1 -0
  1519. package/dist/pam/shared/player-mapper.d.ts +14 -4
  1520. package/dist/pam/shared/player-mapper.d.ts.map +1 -1
  1521. package/dist/pam/shared/player-mapper.js +14 -5
  1522. package/dist/pam/shared/player-mapper.js.map +1 -1
  1523. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts +2 -0
  1524. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts.map +1 -0
  1525. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js +77 -0
  1526. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js.map +1 -0
  1527. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts +2 -0
  1528. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts.map +1 -0
  1529. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js +1024 -0
  1530. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js.map +1 -0
  1531. package/dist/pam/tag/__tests__/tag-mappers.test.js +25 -0
  1532. package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
  1533. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts +2 -0
  1534. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts.map +1 -0
  1535. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js +145 -0
  1536. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js.map +1 -0
  1537. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts +2 -0
  1538. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts.map +1 -0
  1539. package/dist/pam/tag/__tests__/tag.router.int.test.js +222 -0
  1540. package/dist/pam/tag/__tests__/tag.router.int.test.js.map +1 -0
  1541. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts +2 -0
  1542. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts.map +1 -0
  1543. package/dist/pam/tag/__tests__/tag.service.int.test.js +571 -0
  1544. package/dist/pam/tag/__tests__/tag.service.int.test.js.map +1 -0
  1545. package/dist/pam/tag/contract/index.d.ts +139 -1
  1546. package/dist/pam/tag/contract/index.d.ts.map +1 -1
  1547. package/dist/pam/tag/contract/index.js +12 -2
  1548. package/dist/pam/tag/contract/index.js.map +1 -1
  1549. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts +37 -0
  1550. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts.map +1 -0
  1551. package/dist/pam/tag/contract/player-tag-assign-metadata.js +20 -0
  1552. package/dist/pam/tag/contract/player-tag-assign-metadata.js.map +1 -0
  1553. package/dist/pam/tag/drizzle/migrations/0002_silent_skaar.sql +4 -0
  1554. package/dist/pam/tag/drizzle/migrations/0003_overconfident_guardian.sql +3 -0
  1555. package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
  1556. package/dist/pam/tag/drizzle/migrations/meta/0002_snapshot.json +335 -0
  1557. package/dist/pam/tag/drizzle/migrations/meta/0003_snapshot.json +343 -0
  1558. package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
  1559. package/dist/pam/tag/drizzle/migrations/meta/_journal.json +21 -0
  1560. package/dist/pam/tag/migrate.d.ts.map +1 -1
  1561. package/dist/pam/tag/migrate.js +34 -0
  1562. package/dist/pam/tag/migrate.js.map +1 -1
  1563. package/dist/pam/tag/plugin.d.ts +186 -1
  1564. package/dist/pam/tag/plugin.d.ts.map +1 -1
  1565. package/dist/pam/tag/plugin.js +46 -19
  1566. package/dist/pam/tag/plugin.js.map +1 -1
  1567. package/dist/pam/tag/router/index.d.ts +114 -1
  1568. package/dist/pam/tag/router/index.d.ts.map +1 -1
  1569. package/dist/pam/tag/router/index.js +38 -9
  1570. package/dist/pam/tag/router/index.js.map +1 -1
  1571. package/dist/pam/tag/schema/index.d.ts +32 -3
  1572. package/dist/pam/tag/schema/index.d.ts.map +1 -1
  1573. package/dist/pam/tag/schema/index.js +15 -2
  1574. package/dist/pam/tag/schema/index.js.map +1 -1
  1575. package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
  1576. package/dist/pam/tag/seed/data/default-tag-rules.js +42 -0
  1577. package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
  1578. package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
  1579. package/dist/pam/tag/seed/data/default-tags.js +6 -0
  1580. package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
  1581. package/dist/pam/tag/service/tag-evaluation.service.d.ts +147 -17
  1582. package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
  1583. package/dist/pam/tag/service/tag-evaluation.service.js +491 -48
  1584. package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
  1585. package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
  1586. package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
  1587. package/dist/pam/tag/service/tag-mappers.js +1 -0
  1588. package/dist/pam/tag/service/tag-mappers.js.map +1 -1
  1589. package/dist/pam/tag/service/tag-rule.service.d.ts +8 -6
  1590. package/dist/pam/tag/service/tag-rule.service.d.ts.map +1 -1
  1591. package/dist/pam/tag/service/tag-rule.service.js +8 -2
  1592. package/dist/pam/tag/service/tag-rule.service.js.map +1 -1
  1593. package/dist/pam/tag/service/tag.service.d.ts +162 -16
  1594. package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
  1595. package/dist/pam/tag/service/tag.service.js +297 -30
  1596. package/dist/pam/tag/service/tag.service.js.map +1 -1
  1597. package/dist/react/client.d.ts +2 -1
  1598. package/dist/react/client.d.ts.map +1 -1
  1599. package/dist/react/client.js +2 -1
  1600. package/dist/react/client.js.map +1 -1
  1601. package/dist/react/context/__tests__/realtime-client.test.d.ts +2 -0
  1602. package/dist/react/context/__tests__/realtime-client.test.d.ts.map +1 -0
  1603. package/dist/react/context/__tests__/realtime-client.test.js +75 -0
  1604. package/dist/react/context/__tests__/realtime-client.test.js.map +1 -0
  1605. package/dist/react/context/realtime-client.d.ts +15 -0
  1606. package/dist/react/context/realtime-client.d.ts.map +1 -1
  1607. package/dist/react/context/realtime-client.js.map +1 -1
  1608. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts +2 -0
  1609. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts.map +1 -0
  1610. package/dist/react/hooks/__tests__/use-event-stream.test.js +153 -0
  1611. package/dist/react/hooks/__tests__/use-event-stream.test.js.map +1 -0
  1612. package/dist/react/hooks/use-event-stream.d.ts +3 -3
  1613. package/dist/react/hooks/use-event-stream.d.ts.map +1 -1
  1614. package/dist/react/hooks/use-event-stream.js +60 -28
  1615. package/dist/react/hooks/use-event-stream.js.map +1 -1
  1616. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts +2 -0
  1617. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts.map +1 -0
  1618. package/dist/server/auth/__tests__/admin-guard.int.test.js +199 -0
  1619. package/dist/server/auth/__tests__/admin-guard.int.test.js.map +1 -0
  1620. package/dist/server/auth/__tests__/auth.test.d.ts +2 -0
  1621. package/dist/server/auth/__tests__/auth.test.d.ts.map +1 -0
  1622. package/dist/server/auth/__tests__/auth.test.js +178 -0
  1623. package/dist/server/auth/__tests__/auth.test.js.map +1 -0
  1624. package/dist/server/auth/__tests__/permission-levels.test.d.ts +2 -0
  1625. package/dist/server/auth/__tests__/permission-levels.test.d.ts.map +1 -0
  1626. package/dist/server/auth/__tests__/permission-levels.test.js +89 -0
  1627. package/dist/server/auth/__tests__/permission-levels.test.js.map +1 -0
  1628. package/dist/server/auth/__tests__/permissions.test.d.ts +2 -0
  1629. package/dist/server/auth/__tests__/permissions.test.d.ts.map +1 -0
  1630. package/dist/server/auth/__tests__/permissions.test.js +15 -0
  1631. package/dist/server/auth/__tests__/permissions.test.js.map +1 -0
  1632. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts +2 -0
  1633. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts.map +1 -0
  1634. package/dist/server/auth/__tests__/session-resolver.int.test.js +59 -0
  1635. package/dist/server/auth/__tests__/session-resolver.int.test.js.map +1 -0
  1636. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts +2 -0
  1637. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts.map +1 -0
  1638. package/dist/server/auth/__tests__/sign-session-cookie.test.js +59 -0
  1639. package/dist/server/auth/__tests__/sign-session-cookie.test.js.map +1 -0
  1640. package/dist/server/auth/admin-guard.d.ts +13 -10
  1641. package/dist/server/auth/admin-guard.d.ts.map +1 -1
  1642. package/dist/server/auth/admin-guard.js +106 -44
  1643. package/dist/server/auth/admin-guard.js.map +1 -1
  1644. package/dist/server/auth/auth.d.ts +50 -5
  1645. package/dist/server/auth/auth.d.ts.map +1 -1
  1646. package/dist/server/auth/auth.js +113 -19
  1647. package/dist/server/auth/auth.js.map +1 -1
  1648. package/dist/server/auth/index.d.ts +3 -1
  1649. package/dist/server/auth/index.d.ts.map +1 -1
  1650. package/dist/server/auth/index.js +1 -0
  1651. package/dist/server/auth/index.js.map +1 -1
  1652. package/dist/server/auth/permissions.d.ts +169 -38
  1653. package/dist/server/auth/permissions.d.ts.map +1 -1
  1654. package/dist/server/auth/permissions.js +18 -22
  1655. package/dist/server/auth/permissions.js.map +1 -1
  1656. package/dist/server/auth/session-resolver.d.ts +4 -0
  1657. package/dist/server/auth/session-resolver.d.ts.map +1 -1
  1658. package/dist/server/auth/session-resolver.js +9 -2
  1659. package/dist/server/auth/session-resolver.js.map +1 -1
  1660. package/dist/server/auth/sign-session-cookie.d.ts +18 -0
  1661. package/dist/server/auth/sign-session-cookie.d.ts.map +1 -0
  1662. package/dist/server/auth/sign-session-cookie.js +15 -0
  1663. package/dist/server/auth/sign-session-cookie.js.map +1 -0
  1664. package/dist/server/db/__tests__/migrate.test.d.ts +2 -0
  1665. package/dist/server/db/__tests__/migrate.test.d.ts.map +1 -0
  1666. package/dist/server/db/__tests__/migrate.test.js +158 -0
  1667. package/dist/server/db/__tests__/migrate.test.js.map +1 -0
  1668. package/dist/server/db/__tests__/query-helpers.test.js +232 -1
  1669. package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
  1670. package/dist/server/db/__tests__/zod-jsonb.test.d.ts +2 -0
  1671. package/dist/server/db/__tests__/zod-jsonb.test.d.ts.map +1 -0
  1672. package/dist/server/db/__tests__/zod-jsonb.test.js +56 -0
  1673. package/dist/server/db/__tests__/zod-jsonb.test.js.map +1 -0
  1674. package/dist/server/db/drizzle.service.d.ts.map +1 -1
  1675. package/dist/server/db/drizzle.service.js +8 -0
  1676. package/dist/server/db/drizzle.service.js.map +1 -1
  1677. package/dist/server/db/index.d.ts +2 -1
  1678. package/dist/server/db/index.d.ts.map +1 -1
  1679. package/dist/server/db/index.js +2 -1
  1680. package/dist/server/db/index.js.map +1 -1
  1681. package/dist/server/db/migrate.d.ts +38 -0
  1682. package/dist/server/db/migrate.d.ts.map +1 -1
  1683. package/dist/server/db/migrate.js +81 -12
  1684. package/dist/server/db/migrate.js.map +1 -1
  1685. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts +2 -0
  1686. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts.map +1 -0
  1687. package/dist/server/db/outbox/__tests__/relay.int.test.js +183 -0
  1688. package/dist/server/db/outbox/__tests__/relay.int.test.js.map +1 -0
  1689. package/dist/server/db/query-helpers.d.ts +14 -0
  1690. package/dist/server/db/query-helpers.d.ts.map +1 -1
  1691. package/dist/server/db/query-helpers.js +111 -0
  1692. package/dist/server/db/query-helpers.js.map +1 -1
  1693. package/dist/server/db/zod-jsonb.d.ts +52 -0
  1694. package/dist/server/db/zod-jsonb.d.ts.map +1 -0
  1695. package/dist/server/db/zod-jsonb.js +52 -0
  1696. package/dist/server/db/zod-jsonb.js.map +1 -0
  1697. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts +2 -0
  1698. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts.map +1 -0
  1699. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js +240 -0
  1700. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js.map +1 -0
  1701. package/dist/server/kernel/__tests__/cache.int.test.d.ts +2 -0
  1702. package/dist/server/kernel/__tests__/cache.int.test.d.ts.map +1 -0
  1703. package/dist/server/kernel/__tests__/cache.int.test.js +52 -0
  1704. package/dist/server/kernel/__tests__/cache.int.test.js.map +1 -0
  1705. package/dist/server/kernel/__tests__/domain-error.test.d.ts +2 -0
  1706. package/dist/server/kernel/__tests__/domain-error.test.d.ts.map +1 -0
  1707. package/dist/server/kernel/__tests__/domain-error.test.js +35 -0
  1708. package/dist/server/kernel/__tests__/domain-error.test.js.map +1 -0
  1709. package/dist/server/kernel/__tests__/error-reporter.test.d.ts +2 -0
  1710. package/dist/server/kernel/__tests__/error-reporter.test.d.ts.map +1 -0
  1711. package/dist/server/kernel/__tests__/error-reporter.test.js +52 -0
  1712. package/dist/server/kernel/__tests__/error-reporter.test.js.map +1 -0
  1713. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts +2 -0
  1714. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts.map +1 -0
  1715. package/dist/server/kernel/__tests__/event-bus.int.test.js +201 -0
  1716. package/dist/server/kernel/__tests__/event-bus.int.test.js.map +1 -0
  1717. package/dist/server/kernel/__tests__/helpers.test.js +26 -0
  1718. package/dist/server/kernel/__tests__/helpers.test.js.map +1 -1
  1719. package/dist/server/kernel/__tests__/logger.test.d.ts +2 -0
  1720. package/dist/server/kernel/__tests__/logger.test.d.ts.map +1 -0
  1721. package/dist/server/kernel/__tests__/logger.test.js +44 -0
  1722. package/dist/server/kernel/__tests__/logger.test.js.map +1 -0
  1723. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts +2 -0
  1724. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts.map +1 -0
  1725. package/dist/server/kernel/__tests__/orpc-error-map.test.js +54 -0
  1726. package/dist/server/kernel/__tests__/orpc-error-map.test.js.map +1 -0
  1727. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts +2 -0
  1728. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts.map +1 -0
  1729. package/dist/server/kernel/__tests__/platform-config-loader.test.js +112 -0
  1730. package/dist/server/kernel/__tests__/platform-config-loader.test.js.map +1 -0
  1731. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts +2 -0
  1732. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts.map +1 -0
  1733. package/dist/server/kernel/__tests__/rate-limiter.int.test.js +44 -0
  1734. package/dist/server/kernel/__tests__/rate-limiter.int.test.js.map +1 -0
  1735. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts +2 -0
  1736. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts.map +1 -0
  1737. package/dist/server/kernel/__tests__/redis-cache.int.test.js +49 -0
  1738. package/dist/server/kernel/__tests__/redis-cache.int.test.js.map +1 -0
  1739. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts +2 -0
  1740. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts.map +1 -0
  1741. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js +251 -0
  1742. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js.map +1 -0
  1743. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts +2 -0
  1744. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts.map +1 -0
  1745. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js +61 -0
  1746. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js.map +1 -0
  1747. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts +2 -0
  1748. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts.map +1 -0
  1749. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js +190 -0
  1750. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js.map +1 -0
  1751. package/dist/server/kernel/__tests__/request-context.test.d.ts +2 -0
  1752. package/dist/server/kernel/__tests__/request-context.test.d.ts.map +1 -0
  1753. package/dist/server/kernel/__tests__/request-context.test.js +64 -0
  1754. package/dist/server/kernel/__tests__/request-context.test.js.map +1 -0
  1755. package/dist/server/kernel/__tests__/router-utils.test.d.ts +2 -0
  1756. package/dist/server/kernel/__tests__/router-utils.test.d.ts.map +1 -0
  1757. package/dist/server/kernel/__tests__/router-utils.test.js +87 -0
  1758. package/dist/server/kernel/__tests__/router-utils.test.js.map +1 -0
  1759. package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
  1760. package/dist/server/kernel/bullmq-job-queue.js +27 -4
  1761. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  1762. package/dist/server/kernel/cache.d.ts +0 -12
  1763. package/dist/server/kernel/cache.d.ts.map +1 -1
  1764. package/dist/server/kernel/cache.js +0 -55
  1765. package/dist/server/kernel/cache.js.map +1 -1
  1766. package/dist/server/kernel/container.d.ts +7 -6
  1767. package/dist/server/kernel/container.d.ts.map +1 -1
  1768. package/dist/server/kernel/container.js +3 -0
  1769. package/dist/server/kernel/container.js.map +1 -1
  1770. package/dist/server/kernel/domain-error.d.ts +15 -5
  1771. package/dist/server/kernel/domain-error.d.ts.map +1 -1
  1772. package/dist/server/kernel/domain-error.js +4 -2
  1773. package/dist/server/kernel/domain-error.js.map +1 -1
  1774. package/dist/server/kernel/error-reporter.d.ts +5 -0
  1775. package/dist/server/kernel/error-reporter.d.ts.map +1 -0
  1776. package/dist/server/kernel/error-reporter.js +20 -0
  1777. package/dist/server/kernel/error-reporter.js.map +1 -0
  1778. package/dist/server/kernel/event-bus.d.ts +2 -18
  1779. package/dist/server/kernel/event-bus.d.ts.map +1 -1
  1780. package/dist/server/kernel/event-bus.js +28 -44
  1781. package/dist/server/kernel/event-bus.js.map +1 -1
  1782. package/dist/server/kernel/event-stream.d.ts.map +1 -1
  1783. package/dist/server/kernel/event-stream.js +19 -4
  1784. package/dist/server/kernel/event-stream.js.map +1 -1
  1785. package/dist/server/kernel/index.d.ts +10 -8
  1786. package/dist/server/kernel/index.d.ts.map +1 -1
  1787. package/dist/server/kernel/index.js +8 -7
  1788. package/dist/server/kernel/index.js.map +1 -1
  1789. package/dist/server/kernel/logger.d.ts.map +1 -1
  1790. package/dist/server/kernel/logger.js +51 -2
  1791. package/dist/server/kernel/logger.js.map +1 -1
  1792. package/dist/server/kernel/orpc-error-map.d.ts.map +1 -1
  1793. package/dist/server/kernel/orpc-error-map.js +4 -1
  1794. package/dist/server/kernel/orpc-error-map.js.map +1 -1
  1795. package/dist/server/kernel/rate-limiter.d.ts +2 -10
  1796. package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
  1797. package/dist/server/kernel/rate-limiter.js +0 -34
  1798. package/dist/server/kernel/rate-limiter.js.map +1 -1
  1799. package/dist/server/kernel/realtime-authorizer.d.ts +2 -4
  1800. package/dist/server/kernel/realtime-authorizer.d.ts.map +1 -1
  1801. package/dist/server/kernel/realtime-authorizer.js +3 -2
  1802. package/dist/server/kernel/realtime-authorizer.js.map +1 -1
  1803. package/dist/server/kernel/redis-cache.d.ts +3 -0
  1804. package/dist/server/kernel/redis-cache.d.ts.map +1 -1
  1805. package/dist/server/kernel/redis-cache.js +10 -0
  1806. package/dist/server/kernel/redis-cache.js.map +1 -1
  1807. package/dist/server/kernel/redis-client.d.ts.map +1 -1
  1808. package/dist/server/kernel/redis-client.js +5 -1
  1809. package/dist/server/kernel/redis-client.js.map +1 -1
  1810. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts +51 -0
  1811. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts.map +1 -0
  1812. package/dist/server/kernel/redis-pubsub-realtime-transport.js +0 -0
  1813. package/dist/server/kernel/redis-pubsub-realtime-transport.js.map +1 -0
  1814. package/dist/server/kernel/redis-rate-limiter.d.ts +1 -0
  1815. package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
  1816. package/dist/server/kernel/redis-rate-limiter.js +11 -0
  1817. package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
  1818. package/dist/server/kernel/redis-streams-broker.d.ts +65 -0
  1819. package/dist/server/kernel/redis-streams-broker.d.ts.map +1 -0
  1820. package/dist/server/kernel/redis-streams-broker.js +203 -0
  1821. package/dist/server/kernel/redis-streams-broker.js.map +1 -0
  1822. package/dist/server/kernel/request-context.d.ts +4 -0
  1823. package/dist/server/kernel/request-context.d.ts.map +1 -1
  1824. package/dist/server/kernel/request-context.js +4 -0
  1825. package/dist/server/kernel/request-context.js.map +1 -1
  1826. package/dist/server/kernel/router-utils.d.ts +7 -0
  1827. package/dist/server/kernel/router-utils.d.ts.map +1 -1
  1828. package/dist/server/kernel/router-utils.js +31 -2
  1829. package/dist/server/kernel/router-utils.js.map +1 -1
  1830. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts +2 -0
  1831. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts.map +1 -0
  1832. package/dist/server/plugin-host/__tests__/core-plugins.test.js +27 -0
  1833. package/dist/server/plugin-host/__tests__/core-plugins.test.js.map +1 -0
  1834. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts +2 -0
  1835. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts.map +1 -0
  1836. package/dist/server/plugin-host/__tests__/load-plugins.test.js +31 -0
  1837. package/dist/server/plugin-host/__tests__/load-plugins.test.js.map +1 -0
  1838. package/dist/server/plugin-host/__tests__/module-registry.test.js.map +1 -1
  1839. package/dist/server/plugin-host/__tests__/required-ports.test.js +1 -0
  1840. package/dist/server/plugin-host/__tests__/required-ports.test.js.map +1 -1
  1841. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts +2 -0
  1842. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts.map +1 -0
  1843. package/dist/server/plugin-host/__tests__/typed-plugin.test.js +82 -0
  1844. package/dist/server/plugin-host/__tests__/typed-plugin.test.js.map +1 -0
  1845. package/dist/server/plugin-host/core-plugins.d.ts +16 -0
  1846. package/dist/server/plugin-host/core-plugins.d.ts.map +1 -0
  1847. package/dist/server/plugin-host/core-plugins.js +42 -0
  1848. package/dist/server/plugin-host/core-plugins.js.map +1 -0
  1849. package/dist/server/plugin-host/define-plugin.d.ts +24 -24
  1850. package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
  1851. package/dist/server/plugin-host/define-plugin.js +1 -3
  1852. package/dist/server/plugin-host/define-plugin.js.map +1 -1
  1853. package/dist/server/plugin-host/index.d.ts +3 -3
  1854. package/dist/server/plugin-host/index.d.ts.map +1 -1
  1855. package/dist/server/plugin-host/index.js +2 -2
  1856. package/dist/server/plugin-host/index.js.map +1 -1
  1857. package/dist/server/plugin-host/load-extensions.d.ts +2 -2
  1858. package/dist/server/plugin-host/load-extensions.js +2 -2
  1859. package/dist/server/plugin-host/load-plugins.d.ts +7 -3
  1860. package/dist/server/plugin-host/load-plugins.d.ts.map +1 -1
  1861. package/dist/server/plugin-host/load-plugins.js +10 -2
  1862. package/dist/server/plugin-host/load-plugins.js.map +1 -1
  1863. package/dist/server/plugin-host/module-registry.d.ts +9 -14
  1864. package/dist/server/plugin-host/module-registry.d.ts.map +1 -1
  1865. package/dist/server/plugin-host/module-registry.js +2 -9
  1866. package/dist/server/plugin-host/module-registry.js.map +1 -1
  1867. package/dist/server/runtime/__tests__/create-app.test.d.ts +2 -0
  1868. package/dist/server/runtime/__tests__/create-app.test.d.ts.map +1 -0
  1869. package/dist/server/runtime/__tests__/create-app.test.js +158 -0
  1870. package/dist/server/runtime/__tests__/create-app.test.js.map +1 -0
  1871. package/dist/server/runtime/assert-durable-seams.d.ts +19 -0
  1872. package/dist/server/runtime/assert-durable-seams.d.ts.map +1 -0
  1873. package/dist/server/runtime/assert-durable-seams.js +37 -0
  1874. package/dist/server/runtime/assert-durable-seams.js.map +1 -0
  1875. package/dist/server/runtime/core-token-catalog.d.ts +185 -0
  1876. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -0
  1877. package/dist/server/runtime/core-token-catalog.js +74 -0
  1878. package/dist/server/runtime/core-token-catalog.js.map +1 -0
  1879. package/dist/server/runtime/create-app.d.ts +20 -23
  1880. package/dist/server/runtime/create-app.d.ts.map +1 -1
  1881. package/dist/server/runtime/create-app.js +164 -91
  1882. package/dist/server/runtime/create-app.js.map +1 -1
  1883. package/dist/server/runtime/index.d.ts +3 -4
  1884. package/dist/server/runtime/index.d.ts.map +1 -1
  1885. package/dist/server/runtime/index.js +1 -3
  1886. package/dist/server/runtime/index.js.map +1 -1
  1887. package/dist/testing/global-setup.d.ts +15 -0
  1888. package/dist/testing/global-setup.d.ts.map +1 -0
  1889. package/dist/testing/global-setup.js +33 -0
  1890. package/dist/testing/global-setup.js.map +1 -0
  1891. package/dist/testing/index.d.ts +6 -0
  1892. package/dist/testing/index.d.ts.map +1 -0
  1893. package/dist/testing/index.js +6 -0
  1894. package/dist/testing/index.js.map +1 -0
  1895. package/dist/testing/mock.d.ts +58 -15
  1896. package/dist/testing/mock.d.ts.map +1 -1
  1897. package/dist/testing/mock.js +163 -39
  1898. package/dist/testing/mock.js.map +1 -1
  1899. package/dist/testing/real-infra.d.ts +68 -0
  1900. package/dist/testing/real-infra.d.ts.map +1 -0
  1901. package/dist/testing/real-infra.js +151 -0
  1902. package/dist/testing/real-infra.js.map +1 -0
  1903. package/dist/testing/realtime-transport-conformance.d.ts +35 -0
  1904. package/dist/testing/realtime-transport-conformance.d.ts.map +1 -0
  1905. package/dist/testing/realtime-transport-conformance.js +94 -0
  1906. package/dist/testing/realtime-transport-conformance.js.map +1 -0
  1907. package/dist/testing/seed-player.d.ts +119 -0
  1908. package/dist/testing/seed-player.d.ts.map +1 -0
  1909. package/dist/testing/seed-player.js +43 -0
  1910. package/dist/testing/seed-player.js.map +1 -0
  1911. package/dist/testing/seed-wallet.d.ts +9 -0
  1912. package/dist/testing/seed-wallet.d.ts.map +1 -0
  1913. package/dist/testing/seed-wallet.js +27 -0
  1914. package/dist/testing/seed-wallet.js.map +1 -0
  1915. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts +2 -0
  1916. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts.map +1 -0
  1917. package/dist/wallet/__tests__/admin-reporting.int.test.js +236 -0
  1918. package/dist/wallet/__tests__/admin-reporting.int.test.js.map +1 -0
  1919. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts +2 -0
  1920. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts.map +1 -0
  1921. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js +163 -0
  1922. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js.map +1 -0
  1923. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts +2 -0
  1924. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts.map +1 -0
  1925. package/dist/wallet/__tests__/bonus-rollover.int.test.js +444 -0
  1926. package/dist/wallet/__tests__/bonus-rollover.int.test.js.map +1 -0
  1927. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
  1928. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
  1929. package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
  1930. package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
  1931. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
  1932. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
  1933. package/dist/wallet/__tests__/custody-sweep.service.int.test.js +274 -0
  1934. package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
  1935. package/dist/wallet/__tests__/deposit-gate.test.d.ts +2 -0
  1936. package/dist/wallet/__tests__/deposit-gate.test.d.ts.map +1 -0
  1937. package/dist/wallet/__tests__/deposit-gate.test.js +46 -0
  1938. package/dist/wallet/__tests__/deposit-gate.test.js.map +1 -0
  1939. package/dist/wallet/__tests__/rail-for.test.d.ts +2 -0
  1940. package/dist/wallet/__tests__/rail-for.test.d.ts.map +1 -0
  1941. package/dist/wallet/__tests__/rail-for.test.js +29 -0
  1942. package/dist/wallet/__tests__/rail-for.test.js.map +1 -0
  1943. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts +2 -0
  1944. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts.map +1 -0
  1945. package/dist/wallet/__tests__/reconciliation-diff.test.js +49 -0
  1946. package/dist/wallet/__tests__/reconciliation-diff.test.js.map +1 -0
  1947. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts +2 -0
  1948. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts.map +1 -0
  1949. package/dist/wallet/__tests__/reconciliation.service.int.test.js +618 -0
  1950. package/dist/wallet/__tests__/reconciliation.service.int.test.js.map +1 -0
  1951. package/dist/wallet/__tests__/settlement-network.test.d.ts +2 -0
  1952. package/dist/wallet/__tests__/settlement-network.test.d.ts.map +1 -0
  1953. package/dist/wallet/__tests__/settlement-network.test.js +54 -0
  1954. package/dist/wallet/__tests__/settlement-network.test.js.map +1 -0
  1955. package/dist/wallet/__tests__/swap.service.int.test.d.ts +2 -0
  1956. package/dist/wallet/__tests__/swap.service.int.test.d.ts.map +1 -0
  1957. package/dist/wallet/__tests__/swap.service.int.test.js +398 -0
  1958. package/dist/wallet/__tests__/swap.service.int.test.js.map +1 -0
  1959. package/dist/wallet/__tests__/wallet-address-format.test.d.ts +2 -0
  1960. package/dist/wallet/__tests__/wallet-address-format.test.d.ts.map +1 -0
  1961. package/dist/wallet/__tests__/wallet-address-format.test.js +102 -0
  1962. package/dist/wallet/__tests__/wallet-address-format.test.js.map +1 -0
  1963. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts +2 -0
  1964. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts.map +1 -0
  1965. package/dist/wallet/__tests__/wallet-asset.router.int.test.js +263 -0
  1966. package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -0
  1967. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts +2 -0
  1968. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts.map +1 -0
  1969. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +137 -0
  1970. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -0
  1971. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts +2 -0
  1972. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts.map +1 -0
  1973. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +205 -0
  1974. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -0
  1975. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts +2 -0
  1976. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts.map +1 -0
  1977. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +900 -0
  1978. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -0
  1979. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts +2 -0
  1980. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts.map +1 -0
  1981. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js +38 -0
  1982. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js.map +1 -0
  1983. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts +2 -0
  1984. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts.map +1 -0
  1985. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js +114 -0
  1986. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js.map +1 -0
  1987. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts +2 -0
  1988. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts.map +1 -0
  1989. package/dist/wallet/__tests__/wallet-commands.service.int.test.js +419 -0
  1990. package/dist/wallet/__tests__/wallet-commands.service.int.test.js.map +1 -0
  1991. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts +2 -0
  1992. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts.map +1 -0
  1993. package/dist/wallet/__tests__/wallet-currency-code.test.js +48 -0
  1994. package/dist/wallet/__tests__/wallet-currency-code.test.js.map +1 -0
  1995. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts +2 -0
  1996. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts.map +1 -0
  1997. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js +129 -0
  1998. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js.map +1 -0
  1999. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts +2 -0
  2000. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts.map +1 -0
  2001. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js +104 -0
  2002. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js.map +1 -0
  2003. package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts +2 -0
  2004. package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts.map +1 -0
  2005. package/dist/wallet/__tests__/wallet-reader.service.int.test.js +111 -0
  2006. package/dist/wallet/__tests__/wallet-reader.service.int.test.js.map +1 -0
  2007. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts +2 -0
  2008. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts.map +1 -0
  2009. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js +93 -0
  2010. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js.map +1 -0
  2011. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts +2 -0
  2012. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts.map +1 -0
  2013. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js +37 -0
  2014. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js.map +1 -0
  2015. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts +2 -0
  2016. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts.map +1 -0
  2017. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +311 -0
  2018. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -0
  2019. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts +2 -0
  2020. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts.map +1 -0
  2021. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js +64 -0
  2022. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js.map +1 -0
  2023. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts +2 -0
  2024. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts.map +1 -0
  2025. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js +179 -0
  2026. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js.map +1 -0
  2027. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts +2 -0
  2028. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts.map +1 -0
  2029. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js +117 -0
  2030. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js.map +1 -0
  2031. package/dist/wallet/__tests__/wallet.router.int.test.d.ts +2 -0
  2032. package/dist/wallet/__tests__/wallet.router.int.test.d.ts.map +1 -0
  2033. package/dist/wallet/__tests__/wallet.router.int.test.js +104 -0
  2034. package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -0
  2035. package/dist/wallet/__tests__/wallet.service.int.test.d.ts +2 -0
  2036. package/dist/wallet/__tests__/wallet.service.int.test.d.ts.map +1 -0
  2037. package/dist/wallet/__tests__/wallet.service.int.test.js +1684 -0
  2038. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -0
  2039. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts +14 -0
  2040. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts.map +1 -0
  2041. package/dist/wallet/adapters/wallet-asset-catalog.service.js +37 -0
  2042. package/dist/wallet/adapters/wallet-asset-catalog.service.js.map +1 -0
  2043. package/dist/wallet/adapters/wallet-reader.service.d.ts +8 -1
  2044. package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
  2045. package/dist/wallet/adapters/wallet-reader.service.js +52 -1
  2046. package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
  2047. package/dist/wallet/admin-reporting.d.ts +3 -3
  2048. package/dist/wallet/admin-reporting.d.ts.map +1 -1
  2049. package/dist/wallet/admin-reporting.js +11 -3
  2050. package/dist/wallet/admin-reporting.js.map +1 -1
  2051. package/dist/wallet/contract/index.d.ts +1018 -19
  2052. package/dist/wallet/contract/index.d.ts.map +1 -1
  2053. package/dist/wallet/contract/index.js +513 -15
  2054. package/dist/wallet/contract/index.js.map +1 -1
  2055. package/dist/wallet/drizzle/migrations/0003_certain_ogun.sql +2 -0
  2056. package/dist/wallet/drizzle/migrations/0004_reflective_shriek.sql +2 -0
  2057. package/dist/wallet/drizzle/migrations/0005_gigantic_dust.sql +10 -0
  2058. package/dist/wallet/drizzle/migrations/0006_lush_morg.sql +1 -0
  2059. package/dist/wallet/drizzle/migrations/0007_bouncy_swordsman.sql +17 -0
  2060. package/dist/wallet/drizzle/migrations/0008_gorgeous_colonel_america.sql +1 -0
  2061. package/dist/wallet/drizzle/migrations/0009_smooth_sue_storm.sql +17 -0
  2062. package/dist/wallet/drizzle/migrations/0010_worthless_quasimodo.sql +84 -0
  2063. package/dist/wallet/drizzle/migrations/0011_premium_natasha_romanoff.sql +30 -0
  2064. package/dist/wallet/drizzle/migrations/0012_long_wong.sql +15 -0
  2065. package/dist/wallet/drizzle/migrations/0013_polite_peter_parker.sql +1 -0
  2066. package/dist/wallet/drizzle/migrations/0014_abandoned_madripoor.sql +20 -0
  2067. package/dist/wallet/drizzle/migrations/0015_right_oracle.sql +3 -0
  2068. package/dist/wallet/drizzle/migrations/0016_curly_ben_urich.sql +2 -0
  2069. package/dist/wallet/drizzle/migrations/0017_workable_wolf_cub.sql +2 -0
  2070. package/dist/wallet/drizzle/migrations/0018_marvelous_demogoblin.sql +3 -0
  2071. package/dist/wallet/drizzle/migrations/0019_awesome_drax.sql +2 -0
  2072. package/dist/wallet/drizzle/migrations/0020_salty_infant_terrible.sql +1 -0
  2073. package/dist/wallet/drizzle/migrations/0021_mean_chameleon.sql +3 -0
  2074. package/dist/wallet/drizzle/migrations/0022_natural_exodus.sql +1 -0
  2075. package/dist/wallet/drizzle/migrations/meta/0003_snapshot.json +567 -0
  2076. package/dist/wallet/drizzle/migrations/meta/0004_snapshot.json +631 -0
  2077. package/dist/wallet/drizzle/migrations/meta/0006_snapshot.json +638 -0
  2078. package/dist/wallet/drizzle/migrations/meta/0007_snapshot.json +723 -0
  2079. package/dist/wallet/drizzle/migrations/meta/0008_snapshot.json +716 -0
  2080. package/dist/wallet/drizzle/migrations/meta/0009_snapshot.json +895 -0
  2081. package/dist/wallet/drizzle/migrations/meta/0010_snapshot.json +1565 -0
  2082. package/dist/wallet/drizzle/migrations/meta/0011_snapshot.json +1777 -0
  2083. package/dist/wallet/drizzle/migrations/meta/0012_snapshot.json +1907 -0
  2084. package/dist/wallet/drizzle/migrations/meta/0013_snapshot.json +1913 -0
  2085. package/dist/wallet/drizzle/migrations/meta/0014_snapshot.json +1925 -0
  2086. package/dist/wallet/drizzle/migrations/meta/0015_snapshot.json +1937 -0
  2087. package/dist/wallet/drizzle/migrations/meta/0016_snapshot.json +1943 -0
  2088. package/dist/wallet/drizzle/migrations/meta/0017_snapshot.json +1945 -0
  2089. package/dist/wallet/drizzle/migrations/meta/0018_snapshot.json +1967 -0
  2090. package/dist/wallet/drizzle/migrations/meta/0019_snapshot.json +1973 -0
  2091. package/dist/wallet/drizzle/migrations/meta/0020_snapshot.json +1979 -0
  2092. package/dist/wallet/drizzle/migrations/meta/0021_snapshot.json +1986 -0
  2093. package/dist/wallet/drizzle/migrations/meta/0022_snapshot.json +1987 -0
  2094. package/dist/wallet/drizzle/migrations/meta/_journal.json +140 -0
  2095. package/dist/wallet/index.d.ts.map +1 -1
  2096. package/dist/wallet/index.js +0 -2
  2097. package/dist/wallet/index.js.map +1 -1
  2098. package/dist/wallet/migrate.d.ts +0 -1
  2099. package/dist/wallet/migrate.d.ts.map +1 -1
  2100. package/dist/wallet/migrate.js +0 -4
  2101. package/dist/wallet/migrate.js.map +1 -1
  2102. package/dist/wallet/plugin.d.ts +187 -1
  2103. package/dist/wallet/plugin.d.ts.map +1 -1
  2104. package/dist/wallet/plugin.js +223 -19
  2105. package/dist/wallet/plugin.js.map +1 -1
  2106. package/dist/wallet/router/index.d.ts +557 -12
  2107. package/dist/wallet/router/index.d.ts.map +1 -1
  2108. package/dist/wallet/router/index.js +270 -36
  2109. package/dist/wallet/router/index.js.map +1 -1
  2110. package/dist/wallet/schema/index.d.ts +1990 -9
  2111. package/dist/wallet/schema/index.d.ts.map +1 -1
  2112. package/dist/wallet/schema/index.js +290 -7
  2113. package/dist/wallet/schema/index.js.map +1 -1
  2114. package/dist/wallet/seed/index.d.ts +3 -0
  2115. package/dist/wallet/seed/index.d.ts.map +1 -0
  2116. package/dist/wallet/seed/index.js +3 -0
  2117. package/dist/wallet/seed/index.js.map +1 -0
  2118. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts +11 -0
  2119. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts.map +1 -0
  2120. package/dist/wallet/seed/seed-auto-withdrawal-config.js +16 -0
  2121. package/dist/wallet/seed/seed-auto-withdrawal-config.js.map +1 -0
  2122. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts +3 -0
  2123. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts.map +1 -0
  2124. package/dist/wallet/seed/seed-bonus-rollover-config.js +8 -0
  2125. package/dist/wallet/seed/seed-bonus-rollover-config.js.map +1 -0
  2126. package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
  2127. package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
  2128. package/dist/wallet/service/custody-sweep.service.js +388 -0
  2129. package/dist/wallet/service/custody-sweep.service.js.map +1 -0
  2130. package/dist/wallet/service/reconciliation-finding.service.d.ts +68 -0
  2131. package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
  2132. package/dist/wallet/service/reconciliation-finding.service.js +82 -0
  2133. package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
  2134. package/dist/wallet/service/reconciliation.service.d.ts +143 -0
  2135. package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
  2136. package/dist/wallet/service/reconciliation.service.js +685 -0
  2137. package/dist/wallet/service/reconciliation.service.js.map +1 -0
  2138. package/dist/wallet/service/swap.service.d.ts +78 -0
  2139. package/dist/wallet/service/swap.service.d.ts.map +1 -0
  2140. package/dist/wallet/service/swap.service.js +336 -0
  2141. package/dist/wallet/service/swap.service.js.map +1 -0
  2142. package/dist/wallet/service/wallet-commands.service.d.ts +19 -4
  2143. package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
  2144. package/dist/wallet/service/wallet-commands.service.js +238 -31
  2145. package/dist/wallet/service/wallet-commands.service.js.map +1 -1
  2146. package/dist/wallet/service/wallet.service.d.ts +679 -30
  2147. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  2148. package/dist/wallet/service/wallet.service.js +1368 -158
  2149. package/dist/wallet/service/wallet.service.js.map +1 -1
  2150. package/generators/src/config.ts +547 -0
  2151. package/generators/src/templates/adapter.hbs +19 -0
  2152. package/generators/src/templates/contract.hbs +19 -0
  2153. package/generators/src/templates/job-worker.hbs +34 -0
  2154. package/generators/src/templates/module/drizzle.config.hbs +22 -0
  2155. package/generators/src/templates/module/index.hbs +5 -0
  2156. package/generators/src/templates/module/migrate.hbs +17 -0
  2157. package/generators/src/templates/module/plugin.hbs +19 -0
  2158. package/generators/src/templates/module/router.hbs +19 -0
  2159. package/generators/src/templates/module/schema.hbs +14 -0
  2160. package/generators/src/templates/module/service.hbs +26 -0
  2161. package/generators/src/templates/plugin.hbs +20 -0
  2162. package/package.json +169 -12
  2163. package/dist/admin-console/__tests__/backoffice.service.test.d.ts +0 -2
  2164. package/dist/admin-console/__tests__/backoffice.service.test.d.ts.map +0 -1
  2165. package/dist/admin-console/__tests__/backoffice.service.test.js +0 -156
  2166. package/dist/admin-console/__tests__/backoffice.service.test.js.map +0 -1
  2167. package/dist/audit/__tests__/audit.service.test.d.ts +0 -2
  2168. package/dist/audit/__tests__/audit.service.test.d.ts.map +0 -1
  2169. package/dist/audit/__tests__/audit.service.test.js +0 -442
  2170. package/dist/audit/__tests__/audit.service.test.js.map +0 -1
  2171. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts +0 -2
  2172. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts.map +0 -1
  2173. package/dist/casino/gaming/__tests__/gaming.service.test.js +0 -55
  2174. package/dist/casino/gaming/__tests__/gaming.service.test.js.map +0 -1
  2175. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts +0 -2
  2176. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts.map +0 -1
  2177. package/dist/casino/lobby/__tests__/lobby.cache.test.js +0 -47
  2178. package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +0 -1
  2179. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts +0 -2
  2180. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts.map +0 -1
  2181. package/dist/casino/lobby/__tests__/lobby.service.test.js +0 -11
  2182. package/dist/casino/lobby/__tests__/lobby.service.test.js.map +0 -1
  2183. package/dist/cms/__tests__/cms.cache.test.d.ts +0 -2
  2184. package/dist/cms/__tests__/cms.cache.test.d.ts.map +0 -1
  2185. package/dist/cms/__tests__/cms.cache.test.js +0 -87
  2186. package/dist/cms/__tests__/cms.cache.test.js.map +0 -1
  2187. package/dist/cms/__tests__/cms.router.test.d.ts +0 -2
  2188. package/dist/cms/__tests__/cms.router.test.d.ts.map +0 -1
  2189. package/dist/cms/__tests__/cms.router.test.js +0 -51
  2190. package/dist/cms/__tests__/cms.router.test.js.map +0 -1
  2191. package/dist/cms/__tests__/cms.service.test.d.ts +0 -2
  2192. package/dist/cms/__tests__/cms.service.test.d.ts.map +0 -1
  2193. package/dist/cms/__tests__/cms.service.test.js +0 -17
  2194. package/dist/cms/__tests__/cms.service.test.js.map +0 -1
  2195. package/dist/compliance/__tests__/compliance.service.test.d.ts +0 -2
  2196. package/dist/compliance/__tests__/compliance.service.test.d.ts.map +0 -1
  2197. package/dist/compliance/__tests__/compliance.service.test.js +0 -96
  2198. package/dist/compliance/__tests__/compliance.service.test.js.map +0 -1
  2199. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts +0 -2
  2200. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts.map +0 -1
  2201. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +0 -25
  2202. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +0 -1
  2203. package/dist/compliance/__tests__/kyc.service.test.d.ts +0 -2
  2204. package/dist/compliance/__tests__/kyc.service.test.d.ts.map +0 -1
  2205. package/dist/compliance/__tests__/kyc.service.test.js +0 -177
  2206. package/dist/compliance/__tests__/kyc.service.test.js.map +0 -1
  2207. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts +0 -2
  2208. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts.map +0 -1
  2209. package/dist/compliance/__tests__/rg-monitoring.service.test.js +0 -110
  2210. package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +0 -1
  2211. package/dist/compliance/__tests__/rg.router.test.d.ts +0 -2
  2212. package/dist/compliance/__tests__/rg.router.test.d.ts.map +0 -1
  2213. package/dist/compliance/__tests__/rg.router.test.js +0 -66
  2214. package/dist/compliance/__tests__/rg.router.test.js.map +0 -1
  2215. package/dist/compliance/__tests__/rg.service.test.d.ts +0 -2
  2216. package/dist/compliance/__tests__/rg.service.test.d.ts.map +0 -1
  2217. package/dist/compliance/__tests__/rg.service.test.js +0 -212
  2218. package/dist/compliance/__tests__/rg.service.test.js.map +0 -1
  2219. package/dist/contracts/adapters/email.d.ts +0 -10
  2220. package/dist/contracts/adapters/email.d.ts.map +0 -1
  2221. package/dist/contracts/adapters/email.js +0 -8
  2222. package/dist/contracts/adapters/email.js.map +0 -1
  2223. package/dist/contracts/adapters/notification.d.ts +0 -6
  2224. package/dist/contracts/adapters/notification.d.ts.map +0 -1
  2225. package/dist/contracts/adapters/notification.js +0 -8
  2226. package/dist/contracts/adapters/notification.js.map +0 -1
  2227. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts +0 -2
  2228. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts.map +0 -1
  2229. package/dist/contracts/schemas/__tests__/identity-schemas.test.js +0 -38
  2230. package/dist/contracts/schemas/__tests__/identity-schemas.test.js.map +0 -1
  2231. package/dist/engagement/chat/__tests__/chat.service.test.d.ts +0 -2
  2232. package/dist/engagement/chat/__tests__/chat.service.test.d.ts.map +0 -1
  2233. package/dist/engagement/chat/__tests__/chat.service.test.js +0 -170
  2234. package/dist/engagement/chat/__tests__/chat.service.test.js.map +0 -1
  2235. package/dist/engagement/chat/react/use-chat-stream.d.ts +0 -26
  2236. package/dist/engagement/chat/react/use-chat-stream.d.ts.map +0 -1
  2237. package/dist/engagement/chat/react/use-chat-stream.js +0 -54
  2238. package/dist/engagement/chat/react/use-chat-stream.js.map +0 -1
  2239. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts +0 -2
  2240. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts.map +0 -1
  2241. package/dist/engagement/notifications/__tests__/notifications.service.test.js +0 -84
  2242. package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +0 -1
  2243. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts +0 -5
  2244. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts.map +0 -1
  2245. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js +0 -6
  2246. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js.map +0 -1
  2247. package/dist/iam/__tests__/iam.service.test.d.ts +0 -2
  2248. package/dist/iam/__tests__/iam.service.test.d.ts.map +0 -1
  2249. package/dist/iam/__tests__/iam.service.test.js +0 -744
  2250. package/dist/iam/__tests__/iam.service.test.js.map +0 -1
  2251. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts +0 -2
  2252. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts.map +0 -1
  2253. package/dist/pam/identity/__tests__/admin-user-directory.test.js +0 -93
  2254. package/dist/pam/identity/__tests__/admin-user-directory.test.js.map +0 -1
  2255. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts +0 -2
  2256. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts.map +0 -1
  2257. package/dist/pam/identity/__tests__/identity.rate-limit.test.js +0 -127
  2258. package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +0 -1
  2259. package/dist/pam/identity/__tests__/identity.service.test.d.ts +0 -2
  2260. package/dist/pam/identity/__tests__/identity.service.test.d.ts.map +0 -1
  2261. package/dist/pam/identity/__tests__/identity.service.test.js +0 -297
  2262. package/dist/pam/identity/__tests__/identity.service.test.js.map +0 -1
  2263. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts +0 -2
  2264. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts.map +0 -1
  2265. package/dist/pam/identity/__tests__/login-enforcement.service.test.js +0 -41
  2266. package/dist/pam/identity/__tests__/login-enforcement.service.test.js.map +0 -1
  2267. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts +0 -2
  2268. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts.map +0 -1
  2269. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +0 -38
  2270. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +0 -1
  2271. package/dist/pam/player-management/__tests__/player.router.test.d.ts +0 -2
  2272. package/dist/pam/player-management/__tests__/player.router.test.d.ts.map +0 -1
  2273. package/dist/pam/player-management/__tests__/player.router.test.js +0 -57
  2274. package/dist/pam/player-management/__tests__/player.router.test.js.map +0 -1
  2275. package/dist/pam/player-management/__tests__/player.service.test.d.ts +0 -2
  2276. package/dist/pam/player-management/__tests__/player.service.test.d.ts.map +0 -1
  2277. package/dist/pam/player-management/__tests__/player.service.test.js +0 -144
  2278. package/dist/pam/player-management/__tests__/player.service.test.js.map +0 -1
  2279. package/dist/pam/profile/__tests__/profile.service.test.d.ts +0 -2
  2280. package/dist/pam/profile/__tests__/profile.service.test.d.ts.map +0 -1
  2281. package/dist/pam/profile/__tests__/profile.service.test.js +0 -48
  2282. package/dist/pam/profile/__tests__/profile.service.test.js.map +0 -1
  2283. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts +0 -2
  2284. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts.map +0 -1
  2285. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +0 -38
  2286. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +0 -1
  2287. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts +0 -2
  2288. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts.map +0 -1
  2289. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +0 -269
  2290. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +0 -1
  2291. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts +0 -2
  2292. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts.map +0 -1
  2293. package/dist/pam/tag/__tests__/tag-rule.service.test.js +0 -149
  2294. package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +0 -1
  2295. package/dist/pam/tag/__tests__/tag.router.test.d.ts +0 -2
  2296. package/dist/pam/tag/__tests__/tag.router.test.d.ts.map +0 -1
  2297. package/dist/pam/tag/__tests__/tag.router.test.js +0 -38
  2298. package/dist/pam/tag/__tests__/tag.router.test.js.map +0 -1
  2299. package/dist/pam/tag/__tests__/tag.service.test.d.ts +0 -2
  2300. package/dist/pam/tag/__tests__/tag.service.test.d.ts.map +0 -1
  2301. package/dist/pam/tag/__tests__/tag.service.test.js +0 -262
  2302. package/dist/pam/tag/__tests__/tag.service.test.js.map +0 -1
  2303. package/dist/server/auth/__tests__/admin-guard.test.d.ts +0 -2
  2304. package/dist/server/auth/__tests__/admin-guard.test.d.ts.map +0 -1
  2305. package/dist/server/auth/__tests__/admin-guard.test.js +0 -133
  2306. package/dist/server/auth/__tests__/admin-guard.test.js.map +0 -1
  2307. package/dist/server/auth/__tests__/session-resolver.test.d.ts +0 -2
  2308. package/dist/server/auth/__tests__/session-resolver.test.d.ts.map +0 -1
  2309. package/dist/server/auth/__tests__/session-resolver.test.js +0 -27
  2310. package/dist/server/auth/__tests__/session-resolver.test.js.map +0 -1
  2311. package/dist/server/db/outbox/__tests__/relay.test.d.ts +0 -2
  2312. package/dist/server/db/outbox/__tests__/relay.test.d.ts.map +0 -1
  2313. package/dist/server/db/outbox/__tests__/relay.test.js +0 -124
  2314. package/dist/server/db/outbox/__tests__/relay.test.js.map +0 -1
  2315. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts +0 -2
  2316. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts.map +0 -1
  2317. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js +0 -190
  2318. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js.map +0 -1
  2319. package/dist/server/kernel/__tests__/cache.test.d.ts +0 -2
  2320. package/dist/server/kernel/__tests__/cache.test.d.ts.map +0 -1
  2321. package/dist/server/kernel/__tests__/cache.test.js +0 -84
  2322. package/dist/server/kernel/__tests__/cache.test.js.map +0 -1
  2323. package/dist/server/kernel/__tests__/event-bus.test.d.ts +0 -2
  2324. package/dist/server/kernel/__tests__/event-bus.test.d.ts.map +0 -1
  2325. package/dist/server/kernel/__tests__/event-bus.test.js +0 -116
  2326. package/dist/server/kernel/__tests__/event-bus.test.js.map +0 -1
  2327. package/dist/server/kernel/__tests__/job-queue.test.d.ts +0 -2
  2328. package/dist/server/kernel/__tests__/job-queue.test.d.ts.map +0 -1
  2329. package/dist/server/kernel/__tests__/job-queue.test.js +0 -135
  2330. package/dist/server/kernel/__tests__/job-queue.test.js.map +0 -1
  2331. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts +0 -2
  2332. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts.map +0 -1
  2333. package/dist/server/kernel/__tests__/rate-limiter.test.js +0 -74
  2334. package/dist/server/kernel/__tests__/rate-limiter.test.js.map +0 -1
  2335. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts +0 -2
  2336. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts.map +0 -1
  2337. package/dist/server/kernel/__tests__/realtime-authorizer.test.js +0 -19
  2338. package/dist/server/kernel/__tests__/realtime-authorizer.test.js.map +0 -1
  2339. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts +0 -2
  2340. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +0 -1
  2341. package/dist/server/kernel/__tests__/realtime-transport.test.js +0 -50
  2342. package/dist/server/kernel/__tests__/realtime-transport.test.js.map +0 -1
  2343. package/dist/server/kernel/__tests__/redis-cache.test.d.ts +0 -2
  2344. package/dist/server/kernel/__tests__/redis-cache.test.d.ts.map +0 -1
  2345. package/dist/server/kernel/__tests__/redis-cache.test.js +0 -49
  2346. package/dist/server/kernel/__tests__/redis-cache.test.js.map +0 -1
  2347. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts +0 -2
  2348. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts.map +0 -1
  2349. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js +0 -56
  2350. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js.map +0 -1
  2351. package/dist/server/kernel/job-queue.d.ts +0 -40
  2352. package/dist/server/kernel/job-queue.d.ts.map +0 -1
  2353. package/dist/server/kernel/job-queue.js +0 -200
  2354. package/dist/server/kernel/job-queue.js.map +0 -1
  2355. package/dist/server/kernel/realtime-transport.d.ts +0 -8
  2356. package/dist/server/kernel/realtime-transport.d.ts.map +0 -1
  2357. package/dist/server/kernel/realtime-transport.js +0 -57
  2358. package/dist/server/kernel/realtime-transport.js.map +0 -1
  2359. package/dist/server/runtime/openapi.d.ts +0 -15
  2360. package/dist/server/runtime/openapi.d.ts.map +0 -1
  2361. package/dist/server/runtime/openapi.js +0 -26
  2362. package/dist/server/runtime/openapi.js.map +0 -1
  2363. package/dist/wallet/__tests__/admin-reporting.test.d.ts +0 -2
  2364. package/dist/wallet/__tests__/admin-reporting.test.d.ts.map +0 -1
  2365. package/dist/wallet/__tests__/admin-reporting.test.js +0 -124
  2366. package/dist/wallet/__tests__/admin-reporting.test.js.map +0 -1
  2367. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts +0 -2
  2368. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts.map +0 -1
  2369. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +0 -100
  2370. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +0 -1
  2371. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts +0 -2
  2372. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts.map +0 -1
  2373. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +0 -517
  2374. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +0 -1
  2375. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts +0 -2
  2376. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts.map +0 -1
  2377. package/dist/wallet/__tests__/wallet-commands.service.test.js +0 -176
  2378. package/dist/wallet/__tests__/wallet-commands.service.test.js.map +0 -1
  2379. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts +0 -2
  2380. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts.map +0 -1
  2381. package/dist/wallet/__tests__/wallet-kyc-gate.test.js +0 -61
  2382. package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +0 -1
  2383. package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts +0 -2
  2384. package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts.map +0 -1
  2385. package/dist/wallet/__tests__/wallet-webhook.router.test.js +0 -78
  2386. package/dist/wallet/__tests__/wallet-webhook.router.test.js.map +0 -1
  2387. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts +0 -2
  2388. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts.map +0 -1
  2389. package/dist/wallet/__tests__/wallet.rate-limit.test.js +0 -34
  2390. package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +0 -1
  2391. package/dist/wallet/__tests__/wallet.router.test.d.ts +0 -2
  2392. package/dist/wallet/__tests__/wallet.router.test.d.ts.map +0 -1
  2393. package/dist/wallet/__tests__/wallet.router.test.js +0 -45
  2394. package/dist/wallet/__tests__/wallet.router.test.js.map +0 -1
  2395. package/dist/wallet/__tests__/wallet.service.test.d.ts +0 -2
  2396. package/dist/wallet/__tests__/wallet.service.test.d.ts.map +0 -1
  2397. package/dist/wallet/__tests__/wallet.service.test.js +0 -971
  2398. package/dist/wallet/__tests__/wallet.service.test.js.map +0 -1
  2399. package/turbo-generators/src/config.ts +0 -478
  2400. package/turbo-generators/src/templates/adapter.hbs +0 -19
  2401. package/turbo-generators/src/templates/contract.hbs +0 -18
  2402. package/turbo-generators/src/templates/job-worker.hbs +0 -34
  2403. package/turbo-generators/src/templates/module/agents.hbs +0 -67
  2404. package/turbo-generators/src/templates/module/drizzle.config.hbs +0 -22
  2405. package/turbo-generators/src/templates/module/index.hbs +0 -5
  2406. package/turbo-generators/src/templates/module/migrate.hbs +0 -15
  2407. package/turbo-generators/src/templates/module/package.json.hbs +0 -62
  2408. package/turbo-generators/src/templates/module/plugin.hbs +0 -20
  2409. package/turbo-generators/src/templates/module/router.hbs +0 -19
  2410. package/turbo-generators/src/templates/module/schema.hbs +0 -21
  2411. package/turbo-generators/src/templates/module/service.hbs +0 -26
  2412. package/turbo-generators/src/templates/module/tsconfig.json.hbs +0 -8
  2413. package/turbo-generators/src/templates/plugin.hbs +0 -20
  2414. /package/{turbo-generators → generators}/src/templates/adr.hbs +0 -0
  2415. /package/{turbo-generators → generators}/src/templates/config.hbs +0 -0
@@ -1,34 +1,244 @@
1
- import { makeNotFoundError, makeConflictError, createDomainError, findOneOrThrow, pageToOffset, withAdvisoryXactLock, assertRateLimit, createLogger, moneyToNumber, } from '@openora/core/server';
2
- import { eq, desc, sql, and, gte, lte, count, inArray } from 'drizzle-orm';
1
+ import { makeNotFoundError, serializeRow, makeConflictError, createDomainError, findOneOrThrow, pageToOffset, withAdvisoryXactLock, assertRateLimit, createLogger, moneyToNumber, moneyEquals, moneyAdd, moneyCompare, moneySubtract, } from '@openora/core/server';
2
+ import { normalizeKycStatus, RgLimitExceededError, DEFAULT_PAYMENT_PROVIDER, railFor as sharedRailFor, resolveExchangeRatePivot, } from '@openora/core/contracts';
3
+ import { eq, asc, desc, sql, and, gte, lte, count, inArray, isNull, or } from 'drizzle-orm';
3
4
  import { createHash } from 'node:crypto';
4
- import { wallet, walletTransaction, autoWithdrawalRule, walletDepositAddress, } from '../schema/index.js';
5
+ import { wallet, walletBalance, walletTransaction, autoWithdrawalRule, walletAutoWithdrawalConfig, walletDepositAddress, walletBonusCredit, walletBonusRolloverConfig, walletWithdrawalAddress, walletAsset, } from '../schema/index.js';
6
+ import { OUT_OF_CYCLE_RUN_ID, recordReconciliationFinding, rgDecisionForLandedCredit, } from './reconciliation-finding.service.js';
5
7
  const logger = createLogger('wallet');
6
8
  export const WalletNotFoundError = makeNotFoundError('Wallet');
7
9
  export const WithdrawalNotFoundError = makeNotFoundError('Withdrawal');
10
+ export const AutoWithdrawalConfigNotFoundError = makeNotFoundError('AutoWithdrawalConfig');
11
+ export const BonusRolloverConfigNotFoundError = makeNotFoundError('BonusRolloverConfig');
12
+ export const PlayerNotFoundError = makeNotFoundError('Player');
8
13
  export const InsufficientBalanceError = createDomainError('InsufficientBalanceError', (available, requested) => `Insufficient balance: available ${available}, requested ${requested}`);
9
14
  export const WithdrawalNotPendingError = makeConflictError('WithdrawalNotPendingError', 'Withdrawal is not pending and cannot be reviewed');
10
15
  export const KycRequiredError = makeConflictError('KycRequiredError', 'KYC verification required before withdrawal');
11
16
  export const IdempotencyKeyReuseError = makeConflictError('IdempotencyKeyReuseError', 'Idempotency key was already used with a different amount');
12
17
  export const DepositAddressUnsupportedError = makeConflictError('DepositAddressUnsupportedError', 'The bound payment adapter does not support address-based deposits');
13
18
  export const DestinationAddressRequiredError = makeConflictError('DestinationAddressRequiredError', 'A destination address is required for a crypto-rail withdrawal');
14
- // Statuses that satisfy the withdrawal KYC gate.
15
- const KYC_PASS_STATUSES = new Set(['verified', 'manually_overridden']);
16
- export const CurrencyMismatchError = createDomainError('CurrencyMismatchError', (requested, walletCurrency) => `Currency mismatch: requested ${requested}, wallet holds ${walletCurrency}`);
17
- // Crypto currencies settle on the crypto rail (Fireblocks); everything else on the
18
- // fiat rail (a PSP). The concrete provider is recorded per transaction, not here.
19
- const CRYPTO_CURRENCIES = new Set(['BTC', 'ETH', 'USDT']);
19
+ export const BonusRolloverLockedError = createDomainError('BonusRolloverLockedError', (locked) => `Withdrawal blocked: ${locked} is locked by an active bonus rollover requirement`);
20
+ export const DestinationAddressNotWhitelistedError = makeConflictError('DestinationAddressNotWhitelistedError', 'This payout address is not approved for withdrawals. Save it in your address book first');
21
+ export const WalletAssetNotFoundError = makeNotFoundError('WalletAsset');
22
+ export const WalletAssetAlreadyExistsError = makeConflictError('WalletAssetAlreadyExistsError', 'An asset is already configured for this currency and network');
23
+ export const WalletAssetUnsupportedError = makeConflictError('WalletAssetUnsupportedError', 'The bound payment adapter cannot serve this currency and network');
24
+ export const WalletAssetInUseError = makeConflictError('WalletAssetInUseError', 'Players still hold a balance in this currency', { code: 'WALLET_ASSET_BALANCE_HELD' });
25
+ export const WalletAssetHasIssuedAddressesError = makeConflictError('WalletAssetHasIssuedAddressesError', 'A deposit address was already issued for this currency and network', { code: 'WALLET_ASSET_ADDRESS_ISSUED' });
26
+ export const WalletAssetUnknownProviderError = makeConflictError('WalletAssetUnknownProviderError', 'providerName is not a registered payment provider');
27
+ export const WalletAssetHasInFlightTransactionsError = makeConflictError('WalletAssetHasInFlightTransactionsError', 'A pending or processing transaction exists for this currency and network', { code: 'WALLET_ASSET_TRANSACTION_IN_FLIGHT' });
28
+ export const WithdrawalAddressAlreadyExistsError = makeConflictError('WithdrawalAddressAlreadyExistsError', 'This address is already saved for that currency and network');
29
+ export const WithdrawalAddressLimitReachedError = createDomainError('WithdrawalAddressLimitReachedError', (limit) => `A player may save at most ${limit} withdrawal addresses`);
30
+ export const AmbiguousNetworkError = createDomainError('AmbiguousNetworkError', (currency, networks) => `Currency ${currency} settles on several networks (${networks}) - a network is required`);
31
+ export const UnsupportedNetworkError = createDomainError('UnsupportedNetworkError', (currency, network) => `Currency ${currency} is not settled on network ${network}`);
32
+ export const WithdrawalDisabledError = createDomainError('WithdrawalDisabledError', (currency) => `Withdrawals are disabled for ${currency} on every configured network`);
33
+ export const BelowMinimumWithdrawalError = createDomainError('BelowMinimumWithdrawalError', (amount, minimum, currency, network) => `Withdrawal of ${amount} ${currency} on ${network} is below the ${minimum} ${currency} minimum`);
34
+ export const DepositDisabledError = createDomainError('DepositDisabledError', (currency, network) => network
35
+ ? `Deposits are disabled for ${currency} on ${network}`
36
+ : `Deposits are disabled for ${currency} on every configured network`);
37
+ export const BelowMinimumDepositError = createDomainError('BelowMinimumDepositError', (amount, minimum, currency, network) => `Deposit of ${amount} ${currency} on ${network} is below the ${minimum} ${currency} minimum`);
38
+ const KYC_PASS_STATUSES = new Set(['approved', 'manually_overridden']);
39
+ export const AmbiguousDepositAddressError = createDomainError('AmbiguousDepositAddressError', (address, network) => `Deposit address ${address} on ${network ?? 'an unknown network'} is issued to more than one user`);
40
+ // A saved-address book, not a payout allowlist: the cap only stops one account turning
41
+ // the table into unbounded free storage. Not operator-configurable until someone asks.
42
+ const WITHDRAWAL_ADDRESS_LIMIT = 50;
43
+ function toWithdrawalAddressDto(row) {
44
+ return {
45
+ id: row.id,
46
+ label: row.label,
47
+ currency: row.currency,
48
+ network: row.network,
49
+ address: row.address,
50
+ destinationTag: row.destinationTag,
51
+ createdAt: row.createdAt.toISOString(),
52
+ };
53
+ }
54
+ // Mirrors the `wallet.currency` column default: what a player without a wallet row
55
+ // reads as their active currency before one is created on first deposit.
56
+ export const DEFAULT_WALLET_CURRENCY = 'USD';
20
57
  // Per-user throttle on money mutations - guards a runaway/misbehaving client, not
21
58
  // fraud (idempotency + the ledger guard cover correctness). An overlay rebinds
22
59
  // RATE_LIMITER to change the backend, not this policy.
23
60
  const WALLET_MUTATION_RATE_LIMIT = { limit: 30, windowMs: 60 * 1000 };
24
- export function railFor(currency) {
25
- return CRYPTO_CURRENCIES.has(currency.toUpperCase()) ? 'crypto' : 'fiat';
61
+ /**
62
+ * Pins the chain a payout settles on. With one payable network the choice is implied; with
63
+ * several an explicit network is mandatory, because picking one silently would send a
64
+ * player's USDT over a chain their receiving wallet may not support.
65
+ *
66
+ * `assets` is every catalog row for the currency, enabled or not, so the two empty cases
67
+ * stay distinguishable: no rows at all means the operator never configured this currency
68
+ * (a fiat PSP), and the caller's choice passes through unchecked; rows that are all
69
+ * withdrawal-disabled is a deliberate operator decision and fails closed.
70
+ */
71
+ export function resolveWithdrawalNetwork(assets, currency, network) {
72
+ if (assets.length === 0) {
73
+ return network?.toUpperCase() ?? null;
74
+ }
75
+ const payable = assets.filter((asset) => asset.withdrawalEnabled);
76
+ const [only, ...rest] = payable;
77
+ if (!only) {
78
+ throw new WithdrawalDisabledError(currency);
79
+ }
80
+ if (network === undefined) {
81
+ if (rest.length > 0) {
82
+ throw new AmbiguousNetworkError(currency, payable.map((asset) => asset.network).join(', '));
83
+ }
84
+ return only.network.toUpperCase();
85
+ }
86
+ const wanted = network.toUpperCase();
87
+ if (!payable.some((asset) => asset.network.toUpperCase() === wanted)) {
88
+ throw new UnsupportedNetworkError(currency, wanted);
89
+ }
90
+ return wanted;
91
+ }
92
+ /**
93
+ * Rejects a payout worth less than the operator's per-network floor. The floor is per chain,
94
+ * not per currency: moving USDT costs cents on BEP20 and dollars on ERC20, so one
95
+ * currency-wide minimum is either too high for the cheap chain or below the fee on the
96
+ * expensive one.
97
+ */
98
+ export function assertAboveMinimumWithdrawal(assets, amount, currency, network) {
99
+ const asset = assets.find((candidate) => candidate.withdrawalEnabled && candidate.network.toUpperCase() === network);
100
+ if (asset && moneyCompare(amount, asset.minWithdrawal) < 0) {
101
+ throw new BelowMinimumWithdrawalError(amount, asset.minWithdrawal, currency, asset.network);
102
+ }
103
+ }
104
+ export function assertDepositAllowed(assets, currency, network) {
105
+ if (assets.length === 0) {
106
+ // No catalog row at all means the operator never configured this currency (a fiat
107
+ // PSP), and a currency-level request passes through unchecked. A request naming a
108
+ // network does not: the pair it names does not exist - either a typo or a catalog
109
+ // row deleted while this request was in flight - so it fails closed.
110
+ if (network !== undefined) {
111
+ throw new UnsupportedNetworkError(currency, network.toUpperCase());
112
+ }
113
+ return;
114
+ }
115
+ if (network === undefined) {
116
+ if (!assets.some((asset) => asset.depositEnabled)) {
117
+ throw new DepositDisabledError(currency, null);
118
+ }
119
+ return;
120
+ }
121
+ const wanted = network.toUpperCase();
122
+ const asset = assets.find((candidate) => candidate.network.toUpperCase() === wanted);
123
+ if (!asset) {
124
+ throw new UnsupportedNetworkError(currency, wanted);
125
+ }
126
+ if (!asset.depositEnabled) {
127
+ throw new DepositDisabledError(currency, asset.network);
128
+ }
129
+ }
130
+ export function assertAboveMinimumDeposit(assets, amount, currency, network) {
131
+ const enabled = assets.filter((asset) => asset.depositEnabled);
132
+ const wanted = network?.toUpperCase();
133
+ const applicable = wanted
134
+ ? enabled.filter((asset) => asset.network.toUpperCase() === wanted)
135
+ : enabled;
136
+ const floor = applicable.reduce((lowest, asset) => !lowest || moneyCompare(asset.minDeposit, lowest.minDeposit) < 0 ? asset : lowest, undefined);
137
+ if (floor && moneyCompare(amount, floor.minDeposit) < 0) {
138
+ throw new BelowMinimumDepositError(amount, floor.minDeposit, currency, floor.network);
139
+ }
140
+ }
141
+ export const railFor = sharedRailFor;
142
+ // Currency checks elsewhere are case-insensitive, so `usd` reaches here for a `USD`
143
+ // wallet. Every read and write of wallet_balance funnels through these three helpers,
144
+ // so normalizing the key here is enough to keep one row per wallet+currency.
145
+ export const balanceKey = (currency) => currency.toUpperCase();
146
+ export function creditWalletBalance(txn, walletId, currency, amount) {
147
+ return txn
148
+ .insert(walletBalance)
149
+ .values({ walletId, currency: balanceKey(currency), amount })
150
+ .onConflictDoUpdate({
151
+ target: [walletBalance.walletId, walletBalance.currency],
152
+ set: {
153
+ amount: sql `${walletBalance.amount} + ${amount}::numeric`,
154
+ updatedAt: new Date(),
155
+ },
156
+ })
157
+ .returning({ amount: walletBalance.amount });
158
+ }
159
+ export function debitWalletBalance(txn, walletId, currency, amount) {
160
+ return txn
161
+ .update(walletBalance)
162
+ .set({ amount: sql `${walletBalance.amount} - ${amount}::numeric` })
163
+ .where(and(eq(walletBalance.walletId, walletId), eq(walletBalance.currency, balanceKey(currency)), gte(walletBalance.amount, amount)))
164
+ .returning({ amount: walletBalance.amount });
165
+ }
166
+ export async function readWalletBalance(txn, walletId, currency) {
167
+ const [row] = await txn
168
+ .select({ amount: walletBalance.amount })
169
+ .from(walletBalance)
170
+ .where(and(eq(walletBalance.walletId, walletId), eq(walletBalance.currency, balanceKey(currency))));
171
+ return row?.amount ?? '0';
172
+ }
173
+ export async function readWalletBalances(txn, userId) {
174
+ const [record] = await txn.select().from(wallet).where(eq(wallet.userId, userId));
175
+ if (!record) {
176
+ return { activeCurrency: DEFAULT_WALLET_CURRENCY, balances: [] };
177
+ }
178
+ const balances = await txn
179
+ .select({ currency: walletBalance.currency, balance: walletBalance.amount })
180
+ .from(walletBalance)
181
+ .where(eq(walletBalance.walletId, record.id))
182
+ .orderBy(walletBalance.currency);
183
+ return { activeCurrency: record.currency, balances };
184
+ }
185
+ export async function resolveWalletBalance(txn, userId) {
186
+ const [record] = await txn.select().from(wallet).where(eq(wallet.userId, userId));
187
+ if (!record) {
188
+ return { balance: '0', currency: DEFAULT_WALLET_CURRENCY };
189
+ }
190
+ return {
191
+ balance: await readWalletBalance(txn, record.id, record.currency),
192
+ currency: record.currency,
193
+ };
194
+ }
195
+ export function providerRefCondition(providerName, providerRefId) {
196
+ return and(eq(walletTransaction.providerName, providerName), eq(walletTransaction.providerRefId, providerRefId));
197
+ }
198
+ export function debitWithdrawableBalance(txn, walletId, currency, amount) {
199
+ const currencyKey = balanceKey(currency);
200
+ return txn
201
+ .update(walletBalance)
202
+ .set({ amount: sql `${walletBalance.amount} - ${amount}::numeric` })
203
+ .where(and(eq(walletBalance.walletId, walletId), eq(walletBalance.currency, currencyKey), gte(sql `${walletBalance.amount} - COALESCE((
204
+ SELECT SUM(
205
+ ${walletBonusCredit.creditedAmount}
206
+ * GREATEST(
207
+ ${walletBonusCredit.rolloverRequired} - ${walletBonusCredit.rolloverProgress},
208
+ 0
209
+ )
210
+ / NULLIF(${walletBonusCredit.rolloverRequired}, 0)
211
+ )
212
+ FROM ${walletBonusCredit}
213
+ WHERE ${walletBonusCredit.walletId} = ${walletId}
214
+ AND ${walletBonusCredit.currency} = ${currencyKey}
215
+ AND ${walletBonusCredit.status} = 'active'
216
+ ), 0)`, amount)))
217
+ .returning({ amount: walletBalance.amount });
218
+ }
219
+ export async function readLockedBonusAmount(txn, walletId, currency) {
220
+ const currencyKey = balanceKey(currency);
221
+ const [row] = await txn
222
+ .select({
223
+ locked: sql `coalesce(sum(
224
+ ${walletBonusCredit.creditedAmount}
225
+ * greatest(${walletBonusCredit.rolloverRequired} - ${walletBonusCredit.rolloverProgress}, 0)
226
+ / nullif(${walletBonusCredit.rolloverRequired}, 0)
227
+ ), 0)`,
228
+ })
229
+ .from(walletBonusCredit)
230
+ .where(and(eq(walletBonusCredit.walletId, walletId), eq(walletBonusCredit.currency, currencyKey), eq(walletBonusCredit.status, 'active')));
231
+ return row?.locked ?? '0';
26
232
  }
27
233
  // Namespace the key per operation so the same raw key on a deposit then a withdraw can't
28
234
  // collide on the (walletId, idempotencyKey) unique index. The column is a uuid, so a string
29
235
  // prefix won't parse - hash namespace + key into a stable pseudo-uuid instead.
30
236
  const DEPOSIT_IDEMPOTENCY_NAMESPACE = 'deposit';
31
237
  const WITHDRAW_IDEMPOTENCY_NAMESPACE = 'withdraw';
238
+ const MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE = 'manual-adjustment';
239
+ /** Serialises one player's PSP deposits, so an RG reservation cannot be spent twice. */
240
+ const depositSlotKey = (userId) => `wallet-deposit:${userId}`;
241
+ const MANUAL_ADJUSTMENT_TYPES = new Set(['manual_credit', 'manual_debit']);
32
242
  function namespacedIdempotencyKey(namespace, rawKey) {
33
243
  const hex = createHash('sha256').update(`${namespace}:${rawKey}`).digest('hex');
34
244
  return [
@@ -39,9 +249,9 @@ function namespacedIdempotencyKey(namespace, rawKey) {
39
249
  hex.slice(20, 32),
40
250
  ].join('-');
41
251
  }
42
- // ponytail: a flat, currency-agnostic threshold - a starter heuristic for the review
43
- // queue, not a compliance risk engine. Revisit with a real risk service if/when one exists.
44
- // moneyToNumber is the sanctioned JS conversion point for this heuristic comparison only.
252
+ // ponytail: a flat threshold - a starter heuristic, not a compliance risk engine. Auto-approval
253
+ // reads it in the fx pivot; the review-queue tag still compares the raw amount, so it is only
254
+ // a display hint there. Revisit with a real risk service if/when one exists.
45
255
  const LARGE_WITHDRAWAL_THRESHOLD = '5000';
46
256
  // ponytail: >=3 withdrawals in a 24h window flags velocity; a flat count, not a per-tier rule.
47
257
  const HIGH_FREQUENCY_WINDOW_MS = 24 * 60 * 60 * 1000;
@@ -49,6 +259,14 @@ const HIGH_FREQUENCY_MIN_COUNT = 3;
49
259
  const DAILY_CAP_WINDOW_MS = 24 * 60 * 60 * 1000;
50
260
  // Also the marker the cumulative-cap query reads back to identify auto-approved payouts - keep write and read in lockstep.
51
261
  const AUTO_APPROVED_REASON = 'auto-approved';
262
+ function toDepositAddressResult(row) {
263
+ return {
264
+ address: row.address,
265
+ currency: row.currency,
266
+ ...(row.network === null ? {} : { network: row.network }),
267
+ ...(row.tag === null ? {} : { tag: row.tag }),
268
+ };
269
+ }
52
270
  function toAutoWithdrawalRuleDto(row) {
53
271
  return {
54
272
  id: row.id,
@@ -60,10 +278,49 @@ function toAutoWithdrawalRuleDto(row) {
60
278
  updatedAt: row.updatedAt.toISOString(),
61
279
  };
62
280
  }
63
- // The concrete settlement provider recorded per transaction: the crypto rail settles
64
- // through Fireblocks, the fiat rail through a PSP.
65
- function providerNameFor(rail) {
66
- return rail === 'crypto' ? 'fireblocks' : 'psp';
281
+ function toAutoWithdrawalConfigDto(row) {
282
+ return {
283
+ id: row.id,
284
+ fiatThreshold: row.fiatThreshold,
285
+ cryptoThreshold: row.cryptoThreshold,
286
+ excludeRiskFlags: row.excludeRiskFlags,
287
+ updatedBy: row.updatedBy,
288
+ updatedAt: row.updatedAt.toISOString(),
289
+ createdAt: row.createdAt.toISOString(),
290
+ };
291
+ }
292
+ function toBonusCreditDto(row) {
293
+ return {
294
+ id: row.id,
295
+ currency: row.currency,
296
+ sourceType: row.sourceType,
297
+ creditedAmount: row.creditedAmount,
298
+ rolloverMultiplier: row.rolloverMultiplier,
299
+ rolloverRequired: row.rolloverRequired,
300
+ rolloverProgress: row.rolloverProgress,
301
+ status: row.status,
302
+ createdAt: row.createdAt.toISOString(),
303
+ completedAt: row.completedAt ? row.completedAt.toISOString() : null,
304
+ };
305
+ }
306
+ function toBonusRolloverConfigDto(row) {
307
+ return {
308
+ id: row.id,
309
+ multiplier: row.multiplier,
310
+ updatedAt: row.updatedAt.toISOString(),
311
+ };
312
+ }
313
+ const PUBLIC_ASSET_COLUMNS = {
314
+ currency: walletAsset.currency,
315
+ network: walletAsset.network,
316
+ minDeposit: walletAsset.minDeposit,
317
+ minWithdrawal: walletAsset.minWithdrawal,
318
+ withdrawalFee: walletAsset.withdrawalFee,
319
+ depositEnabled: walletAsset.depositEnabled,
320
+ withdrawalEnabled: walletAsset.withdrawalEnabled,
321
+ };
322
+ function toWalletAssetDto(row) {
323
+ return serializeRow(row, { dateFields: ['createdAt', 'updatedAt'], decimalFields: [] });
67
324
  }
68
325
  /**
69
326
  * Owns all wallet balance mutations and the withdrawal review/auto-approval
@@ -77,45 +334,145 @@ export class WalletService {
77
334
  drizzle;
78
335
  events;
79
336
  payment;
337
+ paymentProviders;
338
+ identityReader;
80
339
  directory;
81
340
  platformConfig;
82
341
  limiter;
83
342
  riskTags;
343
+ tagEvaluationCommands;
84
344
  audit;
85
- constructor({ drizzle, events, payment, directory, platformConfig, limiter, riskTags, audit, }) {
345
+ rgLimits;
346
+ rates;
347
+ constructor({ drizzle, events, payment, paymentProviders, directory, identityReader, platformConfig, limiter, riskTags, tagEvaluationCommands, audit, rgLimits, rates, }) {
86
348
  this.drizzle = drizzle;
87
349
  this.events = events;
88
350
  this.payment = payment;
351
+ this.paymentProviders = paymentProviders;
89
352
  this.directory = directory;
353
+ this.identityReader = identityReader;
90
354
  this.platformConfig = platformConfig;
91
355
  this.limiter = limiter;
92
356
  this.riskTags = riskTags;
357
+ this.tagEvaluationCommands = tagEvaluationCommands;
93
358
  this.audit = audit;
359
+ this.rgLimits = rgLimits;
360
+ this.rates = rates;
361
+ }
362
+ // Every catalog row for the currency, enabled or not - resolveWithdrawalNetwork needs
363
+ // both to tell "never configured" from "deliberately disabled".
364
+ assetsForCurrency(currency) {
365
+ return this.drizzle.db
366
+ .select({
367
+ network: walletAsset.network,
368
+ minWithdrawal: walletAsset.minWithdrawal,
369
+ withdrawalEnabled: walletAsset.withdrawalEnabled,
370
+ })
371
+ .from(walletAsset)
372
+ .where(eq(walletAsset.currency, currency.toUpperCase()));
373
+ }
374
+ // `for('share')` blocks a concurrent deleteWalletAsset (which takes `for('update')` on
375
+ // the same rows) from removing the pair while a deposit is being gated against it.
376
+ depositAssetsForCurrency(currency, db = this.drizzle.db) {
377
+ return db
378
+ .select({
379
+ network: walletAsset.network,
380
+ minDeposit: walletAsset.minDeposit,
381
+ depositEnabled: walletAsset.depositEnabled,
382
+ })
383
+ .from(walletAsset)
384
+ .where(eq(walletAsset.currency, currency.toUpperCase()))
385
+ .for('share');
386
+ }
387
+ /**
388
+ * `network` is optional because not every deposit path knows one: `deposit()` takes a
389
+ * PSP amount and currency only, so it is gated currency-wide (any enabled network
390
+ * clears it). Per-network gating applies where a network is actually chosen, ie
391
+ * `getOrCreateDepositAddress`, which is the path that hands a player a chain address.
392
+ */
393
+ async assertDepositable(currency, amount, network, db = this.drizzle.db) {
394
+ const assets = await this.depositAssetsForCurrency(currency, db);
395
+ assertDepositAllowed(assets, currency, network);
396
+ if (amount !== undefined) {
397
+ assertAboveMinimumDeposit(assets, amount, currency, network);
398
+ }
399
+ }
400
+ async assertWithinRgDepositLimit(tx, userId, amount, currency) {
401
+ if (!this.rgLimits) {
402
+ return;
403
+ }
404
+ const decision = await this.rgLimits.checkDeposit(tx, userId, amount, currency);
405
+ if (!decision.allowed) {
406
+ throw new RgLimitExceededError('deposit_limit_exceeded', decision);
407
+ }
408
+ }
409
+ resolveRail(currency) {
410
+ return railFor(currency, this.platformConfig?.wallet?.cryptoCurrencies);
411
+ }
412
+ // The concrete vendor a transaction/deposit-address settles through: the catalog row
413
+ // for the exact (currency, network) pair names the bound provider. Reconciliation
414
+ // scopes its diff by this column, so a null network (an unconfigured pair - no
415
+ // catalog row could ever match it) and a configured-but-null providerName column both
416
+ // resolve to the single default binding rather than leaving the column null.
417
+ async providerNameFor(currency, network) {
418
+ if (network === null) {
419
+ return DEFAULT_PAYMENT_PROVIDER;
420
+ }
421
+ const [row] = await this.drizzle.db
422
+ .select({ providerName: walletAsset.providerName })
423
+ .from(walletAsset)
424
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
425
+ return row?.providerName ?? DEFAULT_PAYMENT_PROVIDER;
426
+ }
427
+ // Fails closed on a named provider that is no longer registered (removed or
428
+ // misconfigured after the catalog row was written). Falling back to the default
429
+ // adapter would pay a withdrawal out through the wrong vendor while still recording
430
+ // the old provider name - money moved somewhere the ledger does not describe.
431
+ async paymentAdapterFor(currency, network) {
432
+ const providerName = await this.providerNameFor(currency, network);
433
+ if (providerName === DEFAULT_PAYMENT_PROVIDER) {
434
+ return { providerName, adapter: this.payment };
435
+ }
436
+ const adapter = this.paymentProviders.get(providerName)?.adapter;
437
+ if (!adapter) {
438
+ throw new WalletAssetUnknownProviderError();
439
+ }
440
+ return { providerName, adapter };
94
441
  }
95
442
  rateLimit(userId) {
96
443
  return this.limiter
97
444
  ? assertRateLimit(this.limiter, `wallet-mutation:${userId}`, WALLET_MUTATION_RATE_LIMIT)
98
445
  : Promise.resolve();
99
446
  }
100
- /** Fail-closed KYC gate: when enabled, a withdrawal needs a passing status (verified|manually_overridden). */
101
447
  async assertKycForWithdrawal(userId) {
102
448
  if (!this.platformConfig?.kyc?.gateWithdrawals) {
103
449
  return;
104
450
  }
105
451
  const status = await this.autoApprovalKycStatus(userId);
106
- if (!status || !KYC_PASS_STATUSES.has(status)) {
452
+ if (!status || !KYC_PASS_STATUSES.has(normalizeKycStatus(status))) {
107
453
  throw new KycRequiredError();
108
454
  }
109
455
  }
110
- async getBalance(userId) {
111
- const [record] = await this.drizzle.db.select().from(wallet).where(eq(wallet.userId, userId));
456
+ getBalance(userId) {
457
+ return resolveWalletBalance(this.drizzle.db, userId);
458
+ }
459
+ async getBalances(userId) {
460
+ return readWalletBalances(this.drizzle.db, userId);
461
+ }
462
+ // TODO: validate `currency` against a canonical supported-currency list once one
463
+ // exists - `platformConfig.wallet.cryptoCurrencies` classifies rails, it is not an
464
+ // allowlist, so today any non-empty string is accepted and persisted.
465
+ async setActiveCurrency(userId, currency) {
466
+ const updated = await this.drizzle.db
467
+ .update(wallet)
468
+ .set({ currency })
469
+ .where(eq(wallet.userId, userId))
470
+ .returning({ currency: wallet.currency });
471
+ const record = updated[0];
112
472
  if (!record) {
113
- return { balance: '0', currency: 'USD' };
473
+ throw new WalletNotFoundError(userId);
114
474
  }
115
- return {
116
- balance: record.balance,
117
- currency: record.currency,
118
- };
475
+ return { activeCurrency: record.currency };
119
476
  }
120
477
  /**
121
478
  * `idempotencyKey` (when supplied) makes a retried deposit a no-op: a replay
@@ -126,9 +483,16 @@ export class WalletService {
126
483
  * reach the PSP, but the ledger insert's unique-index conflict still
127
484
  * guarantees only one balance credit - the loser's write becomes a replay
128
485
  * read of the winner's row.
486
+ *
487
+ * Deposit gating is network-aware when a network is known (e.g. via
488
+ * `getOrCreateDepositAddress`), but here we gate on "any network for this
489
+ * currency is enabled" because `provider` routing may resolve a specific
490
+ * network inside `processDeposit`. A fiat PSP (no networks) passes through
491
+ * unchecked; an explicit network route checks that specific network only.
129
492
  */
130
493
  async deposit({ userId, amount, currency, provider, idempotencyKey, }) {
131
494
  await this.rateLimit(userId);
495
+ await this.assertDepositable(currency, amount);
132
496
  // Short-circuit a replay BEFORE the PSP call - the common retry case (client
133
497
  // resends after a timeout) must not re-charge. A genuine concurrent race (two
134
498
  // first-attempts for the same key landing here at once) can still both reach the
@@ -141,52 +505,222 @@ export class WalletService {
141
505
  }
142
506
  preResolvedWallet = found.walletRecord;
143
507
  }
144
- const psp = await this.payment.processDeposit(amount, currency, { userId, provider });
145
- const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
508
+ else {
509
+ [preResolvedWallet] = await this.drizzle.db
510
+ .select()
511
+ .from(wallet)
512
+ .where(eq(wallet.userId, userId));
513
+ }
514
+ // Reserve the RG headroom BEFORE charging the PSP: the check and the pending row that
515
+ // consumes it commit together under the player's deposit lock, so a second concurrent
516
+ // deposit reads the first one's reservation instead of spending the same headroom.
517
+ const reservation = await this.drizzle.db.transaction(async (txn) => {
146
518
  let walletRecord = preResolvedWallet;
147
519
  if (!walletRecord) {
148
520
  [walletRecord] = await txn.select().from(wallet).where(eq(wallet.userId, userId));
149
521
  }
150
522
  if (!walletRecord) {
151
- walletRecord = findOneOrThrow(await txn.insert(wallet).values({ userId, balance: '0', currency }).returning(), new WalletNotFoundError(userId));
523
+ walletRecord = findOneOrThrow(await txn.insert(wallet).values({ userId, currency }).returning(), new WalletNotFoundError(userId));
524
+ }
525
+ const holder = walletRecord;
526
+ return withAdvisoryXactLock(txn, depositSlotKey(userId), async () => {
527
+ const namespacedKey = idempotencyKey
528
+ ? namespacedIdempotencyKey(DEPOSIT_IDEMPOTENCY_NAMESPACE, idempotencyKey)
529
+ : undefined;
530
+ const existing = namespacedKey
531
+ ? await this.findByIdempotencyKey(txn, holder.id, namespacedKey)
532
+ : undefined;
533
+ if (existing) {
534
+ this.assertReplayMatches(existing, amount, currency);
535
+ return { walletRecord: holder, row: existing, replay: true };
536
+ }
537
+ await this.assertWithinRgDepositLimit(txn, userId, amount, currency);
538
+ const { row } = await this.insertIdempotentTransaction(txn, {
539
+ namespace: DEPOSIT_IDEMPOTENCY_NAMESPACE,
540
+ walletId: holder.id,
541
+ rawIdempotencyKey: idempotencyKey,
542
+ amount,
543
+ currency,
544
+ values: {
545
+ walletId: holder.id,
546
+ type: 'deposit',
547
+ amount,
548
+ currency,
549
+ status: 'pending',
550
+ direction: 'credit',
551
+ rail: this.resolveRail(currency),
552
+ providerName: provider,
553
+ },
554
+ });
555
+ return { walletRecord: holder, row, replay: false };
556
+ });
557
+ });
558
+ if (reservation.replay) {
559
+ return { transactionId: reservation.row.id, status: reservation.row.status };
560
+ }
561
+ let psp;
562
+ try {
563
+ psp = await this.payment.processDeposit(amount, currency, { userId, provider });
564
+ }
565
+ catch (err) {
566
+ await this.releaseDepositReservation(reservation.row.id);
567
+ throw err;
568
+ }
569
+ // The status guard is the settle-once lock: only the update that moves the row out of
570
+ // `pending` credits the balance, so a retry that races here reads a replay instead.
571
+ const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
572
+ const [settled] = await txn
573
+ .update(walletTransaction)
574
+ .set({ status: 'completed', providerRefId: psp.externalId })
575
+ .where(and(eq(walletTransaction.id, reservation.row.id), eq(walletTransaction.status, 'pending')))
576
+ .returning();
577
+ if (!settled) {
578
+ return { transactionId: reservation.row.id, replayed: true };
579
+ }
580
+ await creditWalletBalance(txn, reservation.walletRecord.id, currency, amount);
581
+ return { transactionId: settled.id, replayed: false };
582
+ });
583
+ if (!replayed) {
584
+ this.events.emit('wallet.deposit.completed', {
585
+ userId,
586
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
587
+ amount,
588
+ currency,
589
+ transactionId,
590
+ });
591
+ }
592
+ return { transactionId, status: 'completed' };
593
+ }
594
+ async manualAdjust({ adminId, userId, direction, amount, currency, reason, idempotencyKey, ip, userAgent, }) {
595
+ const playerId = await this.identityReader.getPlayerIdByUserId(userId);
596
+ if (!playerId) {
597
+ throw new PlayerNotFoundError(userId);
598
+ }
599
+ const { result, emitted } = await this.drizzle.db.transaction(async (txn) => {
600
+ let walletRecord = (await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update')).at(0);
601
+ if (!walletRecord) {
602
+ if (direction === 'debit') {
603
+ throw new InsufficientBalanceError('0', amount);
604
+ }
605
+ const [created] = await txn
606
+ .insert(wallet)
607
+ .values({ userId, currency })
608
+ .onConflictDoNothing()
609
+ .returning();
610
+ walletRecord =
611
+ created ??
612
+ findOneOrThrow(await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update'), new WalletNotFoundError(userId));
613
+ }
614
+ const existing = await this.findByIdempotencyKey(txn, walletRecord.id, namespacedIdempotencyKey(MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE, idempotencyKey));
615
+ if (existing) {
616
+ this.assertManualAdjustmentReplayMatches(existing, {
617
+ adminId,
618
+ direction,
619
+ amount,
620
+ currency,
621
+ reason,
622
+ });
623
+ return { result: { transactionId: existing.id, status: existing.status }, emitted: false };
152
624
  }
153
625
  const { row, replayed } = await this.insertIdempotentTransaction(txn, {
154
- namespace: DEPOSIT_IDEMPOTENCY_NAMESPACE,
626
+ namespace: MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE,
155
627
  walletId: walletRecord.id,
156
628
  rawIdempotencyKey: idempotencyKey,
157
629
  amount,
158
630
  currency,
159
631
  values: {
160
632
  walletId: walletRecord.id,
161
- type: 'deposit',
633
+ type: direction === 'credit' ? 'manual_credit' : 'manual_debit',
162
634
  amount,
163
635
  currency,
164
636
  status: 'completed',
165
- rail: railFor(currency),
166
- providerName: provider,
167
- providerRefId: psp.externalId,
637
+ direction,
638
+ reviewedBy: adminId,
639
+ reviewedAt: new Date(),
640
+ reviewReason: reason,
168
641
  },
169
642
  });
170
- if (!replayed) {
171
- await txn
172
- .update(wallet)
173
- .set({ balance: sql `${wallet.balance} + ${amount}::numeric` })
174
- .where(eq(wallet.id, walletRecord.id));
643
+ if (replayed) {
644
+ this.assertManualAdjustmentReplayMatches(row, {
645
+ adminId,
646
+ direction,
647
+ amount,
648
+ currency,
649
+ reason,
650
+ });
651
+ return { result: { transactionId: row.id, status: row.status }, emitted: false };
175
652
  }
176
- return { transactionId: row.id, replayed };
653
+ const balances = direction === 'credit'
654
+ ? await creditWalletBalance(txn, walletRecord.id, currency, amount)
655
+ : await debitWalletBalance(txn, walletRecord.id, currency, amount);
656
+ const [balance] = balances;
657
+ if (!balance) {
658
+ throw new InsufficientBalanceError(await readWalletBalance(txn, walletRecord.id, currency), amount);
659
+ }
660
+ // Derived from the row the update returned, never read separately beforehand. The
661
+ // wallet row is locked here but the deposit credit path does not take that lock, so
662
+ // a deposit can commit between a pre-read and this update - and `before` is going
663
+ // into an append-only audit record that cannot be corrected later.
664
+ const balanceBefore = direction === 'credit'
665
+ ? moneySubtract(balance.amount, amount)
666
+ : moneyAdd(balance.amount, amount);
667
+ await this.audit.recordInTransaction(txn, {
668
+ actorId: adminId,
669
+ actorType: 'admin',
670
+ action: 'wallet.manual_adjustment.created',
671
+ resourceType: 'wallet_transaction',
672
+ resourceId: row.id,
673
+ before: { balance: balanceBefore, currency },
674
+ after: {
675
+ balance: balance.amount,
676
+ currency,
677
+ transactionId: row.id,
678
+ direction,
679
+ amount,
680
+ reason,
681
+ },
682
+ ip,
683
+ userAgent,
684
+ });
685
+ return { result: { transactionId: row.id, status: row.status }, emitted: true };
177
686
  });
178
- if (!replayed) {
179
- this.events.emit('wallet.deposit.completed', {
687
+ // Every other balance-mutating path on this service emits; without this one an admin
688
+ // correction moves a real balance while responsible-gaming monitoring, analytics and
689
+ // any operator subscriber see nothing at all.
690
+ if (emitted) {
691
+ this.events.emit('wallet.manual_adjustment.created', {
180
692
  userId,
693
+ playerId,
694
+ adminId,
181
695
  amount,
182
696
  currency,
183
- transactionId,
697
+ transactionId: result.transactionId,
698
+ direction,
699
+ reason,
700
+ ip,
701
+ userAgent,
184
702
  });
185
703
  }
186
- return { transactionId, status: 'completed' };
704
+ return result;
187
705
  }
188
706
  // Pre-PSP replay check for deposit; also returns the resolved wallet so the transaction
189
707
  // below can skip re-selecting it. Throws IdempotencyKeyReuseError on an amount/currency mismatch.
708
+ /**
709
+ * Frees a reservation the PSP never charged. Failure to release only leaves the player's
710
+ * own headroom held until the row is reconciled, so it is logged rather than raised over
711
+ * the PSP error that caused it.
712
+ */
713
+ async releaseDepositReservation(transactionId) {
714
+ try {
715
+ await this.drizzle.db
716
+ .update(walletTransaction)
717
+ .set({ status: 'failed' })
718
+ .where(and(eq(walletTransaction.id, transactionId), eq(walletTransaction.status, 'pending')));
719
+ }
720
+ catch (err) {
721
+ logger.error({ err, transactionId }, 'deposit reservation release failed');
722
+ }
723
+ }
190
724
  async findDepositReplay({ userId, idempotencyKey, amount, currency, }) {
191
725
  const [walletRecord] = await this.drizzle.db
192
726
  .select()
@@ -202,14 +736,23 @@ export class WalletService {
202
736
  this.assertReplayMatches(existing, amount, currency);
203
737
  return { walletRecord, replay: { transactionId: existing.id, status: existing.status } };
204
738
  }
205
- // Replay comparison only (not a ledger write) - moneyToNumber avoids a false mismatch
206
- // between an unnormalized caller string (eg "10") and the DB's fixed-scale value ("10.00").
739
+ // Replay comparison only (not a ledger write). moneyEquals avoids a false mismatch between
740
+ // an unnormalized caller string (eg "10") and the DB's fixed-scale value ("10.00") while
741
+ // staying exact - a float compare would let two amounts differing past the 15th digit pass.
207
742
  assertReplayMatches(existing, amount, currency) {
208
- if (moneyToNumber(existing.amount) !== moneyToNumber(amount) ||
743
+ if (!moneyEquals(existing.amount, amount) ||
209
744
  existing.currency.toUpperCase() !== currency.toUpperCase()) {
210
745
  throw new IdempotencyKeyReuseError();
211
746
  }
212
747
  }
748
+ assertManualAdjustmentReplayMatches(existing, { adminId, direction, amount, currency, reason, }) {
749
+ if (existing.type !== (direction === 'credit' ? 'manual_credit' : 'manual_debit') ||
750
+ existing.reviewedBy !== adminId ||
751
+ existing.reviewReason !== reason) {
752
+ throw new IdempotencyKeyReuseError();
753
+ }
754
+ this.assertReplayMatches(existing, amount, currency);
755
+ }
213
756
  // Two concurrent requests with the same key can both pass the pre-insert check and race
214
757
  // on the unique index; onConflictDoNothing makes the loser's insert a no-op so it re-reads
215
758
  // the winner's committed row and returns it as a replay instead of aborting the transaction.
@@ -248,19 +791,19 @@ export class WalletService {
248
791
  * return an already-`completed`/`processing` result if the request
249
792
  * qualifies for (and passes) auto-approval - see `maybeAutoApprove`.
250
793
  */
251
- async withdraw({ userId, amount, currency, idempotencyKey, destinationAddress, }) {
794
+ async withdraw({ userId, amount, currency, network, idempotencyKey, destinationAddress, destinationTag, ip, userAgent, }) {
252
795
  await this.rateLimit(userId);
253
796
  await this.assertKycForWithdrawal(userId);
254
- if (railFor(currency) === 'crypto' && !destinationAddress) {
797
+ if (this.resolveRail(currency) === 'crypto' && !destinationAddress) {
255
798
  throw new DestinationAddressRequiredError();
256
799
  }
800
+ const assets = await this.assetsForCurrency(currency);
801
+ const settlementNetwork = resolveWithdrawalNetwork(assets, currency, network);
802
+ assertAboveMinimumWithdrawal(assets, amount, currency, settlementNetwork);
803
+ const destinationWalletId = await this.requireWhitelistedWalletId(userId, currency, settlementNetwork, destinationAddress, destinationTag);
257
804
  const { transactionId, status, replayed, walletId, rail } = await this.drizzle.db.transaction(async (txn) => {
258
805
  // FOR UPDATE serializes concurrent withdrawals against a double-debit TOCTOU under READ COMMITTED.
259
806
  const current = findOneOrThrow(await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update'), new WalletNotFoundError(userId));
260
- // Single-currency wallet: reject a mismatch rather than coerce it onto the wrong rail.
261
- if (currency.toUpperCase() !== current.currency.toUpperCase()) {
262
- throw new CurrencyMismatchError(currency, current.currency);
263
- }
264
807
  // Replay of an already-committed key: return the original untouched. The new-key race is caught by the insert below.
265
808
  if (idempotencyKey) {
266
809
  const existing = await this.findByIdempotencyKey(txn, current.id, namespacedIdempotencyKey(WITHDRAW_IDEMPOTENCY_NAMESPACE, idempotencyKey));
@@ -271,7 +814,7 @@ export class WalletService {
271
814
  status: existing.status,
272
815
  replayed: true,
273
816
  walletId: current.id,
274
- rail: railFor(currency),
817
+ rail: this.resolveRail(currency),
275
818
  };
276
819
  }
277
820
  }
@@ -287,8 +830,12 @@ export class WalletService {
287
830
  amount,
288
831
  currency,
289
832
  status: 'pending',
290
- rail: railFor(currency),
833
+ direction: 'debit',
834
+ rail: this.resolveRail(currency),
835
+ network: settlementNetwork,
291
836
  destinationAddress: destinationAddress ?? null,
837
+ destinationTag: destinationTag ?? null,
838
+ destinationWalletId,
292
839
  },
293
840
  });
294
841
  if (replayed) {
@@ -297,24 +844,29 @@ export class WalletService {
297
844
  status: row.status,
298
845
  replayed,
299
846
  walletId: current.id,
300
- rail: railFor(currency),
847
+ rail: this.resolveRail(currency),
301
848
  };
302
849
  }
303
- // Guarded conditional debit: the WHERE makes balance>=amount atomic with the write; 0 rows back rolls back the whole tx.
304
- const debited = await txn
305
- .update(wallet)
306
- .set({ balance: sql `${wallet.balance} - ${amount}::numeric` })
307
- .where(and(eq(wallet.id, current.id), gte(wallet.balance, amount)))
308
- .returning({ id: wallet.id });
850
+ const debited = await debitWithdrawableBalance(txn, current.id, currency, amount);
309
851
  if (debited.length !== 1) {
310
- throw new InsufficientBalanceError(current.balance, amount);
852
+ const [available, locked] = await Promise.all([
853
+ readWalletBalance(txn, current.id, currency),
854
+ readLockedBonusAmount(txn, current.id, currency),
855
+ ]);
856
+ if (moneyToNumber(available) < moneyToNumber(amount)) {
857
+ throw new InsufficientBalanceError(available, amount);
858
+ }
859
+ throw new BonusRolloverLockedError(locked);
860
+ }
861
+ if (this.tagEvaluationCommands) {
862
+ await this.tagEvaluationCommands.evaluateWithdrawalRequested(txn, { userId, amount });
311
863
  }
312
864
  return {
313
865
  transactionId: row.id,
314
866
  status: row.status,
315
867
  replayed,
316
868
  walletId: current.id,
317
- rail: railFor(currency),
869
+ rail: this.resolveRail(currency),
318
870
  };
319
871
  });
320
872
  if (replayed) {
@@ -322,9 +874,12 @@ export class WalletService {
322
874
  }
323
875
  this.events.emit('wallet.withdrawal.requested', {
324
876
  userId,
877
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
325
878
  amount,
326
879
  currency,
327
880
  transactionId,
881
+ ip: ip ?? null,
882
+ userAgent: userAgent ?? null,
328
883
  });
329
884
  // Fail-closed post-step: decides who approves (system vs manual queue), never throws out of withdraw() - failure leaves the row pending.
330
885
  const auto = await this.maybeAutoApprove({
@@ -364,17 +919,38 @@ export class WalletService {
364
919
  }
365
920
  // Bounded queue: fetch all SQL-matching rows, then enrich + kycStatus-filter + paginate in memory,
366
921
  // else DB-side pagination makes `total` wrong once kycStatus prunes.
922
+ const wdSortBy = filters.sortBy ?? 'createdAt';
923
+ const wdDir = (filters.sortOrder ?? 'desc') === 'asc' ? asc : desc;
924
+ const WD_SORT_COLS = {
925
+ createdAt: walletTransaction.createdAt,
926
+ amount: walletTransaction.amount,
927
+ status: walletTransaction.status,
928
+ currency: walletTransaction.currency,
929
+ rail: walletTransaction.rail,
930
+ reviewedAt: walletTransaction.reviewedAt,
931
+ };
367
932
  const rows = await db
368
933
  .select({ tx: walletTransaction, userId: wallet.userId })
369
934
  .from(walletTransaction)
370
935
  .innerJoin(wallet, eq(wallet.id, walletTransaction.walletId))
371
936
  .where(and(...conditions))
372
- .orderBy(desc(walletTransaction.createdAt));
937
+ .orderBy(wdDir(WD_SORT_COLS[wdSortBy]), desc(walletTransaction.id));
373
938
  const userIds = [...new Set(rows.map((r) => r.userId))];
374
939
  const summaries = this.directory ? await this.directory.lookupPlayers(userIds) : [];
375
940
  const byUserId = new Map(summaries.map((s) => [s.userId, s]));
376
- const matching = filters.kycStatus
377
- ? rows.filter((r) => byUserId.get(r.userId)?.kycStatus === filters.kycStatus)
941
+ // Normalize both sides before comparing: the ADMIN_USER_DIRECTORY port's return type
942
+ // still permits the deprecated `verified` value (it aliases `approved`), and this
943
+ // module cannot assume every bound implementation already normalized it at its own
944
+ // read boundary - a raw `===` here would silently hide every legacy-verified player
945
+ // from the queue the moment an admin filters by the canonical `approved`.
946
+ const kycStatusFilter = filters.kycStatus ? normalizeKycStatus(filters.kycStatus) : undefined;
947
+ const matching = kycStatusFilter
948
+ ? rows.filter((r) => {
949
+ const kycStatus = byUserId.get(r.userId)?.kycStatus;
950
+ return kycStatus !== undefined && kycStatus !== null
951
+ ? normalizeKycStatus(kycStatus) === kycStatusFilter
952
+ : false;
953
+ })
378
954
  : rows;
379
955
  const start = pageToOffset(page, limit);
380
956
  const pageRows = matching.slice(start, start + limit);
@@ -393,15 +969,18 @@ export class WalletService {
393
969
  return {
394
970
  transactionId: r.tx.id,
395
971
  userId: r.userId,
972
+ playerId: summary?.playerId ?? null,
396
973
  username: summary?.username ?? '',
397
974
  amount: r.tx.amount,
398
975
  currency: r.tx.currency,
976
+ network: r.tx.network,
399
977
  rail: r.tx.rail ?? null,
400
978
  status: r.tx.status,
401
979
  kycStatus: summary?.kycStatus ?? null,
402
980
  riskTags,
403
981
  requestedAt: r.tx.createdAt.toISOString(),
404
982
  destinationAddress: r.tx.destinationAddress,
983
+ destinationTag: r.tx.destinationTag,
405
984
  txHash: r.tx.txHash,
406
985
  };
407
986
  });
@@ -412,15 +991,15 @@ export class WalletService {
412
991
  * or Failed + refund on PSP error. Robust PSP idempotency-key/reconciliation for a
413
992
  * lost-response is deferred - same scope boundary the deposit path declares.
414
993
  */
415
- async approveWithdrawal(adminId, withdrawalId) {
994
+ async approveWithdrawal(adminId, withdrawalId, meta) {
416
995
  // Two-phase: commit the `processing` flip first (FOR UPDATE lock), then call the PSP OUTSIDE
417
996
  // the tx (a failure refunds in a second tx). Never inline the PSP call inside the hold transaction.
418
997
  const tx = await this.drizzle.db.transaction((txn) => this.flipToProcessing({ txn, withdrawalId, adminId }));
419
- return this.settleApproved(tx, adminId);
998
+ return this.settleApproved(tx, adminId, meta);
420
999
  }
421
1000
  // Phase one: the pending -> processing flip under a FOR UPDATE lock. Extracted so the auto path can run it
422
1001
  // inside its advisory-locked cap-check transaction, committing the marker atomically. Never call the PSP here.
423
- async flipToProcessing({ txn, withdrawalId, adminId, reviewReason, }) {
1002
+ async flipToProcessing({ txn, withdrawalId, adminId, reviewReason, autoApprovalPivotAmount, }) {
424
1003
  const current = findOneOrThrow(await txn
425
1004
  .select()
426
1005
  .from(walletTransaction)
@@ -437,17 +1016,18 @@ export class WalletService {
437
1016
  reviewedBy: adminId,
438
1017
  reviewedAt: new Date(),
439
1018
  ...(reviewReason !== undefined ? { reviewReason } : {}),
1019
+ ...(autoApprovalPivotAmount !== undefined ? { autoApprovalPivotAmount } : {}),
440
1020
  })
441
1021
  .where(eq(walletTransaction.id, withdrawalId))
442
1022
  .returning(), new WithdrawalNotFoundError(withdrawalId));
443
1023
  }
444
1024
  // Phase two: settle a `processing` withdrawal via the PSP (Completed on success, Failed + refund on error).
445
1025
  // Runs OUTSIDE the hold/flip transaction so the external PSP call never holds a DB lock.
446
- async settleApproved(tx, adminId) {
1026
+ async settleApproved(tx, adminId, meta) {
447
1027
  const userId = await this.userIdForWallet(tx.walletId);
448
1028
  const amount = tx.amount;
449
- // approved/failed are admin-attributed events (schema requires a uuid adminId); the system auto path
450
- // skips them - its trail is the AUDIT_WRITER entry plus the shared `completed` event below.
1029
+ // `approved` is admin-attributed; the system auto path skips it - its trail is the
1030
+ // AUDIT_WRITER entry plus the shared `completed` event below.
451
1031
  if (adminId) {
452
1032
  this.events.emit('wallet.withdrawal.approved', {
453
1033
  userId,
@@ -455,16 +1035,27 @@ export class WalletService {
455
1035
  currency: tx.currency,
456
1036
  transactionId: tx.id,
457
1037
  adminId,
1038
+ ip: meta?.ip ?? null,
1039
+ userAgent: meta?.userAgent ?? null,
458
1040
  });
459
1041
  }
1042
+ const { providerName, adapter } = await this.paymentAdapterFor(tx.currency, tx.network);
460
1043
  let result;
461
1044
  try {
462
- result = await this.payment.processWithdrawal(amount, tx.currency, {
1045
+ result = await adapter.processWithdrawal(amount, tx.currency, {
463
1046
  transactionId: tx.id,
464
1047
  userId,
465
1048
  rail: tx.rail,
466
1049
  adminId,
467
1050
  destinationAddress: tx.destinationAddress,
1051
+ destinationTag: tx.destinationTag,
1052
+ // The provider-side whitelisted destination for that address, when the bound adapter
1053
+ // whitelists at all. Absent for an address that predates whitelisting or was never in
1054
+ // the book, and such an adapter is expected to refuse rather than pay out to the raw
1055
+ // address - the whitelist is the control, so bypassing it would defeat the point.
1056
+ ...(tx.destinationWalletId ? { destinationWalletId: tx.destinationWalletId } : {}),
1057
+ // Pinned at request time; without it an adapter cannot tell ERC20 USDT from TRC20.
1058
+ network: tx.network,
468
1059
  });
469
1060
  }
470
1061
  catch (err) {
@@ -479,7 +1070,10 @@ export class WalletService {
479
1070
  if (result.status !== 'completed') {
480
1071
  await this.drizzle.db
481
1072
  .update(walletTransaction)
482
- .set({ providerName: providerNameFor(tx.rail), providerRefId: result.externalId })
1073
+ .set({
1074
+ providerName,
1075
+ providerRefId: result.externalId,
1076
+ })
483
1077
  .where(eq(walletTransaction.id, tx.id));
484
1078
  return { transactionId: tx.id, status: 'processing' };
485
1079
  }
@@ -487,12 +1081,13 @@ export class WalletService {
487
1081
  .update(walletTransaction)
488
1082
  .set({
489
1083
  status: 'completed',
490
- providerName: providerNameFor(tx.rail),
1084
+ providerName,
491
1085
  providerRefId: result.externalId,
492
1086
  })
493
1087
  .where(eq(walletTransaction.id, tx.id));
494
1088
  this.events.emit('wallet.withdrawal.completed', {
495
1089
  userId,
1090
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
496
1091
  amount,
497
1092
  currency: tx.currency,
498
1093
  transactionId: tx.id,
@@ -509,13 +1104,24 @@ export class WalletService {
509
1104
  if (updated.length === 0) {
510
1105
  return false;
511
1106
  }
512
- await txn
513
- .update(wallet)
514
- .set({ balance: sql `${wallet.balance} + ${amount}::numeric` })
515
- .where(eq(wallet.id, tx.walletId));
1107
+ await creditWalletBalance(txn, tx.walletId, tx.currency, amount);
1108
+ // In the same transaction as the credit, not left to the `wallet.withdrawal.failed`
1109
+ // subscriber below: that fires only after commit, so a crash or a dead subscriber
1110
+ // between the two would return the funds with no audit row behind the movement.
1111
+ await this.audit.recordInTransaction(txn, {
1112
+ actorType: adminId ? 'admin' : 'system',
1113
+ actorId: adminId,
1114
+ action: 'wallet.withdrawal.failed',
1115
+ resourceType: 'withdrawal',
1116
+ resourceId: tx.id,
1117
+ after: { userId, amount, currency: tx.currency, reason: null },
1118
+ });
516
1119
  return true;
517
1120
  });
518
- if (transitioned && adminId) {
1121
+ // Emitted on every path that returns held funds, not just the admin-reviewed one.
1122
+ // Notification-only now - the audit plugin no longer subscribes this topic, see
1123
+ // the recordInTransaction call above.
1124
+ if (transitioned) {
519
1125
  this.events.emit('wallet.withdrawal.failed', {
520
1126
  userId,
521
1127
  amount,
@@ -525,14 +1131,14 @@ export class WalletService {
525
1131
  });
526
1132
  }
527
1133
  }
528
- async reconcileWithdrawalStatus(event) {
1134
+ async reconcileWithdrawalStatus(event, providerName = DEFAULT_PAYMENT_PROVIDER) {
529
1135
  const { externalId, status, txHash } = event;
530
1136
  const [tx] = await this.drizzle.db
531
1137
  .select()
532
1138
  .from(walletTransaction)
533
- .where(eq(walletTransaction.providerRefId, externalId));
1139
+ .where(and(eq(walletTransaction.providerName, providerName), eq(walletTransaction.providerRefId, externalId)));
534
1140
  if (!tx || tx.type !== 'withdrawal') {
535
- logger.warn({ externalId }, 'payment webhook: no matching withdrawal for providerRefId');
1141
+ logger.warn({ externalId, providerName }, 'payment webhook: no matching withdrawal for providerRefId');
536
1142
  return;
537
1143
  }
538
1144
  if (tx.status !== 'processing') {
@@ -550,6 +1156,7 @@ export class WalletService {
550
1156
  }
551
1157
  this.events.emit('wallet.withdrawal.completed', {
552
1158
  userId,
1159
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
553
1160
  amount: tx.amount,
554
1161
  currency: tx.currency,
555
1162
  transactionId: tx.id,
@@ -568,7 +1175,8 @@ export class WalletService {
568
1175
  }
569
1176
  try {
570
1177
  const cfg = this.platformConfig.autoWithdrawal;
571
- // Threshold/KYC/risk/velocity gates run outside any lock; only the cap check below needs serializing.
1178
+ // Threshold/KYC/risk/velocity gates and the fx conversion run outside any lock; only the cap check
1179
+ // below needs serializing, and it reads stored pivot values, never the rate reader.
572
1180
  const gates = await this.evaluateAutoApproval(args);
573
1181
  if (!gates) {
574
1182
  return undefined;
@@ -578,7 +1186,7 @@ export class WalletService {
578
1186
  // and the flip that writes the marker commit together, so a blocked caller re-reads current usage.
579
1187
  // PSP settlement runs AFTER, outside the lock.
580
1188
  const decided = await this.drizzle.db.transaction((txn) => withAdvisoryXactLock(txn, args.userId, async () => {
581
- const caps = await this.autoApprovalCaps({ walletId: args.walletId, amount: args.amount, cfg }, txn);
1189
+ const caps = await this.autoApprovalCaps({ walletId: args.walletId, pivotAmount: gates.pivotAmount, cfg }, txn);
582
1190
  if (caps.exceeded) {
583
1191
  return null;
584
1192
  }
@@ -587,6 +1195,7 @@ export class WalletService {
587
1195
  withdrawalId: args.transactionId,
588
1196
  adminId: null,
589
1197
  reviewReason: AUTO_APPROVED_REASON,
1198
+ autoApprovalPivotAmount: gates.pivotAmount,
590
1199
  });
591
1200
  return { tx, caps };
592
1201
  }));
@@ -620,7 +1229,13 @@ export class WalletService {
620
1229
  // with no PSP attempt, so revert to `pending` before rethrowing (held funds are unaffected).
621
1230
  await this.drizzle.db
622
1231
  .update(walletTransaction)
623
- .set({ status: 'pending', reviewedBy: null, reviewedAt: null, reviewReason: null })
1232
+ .set({
1233
+ status: 'pending',
1234
+ reviewedBy: null,
1235
+ reviewedAt: null,
1236
+ reviewReason: null,
1237
+ autoApprovalPivotAmount: null,
1238
+ })
624
1239
  .where(eq(walletTransaction.id, args.transactionId));
625
1240
  throw err;
626
1241
  }
@@ -634,32 +1249,37 @@ export class WalletService {
634
1249
  }
635
1250
  // Pre-lock gates: threshold, KYC, risk flags, velocity. Returns the gate values on a pass, null to
636
1251
  // route to manual. The daily-cap check is NOT here - it runs under the advisory lock (see maybeAutoApprove).
637
- async evaluateAutoApproval({ userId, amount, walletId, rail, }) {
1252
+ async evaluateAutoApproval({ userId, amount, currency, walletId, rail, }) {
638
1253
  const cfg = this.platformConfig?.autoWithdrawal;
639
1254
  if (!cfg?.enabled) {
640
1255
  return null;
641
1256
  }
642
1257
  const threshold = await this.resolveAutoThreshold(userId, rail);
643
- if (!threshold || moneyToNumber(threshold.value) <= 0) {
1258
+ if (!threshold || moneyCompare(threshold.value, '0') <= 0) {
644
1259
  return null;
645
1260
  }
646
- if (moneyToNumber(amount) > moneyToNumber(threshold.value)) {
1261
+ // One threshold serves every currency on the rail, so it is read in the fx pivot. A raw
1262
+ // comparison let 0.4 BTC clear a threshold of 1 that was written with a stablecoin in mind.
1263
+ const pivotCurrency = resolveExchangeRatePivot(this.platformConfig?.exchangeRate);
1264
+ const pivotAmount = await this.toPivotAmount(amount, currency, pivotCurrency);
1265
+ if (pivotAmount === null || moneyCompare(pivotAmount, threshold.value) > 0) {
647
1266
  return null;
648
1267
  }
649
1268
  // Independent of kyc.gateWithdrawals: auto-approval always demands a passing status; anything else fails closed.
650
1269
  const kycStatus = await this.autoApprovalKycStatus(userId);
651
- if (!kycStatus || !KYC_PASS_STATUSES.has(kycStatus)) {
1270
+ if (!kycStatus || !KYC_PASS_STATUSES.has(normalizeKycStatus(kycStatus))) {
652
1271
  return null;
653
1272
  }
654
- const riskTags = await this.autoApprovalRiskTags(userId, cfg.excludeRiskFlags);
1273
+ const effectiveExcludeTags = threshold.config.excludeRiskFlags;
1274
+ const riskTags = await this.autoApprovalRiskTags(userId, effectiveExcludeTags);
655
1275
  // null = exclusions configured but the lookup port is unavailable => fail closed.
656
1276
  if (riskTags === null) {
657
1277
  return null;
658
1278
  }
659
- if (riskTags.some((t) => cfg.excludeRiskFlags.includes(t))) {
1279
+ if (riskTags.some((t) => effectiveExcludeTags.includes(t))) {
660
1280
  return null;
661
1281
  }
662
- const heuristics = await this.autoApprovalHeuristics({ walletId, amount });
1282
+ const heuristics = await this.autoApprovalHeuristics({ walletId, amount: pivotAmount });
663
1283
  if (heuristics.largeAmount || heuristics.highFrequency) {
664
1284
  return null;
665
1285
  }
@@ -668,23 +1288,302 @@ export class WalletService {
668
1288
  thresholdSource: threshold.source,
669
1289
  kycStatus,
670
1290
  riskTagsEvaluated: riskTags,
1291
+ effectiveExcludeTags,
1292
+ pivotAmount,
1293
+ pivotCurrency,
671
1294
  };
672
1295
  }
673
1296
  async resolveAutoThreshold(userId, rail) {
1297
+ // Always read the global singleton first, even when a per-player override may end up
1298
+ // winning below - an unseeded install (missing row) must fail closed for EVERY player,
1299
+ // not just those without an override. getAutoWithdrawalConfig() throws when absent.
1300
+ const config = await this.getAutoWithdrawalConfig();
674
1301
  const [rule] = await this.drizzle.db
675
1302
  .select()
676
1303
  .from(autoWithdrawalRule)
677
1304
  .where(eq(autoWithdrawalRule.userId, userId));
678
1305
  if (rule) {
679
- return { value: rule.threshold, source: 'per-player' };
1306
+ return { value: rule.threshold, source: 'per-player', config };
1307
+ }
1308
+ const global = rail === 'crypto' ? config.cryptoThreshold : config.fiatThreshold;
1309
+ return { value: global, source: 'global', config };
1310
+ }
1311
+ // The row always exists in a properly-seeded install (seeded once) - a
1312
+ // missing row is an unexpected failure mode on the READ path, not a normal
1313
+ // "unconfigured" state, so this throws rather than silently defaulting.
1314
+ // maybeAutoApprove's outer try/catch handles that thrown error the same as any
1315
+ // other unexpected error: fail closed to pending.
1316
+ async getAutoWithdrawalConfig() {
1317
+ const config = await this.getAutoWithdrawalConfigOrNull();
1318
+ if (!config) {
1319
+ throw new AutoWithdrawalConfigNotFoundError('global');
1320
+ }
1321
+ return config;
1322
+ }
1323
+ // Non-throwing variant for callers that need to tell "missing" from "found"
1324
+ // without a try/catch (eg the router's audit `before` read).
1325
+ async getAutoWithdrawalConfigOrNull() {
1326
+ const [row] = await this.drizzle.db
1327
+ .select()
1328
+ .from(walletAutoWithdrawalConfig)
1329
+ .where(eq(walletAutoWithdrawalConfig.singletonKey, 'global'));
1330
+ return row ? toAutoWithdrawalConfigDto(row) : null;
1331
+ }
1332
+ // Upsert, not a plain UPDATE: the WRITE path lets a Super Admin self-heal a
1333
+ // missing singleton row (eg an install that skipped the seed step) through the
1334
+ // existing route with zero new surface. The READ path (getAutoWithdrawalConfig,
1335
+ // resolveAutoThreshold) still throws on a missing row and stays fail-closed -
1336
+ // a withdrawal must never silently create config.
1337
+ //
1338
+ // Update + audit write run in one transaction: an audit-write failure must roll back
1339
+ // the threshold change too, or the config could change with no audit trail.
1340
+ async setAutoWithdrawalConfig(adminId, { fiatThreshold, cryptoThreshold, excludeRiskFlags, }, meta) {
1341
+ return this.drizzle.db.transaction(async (txn) => {
1342
+ const [before] = await txn
1343
+ .select()
1344
+ .from(walletAutoWithdrawalConfig)
1345
+ .where(eq(walletAutoWithdrawalConfig.singletonKey, 'global'));
1346
+ const rows = await txn
1347
+ .insert(walletAutoWithdrawalConfig)
1348
+ .values({
1349
+ singletonKey: 'global',
1350
+ fiatThreshold,
1351
+ cryptoThreshold,
1352
+ excludeRiskFlags,
1353
+ updatedBy: adminId,
1354
+ })
1355
+ .onConflictDoUpdate({
1356
+ target: walletAutoWithdrawalConfig.singletonKey,
1357
+ set: { fiatThreshold, cryptoThreshold, excludeRiskFlags, updatedBy: adminId },
1358
+ })
1359
+ .returning();
1360
+ const config = toAutoWithdrawalConfigDto(findOneOrThrow(rows, new AutoWithdrawalConfigNotFoundError('global')));
1361
+ await this.audit.recordInTransaction(txn, {
1362
+ actorId: adminId,
1363
+ actorType: 'admin',
1364
+ action: 'wallet.auto_withdrawal_config.set',
1365
+ resourceType: 'auto_withdrawal_config',
1366
+ resourceId: config.id,
1367
+ before: before
1368
+ ? {
1369
+ fiatThreshold: before.fiatThreshold,
1370
+ cryptoThreshold: before.cryptoThreshold,
1371
+ excludeRiskFlags: before.excludeRiskFlags,
1372
+ }
1373
+ : null,
1374
+ after: {
1375
+ fiatThreshold: config.fiatThreshold,
1376
+ cryptoThreshold: config.cryptoThreshold,
1377
+ excludeRiskFlags: config.excludeRiskFlags,
1378
+ },
1379
+ ...meta,
1380
+ });
1381
+ return config;
1382
+ });
1383
+ }
1384
+ async getBonusRolloverStatus(userId, status = 'active') {
1385
+ const rows = await this.drizzle.db
1386
+ .select()
1387
+ .from(walletBonusCredit)
1388
+ .where(and(eq(walletBonusCredit.userId, userId), eq(walletBonusCredit.status, status)))
1389
+ .orderBy(desc(walletBonusCredit.createdAt))
1390
+ .limit(50);
1391
+ return { credits: rows.map(toBonusCreditDto) };
1392
+ }
1393
+ async getBonusRolloverConfig() {
1394
+ const config = await this.getBonusRolloverConfigOrNull();
1395
+ if (!config) {
1396
+ throw new BonusRolloverConfigNotFoundError('global');
680
1397
  }
681
- const global = rail === 'crypto'
682
- ? this.platformConfig?.autoWithdrawal?.cryptoThreshold
683
- : this.platformConfig?.autoWithdrawal?.fiatThreshold;
684
- if (global !== undefined) {
685
- return { value: global, source: 'global' };
1398
+ return config;
1399
+ }
1400
+ async getBonusRolloverConfigOrNull() {
1401
+ const [row] = await this.drizzle.db
1402
+ .select()
1403
+ .from(walletBonusRolloverConfig)
1404
+ .where(eq(walletBonusRolloverConfig.singletonKey, 'global'));
1405
+ return row ? toBonusRolloverConfigDto(row) : null;
1406
+ }
1407
+ async setBonusRolloverConfig(adminId, { multiplier }, meta) {
1408
+ return this.drizzle.db.transaction(async (txn) => {
1409
+ const [before] = await txn
1410
+ .select()
1411
+ .from(walletBonusRolloverConfig)
1412
+ .where(eq(walletBonusRolloverConfig.singletonKey, 'global'));
1413
+ const rows = await txn
1414
+ .insert(walletBonusRolloverConfig)
1415
+ .values({ singletonKey: 'global', multiplier, updatedBy: adminId })
1416
+ .onConflictDoUpdate({
1417
+ target: walletBonusRolloverConfig.singletonKey,
1418
+ set: { multiplier, updatedBy: adminId, updatedAt: new Date() },
1419
+ })
1420
+ .returning();
1421
+ const config = toBonusRolloverConfigDto(findOneOrThrow(rows, new BonusRolloverConfigNotFoundError('global')));
1422
+ await this.audit.recordInTransaction(txn, {
1423
+ actorId: adminId,
1424
+ actorType: 'admin',
1425
+ action: 'wallet.bonus_rollover_config.set',
1426
+ resourceType: 'bonus_rollover_config',
1427
+ resourceId: config.id,
1428
+ before: before ? { multiplier: before.multiplier } : null,
1429
+ after: { multiplier: config.multiplier },
1430
+ ...meta,
1431
+ });
1432
+ return config;
1433
+ });
1434
+ }
1435
+ async listWalletAssets() {
1436
+ const rows = await this.drizzle.db
1437
+ .select()
1438
+ .from(walletAsset)
1439
+ .orderBy(asc(walletAsset.currency), asc(walletAsset.network));
1440
+ return rows.map(toWalletAssetDto);
1441
+ }
1442
+ listEnabledWalletAssets() {
1443
+ return this.drizzle.db
1444
+ .select(PUBLIC_ASSET_COLUMNS)
1445
+ .from(walletAsset)
1446
+ .where(or(eq(walletAsset.depositEnabled, true), eq(walletAsset.withdrawalEnabled, true)))
1447
+ .orderBy(asc(walletAsset.currency), asc(walletAsset.network));
1448
+ }
1449
+ async getWalletAsset(currency, network) {
1450
+ const [row] = await this.drizzle.db
1451
+ .select()
1452
+ .from(walletAsset)
1453
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
1454
+ return row ? toWalletAssetDto(row) : null;
1455
+ }
1456
+ // The catalog is operator-editable, so an admin can name a pair the bound vendor has
1457
+ // never heard of. Reject at write time rather than at a player's deposit request.
1458
+ assertAdapterSupports(currency, network, providerName) {
1459
+ const adapter = (providerName ? this.paymentProviders.get(providerName)?.adapter : undefined) ?? this.payment;
1460
+ if (adapter.supportsAsset && !adapter.supportsAsset(currency, network)) {
1461
+ throw new WalletAssetUnsupportedError();
686
1462
  }
687
- return null;
1463
+ }
1464
+ // Same discipline as assertAdapterSupports, for the provider key itself: an
1465
+ // unvalidated typo silently falls back to the default adapter, which means eg a
1466
+ // crypto payout attempted through a PSP. Undefined (the default binding) always passes.
1467
+ assertProviderNameValid(providerName) {
1468
+ if (providerName !== undefined && !this.paymentProviders.names().includes(providerName)) {
1469
+ throw new WalletAssetUnknownProviderError();
1470
+ }
1471
+ }
1472
+ async createWalletAsset(adminId, input, meta) {
1473
+ this.assertProviderNameValid(input.providerName);
1474
+ this.assertAdapterSupports(input.currency, input.network, input.providerName);
1475
+ return this.drizzle.db.transaction(async (txn) => {
1476
+ const rows = await txn.insert(walletAsset).values(input).onConflictDoNothing().returning();
1477
+ // Empty => the (currency, network) unique index rejected it.
1478
+ const asset = toWalletAssetDto(findOneOrThrow(rows, new WalletAssetAlreadyExistsError()));
1479
+ await this.audit.recordInTransaction(txn, {
1480
+ actorId: adminId,
1481
+ actorType: 'admin',
1482
+ action: 'wallet.wallet_asset.created',
1483
+ resourceType: 'wallet_asset',
1484
+ resourceId: asset.id,
1485
+ before: null,
1486
+ after: asset,
1487
+ ...meta,
1488
+ });
1489
+ return asset;
1490
+ });
1491
+ }
1492
+ // Deliberately touches only the catalog row: a withdrawal already pending or processing
1493
+ // in this currency keeps its own terms and is never cancelled by disabling the pair.
1494
+ async updateWalletAsset(adminId, { currency, network, ...changes }, meta) {
1495
+ return this.drizzle.db.transaction(async (txn) => {
1496
+ const [before] = await txn
1497
+ .select()
1498
+ .from(walletAsset)
1499
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
1500
+ // Held until commit, so an address issuance that already gated against this row
1501
+ // (see depositAssetsForCurrency) commits its address first and is then seen by
1502
+ // the in-use count below, instead of slipping in behind the delete.
1503
+ .for('update');
1504
+ if (!before) {
1505
+ throw new WalletAssetNotFoundError(`${currency}/${network}`);
1506
+ }
1507
+ if (changes.providerAssetId !== undefined) {
1508
+ this.assertAdapterSupports(currency, network, before.providerName ?? undefined);
1509
+ }
1510
+ const rows = await txn
1511
+ .update(walletAsset)
1512
+ .set(changes)
1513
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
1514
+ .returning();
1515
+ const asset = toWalletAssetDto(findOneOrThrow(rows, new WalletAssetNotFoundError(`${currency}/${network}`)));
1516
+ await this.audit.recordInTransaction(txn, {
1517
+ actorId: adminId,
1518
+ actorType: 'admin',
1519
+ action: 'wallet.wallet_asset.updated',
1520
+ resourceType: 'wallet_asset',
1521
+ resourceId: asset.id,
1522
+ before: toWalletAssetDto(before),
1523
+ after: asset,
1524
+ ...meta,
1525
+ });
1526
+ return asset;
1527
+ });
1528
+ }
1529
+ async deleteWalletAsset(adminId, currency, network, meta) {
1530
+ return this.drizzle.db.transaction(async (txn) => {
1531
+ const [before] = await txn
1532
+ .select()
1533
+ .from(walletAsset)
1534
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
1535
+ // Held until commit, so an address issuance that already gated against this row
1536
+ // (see depositAssetsForCurrency) commits its address first and is then seen by
1537
+ // the in-use count below, instead of slipping in behind the delete.
1538
+ .for('update');
1539
+ if (!before) {
1540
+ return false;
1541
+ }
1542
+ // wallet_balance is keyed by currency only (no network column), so this guard is
1543
+ // necessarily currency-wide: removing one network of a currency players still hold
1544
+ // is blocked even if their balance arrived over another network. Fails safe.
1545
+ const held = await txn
1546
+ .select({ id: walletBalance.id })
1547
+ .from(walletBalance)
1548
+ .where(and(eq(walletBalance.currency, currency), sql `${walletBalance.amount} > 0`))
1549
+ .for('update');
1550
+ if (held.length > 0) {
1551
+ throw new WalletAssetInUseError();
1552
+ }
1553
+ const [issued] = await txn
1554
+ .select({ n: count() })
1555
+ .from(walletDepositAddress)
1556
+ .where(and(eq(walletDepositAddress.currency, currency), eq(walletDepositAddress.network, network)));
1557
+ if ((issued?.n ?? 0) > 0) {
1558
+ throw new WalletAssetHasIssuedAddressesError();
1559
+ }
1560
+ // Renaming a pair is a delete plus a create (the (currency, network) key AND
1561
+ // providerName are immutable), so this delete is the only way providerName ever
1562
+ // effectively changes. Block it while a pending/processing transaction exists for
1563
+ // this exact (currency, network) pair - otherwise the vendor reference an in-flight
1564
+ // payout is settling through gets rewritten out from under it.
1565
+ const [inFlight] = await txn
1566
+ .select({ n: count() })
1567
+ .from(walletTransaction)
1568
+ .where(and(eq(walletTransaction.currency, currency), eq(walletTransaction.network, network), inArray(walletTransaction.status, ['pending', 'processing'])));
1569
+ if ((inFlight?.n ?? 0) > 0) {
1570
+ throw new WalletAssetHasInFlightTransactionsError();
1571
+ }
1572
+ await txn
1573
+ .delete(walletAsset)
1574
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
1575
+ await this.audit.recordInTransaction(txn, {
1576
+ actorId: adminId,
1577
+ actorType: 'admin',
1578
+ action: 'wallet.wallet_asset.deleted',
1579
+ resourceType: 'wallet_asset',
1580
+ resourceId: before.id,
1581
+ before: toWalletAssetDto(before),
1582
+ after: null,
1583
+ ...meta,
1584
+ });
1585
+ return true;
1586
+ });
688
1587
  }
689
1588
  async autoApprovalKycStatus(userId) {
690
1589
  // No directory bound => cannot verify KYC => fail closed.
@@ -708,7 +1607,7 @@ export class WalletService {
708
1607
  async autoApprovalHeuristics({ walletId, amount, }) {
709
1608
  const frequent = await this.frequentWithdrawalWalletIds(this.drizzle.db, [walletId]);
710
1609
  return {
711
- largeAmount: moneyToNumber(amount) >= moneyToNumber(LARGE_WITHDRAWAL_THRESHOLD),
1610
+ largeAmount: moneyCompare(amount, LARGE_WITHDRAWAL_THRESHOLD) >= 0,
712
1611
  highFrequency: frequent.has(walletId),
713
1612
  };
714
1613
  }
@@ -734,24 +1633,35 @@ export class WalletService {
734
1633
  }
735
1634
  // Sum + count of this wallet's auto-approved payouts in the trailing 24h; `exceeded` when this withdrawal
736
1635
  // would breach a configured amount or count cap (an unconfigured cap never blocks).
737
- async autoApprovalCaps({ walletId, amount, cfg, }, db) {
1636
+ // The amount cap is in the fx pivot and sums the value each payout was approved at, so a rate
1637
+ // move since cannot shrink it and no rate is read under the lock. A trailing payout with no
1638
+ // stored value (approved before the column existed) leaves the total unknown: `amountUsed` is
1639
+ // null and a configured amount cap counts as exceeded.
1640
+ async autoApprovalCaps({ walletId, pivotAmount, cfg, }, db) {
738
1641
  const since = new Date(Date.now() - DAILY_CAP_WINDOW_MS);
739
1642
  const [row] = await db
740
1643
  .select({
741
- total: sql `coalesce(sum(${walletTransaction.amount}), 0)`,
1644
+ total: sql `coalesce(sum(${walletTransaction.autoApprovalPivotAmount}), 0)`,
742
1645
  n: count(),
1646
+ priced: count(walletTransaction.autoApprovalPivotAmount),
743
1647
  })
744
1648
  .from(walletTransaction)
745
1649
  .where(and(eq(walletTransaction.walletId, walletId), eq(walletTransaction.type, 'withdrawal'), eq(walletTransaction.reviewReason, AUTO_APPROVED_REASON), gte(walletTransaction.createdAt, since)));
746
- const amountUsed = row?.total ?? '0';
747
- const countUsed = Number(row?.n ?? 0);
748
- // Cap comparison is a review-queue decision, not a ledger write - moneyToNumber is the
749
- // documented single conversion point (see the helper's own doc comment).
1650
+ const countUsed = row?.n ?? 0;
1651
+ const amountUsed = (row?.priced ?? 0) < countUsed ? null : (row?.total ?? '0');
750
1652
  const amountExceeded = cfg.dailyCapAmount !== undefined &&
751
- moneyToNumber(amountUsed) + moneyToNumber(amount) > moneyToNumber(cfg.dailyCapAmount);
1653
+ (amountUsed === null ||
1654
+ moneyCompare(moneyAdd(amountUsed, pivotAmount), cfg.dailyCapAmount) > 0);
752
1655
  const countExceeded = cfg.dailyCapCount !== undefined && countUsed + 1 > cfg.dailyCapCount;
753
1656
  return { exceeded: amountExceeded || countExceeded, amountUsed, countUsed };
754
1657
  }
1658
+ // A withdrawal already in the pivot needs no rate, so it is valued even without the fx module.
1659
+ async toPivotAmount(amount, currency, pivotCurrency) {
1660
+ if (currency.toUpperCase() === pivotCurrency) {
1661
+ return amount;
1662
+ }
1663
+ return this.rates ? this.rates.convert(amount, currency, pivotCurrency) : null;
1664
+ }
755
1665
  async setAutoWithdrawalRule({ userId, threshold, reason, createdBy, }) {
756
1666
  const row = findOneOrThrow(await this.drizzle.db
757
1667
  .insert(autoWithdrawalRule)
@@ -777,7 +1687,7 @@ export class WalletService {
777
1687
  .returning({ id: autoWithdrawalRule.id });
778
1688
  return deleted.length > 0;
779
1689
  }
780
- async rejectWithdrawal(adminId, withdrawalId, reason) {
1690
+ async rejectWithdrawal(adminId, withdrawalId, reason, meta) {
781
1691
  const reviewedAt = new Date();
782
1692
  const tx = await this.drizzle.db.transaction(async (txn) => {
783
1693
  const current = findOneOrThrow(await txn
@@ -793,10 +1703,7 @@ export class WalletService {
793
1703
  .set({ status: 'rejected', reviewedBy: adminId, reviewedAt, reviewReason: reason })
794
1704
  .where(eq(walletTransaction.id, withdrawalId))
795
1705
  .returning(), new WithdrawalNotFoundError(withdrawalId));
796
- await txn
797
- .update(wallet)
798
- .set({ balance: sql `${wallet.balance} + ${updated.amount}::numeric` })
799
- .where(eq(wallet.id, updated.walletId));
1706
+ await creditWalletBalance(txn, updated.walletId, updated.currency, updated.amount);
800
1707
  return updated;
801
1708
  });
802
1709
  const userId = await this.userIdForWallet(tx.walletId);
@@ -807,22 +1714,35 @@ export class WalletService {
807
1714
  transactionId: tx.id,
808
1715
  adminId,
809
1716
  reason,
1717
+ ip: meta?.ip ?? null,
1718
+ userAgent: meta?.userAgent ?? null,
810
1719
  });
811
1720
  return { transactionId: tx.id, status: 'rejected' };
812
1721
  }
813
- async getTransactions(userId, page, limit) {
1722
+ async getTransactions({ userId, page, limit, sortBy, sortOrder, includeInternal = false, }) {
814
1723
  const db = this.drizzle.db;
815
1724
  const [walletRecord] = await db.select().from(wallet).where(eq(wallet.userId, userId));
816
1725
  if (!walletRecord) {
817
1726
  return { items: [], total: 0, page, limit };
818
1727
  }
1728
+ const dir = (sortOrder ?? 'desc') === 'asc' ? asc : desc;
1729
+ const TX_SORT_COLS = {
1730
+ createdAt: walletTransaction.createdAt,
1731
+ amount: walletTransaction.amount,
1732
+ type: walletTransaction.type,
1733
+ status: walletTransaction.status,
1734
+ currency: walletTransaction.currency,
1735
+ rail: walletTransaction.rail,
1736
+ reviewedAt: walletTransaction.reviewedAt,
1737
+ };
1738
+ const col = TX_SORT_COLS[sortBy ?? 'createdAt'];
819
1739
  const where = eq(walletTransaction.walletId, walletRecord.id);
820
1740
  const [txs, [{ n }]] = await Promise.all([
821
1741
  db
822
1742
  .select()
823
1743
  .from(walletTransaction)
824
1744
  .where(where)
825
- .orderBy(desc(walletTransaction.createdAt))
1745
+ .orderBy(dir(col), desc(walletTransaction.id))
826
1746
  .limit(limit)
827
1747
  .offset(pageToOffset(page, limit)),
828
1748
  db.select({ n: count() }).from(walletTransaction).where(where),
@@ -833,50 +1753,108 @@ export class WalletService {
833
1753
  type: tx.type,
834
1754
  amount: tx.amount,
835
1755
  currency: tx.currency,
1756
+ network: tx.network,
836
1757
  status: tx.status,
1758
+ direction: tx.direction,
837
1759
  createdAt: tx.createdAt.toISOString(),
1760
+ reviewedBy: includeInternal ? tx.reviewedBy : null,
1761
+ reviewedAt: includeInternal ? (tx.reviewedAt?.toISOString() ?? null) : null,
1762
+ reviewReason: includeInternal || MANUAL_ADJUSTMENT_TYPES.has(tx.type) ? tx.reviewReason : null,
838
1763
  })),
839
1764
  total: Number(n),
840
1765
  page,
841
1766
  limit,
842
1767
  };
843
1768
  }
844
- async getOrCreateDepositAddress(userId, currency) {
845
- const existing = await this.findDepositAddress(userId, currency);
1769
+ async getOrCreateDepositAddress(userId, currency, network) {
1770
+ await this.assertDepositable(currency, undefined, network);
1771
+ const existing = await this.findDepositAddress(userId, currency, network);
846
1772
  if (existing) {
847
- return { address: existing.address, currency: existing.currency };
1773
+ return toDepositAddressResult(existing);
848
1774
  }
849
- if (!this.payment.issueDepositAddress) {
1775
+ const { providerName, adapter } = await this.paymentAdapterFor(currency, network ?? null);
1776
+ if (!adapter.issueDepositAddress) {
850
1777
  throw new DepositAddressUnsupportedError();
851
1778
  }
852
- const issued = await this.payment.issueDepositAddress(userId, currency);
853
- const [row] = await this.drizzle.db
854
- .insert(walletDepositAddress)
855
- .values({
856
- userId,
857
- currency,
858
- address: issued.address,
859
- providerName: providerNameFor(railFor(currency)),
860
- })
861
- .onConflictDoNothing()
862
- .returning();
1779
+ const issued = await adapter.issueDepositAddress(userId, currency, network);
1780
+ // Re-gate inside the transaction that writes the row: the catalog pair can be
1781
+ // disabled or deleted while the vendor call is in flight, and this is what makes
1782
+ // deleteWalletAsset's in-use check race-free.
1783
+ const [row] = await this.drizzle.db.transaction(async (txn) => {
1784
+ await this.assertDepositable(currency, undefined, network, txn);
1785
+ return txn
1786
+ .insert(walletDepositAddress)
1787
+ .values({
1788
+ userId,
1789
+ currency,
1790
+ network: network ?? null,
1791
+ address: issued.address,
1792
+ tag: issued.tag ?? null,
1793
+ providerName,
1794
+ })
1795
+ .onConflictDoNothing()
1796
+ .returning();
1797
+ });
863
1798
  if (row) {
864
- return { address: row.address, currency: row.currency };
1799
+ return toDepositAddressResult(row);
865
1800
  }
866
- const winner = await this.findDepositAddress(userId, currency);
1801
+ const winner = await this.findDepositAddress(userId, currency, network);
867
1802
  if (!winner) {
868
- throw new Error(`wallet deposit address: idempotency conflict but no row found (userId=${userId}, currency=${currency})`);
1803
+ throw new Error(`wallet deposit address: idempotency conflict but no row found (userId=${userId}, currency=${currency}, network=${network ?? 'none'})`);
869
1804
  }
870
- return { address: winner.address, currency: winner.currency };
1805
+ return toDepositAddressResult(winner);
871
1806
  }
872
- async creditDepositByAddress(event) {
873
- const depositAddress = await this.findDepositAddressByAddress(event.address);
1807
+ /**
1808
+ * `providerName` is the vendor the webhook route already resolved (verifier + adapter
1809
+ * came from the same registry entry) - it is only used to label a finding when this
1810
+ * deposit can't be attributed, never to look anything up. Defaults to the single
1811
+ * default binding for callers (tests, a poller with no named provider) that don't care.
1812
+ */
1813
+ async creditDepositByAddress(event, providerName = DEFAULT_PAYMENT_PROVIDER) {
1814
+ const depositAddress = await this.findDepositAddressByAddress(event);
874
1815
  if (!depositAddress) {
875
- logger.warn({ address: event.address }, 'payment webhook: no wallet_deposit_address for inbound deposit');
1816
+ // A known vendor defect hits this live: a token deposit reported under a sibling
1817
+ // token's asset id never resolves to a row. Never let it survive only as a log
1818
+ // line - file a finding so an operator can attribute and manually credit it.
1819
+ logger.warn({ address: event.address, network: event.network, tag: event.tag }, 'payment webhook: no wallet_deposit_address for inbound deposit');
1820
+ await recordReconciliationFinding(this.drizzle.db, {
1821
+ runId: OUT_OF_CYCLE_RUN_ID,
1822
+ providerName,
1823
+ kind: 'unattributed_deposit',
1824
+ currency: event.currency,
1825
+ network: event.network ?? null,
1826
+ amount: event.amount,
1827
+ address: event.address,
1828
+ tag: event.tag ?? null,
1829
+ txHash: event.txHash,
1830
+ externalId: event.externalId,
1831
+ detail: 'no wallet_deposit_address matched this address/network/tag',
1832
+ }, this.audit);
876
1833
  return;
877
1834
  }
878
- if (event.currency.toUpperCase() !== depositAddress.currency.toUpperCase()) {
879
- throw new CurrencyMismatchError(event.currency, depositAddress.currency);
1835
+ if (event.network === undefined &&
1836
+ event.currency.toUpperCase() !== depositAddress.currency.toUpperCase()) {
1837
+ // Same "do not silently drop" discipline as the no-address branch above - this is
1838
+ // the push-path counterpart to the poll-path's currency_mismatch finding.
1839
+ logger.warn({
1840
+ address: event.address,
1841
+ eventCurrency: event.currency,
1842
+ addressCurrency: depositAddress.currency,
1843
+ }, 'payment webhook: currency mismatch for inbound deposit');
1844
+ await recordReconciliationFinding(this.drizzle.db, {
1845
+ runId: OUT_OF_CYCLE_RUN_ID,
1846
+ providerName: depositAddress.providerName,
1847
+ kind: 'currency_mismatch',
1848
+ currency: event.currency,
1849
+ network: event.network ?? depositAddress.network,
1850
+ amount: event.amount,
1851
+ address: event.address,
1852
+ tag: event.tag ?? null,
1853
+ txHash: event.txHash,
1854
+ externalId: event.externalId,
1855
+ detail: `currency mismatch: event reported ${event.currency}, address issued for ${depositAddress.currency}`,
1856
+ }, this.audit);
1857
+ return;
880
1858
  }
881
1859
  const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
882
1860
  let [walletRecord] = await txn
@@ -886,12 +1864,9 @@ export class WalletService {
886
1864
  if (!walletRecord) {
887
1865
  walletRecord = findOneOrThrow(await txn
888
1866
  .insert(wallet)
889
- .values({ userId: depositAddress.userId, balance: '0', currency: event.currency })
1867
+ .values({ userId: depositAddress.userId, currency: event.currency })
890
1868
  .returning(), new WalletNotFoundError(depositAddress.userId));
891
1869
  }
892
- else if (walletRecord.currency.toUpperCase() !== event.currency.toUpperCase()) {
893
- throw new CurrencyMismatchError(event.currency, walletRecord.currency);
894
- }
895
1870
  const [inserted] = await txn
896
1871
  .insert(walletTransaction)
897
1872
  .values({
@@ -900,7 +1875,11 @@ export class WalletService {
900
1875
  amount: event.amount,
901
1876
  currency: event.currency,
902
1877
  status: 'completed',
903
- rail: railFor(event.currency),
1878
+ direction: 'credit',
1879
+ rail: this.resolveRail(event.currency),
1880
+ // Prefer the chain the vendor reported; fall back to the one the address was
1881
+ // issued on, which is the only network an address-only webhook can imply.
1882
+ network: event.network ?? depositAddress.network,
904
1883
  providerName: depositAddress.providerName,
905
1884
  providerRefId: event.externalId,
906
1885
  destinationAddress: event.address,
@@ -909,16 +1888,13 @@ export class WalletService {
909
1888
  .onConflictDoNothing()
910
1889
  .returning();
911
1890
  if (inserted) {
912
- await txn
913
- .update(wallet)
914
- .set({ balance: sql `${wallet.balance} + ${event.amount}::numeric` })
915
- .where(eq(wallet.id, walletRecord.id));
1891
+ await creditWalletBalance(txn, walletRecord.id, event.currency, event.amount);
916
1892
  return { transactionId: inserted.id, replayed: false };
917
1893
  }
918
1894
  const [winner] = await txn
919
1895
  .select()
920
1896
  .from(walletTransaction)
921
- .where(eq(walletTransaction.providerRefId, event.externalId));
1897
+ .where(and(eq(walletTransaction.providerName, depositAddress.providerName), eq(walletTransaction.providerRefId, event.externalId)));
922
1898
  if (!winner) {
923
1899
  throw new Error(`payment webhook: idempotency conflict but no row found (externalId=${event.externalId})`);
924
1900
  }
@@ -927,11 +1903,44 @@ export class WalletService {
927
1903
  if (!replayed) {
928
1904
  this.events.emit('wallet.deposit.completed', {
929
1905
  userId: depositAddress.userId,
1906
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(depositAddress.userId),
930
1907
  amount: event.amount,
931
1908
  currency: event.currency,
932
1909
  transactionId,
933
1910
  });
934
1911
  }
1912
+ // The funds are already on chain, so the player's deposit limit cannot refuse this
1913
+ // credit the way it refuses a PSP charge. It is asked anyway, and a breach becomes a
1914
+ // finding so a human can act on the excess.
1915
+ //
1916
+ // Asked AFTER the credit commits, never before: the gate counts the player's window
1917
+ // out of the database, so a pre-credit read judges every deposit against the same
1918
+ // stale snapshot and two that land together are each allowed on their own while the
1919
+ // window closes over the limit. The attempted move is `0` for that same reason - the
1920
+ // committed deposit row is already inside the window, so asking with `event.amount`
1921
+ // would count this deposit twice.
1922
+ //
1923
+ // Deliberately NOT guarded by `replayed`: this write failing is what makes the vendor
1924
+ // retry the webhook, and the retry sees the credit as a replay. The (kind, providerName, externalId)
1925
+ // unique index is what keeps a replay from filing the finding twice, so the retry
1926
+ // fills a gap instead of duplicating a row.
1927
+ const rgDecision = await rgDecisionForLandedCredit(this.drizzle.db, this.rgLimits, { userId: depositAddress.userId, attempted: '0', currency: event.currency }, { externalId: event.externalId, txHash: event.txHash });
1928
+ if (rgDecision) {
1929
+ await recordReconciliationFinding(this.drizzle.db, {
1930
+ runId: OUT_OF_CYCLE_RUN_ID,
1931
+ providerName: depositAddress.providerName,
1932
+ kind: 'rg_limit_breach',
1933
+ currency: event.currency,
1934
+ network: event.network ?? depositAddress.network,
1935
+ amount: event.amount,
1936
+ address: event.address,
1937
+ tag: event.tag ?? null,
1938
+ txHash: event.txHash,
1939
+ externalId: event.externalId,
1940
+ transactionId,
1941
+ detail: `credited past the player's ${rgDecision.period} ${rgDecision.limitType} limit of ${rgDecision.limit} (${rgDecision.used} in the window, this deposit included) - the funds were already on chain`,
1942
+ }, this.audit);
1943
+ }
935
1944
  }
936
1945
  async userIdForWallet(walletId) {
937
1946
  const record = findOneOrThrow(await this.drizzle.db
@@ -947,19 +1956,220 @@ export class WalletService {
947
1956
  .where(and(eq(walletTransaction.walletId, walletId), eq(walletTransaction.idempotencyKey, idempotencyKey)));
948
1957
  return existing;
949
1958
  }
950
- async findDepositAddress(userId, currency) {
1959
+ async findDepositAddress(userId, currency, network) {
951
1960
  const [row] = await this.drizzle.db
952
1961
  .select()
953
1962
  .from(walletDepositAddress)
954
- .where(and(eq(walletDepositAddress.userId, userId), eq(walletDepositAddress.currency, currency)));
1963
+ .where(and(eq(walletDepositAddress.userId, userId), eq(walletDepositAddress.currency, currency), network === undefined
1964
+ ? isNull(walletDepositAddress.network)
1965
+ : eq(walletDepositAddress.network, network)));
955
1966
  return row;
956
1967
  }
957
- async findDepositAddressByAddress(address) {
958
- const [row] = await this.drizzle.db
1968
+ async findDepositAddressByAddress({ address, network, tag, }) {
1969
+ const rows = await this.drizzle.db
959
1970
  .select()
960
1971
  .from(walletDepositAddress)
961
- .where(eq(walletDepositAddress.address, address));
962
- return row;
1972
+ .where(and(eq(walletDepositAddress.address, address), tag === undefined ? isNull(walletDepositAddress.tag) : eq(walletDepositAddress.tag, tag), network === undefined
1973
+ ? undefined
1974
+ : or(eq(walletDepositAddress.network, network), isNull(walletDepositAddress.network))));
1975
+ const owners = new Set(rows.map((row) => row.userId));
1976
+ if (owners.size > 1) {
1977
+ throw new AmbiguousDepositAddressError(address, network);
1978
+ }
1979
+ return rows.find((row) => row.network === network) ?? rows[0];
1980
+ }
1981
+ /**
1982
+ * The player's own payout address book. Every method here is scoped on `userId` - a
1983
+ * saved address is personal data with no admin read path, so there is
1984
+ * deliberately no variant of these that takes an arbitrary user id.
1985
+ */
1986
+ async listWithdrawalAddresses(userId, currency) {
1987
+ const rows = await this.drizzle.db
1988
+ .select()
1989
+ .from(walletWithdrawalAddress)
1990
+ .where(and(eq(walletWithdrawalAddress.userId, userId), currency === undefined ? undefined : eq(walletWithdrawalAddress.currency, currency)))
1991
+ .orderBy(desc(walletWithdrawalAddress.createdAt));
1992
+ return rows.map(toWithdrawalAddressDto);
1993
+ }
1994
+ async createWithdrawalAddress(userId, input, meta) {
1995
+ // Shares the wallet mutation budget with deposit/withdraw: the row cap alone does
1996
+ // not bound writes, since deleting frees a slot and lets a client churn forever.
1997
+ await this.rateLimit(userId);
1998
+ // The slot is taken durably BEFORE the vendor call. Whitelisting first let every request
1999
+ // past the cap reach the provider and create a destination there that no local row would
2000
+ // ever describe, because the cap check only ran afterwards. The row is the reservation, and
2001
+ // it is deleted again if the vendor refuses, so a rejected or unreachable provider still
2002
+ // leaves the player no address they would believe they can withdraw to.
2003
+ const reserved = await this.drizzle.db.transaction((txn) => withAdvisoryXactLock(txn, `withdrawal-address-cap:${userId}`, async () => {
2004
+ const [existing] = await txn
2005
+ .select({ total: count() })
2006
+ .from(walletWithdrawalAddress)
2007
+ .where(eq(walletWithdrawalAddress.userId, userId));
2008
+ if ((existing?.total ?? 0) >= WITHDRAWAL_ADDRESS_LIMIT) {
2009
+ throw new WithdrawalAddressLimitReachedError(WITHDRAWAL_ADDRESS_LIMIT);
2010
+ }
2011
+ const [inserted] = await txn
2012
+ .insert(walletWithdrawalAddress)
2013
+ .values({ userId, ...input })
2014
+ .onConflictDoNothing()
2015
+ .returning();
2016
+ if (!inserted) {
2017
+ throw new WithdrawalAddressAlreadyExistsError();
2018
+ }
2019
+ return inserted;
2020
+ }));
2021
+ // The port is required to be idempotent, so releasing and retrying cannot orphan a
2022
+ // destination. A row left behind by a failed release carries no providerWalletId, which
2023
+ // the payout path re-registers rather than trusts - it is never a whitelist bypass.
2024
+ let whitelisted;
2025
+ try {
2026
+ whitelisted = await this.whitelistWithdrawalAddress(userId, input);
2027
+ }
2028
+ catch (err) {
2029
+ await this.releaseWithdrawalAddressSlot(reserved.id);
2030
+ throw err;
2031
+ }
2032
+ const [updated] = Object.keys(whitelisted).length
2033
+ ? await this.drizzle.db
2034
+ .update(walletWithdrawalAddress)
2035
+ .set(whitelisted)
2036
+ .where(eq(walletWithdrawalAddress.id, reserved.id))
2037
+ .returning()
2038
+ : [];
2039
+ const row = updated ?? reserved;
2040
+ await this.audit.record({
2041
+ actorId: userId,
2042
+ actorType: 'player',
2043
+ action: 'wallet.withdrawal_address.created',
2044
+ resourceType: 'wallet_withdrawal_address',
2045
+ resourceId: row.id,
2046
+ // The address string is deliberately absent: the audit log is admin-readable and
2047
+ // a player's saved addresses are not. The row id is enough to correlate.
2048
+ after: { label: row.label, currency: row.currency, network: row.network },
2049
+ ...meta,
2050
+ });
2051
+ return toWithdrawalAddressDto(row);
2052
+ }
2053
+ /**
2054
+ * Refuses a payout to a destination the provider has not approved. A no-op for an adapter that
2055
+ * does not whitelist, and for a fiat rail, which has no address at all.
2056
+ *
2057
+ * The tag is matched as strictly as the address. On a tag chain one exchange address is shared
2058
+ * by every account behind it, so an address-only check would let a player whitelist their own
2059
+ * account at that exchange and then pay out to a stranger's tag at the same address - an
2060
+ * auto-approved withdrawal would do it with nobody looking.
2061
+ */
2062
+ async requireWhitelistedWalletId(userId, currency, network, destinationAddress, destinationTag) {
2063
+ if (!this.payment.whitelistWithdrawalAddress || !destinationAddress) {
2064
+ return null;
2065
+ }
2066
+ const walletId = await this.whitelistedWalletId(userId, currency, network, destinationAddress, destinationTag);
2067
+ if (!walletId) {
2068
+ throw new DestinationAddressNotWhitelistedError();
2069
+ }
2070
+ return walletId;
2071
+ }
2072
+ /**
2073
+ * The approved destination saved for this (address, tag) pair, or null. Matched on the pair
2074
+ * itself rather than an id on the transaction, because a withdrawal is requested by address
2075
+ * and may name one the player never saved. An absent tag matches only a row saved without
2076
+ * one: a tagged payout against an untagged whitelist row is a different beneficiary.
2077
+ */
2078
+ async whitelistedWalletId(userId, currency, network, address, destinationTag) {
2079
+ if (!this.payment.whitelistWithdrawalAddress || !address) {
2080
+ return null;
2081
+ }
2082
+ const providerName = await this.providerNameFor(currency, network);
2083
+ const [row] = await this.drizzle.db
2084
+ .select({
2085
+ id: walletWithdrawalAddress.id,
2086
+ network: walletWithdrawalAddress.network,
2087
+ destinationTag: walletWithdrawalAddress.destinationTag,
2088
+ providerName: walletWithdrawalAddress.providerName,
2089
+ providerWalletId: walletWithdrawalAddress.providerWalletId,
2090
+ })
2091
+ .from(walletWithdrawalAddress)
2092
+ .where(and(eq(walletWithdrawalAddress.userId, userId), eq(walletWithdrawalAddress.currency, currency), eq(walletWithdrawalAddress.address, address), destinationTag
2093
+ ? eq(walletWithdrawalAddress.destinationTag, destinationTag)
2094
+ : isNull(walletWithdrawalAddress.destinationTag), ...(network ? [eq(walletWithdrawalAddress.network, network)] : [])))
2095
+ .limit(1);
2096
+ if (!row) {
2097
+ return null;
2098
+ }
2099
+ // An id minted by a different provider names nothing in the current one, and a row
2100
+ // saved while no whitelisting adapter was bound has no id at all. Both re-register
2101
+ // with the provider that will actually settle, rather than failing a payout on a
2102
+ // saved address the player cannot fix themselves.
2103
+ if (row.providerWalletId && row.providerName === providerName) {
2104
+ return row.providerWalletId;
2105
+ }
2106
+ const { providerWalletId } = await this.payment.whitelistWithdrawalAddress({
2107
+ userId,
2108
+ currency,
2109
+ network: row.network,
2110
+ address,
2111
+ ...(row.destinationTag ? { destinationTag: row.destinationTag } : {}),
2112
+ });
2113
+ await this.drizzle.db
2114
+ .update(walletWithdrawalAddress)
2115
+ .set({ providerName, providerWalletId })
2116
+ .where(eq(walletWithdrawalAddress.id, row.id));
2117
+ return providerWalletId;
2118
+ }
2119
+ /** Frees a reserved slot the vendor refused. Idempotent: a row already gone is a no-op. */
2120
+ async releaseWithdrawalAddressSlot(id) {
2121
+ try {
2122
+ await this.drizzle.db
2123
+ .delete(walletWithdrawalAddress)
2124
+ .where(eq(walletWithdrawalAddress.id, id));
2125
+ }
2126
+ catch (err) {
2127
+ logger.error({ err, withdrawalAddressId: id }, 'withdrawal address slot release failed');
2128
+ }
2129
+ }
2130
+ /**
2131
+ * Delegates to the bound payment adapter when it whitelists destinations, and returns nothing
2132
+ * to store when it does not. A vendor failure propagates rather than being swallowed: saving
2133
+ * the address anyway would produce a row that looks usable and fails only once the player has
2134
+ * committed to a payout.
2135
+ */
2136
+ async whitelistWithdrawalAddress(userId, input) {
2137
+ if (!this.payment.whitelistWithdrawalAddress) {
2138
+ return {};
2139
+ }
2140
+ const { providerWalletId } = await this.payment.whitelistWithdrawalAddress({
2141
+ userId,
2142
+ currency: input.currency,
2143
+ network: input.network,
2144
+ address: input.address,
2145
+ ...(input.destinationTag ? { destinationTag: input.destinationTag } : {}),
2146
+ });
2147
+ return {
2148
+ providerName: await this.providerNameFor(input.currency, input.network),
2149
+ providerWalletId,
2150
+ };
2151
+ }
2152
+ /** False when the row does not exist OR belongs to someone else - the caller cannot
2153
+ * tell the two apart, which is what stops the id space being probed. */
2154
+ async deleteWithdrawalAddress(userId, id, meta) {
2155
+ await this.rateLimit(userId);
2156
+ const [row] = await this.drizzle.db
2157
+ .delete(walletWithdrawalAddress)
2158
+ .where(and(eq(walletWithdrawalAddress.id, id), eq(walletWithdrawalAddress.userId, userId)))
2159
+ .returning();
2160
+ if (!row) {
2161
+ return false;
2162
+ }
2163
+ await this.audit.record({
2164
+ actorId: userId,
2165
+ actorType: 'player',
2166
+ action: 'wallet.withdrawal_address.deleted',
2167
+ resourceType: 'wallet_withdrawal_address',
2168
+ resourceId: row.id,
2169
+ before: { label: row.label, currency: row.currency, network: row.network },
2170
+ ...meta,
2171
+ });
2172
+ return true;
963
2173
  }
964
2174
  }
965
2175
  //# sourceMappingURL=wallet.service.js.map