@openora/core 0.4.1-canary.13 → 0.4.1-canary.130

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