@openora/core 0.4.1-canary.12 → 0.4.1-canary.121

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 (2116) 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 +333 -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 +177 -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 +67 -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 +179 -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 +861 -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 +113 -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 +178 -1
  94. package/dist/audit/plugin.d.ts.map +1 -1
  95. package/dist/audit/plugin.js +487 -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 +178 -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 +176 -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 +176 -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 +323 -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 +722 -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 +179 -1
  289. package/dist/compliance/plugin.d.ts.map +1 -1
  290. package/dist/compliance/plugin.js +85 -12
  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 +101 -11
  321. package/dist/compliance/service/rg.service.d.ts.map +1 -1
  322. package/dist/compliance/service/rg.service.js +301 -51
  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 +49 -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 +45 -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 +54 -0
  404. package/dist/contracts/adapters/email-template.d.ts.map +1 -0
  405. package/dist/contracts/adapters/email-template.js +61 -0
  406. package/dist/contracts/adapters/email-template.js.map +1 -0
  407. package/dist/contracts/adapters/email.d.ts +7 -0
  408. package/dist/contracts/adapters/email.d.ts.map +1 -1
  409. package/dist/contracts/adapters/email.js +7 -5
  410. package/dist/contracts/adapters/email.js.map +1 -1
  411. package/dist/contracts/adapters/error-tracking.d.ts +12 -0
  412. package/dist/contracts/adapters/error-tracking.d.ts.map +1 -0
  413. package/dist/contracts/adapters/error-tracking.js +3 -0
  414. package/dist/contracts/adapters/error-tracking.js.map +1 -0
  415. package/dist/contracts/adapters/exchange-rate-provider.d.ts +14 -0
  416. package/dist/contracts/adapters/exchange-rate-provider.d.ts.map +1 -0
  417. package/dist/contracts/adapters/exchange-rate-provider.js +5 -0
  418. package/dist/contracts/adapters/exchange-rate-provider.js.map +1 -0
  419. package/dist/contracts/adapters/exchange-rate-reader.d.ts +16 -0
  420. package/dist/contracts/adapters/exchange-rate-reader.d.ts.map +1 -0
  421. package/dist/contracts/adapters/exchange-rate-reader.js +3 -0
  422. package/dist/contracts/adapters/exchange-rate-reader.js.map +1 -0
  423. package/dist/contracts/adapters/game.d.ts +4 -0
  424. package/dist/contracts/adapters/game.d.ts.map +1 -1
  425. package/dist/contracts/adapters/game.js +4 -2
  426. package/dist/contracts/adapters/game.js.map +1 -1
  427. package/dist/contracts/adapters/geo-check-commands.d.ts +8 -0
  428. package/dist/contracts/adapters/geo-check-commands.d.ts.map +1 -0
  429. package/dist/contracts/adapters/geo-check-commands.js +3 -0
  430. package/dist/contracts/adapters/geo-check-commands.js.map +1 -0
  431. package/dist/contracts/adapters/geo-ip.d.ts +4 -0
  432. package/dist/contracts/adapters/geo-ip.d.ts.map +1 -1
  433. package/dist/contracts/adapters/geo-ip.js +4 -2
  434. package/dist/contracts/adapters/geo-ip.js.map +1 -1
  435. package/dist/contracts/adapters/identity-reader.d.ts +14 -4
  436. package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
  437. package/dist/contracts/adapters/identity-reader.js.map +1 -1
  438. package/dist/contracts/adapters/identity.d.ts +15 -0
  439. package/dist/contracts/adapters/identity.d.ts.map +1 -1
  440. package/dist/contracts/adapters/identity.js +5 -2
  441. package/dist/contracts/adapters/identity.js.map +1 -1
  442. package/dist/contracts/adapters/index.d.ts +66 -15
  443. package/dist/contracts/adapters/index.d.ts.map +1 -1
  444. package/dist/contracts/adapters/index.js +35 -11
  445. package/dist/contracts/adapters/index.js.map +1 -1
  446. package/dist/contracts/adapters/job-queue.d.ts +55 -0
  447. package/dist/contracts/adapters/job-queue.d.ts.map +1 -1
  448. package/dist/contracts/adapters/job-queue.js +11 -9
  449. package/dist/contracts/adapters/job-queue.js.map +1 -1
  450. package/dist/contracts/adapters/kyc.d.ts +110 -11
  451. package/dist/contracts/adapters/kyc.d.ts.map +1 -1
  452. package/dist/contracts/adapters/kyc.js +23 -0
  453. package/dist/contracts/adapters/kyc.js.map +1 -1
  454. package/dist/contracts/adapters/login-enforcement.d.ts +8 -0
  455. package/dist/contracts/adapters/login-enforcement.d.ts.map +1 -1
  456. package/dist/contracts/adapters/login-enforcement.js +8 -6
  457. package/dist/contracts/adapters/login-enforcement.js.map +1 -1
  458. package/dist/contracts/adapters/notification.d.ts +7 -0
  459. package/dist/contracts/adapters/notification.d.ts.map +1 -1
  460. package/dist/contracts/adapters/notification.js +7 -5
  461. package/dist/contracts/adapters/notification.js.map +1 -1
  462. package/dist/contracts/adapters/outbox.d.ts +14 -0
  463. package/dist/contracts/adapters/outbox.d.ts.map +1 -1
  464. package/dist/contracts/adapters/outbox.js +14 -12
  465. package/dist/contracts/adapters/outbox.js.map +1 -1
  466. package/dist/contracts/adapters/payment.d.ts +195 -0
  467. package/dist/contracts/adapters/payment.d.ts.map +1 -1
  468. package/dist/contracts/adapters/payment.js +12 -2
  469. package/dist/contracts/adapters/payment.js.map +1 -1
  470. package/dist/contracts/adapters/play-eligibility.d.ts +15 -0
  471. package/dist/contracts/adapters/play-eligibility.d.ts.map +1 -0
  472. package/dist/contracts/adapters/play-eligibility.js +3 -0
  473. package/dist/contracts/adapters/play-eligibility.js.map +1 -0
  474. package/dist/contracts/adapters/player-activity.d.ts +6 -0
  475. package/dist/contracts/adapters/player-activity.d.ts.map +1 -0
  476. package/dist/contracts/adapters/player-activity.js +3 -0
  477. package/dist/contracts/adapters/player-activity.js.map +1 -0
  478. package/dist/contracts/adapters/player-provisioning.d.ts +21 -0
  479. package/dist/contracts/adapters/player-provisioning.d.ts.map +1 -0
  480. package/dist/contracts/adapters/player-provisioning.js +3 -0
  481. package/dist/contracts/adapters/player-provisioning.js.map +1 -0
  482. package/dist/contracts/adapters/player-tags.d.ts +4 -0
  483. package/dist/contracts/adapters/player-tags.d.ts.map +1 -1
  484. package/dist/contracts/adapters/player-tags.js.map +1 -1
  485. package/dist/contracts/adapters/rate-limit.d.ts +41 -3
  486. package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
  487. package/dist/contracts/adapters/rate-limit.js +29 -6
  488. package/dist/contracts/adapters/rate-limit.js.map +1 -1
  489. package/dist/contracts/adapters/realtime.d.ts +139 -7
  490. package/dist/contracts/adapters/realtime.d.ts.map +1 -1
  491. package/dist/contracts/adapters/realtime.js +26 -10
  492. package/dist/contracts/adapters/realtime.js.map +1 -1
  493. package/dist/contracts/adapters/rg-limits.d.ts +47 -0
  494. package/dist/contracts/adapters/rg-limits.d.ts.map +1 -0
  495. package/dist/contracts/adapters/rg-limits.js +18 -0
  496. package/dist/contracts/adapters/rg-limits.js.map +1 -0
  497. package/dist/contracts/adapters/rng.d.ts +11 -0
  498. package/dist/contracts/adapters/rng.d.ts.map +1 -1
  499. package/dist/contracts/adapters/rng.js +11 -9
  500. package/dist/contracts/adapters/rng.js.map +1 -1
  501. package/dist/contracts/adapters/sms.d.ts +15 -0
  502. package/dist/contracts/adapters/sms.d.ts.map +1 -0
  503. package/dist/contracts/adapters/sms.js +9 -0
  504. package/dist/contracts/adapters/sms.js.map +1 -0
  505. package/dist/contracts/adapters/social-commands.d.ts +12 -0
  506. package/dist/contracts/adapters/social-commands.d.ts.map +1 -0
  507. package/dist/contracts/adapters/social-commands.js +7 -0
  508. package/dist/contracts/adapters/social-commands.js.map +1 -0
  509. package/dist/contracts/adapters/swap.d.ts +75 -0
  510. package/dist/contracts/adapters/swap.d.ts.map +1 -0
  511. package/dist/contracts/adapters/swap.js +5 -0
  512. package/dist/contracts/adapters/swap.js.map +1 -0
  513. package/dist/contracts/adapters/tag-evaluation-commands.d.ts +20 -0
  514. package/dist/contracts/adapters/tag-evaluation-commands.d.ts.map +1 -0
  515. package/dist/contracts/adapters/tag-evaluation-commands.js +13 -0
  516. package/dist/contracts/adapters/tag-evaluation-commands.js.map +1 -0
  517. package/dist/contracts/adapters/token.d.ts +28 -5
  518. package/dist/contracts/adapters/token.d.ts.map +1 -1
  519. package/dist/contracts/adapters/token.js +10 -8
  520. package/dist/contracts/adapters/token.js.map +1 -1
  521. package/dist/contracts/adapters/wallet-asset-catalog.d.ts +34 -0
  522. package/dist/contracts/adapters/wallet-asset-catalog.d.ts.map +1 -0
  523. package/dist/contracts/adapters/wallet-asset-catalog.js +3 -0
  524. package/dist/contracts/adapters/wallet-asset-catalog.js.map +1 -0
  525. package/dist/contracts/adapters/wallet-commands.d.ts +17 -0
  526. package/dist/contracts/adapters/wallet-commands.d.ts.map +1 -1
  527. package/dist/contracts/adapters/wallet-commands.js.map +1 -1
  528. package/dist/contracts/adapters/wallet-reader.d.ts +21 -1
  529. package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
  530. package/dist/contracts/adapters/wallet-reader.js.map +1 -1
  531. package/dist/contracts/kit.d.ts +15 -0
  532. package/dist/contracts/kit.d.ts.map +1 -1
  533. package/dist/contracts/kit.js +1 -0
  534. package/dist/contracts/kit.js.map +1 -1
  535. package/dist/contracts/schemas/__tests__/common-schemas.test.d.ts +2 -0
  536. package/dist/contracts/schemas/__tests__/common-schemas.test.d.ts.map +1 -0
  537. package/dist/contracts/schemas/__tests__/common-schemas.test.js +21 -0
  538. package/dist/contracts/schemas/__tests__/common-schemas.test.js.map +1 -0
  539. package/dist/contracts/schemas/__tests__/events.test.d.ts +2 -0
  540. package/dist/contracts/schemas/__tests__/events.test.d.ts.map +1 -0
  541. package/dist/contracts/schemas/__tests__/events.test.js +139 -0
  542. package/dist/contracts/schemas/__tests__/events.test.js.map +1 -0
  543. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts +2 -0
  544. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts.map +1 -0
  545. package/dist/contracts/schemas/__tests__/igaming-config.test.js +38 -0
  546. package/dist/contracts/schemas/__tests__/igaming-config.test.js.map +1 -0
  547. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts +2 -0
  548. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts.map +1 -0
  549. package/dist/contracts/schemas/__tests__/platform-config.test.js +16 -0
  550. package/dist/contracts/schemas/__tests__/platform-config.test.js.map +1 -0
  551. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
  552. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
  553. package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
  554. package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
  555. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts +2 -0
  556. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts.map +1 -0
  557. package/dist/contracts/schemas/__tests__/tag-schemas.test.js +42 -0
  558. package/dist/contracts/schemas/__tests__/tag-schemas.test.js.map +1 -0
  559. package/dist/contracts/schemas/chat-attachment.d.ts +20 -0
  560. package/dist/contracts/schemas/chat-attachment.d.ts.map +1 -0
  561. package/dist/contracts/schemas/chat-attachment.js +14 -0
  562. package/dist/contracts/schemas/chat-attachment.js.map +1 -0
  563. package/dist/contracts/schemas/chat-command-metadata.d.ts +73 -0
  564. package/dist/contracts/schemas/chat-command-metadata.d.ts.map +1 -0
  565. package/dist/contracts/schemas/chat-command-metadata.js +67 -0
  566. package/dist/contracts/schemas/chat-command-metadata.js.map +1 -0
  567. package/dist/contracts/schemas/chat-command.d.ts +224 -0
  568. package/dist/contracts/schemas/chat-command.d.ts.map +1 -0
  569. package/dist/contracts/schemas/chat-command.js +55 -0
  570. package/dist/contracts/schemas/chat-command.js.map +1 -0
  571. package/dist/contracts/schemas/common.d.ts +21 -0
  572. package/dist/contracts/schemas/common.d.ts.map +1 -1
  573. package/dist/contracts/schemas/common.js +34 -2
  574. package/dist/contracts/schemas/common.js.map +1 -1
  575. package/dist/contracts/schemas/compliance.d.ts +23 -1
  576. package/dist/contracts/schemas/compliance.d.ts.map +1 -1
  577. package/dist/contracts/schemas/compliance.js +12 -0
  578. package/dist/contracts/schemas/compliance.js.map +1 -1
  579. package/dist/contracts/schemas/display-currency.d.ts +14 -0
  580. package/dist/contracts/schemas/display-currency.d.ts.map +1 -0
  581. package/dist/contracts/schemas/display-currency.js +45 -0
  582. package/dist/contracts/schemas/display-currency.js.map +1 -0
  583. package/dist/contracts/schemas/events.d.ts +825 -7
  584. package/dist/contracts/schemas/events.d.ts.map +1 -1
  585. package/dist/contracts/schemas/events.js +501 -69
  586. package/dist/contracts/schemas/events.js.map +1 -1
  587. package/dist/contracts/schemas/game.d.ts +9 -0
  588. package/dist/contracts/schemas/game.d.ts.map +1 -0
  589. package/dist/contracts/schemas/game.js +4 -0
  590. package/dist/contracts/schemas/game.js.map +1 -0
  591. package/dist/contracts/schemas/iam.d.ts +30 -0
  592. package/dist/contracts/schemas/iam.d.ts.map +1 -1
  593. package/dist/contracts/schemas/iam.js +33 -0
  594. package/dist/contracts/schemas/iam.js.map +1 -1
  595. package/dist/contracts/schemas/identity.d.ts +123 -3
  596. package/dist/contracts/schemas/identity.d.ts.map +1 -1
  597. package/dist/contracts/schemas/identity.js +113 -7
  598. package/dist/contracts/schemas/identity.js.map +1 -1
  599. package/dist/contracts/schemas/igaming-config.d.ts +31 -1
  600. package/dist/contracts/schemas/igaming-config.d.ts.map +1 -1
  601. package/dist/contracts/schemas/igaming-config.js +9 -1
  602. package/dist/contracts/schemas/igaming-config.js.map +1 -1
  603. package/dist/contracts/schemas/index.d.ts +6 -0
  604. package/dist/contracts/schemas/index.d.ts.map +1 -1
  605. package/dist/contracts/schemas/index.js +6 -0
  606. package/dist/contracts/schemas/index.js.map +1 -1
  607. package/dist/contracts/schemas/platform-config.d.ts +182 -29
  608. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  609. package/dist/contracts/schemas/platform-config.js +197 -6
  610. package/dist/contracts/schemas/platform-config.js.map +1 -1
  611. package/dist/contracts/schemas/player.d.ts +90 -4
  612. package/dist/contracts/schemas/player.d.ts.map +1 -1
  613. package/dist/contracts/schemas/player.js +74 -8
  614. package/dist/contracts/schemas/player.js.map +1 -1
  615. package/dist/contracts/schemas/reporting.d.ts +20 -0
  616. package/dist/contracts/schemas/reporting.d.ts.map +1 -0
  617. package/dist/contracts/schemas/reporting.js +13 -0
  618. package/dist/contracts/schemas/reporting.js.map +1 -0
  619. package/dist/contracts/schemas/tag.d.ts +86 -2
  620. package/dist/contracts/schemas/tag.d.ts.map +1 -1
  621. package/dist/contracts/schemas/tag.js +13 -1
  622. package/dist/contracts/schemas/tag.js.map +1 -1
  623. package/dist/contracts/schemas/wallet-tx.d.ts +47 -3
  624. package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
  625. package/dist/contracts/schemas/wallet-tx.js +47 -3
  626. package/dist/contracts/schemas/wallet-tx.js.map +1 -1
  627. package/dist/engagement/chat/__tests__/chat.router.test.d.ts +2 -0
  628. package/dist/engagement/chat/__tests__/chat.router.test.d.ts.map +1 -0
  629. package/dist/engagement/chat/__tests__/chat.router.test.js +44 -0
  630. package/dist/engagement/chat/__tests__/chat.router.test.js.map +1 -0
  631. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts +2 -0
  632. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts.map +1 -0
  633. package/dist/engagement/chat/__tests__/chat.service.int.test.js +2298 -0
  634. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -0
  635. package/dist/engagement/chat/__tests__/contract.test.d.ts +2 -0
  636. package/dist/engagement/chat/__tests__/contract.test.d.ts.map +1 -0
  637. package/dist/engagement/chat/__tests__/contract.test.js +44 -0
  638. package/dist/engagement/chat/__tests__/contract.test.js.map +1 -0
  639. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts +2 -0
  640. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts.map +1 -0
  641. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js +100 -0
  642. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js.map +1 -0
  643. package/dist/engagement/chat/__tests__/moderation.test.js +2 -0
  644. package/dist/engagement/chat/__tests__/moderation.test.js.map +1 -1
  645. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts +2 -0
  646. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts.map +1 -0
  647. package/dist/engagement/chat/__tests__/validate-attachment.test.js +38 -0
  648. package/dist/engagement/chat/__tests__/validate-attachment.test.js.map +1 -0
  649. package/dist/engagement/chat/contract/constants.d.ts +13 -0
  650. package/dist/engagement/chat/contract/constants.d.ts.map +1 -0
  651. package/dist/engagement/chat/contract/constants.js +18 -0
  652. package/dist/engagement/chat/contract/constants.js.map +1 -0
  653. package/dist/engagement/chat/contract/index.d.ts +2170 -17
  654. package/dist/engagement/chat/contract/index.d.ts.map +1 -1
  655. package/dist/engagement/chat/contract/index.js +451 -13
  656. package/dist/engagement/chat/contract/index.js.map +1 -1
  657. package/dist/engagement/chat/drizzle/migrations/0001_cloudy_groot.sql +32 -0
  658. package/dist/engagement/chat/drizzle/migrations/0002_steep_zodiak.sql +3 -0
  659. package/dist/engagement/chat/drizzle/migrations/0003_stormy_king_bedlam.sql +9 -0
  660. package/dist/engagement/chat/drizzle/migrations/0004_panoramic_robin_chapel.sql +6 -0
  661. package/dist/engagement/chat/drizzle/migrations/0005_tranquil_gwen_stacy.sql +100 -0
  662. package/dist/engagement/chat/drizzle/migrations/0006_tiny_ultron.sql +3 -0
  663. package/dist/engagement/chat/drizzle/migrations/0007_seed_global_chat_room.sql +8 -0
  664. package/dist/engagement/chat/drizzle/migrations/0008_robust_korvac.sql +1 -0
  665. package/dist/engagement/chat/drizzle/migrations/0009_massive_bill_hollister.sql +1 -0
  666. package/dist/engagement/chat/drizzle/migrations/0010_backfill_role_assigned_at.sql +9 -0
  667. package/dist/engagement/chat/drizzle/migrations/meta/0001_snapshot.json +557 -0
  668. package/dist/engagement/chat/drizzle/migrations/meta/0002_snapshot.json +576 -0
  669. package/dist/engagement/chat/drizzle/migrations/meta/0003_snapshot.json +652 -0
  670. package/dist/engagement/chat/drizzle/migrations/meta/0004_snapshot.json +666 -0
  671. package/dist/engagement/chat/drizzle/migrations/meta/0005_snapshot.json +1422 -0
  672. package/dist/engagement/chat/drizzle/migrations/meta/0006_snapshot.json +1456 -0
  673. package/dist/engagement/chat/drizzle/migrations/meta/0007_snapshot.json +1456 -0
  674. package/dist/engagement/chat/drizzle/migrations/meta/0008_snapshot.json +1462 -0
  675. package/dist/engagement/chat/drizzle/migrations/meta/0009_snapshot.json +1468 -0
  676. package/dist/engagement/chat/drizzle/migrations/meta/0010_snapshot.json +1468 -0
  677. package/dist/engagement/chat/drizzle/migrations/meta/_journal.json +70 -0
  678. package/dist/engagement/chat/index.d.ts +1 -2
  679. package/dist/engagement/chat/index.d.ts.map +1 -1
  680. package/dist/engagement/chat/index.js +1 -2
  681. package/dist/engagement/chat/index.js.map +1 -1
  682. package/dist/engagement/chat/moderation/index.d.ts +1 -0
  683. package/dist/engagement/chat/moderation/index.d.ts.map +1 -1
  684. package/dist/engagement/chat/moderation/index.js +1 -0
  685. package/dist/engagement/chat/moderation/index.js.map +1 -1
  686. package/dist/engagement/chat/moderation/profanity.d.ts.map +1 -1
  687. package/dist/engagement/chat/moderation/profanity.js +2 -0
  688. package/dist/engagement/chat/moderation/profanity.js.map +1 -1
  689. package/dist/engagement/chat/moderation/validate-attachment.d.ts +9 -0
  690. package/dist/engagement/chat/moderation/validate-attachment.d.ts.map +1 -0
  691. package/dist/engagement/chat/moderation/validate-attachment.js +27 -0
  692. package/dist/engagement/chat/moderation/validate-attachment.js.map +1 -0
  693. package/dist/engagement/chat/plugin.d.ts +177 -1
  694. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  695. package/dist/engagement/chat/plugin.js +46 -5
  696. package/dist/engagement/chat/plugin.js.map +1 -1
  697. package/dist/engagement/chat/router/index.d.ts +1650 -17
  698. package/dist/engagement/chat/router/index.d.ts.map +1 -1
  699. package/dist/engagement/chat/router/index.js +302 -27
  700. package/dist/engagement/chat/router/index.js.map +1 -1
  701. package/dist/engagement/chat/schema/index.d.ts +1562 -0
  702. package/dist/engagement/chat/schema/index.d.ts.map +1 -1
  703. package/dist/engagement/chat/schema/index.js +179 -3
  704. package/dist/engagement/chat/schema/index.js.map +1 -1
  705. package/dist/engagement/chat/service/chat-ban.service.d.ts +26 -0
  706. package/dist/engagement/chat/service/chat-ban.service.d.ts.map +1 -0
  707. package/dist/engagement/chat/service/chat-ban.service.js +139 -0
  708. package/dist/engagement/chat/service/chat-ban.service.js.map +1 -0
  709. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts +14 -0
  710. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts.map +1 -0
  711. package/dist/engagement/chat/service/chat-message-moderation.service.js +48 -0
  712. package/dist/engagement/chat/service/chat-message-moderation.service.js.map +1 -0
  713. package/dist/engagement/chat/service/chat-moderation.service.d.ts +30 -0
  714. package/dist/engagement/chat/service/chat-moderation.service.d.ts.map +1 -0
  715. package/dist/engagement/chat/service/chat-moderation.service.js +40 -0
  716. package/dist/engagement/chat/service/chat-moderation.service.js.map +1 -0
  717. package/dist/engagement/chat/service/chat-mute.service.d.ts +26 -0
  718. package/dist/engagement/chat/service/chat-mute.service.d.ts.map +1 -0
  719. package/dist/engagement/chat/service/chat-mute.service.js +151 -0
  720. package/dist/engagement/chat/service/chat-mute.service.js.map +1 -0
  721. package/dist/engagement/chat/service/chat-room-ban.service.d.ts +29 -0
  722. package/dist/engagement/chat/service/chat-room-ban.service.d.ts.map +1 -0
  723. package/dist/engagement/chat/service/chat-room-ban.service.js +105 -0
  724. package/dist/engagement/chat/service/chat-room-ban.service.js.map +1 -0
  725. package/dist/engagement/chat/service/chat-room-membership.service.d.ts +87 -0
  726. package/dist/engagement/chat/service/chat-room-membership.service.d.ts.map +1 -0
  727. package/dist/engagement/chat/service/chat-room-membership.service.js +268 -0
  728. package/dist/engagement/chat/service/chat-room-membership.service.js.map +1 -0
  729. package/dist/engagement/chat/service/chat-room-mute.service.d.ts +25 -0
  730. package/dist/engagement/chat/service/chat-room-mute.service.d.ts.map +1 -0
  731. package/dist/engagement/chat/service/chat-room-mute.service.js +89 -0
  732. package/dist/engagement/chat/service/chat-room-mute.service.js.map +1 -0
  733. package/dist/engagement/chat/service/chat.service.d.ts +1133 -35
  734. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  735. package/dist/engagement/chat/service/chat.service.js +1189 -70
  736. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  737. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts +42 -0
  738. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts.map +1 -0
  739. package/dist/engagement/chat/service/errors/chat-moderation.errors.js +32 -0
  740. package/dist/engagement/chat/service/errors/chat-moderation.errors.js.map +1 -0
  741. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts +2 -0
  742. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts.map +1 -0
  743. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js +52 -0
  744. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js.map +1 -0
  745. package/dist/engagement/chat-commands/contract/index.d.ts +165 -0
  746. package/dist/engagement/chat-commands/contract/index.d.ts.map +1 -0
  747. package/dist/engagement/chat-commands/contract/index.js +67 -0
  748. package/dist/engagement/chat-commands/contract/index.js.map +1 -0
  749. package/dist/engagement/chat-commands/drizzle/migrations/0000_daffy_lady_bullseye.sql +24 -0
  750. package/dist/engagement/chat-commands/drizzle/migrations/0001_sturdy_barracuda.sql +1 -0
  751. package/dist/engagement/chat-commands/drizzle/migrations/meta/0000_snapshot.json +164 -0
  752. package/dist/engagement/chat-commands/drizzle/migrations/meta/0001_snapshot.json +83 -0
  753. package/dist/engagement/chat-commands/drizzle/migrations/meta/_journal.json +20 -0
  754. package/dist/engagement/chat-commands/drizzle.config.d.ts +4 -0
  755. package/dist/engagement/chat-commands/drizzle.config.d.ts.map +1 -0
  756. package/dist/engagement/chat-commands/drizzle.config.js +21 -0
  757. package/dist/engagement/chat-commands/drizzle.config.js.map +1 -0
  758. package/dist/engagement/chat-commands/migrate.d.ts +2 -0
  759. package/dist/engagement/chat-commands/migrate.d.ts.map +1 -0
  760. package/dist/engagement/chat-commands/migrate.js +20 -0
  761. package/dist/engagement/chat-commands/migrate.js.map +1 -0
  762. package/dist/engagement/chat-commands/plugin.d.ts +179 -0
  763. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -0
  764. package/dist/engagement/chat-commands/plugin.js +15 -0
  765. package/dist/engagement/chat-commands/plugin.js.map +1 -0
  766. package/dist/engagement/chat-commands/router/index.d.ts +113 -0
  767. package/dist/engagement/chat-commands/router/index.d.ts.map +1 -0
  768. package/dist/engagement/chat-commands/router/index.js +24 -0
  769. package/dist/engagement/chat-commands/router/index.js.map +1 -0
  770. package/dist/engagement/chat-commands/schema/index.d.ts +138 -0
  771. package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -0
  772. package/dist/engagement/chat-commands/schema/index.js +11 -0
  773. package/dist/engagement/chat-commands/schema/index.js.map +1 -0
  774. package/dist/engagement/chat-commands/seed/index.d.ts +3 -0
  775. package/dist/engagement/chat-commands/seed/index.d.ts.map +1 -0
  776. package/dist/engagement/chat-commands/seed/index.js +66 -0
  777. package/dist/engagement/chat-commands/seed/index.js.map +1 -0
  778. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts +2 -0
  779. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts.map +1 -0
  780. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js +36 -0
  781. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js.map +1 -0
  782. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts +54 -0
  783. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts.map +1 -0
  784. package/dist/engagement/chat-commands/service/chat-commands.service.js +141 -0
  785. package/dist/engagement/chat-commands/service/chat-commands.service.js.map +1 -0
  786. package/dist/engagement/contracts.d.ts +2 -0
  787. package/dist/engagement/contracts.d.ts.map +1 -1
  788. package/dist/engagement/contracts.js +2 -0
  789. package/dist/engagement/contracts.js.map +1 -1
  790. package/dist/engagement/index.d.ts +2 -0
  791. package/dist/engagement/index.d.ts.map +1 -1
  792. package/dist/engagement/index.js +2 -0
  793. package/dist/engagement/index.js.map +1 -1
  794. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts +2 -0
  795. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts.map +1 -0
  796. package/dist/engagement/notifications/__tests__/notification-event-map.test.js +235 -0
  797. package/dist/engagement/notifications/__tests__/notification-event-map.test.js.map +1 -0
  798. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts +2 -0
  799. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts.map +1 -0
  800. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js +148 -0
  801. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js.map +1 -0
  802. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts +2 -0
  803. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts.map +1 -0
  804. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +298 -0
  805. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -0
  806. package/dist/engagement/notifications/contract/index.d.ts +118 -13
  807. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  808. package/dist/engagement/notifications/contract/index.js +44 -5
  809. package/dist/engagement/notifications/contract/index.js.map +1 -1
  810. package/dist/engagement/notifications/drizzle/migrations/0001_classy_pixie.sql +1 -0
  811. package/dist/engagement/notifications/drizzle/migrations/0002_open_madame_web.sql +2 -0
  812. package/dist/engagement/notifications/drizzle/migrations/meta/0001_snapshot.json +98 -0
  813. package/dist/engagement/notifications/drizzle/migrations/meta/0002_snapshot.json +119 -0
  814. package/dist/engagement/notifications/drizzle/migrations/meta/_journal.json +14 -0
  815. package/dist/engagement/notifications/plugin.d.ts +189 -1
  816. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  817. package/dist/engagement/notifications/plugin.js +270 -27
  818. package/dist/engagement/notifications/plugin.js.map +1 -1
  819. package/dist/engagement/notifications/react/notifications.d.ts +20 -0
  820. package/dist/engagement/notifications/react/notifications.d.ts.map +1 -0
  821. package/dist/engagement/notifications/react/notifications.js +39 -0
  822. package/dist/engagement/notifications/react/notifications.js.map +1 -0
  823. package/dist/engagement/notifications/router/index.d.ts +72 -13
  824. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  825. package/dist/engagement/notifications/router/index.js +37 -16
  826. package/dist/engagement/notifications/router/index.js.map +1 -1
  827. package/dist/engagement/notifications/schema/index.d.ts +36 -0
  828. package/dist/engagement/notifications/schema/index.d.ts.map +1 -1
  829. package/dist/engagement/notifications/schema/index.js +7 -2
  830. package/dist/engagement/notifications/schema/index.js.map +1 -1
  831. package/dist/engagement/notifications/service/notifications.service.d.ts +33 -21
  832. package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
  833. package/dist/engagement/notifications/service/notifications.service.js +41 -11
  834. package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
  835. package/dist/engagement/react.d.ts +1 -1
  836. package/dist/engagement/react.d.ts.map +1 -1
  837. package/dist/engagement/react.js +2 -2
  838. package/dist/engagement/react.js.map +1 -1
  839. package/dist/engagement/server.d.ts +2 -0
  840. package/dist/engagement/server.d.ts.map +1 -1
  841. package/dist/engagement/server.js +2 -0
  842. package/dist/engagement/server.js.map +1 -1
  843. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts +2 -0
  844. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts.map +1 -0
  845. package/dist/engagement/social/__tests__/social.plugin.int.test.js +100 -0
  846. package/dist/engagement/social/__tests__/social.plugin.int.test.js.map +1 -0
  847. package/dist/engagement/social/__tests__/social.router.int.test.d.ts +2 -0
  848. package/dist/engagement/social/__tests__/social.router.int.test.d.ts.map +1 -0
  849. package/dist/engagement/social/__tests__/social.router.int.test.js +215 -0
  850. package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -0
  851. package/dist/engagement/social/__tests__/social.service.int.test.d.ts +2 -0
  852. package/dist/engagement/social/__tests__/social.service.int.test.d.ts.map +1 -0
  853. package/dist/engagement/social/__tests__/social.service.int.test.js +810 -0
  854. package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -0
  855. package/dist/engagement/social/contract/index.d.ts +187 -0
  856. package/dist/engagement/social/contract/index.d.ts.map +1 -0
  857. package/dist/engagement/social/contract/index.js +107 -0
  858. package/dist/engagement/social/contract/index.js.map +1 -0
  859. package/dist/engagement/social/drizzle/migrations/0000_fine_jamie_braddock.sql +24 -0
  860. package/dist/engagement/social/drizzle/migrations/0001_lame_eddie_brock.sql +10 -0
  861. package/dist/engagement/social/drizzle/migrations/0002_foamy_saracen.sql +1 -0
  862. package/dist/engagement/social/drizzle/migrations/0003_fuzzy_shadow_king.sql +4 -0
  863. package/dist/engagement/social/drizzle/migrations/0004_friendship-cancel-constraint.sql +2 -0
  864. package/dist/engagement/social/drizzle/migrations/meta/0000_snapshot.json +232 -0
  865. package/dist/engagement/social/drizzle/migrations/meta/0001_snapshot.json +129 -0
  866. package/dist/engagement/social/drizzle/migrations/meta/0002_snapshot.json +134 -0
  867. package/dist/engagement/social/drizzle/migrations/meta/0003_snapshot.json +145 -0
  868. package/dist/engagement/social/drizzle/migrations/meta/0004_snapshot.json +145 -0
  869. package/dist/engagement/social/drizzle/migrations/meta/_journal.json +41 -0
  870. package/dist/engagement/social/drizzle.config.d.ts +4 -0
  871. package/dist/engagement/social/drizzle.config.d.ts.map +1 -0
  872. package/dist/engagement/social/drizzle.config.js +21 -0
  873. package/dist/engagement/social/drizzle.config.js.map +1 -0
  874. package/dist/engagement/social/index.d.ts +3 -0
  875. package/dist/engagement/social/index.d.ts.map +1 -0
  876. package/dist/engagement/social/index.js +6 -0
  877. package/dist/engagement/social/index.js.map +1 -0
  878. package/dist/engagement/social/migrate.d.ts +5 -0
  879. package/dist/engagement/social/migrate.d.ts.map +1 -0
  880. package/dist/engagement/social/migrate.js +17 -0
  881. package/dist/engagement/social/migrate.js.map +1 -0
  882. package/dist/engagement/social/plugin.d.ts +179 -0
  883. package/dist/engagement/social/plugin.d.ts.map +1 -0
  884. package/dist/engagement/social/plugin.js +17 -0
  885. package/dist/engagement/social/plugin.js.map +1 -0
  886. package/dist/engagement/social/router/index.d.ts +98 -0
  887. package/dist/engagement/social/router/index.d.ts.map +1 -0
  888. package/dist/engagement/social/router/index.js +68 -0
  889. package/dist/engagement/social/router/index.js.map +1 -0
  890. package/dist/engagement/social/schema/index.d.ts +145 -0
  891. package/dist/engagement/social/schema/index.d.ts.map +1 -0
  892. package/dist/engagement/social/schema/index.js +24 -0
  893. package/dist/engagement/social/schema/index.js.map +1 -0
  894. package/dist/engagement/social/service/social.service.d.ts +73 -0
  895. package/dist/engagement/social/service/social.service.d.ts.map +1 -0
  896. package/dist/engagement/social/service/social.service.js +479 -0
  897. package/dist/engagement/social/service/social.service.js.map +1 -0
  898. package/dist/fx/contracts.d.ts +2 -0
  899. package/dist/fx/contracts.d.ts.map +1 -0
  900. package/dist/fx/contracts.js +2 -0
  901. package/dist/fx/contracts.js.map +1 -0
  902. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts +2 -0
  903. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts.map +1 -0
  904. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js +221 -0
  905. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js.map +1 -0
  906. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts +2 -0
  907. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts.map +1 -0
  908. package/dist/fx/exchange-rate/__tests__/select-provider.test.js +26 -0
  909. package/dist/fx/exchange-rate/__tests__/select-provider.test.js.map +1 -0
  910. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts +59 -0
  911. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts.map +1 -0
  912. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js +212 -0
  913. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js.map +1 -0
  914. package/dist/fx/exchange-rate/contract/index.d.ts +44 -0
  915. package/dist/fx/exchange-rate/contract/index.d.ts.map +1 -0
  916. package/dist/fx/exchange-rate/contract/index.js +30 -0
  917. package/dist/fx/exchange-rate/contract/index.js.map +1 -0
  918. package/dist/fx/exchange-rate/drizzle/migrations/0000_hot_trauma.sql +10 -0
  919. package/dist/fx/exchange-rate/drizzle/migrations/meta/0000_snapshot.json +92 -0
  920. package/dist/fx/exchange-rate/drizzle/migrations/meta/_journal.json +13 -0
  921. package/dist/fx/exchange-rate/drizzle.config.d.ts +4 -0
  922. package/dist/fx/exchange-rate/drizzle.config.d.ts.map +1 -0
  923. package/dist/fx/exchange-rate/drizzle.config.js +18 -0
  924. package/dist/fx/exchange-rate/drizzle.config.js.map +1 -0
  925. package/dist/fx/exchange-rate/index.d.ts +3 -0
  926. package/dist/fx/exchange-rate/index.d.ts.map +1 -0
  927. package/dist/fx/exchange-rate/index.js +3 -0
  928. package/dist/fx/exchange-rate/index.js.map +1 -0
  929. package/dist/fx/exchange-rate/migrate.d.ts +5 -0
  930. package/dist/fx/exchange-rate/migrate.d.ts.map +1 -0
  931. package/dist/fx/exchange-rate/migrate.js +14 -0
  932. package/dist/fx/exchange-rate/migrate.js.map +1 -0
  933. package/dist/fx/exchange-rate/plugin.d.ts +178 -0
  934. package/dist/fx/exchange-rate/plugin.d.ts.map +1 -0
  935. package/dist/fx/exchange-rate/plugin.js +46 -0
  936. package/dist/fx/exchange-rate/plugin.js.map +1 -0
  937. package/dist/fx/exchange-rate/react/exchange-rate.d.ts +12 -0
  938. package/dist/fx/exchange-rate/react/exchange-rate.d.ts.map +1 -0
  939. package/dist/fx/exchange-rate/react/exchange-rate.js +17 -0
  940. package/dist/fx/exchange-rate/react/exchange-rate.js.map +1 -0
  941. package/dist/fx/exchange-rate/router/index.d.ts +22 -0
  942. package/dist/fx/exchange-rate/router/index.d.ts.map +1 -0
  943. package/dist/fx/exchange-rate/router/index.js +18 -0
  944. package/dist/fx/exchange-rate/router/index.js.map +1 -0
  945. package/dist/fx/exchange-rate/schema/index.d.ts +116 -0
  946. package/dist/fx/exchange-rate/schema/index.d.ts.map +1 -0
  947. package/dist/fx/exchange-rate/schema/index.js +18 -0
  948. package/dist/fx/exchange-rate/schema/index.js.map +1 -0
  949. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts +22 -0
  950. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts.map +1 -0
  951. package/dist/fx/exchange-rate/service/exchange-rate.service.js +38 -0
  952. package/dist/fx/exchange-rate/service/exchange-rate.service.js.map +1 -0
  953. package/dist/fx/index.d.ts +2 -0
  954. package/dist/fx/index.d.ts.map +1 -0
  955. package/dist/fx/index.js +2 -0
  956. package/dist/fx/index.js.map +1 -0
  957. package/dist/fx/react.d.ts +2 -0
  958. package/dist/fx/react.d.ts.map +1 -0
  959. package/dist/fx/react.js +2 -0
  960. package/dist/fx/react.js.map +1 -0
  961. package/dist/fx/server.d.ts +2 -0
  962. package/dist/fx/server.d.ts.map +1 -0
  963. package/dist/fx/server.js +2 -0
  964. package/dist/fx/server.js.map +1 -0
  965. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts +2 -0
  966. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts.map +1 -0
  967. package/dist/iam/__tests__/admin-player-activity.int.test.js +119 -0
  968. package/dist/iam/__tests__/admin-player-activity.int.test.js.map +1 -0
  969. package/dist/iam/__tests__/iam.service.int.test.d.ts +2 -0
  970. package/dist/iam/__tests__/iam.service.int.test.d.ts.map +1 -0
  971. package/dist/iam/__tests__/iam.service.int.test.js +573 -0
  972. package/dist/iam/__tests__/iam.service.int.test.js.map +1 -0
  973. package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
  974. package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
  975. package/dist/iam/adapters/admin-player-activity.js +106 -0
  976. package/dist/iam/adapters/admin-player-activity.js.map +1 -0
  977. package/dist/iam/adapters/admin-role-assignment-directory.d.ts +8 -0
  978. package/dist/iam/adapters/admin-role-assignment-directory.d.ts.map +1 -0
  979. package/dist/iam/adapters/admin-role-assignment-directory.js +23 -0
  980. package/dist/iam/adapters/admin-role-assignment-directory.js.map +1 -0
  981. package/dist/iam/contract/index.d.ts +58 -0
  982. package/dist/iam/contract/index.d.ts.map +1 -1
  983. package/dist/iam/contract/index.js +30 -4
  984. package/dist/iam/contract/index.js.map +1 -1
  985. package/dist/iam/plugin.d.ts +177 -1
  986. package/dist/iam/plugin.d.ts.map +1 -1
  987. package/dist/iam/plugin.js +9 -5
  988. package/dist/iam/plugin.js.map +1 -1
  989. package/dist/iam/router/index.d.ts +37 -0
  990. package/dist/iam/router/index.d.ts.map +1 -1
  991. package/dist/iam/router/index.js +7 -1
  992. package/dist/iam/router/index.js.map +1 -1
  993. package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
  994. package/dist/iam/seed/data/default-admin-roles.js +4 -0
  995. package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
  996. package/dist/iam/service/iam.service.d.ts +54 -25
  997. package/dist/iam/service/iam.service.d.ts.map +1 -1
  998. package/dist/iam/service/iam.service.js +112 -11
  999. package/dist/iam/service/iam.service.js.map +1 -1
  1000. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts +2 -0
  1001. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts.map +1 -0
  1002. package/dist/pam/identity/__tests__/admin-security.int.test.js +137 -0
  1003. package/dist/pam/identity/__tests__/admin-security.int.test.js.map +1 -0
  1004. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts +2 -0
  1005. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts.map +1 -0
  1006. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js +217 -0
  1007. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js.map +1 -0
  1008. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts +2 -0
  1009. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts.map +1 -0
  1010. package/dist/pam/identity/__tests__/device-fingerprint.test.js +105 -0
  1011. package/dist/pam/identity/__tests__/device-fingerprint.test.js.map +1 -0
  1012. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts +2 -0
  1013. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts.map +1 -0
  1014. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +195 -0
  1015. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -0
  1016. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts +2 -0
  1017. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts.map +1 -0
  1018. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +118 -0
  1019. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -0
  1020. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts +2 -0
  1021. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts.map +1 -0
  1022. package/dist/pam/identity/__tests__/identity.service.int.test.js +806 -0
  1023. package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -0
  1024. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts +2 -0
  1025. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts.map +1 -0
  1026. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js +99 -0
  1027. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js.map +1 -0
  1028. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts +2 -0
  1029. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts.map +1 -0
  1030. package/dist/pam/identity/__tests__/phone-login.service.int.test.js +371 -0
  1031. package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -0
  1032. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts +2 -0
  1033. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts.map +1 -0
  1034. package/dist/pam/identity/__tests__/play-eligibility.test.js +30 -0
  1035. package/dist/pam/identity/__tests__/play-eligibility.test.js.map +1 -0
  1036. package/dist/pam/identity/__tests__/rg-guard.test.d.ts +2 -0
  1037. package/dist/pam/identity/__tests__/rg-guard.test.d.ts.map +1 -0
  1038. package/dist/pam/identity/__tests__/rg-guard.test.js +21 -0
  1039. package/dist/pam/identity/__tests__/rg-guard.test.js.map +1 -0
  1040. package/dist/pam/identity/__tests__/session.service.int.test.d.ts +2 -0
  1041. package/dist/pam/identity/__tests__/session.service.int.test.d.ts.map +1 -0
  1042. package/dist/pam/identity/__tests__/session.service.int.test.js +88 -0
  1043. package/dist/pam/identity/__tests__/session.service.int.test.js.map +1 -0
  1044. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts +2 -0
  1045. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts.map +1 -0
  1046. package/dist/pam/identity/__tests__/user-commands.int.test.js +39 -0
  1047. package/dist/pam/identity/__tests__/user-commands.int.test.js.map +1 -0
  1048. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts +2 -0
  1049. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts.map +1 -0
  1050. package/dist/pam/identity/__tests__/username-backfill.int.test.js +103 -0
  1051. package/dist/pam/identity/__tests__/username-backfill.int.test.js.map +1 -0
  1052. package/dist/pam/identity/adapters/__tests__/default-email-template-renderer.test.d.ts +2 -0
  1053. package/dist/pam/identity/adapters/__tests__/default-email-template-renderer.test.d.ts.map +1 -0
  1054. package/dist/pam/identity/adapters/__tests__/default-email-template-renderer.test.js +33 -0
  1055. package/dist/pam/identity/adapters/__tests__/default-email-template-renderer.test.js.map +1 -0
  1056. package/dist/pam/identity/adapters/default-email-template-renderer.d.ts +8 -0
  1057. package/dist/pam/identity/adapters/default-email-template-renderer.d.ts.map +1 -0
  1058. package/dist/pam/identity/adapters/default-email-template-renderer.js +7 -0
  1059. package/dist/pam/identity/adapters/default-email-template-renderer.js.map +1 -0
  1060. package/dist/pam/identity/adapters/identity-reader.service.d.ts +8 -4
  1061. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  1062. package/dist/pam/identity/adapters/identity-reader.service.js +53 -2
  1063. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  1064. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts +3 -3
  1065. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts.map +1 -1
  1066. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js +3 -3
  1067. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js.map +1 -1
  1068. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts +8 -0
  1069. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts.map +1 -0
  1070. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js +7 -0
  1071. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js.map +1 -0
  1072. package/dist/pam/identity/admin-user-directory.d.ts +36 -8
  1073. package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
  1074. package/dist/pam/identity/admin-user-directory.js +88 -35
  1075. package/dist/pam/identity/admin-user-directory.js.map +1 -1
  1076. package/dist/pam/identity/contract/index.d.ts +300 -15
  1077. package/dist/pam/identity/contract/index.d.ts.map +1 -1
  1078. package/dist/pam/identity/contract/index.js +148 -7
  1079. package/dist/pam/identity/contract/index.js.map +1 -1
  1080. package/dist/pam/identity/drizzle/migrations/0001_rainy_peter_quill.sql +18 -0
  1081. package/dist/pam/identity/drizzle/migrations/0002_outstanding_patriot.sql +1 -0
  1082. package/dist/pam/identity/drizzle/migrations/0003_open_shotgun.sql +1 -0
  1083. package/dist/pam/identity/drizzle/migrations/0004_round_giant_girl.sql +1 -0
  1084. package/dist/pam/identity/drizzle/migrations/0005_daily_black_tom.sql +1 -0
  1085. package/dist/pam/identity/drizzle/migrations/0006_brave_sabra.sql +1 -0
  1086. package/dist/pam/identity/drizzle/migrations/0007_fuzzy_barracuda.sql +44 -0
  1087. package/dist/pam/identity/drizzle/migrations/0008_pink_bucky.sql +23 -0
  1088. package/dist/pam/identity/drizzle/migrations/0009_hard_sauron.sql +2 -0
  1089. package/dist/pam/identity/drizzle/migrations/meta/0001_snapshot.json +684 -0
  1090. package/dist/pam/identity/drizzle/migrations/meta/0002_snapshot.json +690 -0
  1091. package/dist/pam/identity/drizzle/migrations/meta/0003_snapshot.json +695 -0
  1092. package/dist/pam/identity/drizzle/migrations/meta/0004_snapshot.json +680 -0
  1093. package/dist/pam/identity/drizzle/migrations/meta/0005_snapshot.json +695 -0
  1094. package/dist/pam/identity/drizzle/migrations/meta/0006_snapshot.json +701 -0
  1095. package/dist/pam/identity/drizzle/migrations/meta/0007_snapshot.json +737 -0
  1096. package/dist/pam/identity/drizzle/migrations/meta/0008_snapshot.json +913 -0
  1097. package/dist/pam/identity/drizzle/migrations/meta/0009_snapshot.json +926 -0
  1098. package/dist/pam/identity/drizzle/migrations/meta/_journal.json +63 -0
  1099. package/dist/pam/identity/plugin.d.ts +176 -1
  1100. package/dist/pam/identity/plugin.d.ts.map +1 -1
  1101. package/dist/pam/identity/plugin.js +105 -14
  1102. package/dist/pam/identity/plugin.js.map +1 -1
  1103. package/dist/pam/identity/react/account.d.ts +49 -11
  1104. package/dist/pam/identity/react/account.d.ts.map +1 -1
  1105. package/dist/pam/identity/react/account.js +13 -1
  1106. package/dist/pam/identity/react/account.js.map +1 -1
  1107. package/dist/pam/identity/react/auth.d.ts +19 -13
  1108. package/dist/pam/identity/react/auth.d.ts.map +1 -1
  1109. package/dist/pam/identity/router/index.d.ts +249 -16
  1110. package/dist/pam/identity/router/index.d.ts.map +1 -1
  1111. package/dist/pam/identity/router/index.js +108 -13
  1112. package/dist/pam/identity/router/index.js.map +1 -1
  1113. package/dist/pam/identity/schema/index.d.ts +560 -0
  1114. package/dist/pam/identity/schema/index.d.ts.map +1 -1
  1115. package/dist/pam/identity/schema/index.js +70 -2
  1116. package/dist/pam/identity/schema/index.js.map +1 -1
  1117. package/dist/pam/identity/service/admin-security.service.d.ts +84 -0
  1118. package/dist/pam/identity/service/admin-security.service.d.ts.map +1 -0
  1119. package/dist/pam/identity/service/admin-security.service.js +277 -0
  1120. package/dist/pam/identity/service/admin-security.service.js.map +1 -0
  1121. package/dist/pam/identity/service/device-fingerprint.service.d.ts +32 -0
  1122. package/dist/pam/identity/service/device-fingerprint.service.d.ts.map +1 -0
  1123. package/dist/pam/identity/service/device-fingerprint.service.js +79 -0
  1124. package/dist/pam/identity/service/device-fingerprint.service.js.map +1 -0
  1125. package/dist/pam/identity/service/identity.service.d.ts +147 -34
  1126. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  1127. package/dist/pam/identity/service/identity.service.js +939 -132
  1128. package/dist/pam/identity/service/identity.service.js.map +1 -1
  1129. package/dist/pam/identity/service/lockout-policy.service.d.ts +30 -0
  1130. package/dist/pam/identity/service/lockout-policy.service.d.ts.map +1 -0
  1131. package/dist/pam/identity/service/lockout-policy.service.js +40 -0
  1132. package/dist/pam/identity/service/lockout-policy.service.js.map +1 -0
  1133. package/dist/pam/identity/service/phone-login.service.d.ts +63 -0
  1134. package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -0
  1135. package/dist/pam/identity/service/phone-login.service.js +373 -0
  1136. package/dist/pam/identity/service/phone-login.service.js.map +1 -0
  1137. package/dist/pam/identity/service/play-eligibility.service.d.ts +8 -0
  1138. package/dist/pam/identity/service/play-eligibility.service.d.ts.map +1 -0
  1139. package/dist/pam/identity/service/play-eligibility.service.js +21 -0
  1140. package/dist/pam/identity/service/play-eligibility.service.js.map +1 -0
  1141. package/dist/pam/identity/service/rg-guard.service.d.ts +37 -0
  1142. package/dist/pam/identity/service/rg-guard.service.d.ts.map +1 -0
  1143. package/dist/pam/identity/service/rg-guard.service.js +60 -0
  1144. package/dist/pam/identity/service/rg-guard.service.js.map +1 -0
  1145. package/dist/pam/identity/service/session.service.d.ts +63 -6
  1146. package/dist/pam/identity/service/session.service.d.ts.map +1 -1
  1147. package/dist/pam/identity/service/session.service.js +113 -21
  1148. package/dist/pam/identity/service/session.service.js.map +1 -1
  1149. package/dist/pam/identity/service/trusted-device.service.d.ts +56 -0
  1150. package/dist/pam/identity/service/trusted-device.service.d.ts.map +1 -0
  1151. package/dist/pam/identity/service/trusted-device.service.js +157 -0
  1152. package/dist/pam/identity/service/trusted-device.service.js.map +1 -0
  1153. package/dist/pam/identity/service/two-factor-lockout.service.d.ts +25 -0
  1154. package/dist/pam/identity/service/two-factor-lockout.service.d.ts.map +1 -0
  1155. package/dist/pam/identity/service/two-factor-lockout.service.js +121 -0
  1156. package/dist/pam/identity/service/two-factor-lockout.service.js.map +1 -0
  1157. package/dist/pam/identity/service/user-commands.service.d.ts +11 -0
  1158. package/dist/pam/identity/service/user-commands.service.d.ts.map +1 -0
  1159. package/dist/pam/identity/service/user-commands.service.js +32 -0
  1160. package/dist/pam/identity/service/user-commands.service.js.map +1 -0
  1161. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts +2 -0
  1162. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts.map +1 -0
  1163. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js +76 -0
  1164. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js.map +1 -0
  1165. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts +2 -0
  1166. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts.map +1 -0
  1167. package/dist/pam/player-management/__tests__/player.router.int.test.js +107 -0
  1168. package/dist/pam/player-management/__tests__/player.router.int.test.js.map +1 -0
  1169. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts +2 -0
  1170. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts.map +1 -0
  1171. package/dist/pam/player-management/__tests__/player.service.int.test.js +429 -0
  1172. package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -0
  1173. package/dist/pam/player-management/contract/index.d.ts +115 -15
  1174. package/dist/pam/player-management/contract/index.d.ts.map +1 -1
  1175. package/dist/pam/player-management/contract/index.js +35 -5
  1176. package/dist/pam/player-management/contract/index.js.map +1 -1
  1177. package/dist/pam/player-management/plugin.d.ts +177 -1
  1178. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  1179. package/dist/pam/player-management/plugin.js +11 -8
  1180. package/dist/pam/player-management/plugin.js.map +1 -1
  1181. package/dist/pam/player-management/router/index.d.ts +87 -15
  1182. package/dist/pam/player-management/router/index.d.ts.map +1 -1
  1183. package/dist/pam/player-management/router/index.js +54 -17
  1184. package/dist/pam/player-management/router/index.js.map +1 -1
  1185. package/dist/pam/player-management/service/kyc-status-writer.d.ts +5 -7
  1186. package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
  1187. package/dist/pam/player-management/service/kyc-status-writer.js +23 -19
  1188. package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
  1189. package/dist/pam/player-management/service/player.service.d.ts +55 -22
  1190. package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
  1191. package/dist/pam/player-management/service/player.service.js +129 -43
  1192. package/dist/pam/player-management/service/player.service.js.map +1 -1
  1193. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts +2 -0
  1194. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts.map +1 -0
  1195. package/dist/pam/player-note/__tests__/player-note.router.int.test.js +52 -0
  1196. package/dist/pam/player-note/__tests__/player-note.router.int.test.js.map +1 -0
  1197. package/dist/pam/player-note/contract/index.d.ts +14 -0
  1198. package/dist/pam/player-note/contract/index.d.ts.map +1 -1
  1199. package/dist/pam/player-note/contract/index.js +8 -2
  1200. package/dist/pam/player-note/contract/index.js.map +1 -1
  1201. package/dist/pam/player-note/plugin.d.ts +177 -1
  1202. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  1203. package/dist/pam/player-note/plugin.js +6 -4
  1204. package/dist/pam/player-note/plugin.js.map +1 -1
  1205. package/dist/pam/player-note/router/index.d.ts +10 -1
  1206. package/dist/pam/player-note/router/index.d.ts.map +1 -1
  1207. package/dist/pam/player-note/router/index.js +20 -3
  1208. package/dist/pam/player-note/router/index.js.map +1 -1
  1209. package/dist/pam/player-note/service/player-note.service.d.ts +5 -3
  1210. package/dist/pam/player-note/service/player-note.service.d.ts.map +1 -1
  1211. package/dist/pam/player-note/service/player-note.service.js +5 -3
  1212. package/dist/pam/player-note/service/player-note.service.js.map +1 -1
  1213. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts +2 -0
  1214. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts.map +1 -0
  1215. package/dist/pam/profile/__tests__/profile.service.int.test.js +221 -0
  1216. package/dist/pam/profile/__tests__/profile.service.int.test.js.map +1 -0
  1217. package/dist/pam/profile/contract/index.d.ts +69 -36
  1218. package/dist/pam/profile/contract/index.d.ts.map +1 -1
  1219. package/dist/pam/profile/contract/index.js +16 -1
  1220. package/dist/pam/profile/contract/index.js.map +1 -1
  1221. package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
  1222. package/dist/pam/profile/drizzle/migrations/0002_sour_alex_wilder.sql +7 -0
  1223. package/dist/pam/profile/drizzle/migrations/0003_absurd_morbius.sql +4 -0
  1224. package/dist/pam/profile/drizzle/migrations/0004_fuzzy_korvac.sql +1 -0
  1225. package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
  1226. package/dist/pam/profile/drizzle/migrations/meta/0002_snapshot.json +200 -0
  1227. package/dist/pam/profile/drizzle/migrations/meta/0003_snapshot.json +224 -0
  1228. package/dist/pam/profile/drizzle/migrations/meta/0004_snapshot.json +230 -0
  1229. package/dist/pam/profile/drizzle/migrations/meta/_journal.json +28 -0
  1230. package/dist/pam/profile/migrate.d.ts.map +1 -1
  1231. package/dist/pam/profile/migrate.js +3 -1
  1232. package/dist/pam/profile/migrate.js.map +1 -1
  1233. package/dist/pam/profile/plugin.d.ts +177 -1
  1234. package/dist/pam/profile/plugin.d.ts.map +1 -1
  1235. package/dist/pam/profile/plugin.js +8 -4
  1236. package/dist/pam/profile/plugin.js.map +1 -1
  1237. package/dist/pam/profile/react/profile.d.ts +29 -6
  1238. package/dist/pam/profile/react/profile.d.ts.map +1 -1
  1239. package/dist/pam/profile/react/profile.js +12 -0
  1240. package/dist/pam/profile/react/profile.js.map +1 -1
  1241. package/dist/pam/profile/router/index.d.ts +27 -4
  1242. package/dist/pam/profile/router/index.d.ts.map +1 -1
  1243. package/dist/pam/profile/router/index.js +4 -1
  1244. package/dist/pam/profile/router/index.js.map +1 -1
  1245. package/dist/pam/profile/schema/index.d.ts +159 -6
  1246. package/dist/pam/profile/schema/index.d.ts.map +1 -1
  1247. package/dist/pam/profile/schema/index.js +17 -10
  1248. package/dist/pam/profile/schema/index.js.map +1 -1
  1249. package/dist/pam/profile/service/profile.service.d.ts +44 -8
  1250. package/dist/pam/profile/service/profile.service.d.ts.map +1 -1
  1251. package/dist/pam/profile/service/profile.service.js +98 -18
  1252. package/dist/pam/profile/service/profile.service.js.map +1 -1
  1253. package/dist/pam/react.d.ts +2 -2
  1254. package/dist/pam/react.d.ts.map +1 -1
  1255. package/dist/pam/react.js +2 -2
  1256. package/dist/pam/react.js.map +1 -1
  1257. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts +2 -0
  1258. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts.map +1 -0
  1259. package/dist/pam/shared/__tests__/shared-mappers.test.js +55 -0
  1260. package/dist/pam/shared/__tests__/shared-mappers.test.js.map +1 -0
  1261. package/dist/pam/shared/language.d.ts +3 -1
  1262. package/dist/pam/shared/language.d.ts.map +1 -1
  1263. package/dist/pam/shared/player-mapper.d.ts +12 -4
  1264. package/dist/pam/shared/player-mapper.d.ts.map +1 -1
  1265. package/dist/pam/shared/player-mapper.js +12 -5
  1266. package/dist/pam/shared/player-mapper.js.map +1 -1
  1267. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts +2 -0
  1268. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts.map +1 -0
  1269. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js +77 -0
  1270. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js.map +1 -0
  1271. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts +2 -0
  1272. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts.map +1 -0
  1273. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js +1024 -0
  1274. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js.map +1 -0
  1275. package/dist/pam/tag/__tests__/tag-mappers.test.js +25 -0
  1276. package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
  1277. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts +2 -0
  1278. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts.map +1 -0
  1279. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js +145 -0
  1280. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js.map +1 -0
  1281. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts +2 -0
  1282. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts.map +1 -0
  1283. package/dist/pam/tag/__tests__/tag.router.int.test.js +222 -0
  1284. package/dist/pam/tag/__tests__/tag.router.int.test.js.map +1 -0
  1285. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts +2 -0
  1286. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts.map +1 -0
  1287. package/dist/pam/tag/__tests__/tag.service.int.test.js +571 -0
  1288. package/dist/pam/tag/__tests__/tag.service.int.test.js.map +1 -0
  1289. package/dist/pam/tag/contract/index.d.ts +139 -1
  1290. package/dist/pam/tag/contract/index.d.ts.map +1 -1
  1291. package/dist/pam/tag/contract/index.js +12 -2
  1292. package/dist/pam/tag/contract/index.js.map +1 -1
  1293. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts +37 -0
  1294. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts.map +1 -0
  1295. package/dist/pam/tag/contract/player-tag-assign-metadata.js +20 -0
  1296. package/dist/pam/tag/contract/player-tag-assign-metadata.js.map +1 -0
  1297. package/dist/pam/tag/drizzle/migrations/0002_silent_skaar.sql +4 -0
  1298. package/dist/pam/tag/drizzle/migrations/0003_overconfident_guardian.sql +3 -0
  1299. package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
  1300. package/dist/pam/tag/drizzle/migrations/meta/0002_snapshot.json +335 -0
  1301. package/dist/pam/tag/drizzle/migrations/meta/0003_snapshot.json +343 -0
  1302. package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
  1303. package/dist/pam/tag/drizzle/migrations/meta/_journal.json +21 -0
  1304. package/dist/pam/tag/migrate.d.ts.map +1 -1
  1305. package/dist/pam/tag/migrate.js +34 -0
  1306. package/dist/pam/tag/migrate.js.map +1 -1
  1307. package/dist/pam/tag/plugin.d.ts +177 -1
  1308. package/dist/pam/tag/plugin.d.ts.map +1 -1
  1309. package/dist/pam/tag/plugin.js +46 -19
  1310. package/dist/pam/tag/plugin.js.map +1 -1
  1311. package/dist/pam/tag/router/index.d.ts +114 -1
  1312. package/dist/pam/tag/router/index.d.ts.map +1 -1
  1313. package/dist/pam/tag/router/index.js +38 -9
  1314. package/dist/pam/tag/router/index.js.map +1 -1
  1315. package/dist/pam/tag/schema/index.d.ts +42 -3
  1316. package/dist/pam/tag/schema/index.d.ts.map +1 -1
  1317. package/dist/pam/tag/schema/index.js +13 -2
  1318. package/dist/pam/tag/schema/index.js.map +1 -1
  1319. package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
  1320. package/dist/pam/tag/seed/data/default-tag-rules.js +42 -0
  1321. package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
  1322. package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
  1323. package/dist/pam/tag/seed/data/default-tags.js +6 -0
  1324. package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
  1325. package/dist/pam/tag/service/tag-evaluation.service.d.ts +147 -17
  1326. package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
  1327. package/dist/pam/tag/service/tag-evaluation.service.js +491 -48
  1328. package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
  1329. package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
  1330. package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
  1331. package/dist/pam/tag/service/tag-mappers.js +1 -0
  1332. package/dist/pam/tag/service/tag-mappers.js.map +1 -1
  1333. package/dist/pam/tag/service/tag-rule.service.d.ts +8 -6
  1334. package/dist/pam/tag/service/tag-rule.service.d.ts.map +1 -1
  1335. package/dist/pam/tag/service/tag-rule.service.js +8 -2
  1336. package/dist/pam/tag/service/tag-rule.service.js.map +1 -1
  1337. package/dist/pam/tag/service/tag.service.d.ts +162 -16
  1338. package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
  1339. package/dist/pam/tag/service/tag.service.js +297 -30
  1340. package/dist/pam/tag/service/tag.service.js.map +1 -1
  1341. package/dist/react/context/__tests__/realtime-client.test.d.ts +2 -0
  1342. package/dist/react/context/__tests__/realtime-client.test.d.ts.map +1 -0
  1343. package/dist/react/context/__tests__/realtime-client.test.js +75 -0
  1344. package/dist/react/context/__tests__/realtime-client.test.js.map +1 -0
  1345. package/dist/react/context/realtime-client.d.ts +15 -0
  1346. package/dist/react/context/realtime-client.d.ts.map +1 -1
  1347. package/dist/react/context/realtime-client.js.map +1 -1
  1348. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts +2 -0
  1349. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts.map +1 -0
  1350. package/dist/react/hooks/__tests__/use-event-stream.test.js +153 -0
  1351. package/dist/react/hooks/__tests__/use-event-stream.test.js.map +1 -0
  1352. package/dist/react/hooks/use-event-stream.d.ts +3 -3
  1353. package/dist/react/hooks/use-event-stream.d.ts.map +1 -1
  1354. package/dist/react/hooks/use-event-stream.js +60 -28
  1355. package/dist/react/hooks/use-event-stream.js.map +1 -1
  1356. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts +2 -0
  1357. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts.map +1 -0
  1358. package/dist/server/auth/__tests__/admin-guard.int.test.js +155 -0
  1359. package/dist/server/auth/__tests__/admin-guard.int.test.js.map +1 -0
  1360. package/dist/server/auth/__tests__/auth.test.d.ts +2 -0
  1361. package/dist/server/auth/__tests__/auth.test.d.ts.map +1 -0
  1362. package/dist/server/auth/__tests__/auth.test.js +155 -0
  1363. package/dist/server/auth/__tests__/auth.test.js.map +1 -0
  1364. package/dist/server/auth/__tests__/permission-levels.test.d.ts +2 -0
  1365. package/dist/server/auth/__tests__/permission-levels.test.d.ts.map +1 -0
  1366. package/dist/server/auth/__tests__/permission-levels.test.js +89 -0
  1367. package/dist/server/auth/__tests__/permission-levels.test.js.map +1 -0
  1368. package/dist/server/auth/__tests__/permissions.test.d.ts +2 -0
  1369. package/dist/server/auth/__tests__/permissions.test.d.ts.map +1 -0
  1370. package/dist/server/auth/__tests__/permissions.test.js +15 -0
  1371. package/dist/server/auth/__tests__/permissions.test.js.map +1 -0
  1372. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts +2 -0
  1373. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts.map +1 -0
  1374. package/dist/server/auth/__tests__/session-resolver.int.test.js +59 -0
  1375. package/dist/server/auth/__tests__/session-resolver.int.test.js.map +1 -0
  1376. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts +2 -0
  1377. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts.map +1 -0
  1378. package/dist/server/auth/__tests__/sign-session-cookie.test.js +59 -0
  1379. package/dist/server/auth/__tests__/sign-session-cookie.test.js.map +1 -0
  1380. package/dist/server/auth/admin-guard.d.ts +13 -10
  1381. package/dist/server/auth/admin-guard.d.ts.map +1 -1
  1382. package/dist/server/auth/admin-guard.js +106 -44
  1383. package/dist/server/auth/admin-guard.js.map +1 -1
  1384. package/dist/server/auth/auth.d.ts +44 -0
  1385. package/dist/server/auth/auth.d.ts.map +1 -1
  1386. package/dist/server/auth/auth.js +83 -17
  1387. package/dist/server/auth/auth.js.map +1 -1
  1388. package/dist/server/auth/index.d.ts +2 -0
  1389. package/dist/server/auth/index.d.ts.map +1 -1
  1390. package/dist/server/auth/index.js +1 -0
  1391. package/dist/server/auth/index.js.map +1 -1
  1392. package/dist/server/auth/permissions.d.ts +121 -14
  1393. package/dist/server/auth/permissions.d.ts.map +1 -1
  1394. package/dist/server/auth/permissions.js +14 -20
  1395. package/dist/server/auth/permissions.js.map +1 -1
  1396. package/dist/server/auth/session-resolver.d.ts +4 -0
  1397. package/dist/server/auth/session-resolver.d.ts.map +1 -1
  1398. package/dist/server/auth/session-resolver.js +9 -2
  1399. package/dist/server/auth/session-resolver.js.map +1 -1
  1400. package/dist/server/auth/sign-session-cookie.d.ts +18 -0
  1401. package/dist/server/auth/sign-session-cookie.d.ts.map +1 -0
  1402. package/dist/server/auth/sign-session-cookie.js +15 -0
  1403. package/dist/server/auth/sign-session-cookie.js.map +1 -0
  1404. package/dist/server/db/__tests__/migrate.test.d.ts +2 -0
  1405. package/dist/server/db/__tests__/migrate.test.d.ts.map +1 -0
  1406. package/dist/server/db/__tests__/migrate.test.js +148 -0
  1407. package/dist/server/db/__tests__/migrate.test.js.map +1 -0
  1408. package/dist/server/db/__tests__/query-helpers.test.js +166 -1
  1409. package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
  1410. package/dist/server/db/drizzle.service.d.ts.map +1 -1
  1411. package/dist/server/db/drizzle.service.js +8 -0
  1412. package/dist/server/db/drizzle.service.js.map +1 -1
  1413. package/dist/server/db/index.d.ts +1 -1
  1414. package/dist/server/db/index.d.ts.map +1 -1
  1415. package/dist/server/db/index.js +1 -1
  1416. package/dist/server/db/index.js.map +1 -1
  1417. package/dist/server/db/migrate.d.ts +38 -0
  1418. package/dist/server/db/migrate.d.ts.map +1 -1
  1419. package/dist/server/db/migrate.js +81 -12
  1420. package/dist/server/db/migrate.js.map +1 -1
  1421. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts +2 -0
  1422. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts.map +1 -0
  1423. package/dist/server/db/outbox/__tests__/relay.int.test.js +117 -0
  1424. package/dist/server/db/outbox/__tests__/relay.int.test.js.map +1 -0
  1425. package/dist/server/db/query-helpers.d.ts +8 -0
  1426. package/dist/server/db/query-helpers.d.ts.map +1 -1
  1427. package/dist/server/db/query-helpers.js +67 -0
  1428. package/dist/server/db/query-helpers.js.map +1 -1
  1429. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts +2 -0
  1430. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts.map +1 -0
  1431. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js +240 -0
  1432. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js.map +1 -0
  1433. package/dist/server/kernel/__tests__/cache.int.test.d.ts +2 -0
  1434. package/dist/server/kernel/__tests__/cache.int.test.d.ts.map +1 -0
  1435. package/dist/server/kernel/__tests__/cache.int.test.js +52 -0
  1436. package/dist/server/kernel/__tests__/cache.int.test.js.map +1 -0
  1437. package/dist/server/kernel/__tests__/domain-error.test.d.ts +2 -0
  1438. package/dist/server/kernel/__tests__/domain-error.test.d.ts.map +1 -0
  1439. package/dist/server/kernel/__tests__/domain-error.test.js +35 -0
  1440. package/dist/server/kernel/__tests__/domain-error.test.js.map +1 -0
  1441. package/dist/server/kernel/__tests__/error-reporter.test.d.ts +2 -0
  1442. package/dist/server/kernel/__tests__/error-reporter.test.d.ts.map +1 -0
  1443. package/dist/server/kernel/__tests__/error-reporter.test.js +52 -0
  1444. package/dist/server/kernel/__tests__/error-reporter.test.js.map +1 -0
  1445. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts +2 -0
  1446. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts.map +1 -0
  1447. package/dist/server/kernel/__tests__/event-bus.int.test.js +173 -0
  1448. package/dist/server/kernel/__tests__/event-bus.int.test.js.map +1 -0
  1449. package/dist/server/kernel/__tests__/helpers.test.js +26 -0
  1450. package/dist/server/kernel/__tests__/helpers.test.js.map +1 -1
  1451. package/dist/server/kernel/__tests__/logger.test.d.ts +2 -0
  1452. package/dist/server/kernel/__tests__/logger.test.d.ts.map +1 -0
  1453. package/dist/server/kernel/__tests__/logger.test.js +44 -0
  1454. package/dist/server/kernel/__tests__/logger.test.js.map +1 -0
  1455. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts +2 -0
  1456. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts.map +1 -0
  1457. package/dist/server/kernel/__tests__/orpc-error-map.test.js +54 -0
  1458. package/dist/server/kernel/__tests__/orpc-error-map.test.js.map +1 -0
  1459. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts +2 -0
  1460. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts.map +1 -0
  1461. package/dist/server/kernel/__tests__/platform-config-loader.test.js +112 -0
  1462. package/dist/server/kernel/__tests__/platform-config-loader.test.js.map +1 -0
  1463. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts +2 -0
  1464. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts.map +1 -0
  1465. package/dist/server/kernel/__tests__/rate-limiter.int.test.js +41 -0
  1466. package/dist/server/kernel/__tests__/rate-limiter.int.test.js.map +1 -0
  1467. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts +2 -0
  1468. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts.map +1 -0
  1469. package/dist/server/kernel/__tests__/redis-cache.int.test.js +49 -0
  1470. package/dist/server/kernel/__tests__/redis-cache.int.test.js.map +1 -0
  1471. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts +2 -0
  1472. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts.map +1 -0
  1473. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js +218 -0
  1474. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js.map +1 -0
  1475. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts +2 -0
  1476. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts.map +1 -0
  1477. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js +61 -0
  1478. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js.map +1 -0
  1479. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts +2 -0
  1480. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts.map +1 -0
  1481. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js +190 -0
  1482. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js.map +1 -0
  1483. package/dist/server/kernel/__tests__/request-context.test.d.ts +2 -0
  1484. package/dist/server/kernel/__tests__/request-context.test.d.ts.map +1 -0
  1485. package/dist/server/kernel/__tests__/request-context.test.js +64 -0
  1486. package/dist/server/kernel/__tests__/request-context.test.js.map +1 -0
  1487. package/dist/server/kernel/__tests__/router-utils.test.d.ts +2 -0
  1488. package/dist/server/kernel/__tests__/router-utils.test.d.ts.map +1 -0
  1489. package/dist/server/kernel/__tests__/router-utils.test.js +87 -0
  1490. package/dist/server/kernel/__tests__/router-utils.test.js.map +1 -0
  1491. package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
  1492. package/dist/server/kernel/bullmq-job-queue.js +27 -4
  1493. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  1494. package/dist/server/kernel/cache.d.ts +0 -12
  1495. package/dist/server/kernel/cache.d.ts.map +1 -1
  1496. package/dist/server/kernel/cache.js +0 -55
  1497. package/dist/server/kernel/cache.js.map +1 -1
  1498. package/dist/server/kernel/container.d.ts +7 -6
  1499. package/dist/server/kernel/container.d.ts.map +1 -1
  1500. package/dist/server/kernel/container.js +3 -0
  1501. package/dist/server/kernel/container.js.map +1 -1
  1502. package/dist/server/kernel/domain-error.d.ts +15 -5
  1503. package/dist/server/kernel/domain-error.d.ts.map +1 -1
  1504. package/dist/server/kernel/domain-error.js +4 -2
  1505. package/dist/server/kernel/domain-error.js.map +1 -1
  1506. package/dist/server/kernel/error-reporter.d.ts +5 -0
  1507. package/dist/server/kernel/error-reporter.d.ts.map +1 -0
  1508. package/dist/server/kernel/error-reporter.js +20 -0
  1509. package/dist/server/kernel/error-reporter.js.map +1 -0
  1510. package/dist/server/kernel/event-bus.d.ts +2 -18
  1511. package/dist/server/kernel/event-bus.d.ts.map +1 -1
  1512. package/dist/server/kernel/event-bus.js +11 -34
  1513. package/dist/server/kernel/event-bus.js.map +1 -1
  1514. package/dist/server/kernel/event-stream.d.ts.map +1 -1
  1515. package/dist/server/kernel/event-stream.js +19 -4
  1516. package/dist/server/kernel/event-stream.js.map +1 -1
  1517. package/dist/server/kernel/index.d.ts +10 -8
  1518. package/dist/server/kernel/index.d.ts.map +1 -1
  1519. package/dist/server/kernel/index.js +8 -7
  1520. package/dist/server/kernel/index.js.map +1 -1
  1521. package/dist/server/kernel/logger.d.ts +7 -0
  1522. package/dist/server/kernel/logger.d.ts.map +1 -1
  1523. package/dist/server/kernel/logger.js +36 -2
  1524. package/dist/server/kernel/logger.js.map +1 -1
  1525. package/dist/server/kernel/orpc-error-map.d.ts.map +1 -1
  1526. package/dist/server/kernel/orpc-error-map.js +4 -1
  1527. package/dist/server/kernel/orpc-error-map.js.map +1 -1
  1528. package/dist/server/kernel/rate-limiter.d.ts +2 -10
  1529. package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
  1530. package/dist/server/kernel/rate-limiter.js +0 -34
  1531. package/dist/server/kernel/rate-limiter.js.map +1 -1
  1532. package/dist/server/kernel/realtime-authorizer.d.ts +2 -4
  1533. package/dist/server/kernel/realtime-authorizer.d.ts.map +1 -1
  1534. package/dist/server/kernel/realtime-authorizer.js +3 -2
  1535. package/dist/server/kernel/realtime-authorizer.js.map +1 -1
  1536. package/dist/server/kernel/redis-cache.d.ts +3 -0
  1537. package/dist/server/kernel/redis-cache.d.ts.map +1 -1
  1538. package/dist/server/kernel/redis-cache.js +10 -0
  1539. package/dist/server/kernel/redis-cache.js.map +1 -1
  1540. package/dist/server/kernel/redis-client.d.ts.map +1 -1
  1541. package/dist/server/kernel/redis-client.js +5 -1
  1542. package/dist/server/kernel/redis-client.js.map +1 -1
  1543. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts +43 -0
  1544. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts.map +1 -0
  1545. package/dist/server/kernel/redis-pubsub-realtime-transport.js +0 -0
  1546. package/dist/server/kernel/redis-pubsub-realtime-transport.js.map +1 -0
  1547. package/dist/server/kernel/redis-rate-limiter.d.ts +1 -0
  1548. package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
  1549. package/dist/server/kernel/redis-rate-limiter.js +11 -0
  1550. package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
  1551. package/dist/server/kernel/redis-streams-broker.d.ts +65 -0
  1552. package/dist/server/kernel/redis-streams-broker.d.ts.map +1 -0
  1553. package/dist/server/kernel/redis-streams-broker.js +203 -0
  1554. package/dist/server/kernel/redis-streams-broker.js.map +1 -0
  1555. package/dist/server/kernel/request-context.d.ts +4 -0
  1556. package/dist/server/kernel/request-context.d.ts.map +1 -1
  1557. package/dist/server/kernel/request-context.js +4 -0
  1558. package/dist/server/kernel/request-context.js.map +1 -1
  1559. package/dist/server/kernel/router-utils.d.ts +7 -0
  1560. package/dist/server/kernel/router-utils.d.ts.map +1 -1
  1561. package/dist/server/kernel/router-utils.js +31 -2
  1562. package/dist/server/kernel/router-utils.js.map +1 -1
  1563. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts +2 -0
  1564. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts.map +1 -0
  1565. package/dist/server/plugin-host/__tests__/core-plugins.test.js +27 -0
  1566. package/dist/server/plugin-host/__tests__/core-plugins.test.js.map +1 -0
  1567. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts +2 -0
  1568. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts.map +1 -0
  1569. package/dist/server/plugin-host/__tests__/load-plugins.test.js +31 -0
  1570. package/dist/server/plugin-host/__tests__/load-plugins.test.js.map +1 -0
  1571. package/dist/server/plugin-host/__tests__/module-registry.test.js.map +1 -1
  1572. package/dist/server/plugin-host/__tests__/required-ports.test.js +1 -0
  1573. package/dist/server/plugin-host/__tests__/required-ports.test.js.map +1 -1
  1574. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts +2 -0
  1575. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts.map +1 -0
  1576. package/dist/server/plugin-host/__tests__/typed-plugin.test.js +82 -0
  1577. package/dist/server/plugin-host/__tests__/typed-plugin.test.js.map +1 -0
  1578. package/dist/server/plugin-host/core-plugins.d.ts +16 -0
  1579. package/dist/server/plugin-host/core-plugins.d.ts.map +1 -0
  1580. package/dist/server/plugin-host/core-plugins.js +41 -0
  1581. package/dist/server/plugin-host/core-plugins.js.map +1 -0
  1582. package/dist/server/plugin-host/define-plugin.d.ts +24 -24
  1583. package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
  1584. package/dist/server/plugin-host/define-plugin.js +1 -3
  1585. package/dist/server/plugin-host/define-plugin.js.map +1 -1
  1586. package/dist/server/plugin-host/index.d.ts +3 -3
  1587. package/dist/server/plugin-host/index.d.ts.map +1 -1
  1588. package/dist/server/plugin-host/index.js +2 -2
  1589. package/dist/server/plugin-host/index.js.map +1 -1
  1590. package/dist/server/plugin-host/load-extensions.d.ts +2 -2
  1591. package/dist/server/plugin-host/load-extensions.js +2 -2
  1592. package/dist/server/plugin-host/load-plugins.d.ts +7 -3
  1593. package/dist/server/plugin-host/load-plugins.d.ts.map +1 -1
  1594. package/dist/server/plugin-host/load-plugins.js +10 -2
  1595. package/dist/server/plugin-host/load-plugins.js.map +1 -1
  1596. package/dist/server/plugin-host/module-registry.d.ts +9 -14
  1597. package/dist/server/plugin-host/module-registry.d.ts.map +1 -1
  1598. package/dist/server/plugin-host/module-registry.js +2 -9
  1599. package/dist/server/plugin-host/module-registry.js.map +1 -1
  1600. package/dist/server/runtime/__tests__/create-app.test.d.ts +2 -0
  1601. package/dist/server/runtime/__tests__/create-app.test.d.ts.map +1 -0
  1602. package/dist/server/runtime/__tests__/create-app.test.js +98 -0
  1603. package/dist/server/runtime/__tests__/create-app.test.js.map +1 -0
  1604. package/dist/server/runtime/assert-durable-seams.d.ts +19 -0
  1605. package/dist/server/runtime/assert-durable-seams.d.ts.map +1 -0
  1606. package/dist/server/runtime/assert-durable-seams.js +37 -0
  1607. package/dist/server/runtime/assert-durable-seams.js.map +1 -0
  1608. package/dist/server/runtime/core-token-catalog.d.ts +176 -0
  1609. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -0
  1610. package/dist/server/runtime/core-token-catalog.js +69 -0
  1611. package/dist/server/runtime/core-token-catalog.js.map +1 -0
  1612. package/dist/server/runtime/create-app.d.ts +18 -23
  1613. package/dist/server/runtime/create-app.d.ts.map +1 -1
  1614. package/dist/server/runtime/create-app.js +126 -73
  1615. package/dist/server/runtime/create-app.js.map +1 -1
  1616. package/dist/server/runtime/index.d.ts +2 -3
  1617. package/dist/server/runtime/index.d.ts.map +1 -1
  1618. package/dist/server/runtime/index.js +0 -2
  1619. package/dist/server/runtime/index.js.map +1 -1
  1620. package/dist/testing/index.d.ts +6 -0
  1621. package/dist/testing/index.d.ts.map +1 -0
  1622. package/dist/testing/index.js +6 -0
  1623. package/dist/testing/index.js.map +1 -0
  1624. package/dist/testing/mock.d.ts +58 -15
  1625. package/dist/testing/mock.d.ts.map +1 -1
  1626. package/dist/testing/mock.js +162 -39
  1627. package/dist/testing/mock.js.map +1 -1
  1628. package/dist/testing/real-infra.d.ts +47 -0
  1629. package/dist/testing/real-infra.d.ts.map +1 -0
  1630. package/dist/testing/real-infra.js +151 -0
  1631. package/dist/testing/real-infra.js.map +1 -0
  1632. package/dist/testing/realtime-transport-conformance.d.ts +35 -0
  1633. package/dist/testing/realtime-transport-conformance.d.ts.map +1 -0
  1634. package/dist/testing/realtime-transport-conformance.js +94 -0
  1635. package/dist/testing/realtime-transport-conformance.js.map +1 -0
  1636. package/dist/testing/seed-player.d.ts +101 -0
  1637. package/dist/testing/seed-player.d.ts.map +1 -0
  1638. package/dist/testing/seed-player.js +43 -0
  1639. package/dist/testing/seed-player.js.map +1 -0
  1640. package/dist/testing/seed-wallet.d.ts +9 -0
  1641. package/dist/testing/seed-wallet.d.ts.map +1 -0
  1642. package/dist/testing/seed-wallet.js +27 -0
  1643. package/dist/testing/seed-wallet.js.map +1 -0
  1644. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts +2 -0
  1645. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts.map +1 -0
  1646. package/dist/wallet/__tests__/admin-reporting.int.test.js +236 -0
  1647. package/dist/wallet/__tests__/admin-reporting.int.test.js.map +1 -0
  1648. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts +2 -0
  1649. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts.map +1 -0
  1650. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js +163 -0
  1651. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js.map +1 -0
  1652. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts +2 -0
  1653. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts.map +1 -0
  1654. package/dist/wallet/__tests__/bonus-rollover.int.test.js +444 -0
  1655. package/dist/wallet/__tests__/bonus-rollover.int.test.js.map +1 -0
  1656. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
  1657. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
  1658. package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
  1659. package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
  1660. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
  1661. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
  1662. package/dist/wallet/__tests__/custody-sweep.service.int.test.js +274 -0
  1663. package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
  1664. package/dist/wallet/__tests__/deposit-gate.test.d.ts +2 -0
  1665. package/dist/wallet/__tests__/deposit-gate.test.d.ts.map +1 -0
  1666. package/dist/wallet/__tests__/deposit-gate.test.js +46 -0
  1667. package/dist/wallet/__tests__/deposit-gate.test.js.map +1 -0
  1668. package/dist/wallet/__tests__/hmac-payment-webhook-verifier.test.d.ts +2 -0
  1669. package/dist/wallet/__tests__/hmac-payment-webhook-verifier.test.d.ts.map +1 -0
  1670. package/dist/wallet/__tests__/hmac-payment-webhook-verifier.test.js +25 -0
  1671. package/dist/wallet/__tests__/hmac-payment-webhook-verifier.test.js.map +1 -0
  1672. package/dist/wallet/__tests__/rail-for.test.d.ts +2 -0
  1673. package/dist/wallet/__tests__/rail-for.test.d.ts.map +1 -0
  1674. package/dist/wallet/__tests__/rail-for.test.js +29 -0
  1675. package/dist/wallet/__tests__/rail-for.test.js.map +1 -0
  1676. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts +2 -0
  1677. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts.map +1 -0
  1678. package/dist/wallet/__tests__/reconciliation-diff.test.js +49 -0
  1679. package/dist/wallet/__tests__/reconciliation-diff.test.js.map +1 -0
  1680. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts +2 -0
  1681. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts.map +1 -0
  1682. package/dist/wallet/__tests__/reconciliation.service.int.test.js +444 -0
  1683. package/dist/wallet/__tests__/reconciliation.service.int.test.js.map +1 -0
  1684. package/dist/wallet/__tests__/settlement-network.test.d.ts +2 -0
  1685. package/dist/wallet/__tests__/settlement-network.test.d.ts.map +1 -0
  1686. package/dist/wallet/__tests__/settlement-network.test.js +54 -0
  1687. package/dist/wallet/__tests__/settlement-network.test.js.map +1 -0
  1688. package/dist/wallet/__tests__/wallet-address-format.test.d.ts +2 -0
  1689. package/dist/wallet/__tests__/wallet-address-format.test.d.ts.map +1 -0
  1690. package/dist/wallet/__tests__/wallet-address-format.test.js +102 -0
  1691. package/dist/wallet/__tests__/wallet-address-format.test.js.map +1 -0
  1692. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts +2 -0
  1693. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts.map +1 -0
  1694. package/dist/wallet/__tests__/wallet-asset.router.int.test.js +263 -0
  1695. package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -0
  1696. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts +2 -0
  1697. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts.map +1 -0
  1698. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +137 -0
  1699. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -0
  1700. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts +2 -0
  1701. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts.map +1 -0
  1702. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +205 -0
  1703. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -0
  1704. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts +2 -0
  1705. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts.map +1 -0
  1706. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +775 -0
  1707. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -0
  1708. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts +2 -0
  1709. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts.map +1 -0
  1710. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js +38 -0
  1711. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js.map +1 -0
  1712. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts +2 -0
  1713. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts.map +1 -0
  1714. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js +114 -0
  1715. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js.map +1 -0
  1716. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts +2 -0
  1717. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts.map +1 -0
  1718. package/dist/wallet/__tests__/wallet-commands.service.int.test.js +299 -0
  1719. package/dist/wallet/__tests__/wallet-commands.service.int.test.js.map +1 -0
  1720. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts +2 -0
  1721. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts.map +1 -0
  1722. package/dist/wallet/__tests__/wallet-currency-code.test.js +48 -0
  1723. package/dist/wallet/__tests__/wallet-currency-code.test.js.map +1 -0
  1724. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts +2 -0
  1725. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts.map +1 -0
  1726. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js +129 -0
  1727. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js.map +1 -0
  1728. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts +2 -0
  1729. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts.map +1 -0
  1730. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js +104 -0
  1731. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js.map +1 -0
  1732. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts +2 -0
  1733. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts.map +1 -0
  1734. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js +93 -0
  1735. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js.map +1 -0
  1736. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts +2 -0
  1737. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts.map +1 -0
  1738. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js +36 -0
  1739. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js.map +1 -0
  1740. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts +2 -0
  1741. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts.map +1 -0
  1742. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +310 -0
  1743. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -0
  1744. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts +2 -0
  1745. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts.map +1 -0
  1746. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js +64 -0
  1747. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js.map +1 -0
  1748. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts +2 -0
  1749. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts.map +1 -0
  1750. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js +179 -0
  1751. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js.map +1 -0
  1752. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts +2 -0
  1753. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts.map +1 -0
  1754. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js +117 -0
  1755. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js.map +1 -0
  1756. package/dist/wallet/__tests__/wallet.router.int.test.d.ts +2 -0
  1757. package/dist/wallet/__tests__/wallet.router.int.test.d.ts.map +1 -0
  1758. package/dist/wallet/__tests__/wallet.router.int.test.js +104 -0
  1759. package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -0
  1760. package/dist/wallet/__tests__/wallet.service.int.test.d.ts +2 -0
  1761. package/dist/wallet/__tests__/wallet.service.int.test.d.ts.map +1 -0
  1762. package/dist/wallet/__tests__/wallet.service.int.test.js +1483 -0
  1763. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -0
  1764. package/dist/wallet/adapters/hmac-payment-webhook-verifier.d.ts +7 -0
  1765. package/dist/wallet/adapters/hmac-payment-webhook-verifier.d.ts.map +1 -0
  1766. package/dist/wallet/adapters/hmac-payment-webhook-verifier.js +30 -0
  1767. package/dist/wallet/adapters/hmac-payment-webhook-verifier.js.map +1 -0
  1768. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts +14 -0
  1769. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts.map +1 -0
  1770. package/dist/wallet/adapters/wallet-asset-catalog.service.js +37 -0
  1771. package/dist/wallet/adapters/wallet-asset-catalog.service.js.map +1 -0
  1772. package/dist/wallet/adapters/wallet-reader.service.d.ts +3 -1
  1773. package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
  1774. package/dist/wallet/adapters/wallet-reader.service.js +22 -1
  1775. package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
  1776. package/dist/wallet/admin-reporting.d.ts +3 -3
  1777. package/dist/wallet/admin-reporting.d.ts.map +1 -1
  1778. package/dist/wallet/admin-reporting.js +11 -3
  1779. package/dist/wallet/admin-reporting.js.map +1 -1
  1780. package/dist/wallet/contract/index.d.ts +951 -17
  1781. package/dist/wallet/contract/index.d.ts.map +1 -1
  1782. package/dist/wallet/contract/index.js +481 -15
  1783. package/dist/wallet/contract/index.js.map +1 -1
  1784. package/dist/wallet/drizzle/migrations/0002_aromatic_archangel.sql +20 -0
  1785. package/dist/wallet/drizzle/migrations/0003_certain_ogun.sql +2 -0
  1786. package/dist/wallet/drizzle/migrations/0004_reflective_shriek.sql +2 -0
  1787. package/dist/wallet/drizzle/migrations/0005_gigantic_dust.sql +10 -0
  1788. package/dist/wallet/drizzle/migrations/0006_lush_morg.sql +1 -0
  1789. package/dist/wallet/drizzle/migrations/0007_bouncy_swordsman.sql +17 -0
  1790. package/dist/wallet/drizzle/migrations/0008_gorgeous_colonel_america.sql +1 -0
  1791. package/dist/wallet/drizzle/migrations/0009_smooth_sue_storm.sql +17 -0
  1792. package/dist/wallet/drizzle/migrations/0010_worthless_quasimodo.sql +84 -0
  1793. package/dist/wallet/drizzle/migrations/0011_premium_natasha_romanoff.sql +30 -0
  1794. package/dist/wallet/drizzle/migrations/0012_long_wong.sql +15 -0
  1795. package/dist/wallet/drizzle/migrations/0013_polite_peter_parker.sql +1 -0
  1796. package/dist/wallet/drizzle/migrations/0014_abandoned_madripoor.sql +20 -0
  1797. package/dist/wallet/drizzle/migrations/0015_right_oracle.sql +3 -0
  1798. package/dist/wallet/drizzle/migrations/0016_curly_ben_urich.sql +2 -0
  1799. package/dist/wallet/drizzle/migrations/0017_workable_wolf_cub.sql +2 -0
  1800. package/dist/wallet/drizzle/migrations/meta/0002_snapshot.json +513 -0
  1801. package/dist/wallet/drizzle/migrations/meta/0003_snapshot.json +567 -0
  1802. package/dist/wallet/drizzle/migrations/meta/0004_snapshot.json +631 -0
  1803. package/dist/wallet/drizzle/migrations/meta/0006_snapshot.json +638 -0
  1804. package/dist/wallet/drizzle/migrations/meta/0007_snapshot.json +723 -0
  1805. package/dist/wallet/drizzle/migrations/meta/0008_snapshot.json +716 -0
  1806. package/dist/wallet/drizzle/migrations/meta/0009_snapshot.json +895 -0
  1807. package/dist/wallet/drizzle/migrations/meta/0010_snapshot.json +1565 -0
  1808. package/dist/wallet/drizzle/migrations/meta/0011_snapshot.json +1777 -0
  1809. package/dist/wallet/drizzle/migrations/meta/0012_snapshot.json +1907 -0
  1810. package/dist/wallet/drizzle/migrations/meta/0013_snapshot.json +1913 -0
  1811. package/dist/wallet/drizzle/migrations/meta/0014_snapshot.json +1925 -0
  1812. package/dist/wallet/drizzle/migrations/meta/0015_snapshot.json +1937 -0
  1813. package/dist/wallet/drizzle/migrations/meta/0016_snapshot.json +1943 -0
  1814. package/dist/wallet/drizzle/migrations/meta/0017_snapshot.json +1945 -0
  1815. package/dist/wallet/drizzle/migrations/meta/_journal.json +112 -0
  1816. package/dist/wallet/index.d.ts.map +1 -1
  1817. package/dist/wallet/index.js +0 -2
  1818. package/dist/wallet/index.js.map +1 -1
  1819. package/dist/wallet/migrate.d.ts +0 -1
  1820. package/dist/wallet/migrate.d.ts.map +1 -1
  1821. package/dist/wallet/migrate.js +0 -4
  1822. package/dist/wallet/migrate.js.map +1 -1
  1823. package/dist/wallet/plugin.d.ts +178 -1
  1824. package/dist/wallet/plugin.d.ts.map +1 -1
  1825. package/dist/wallet/plugin.js +189 -19
  1826. package/dist/wallet/plugin.js.map +1 -1
  1827. package/dist/wallet/router/index.d.ts +512 -11
  1828. package/dist/wallet/router/index.d.ts.map +1 -1
  1829. package/dist/wallet/router/index.js +234 -22
  1830. package/dist/wallet/router/index.js.map +1 -1
  1831. package/dist/wallet/schema/index.d.ts +2100 -9
  1832. package/dist/wallet/schema/index.d.ts.map +1 -1
  1833. package/dist/wallet/schema/index.js +296 -6
  1834. package/dist/wallet/schema/index.js.map +1 -1
  1835. package/dist/wallet/seed/index.d.ts +3 -0
  1836. package/dist/wallet/seed/index.d.ts.map +1 -0
  1837. package/dist/wallet/seed/index.js +3 -0
  1838. package/dist/wallet/seed/index.js.map +1 -0
  1839. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts +11 -0
  1840. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts.map +1 -0
  1841. package/dist/wallet/seed/seed-auto-withdrawal-config.js +16 -0
  1842. package/dist/wallet/seed/seed-auto-withdrawal-config.js.map +1 -0
  1843. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts +3 -0
  1844. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts.map +1 -0
  1845. package/dist/wallet/seed/seed-bonus-rollover-config.js +8 -0
  1846. package/dist/wallet/seed/seed-bonus-rollover-config.js.map +1 -0
  1847. package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
  1848. package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
  1849. package/dist/wallet/service/custody-sweep.service.js +388 -0
  1850. package/dist/wallet/service/custody-sweep.service.js.map +1 -0
  1851. package/dist/wallet/service/reconciliation-finding.service.d.ts +39 -0
  1852. package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
  1853. package/dist/wallet/service/reconciliation-finding.service.js +47 -0
  1854. package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
  1855. package/dist/wallet/service/reconciliation.service.d.ts +118 -0
  1856. package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
  1857. package/dist/wallet/service/reconciliation.service.js +533 -0
  1858. package/dist/wallet/service/reconciliation.service.js.map +1 -0
  1859. package/dist/wallet/service/wallet-commands.service.d.ts +18 -4
  1860. package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
  1861. package/dist/wallet/service/wallet-commands.service.js +196 -29
  1862. package/dist/wallet/service/wallet-commands.service.js.map +1 -1
  1863. package/dist/wallet/service/wallet.service.d.ts +679 -22
  1864. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  1865. package/dist/wallet/service/wallet.service.js +1403 -108
  1866. package/dist/wallet/service/wallet.service.js.map +1 -1
  1867. package/generators/src/config.ts +548 -0
  1868. package/generators/src/templates/adapter.hbs +19 -0
  1869. package/generators/src/templates/contract.hbs +19 -0
  1870. package/generators/src/templates/job-worker.hbs +34 -0
  1871. package/generators/src/templates/module/drizzle.config.hbs +22 -0
  1872. package/generators/src/templates/module/index.hbs +5 -0
  1873. package/generators/src/templates/module/migrate.hbs +17 -0
  1874. package/generators/src/templates/module/plugin.hbs +19 -0
  1875. package/generators/src/templates/module/router.hbs +19 -0
  1876. package/generators/src/templates/module/schema.hbs +14 -0
  1877. package/generators/src/templates/module/service.hbs +26 -0
  1878. package/generators/src/templates/plugin.hbs +20 -0
  1879. package/package.json +148 -11
  1880. package/dist/admin-console/__tests__/backoffice.service.test.d.ts +0 -2
  1881. package/dist/admin-console/__tests__/backoffice.service.test.d.ts.map +0 -1
  1882. package/dist/admin-console/__tests__/backoffice.service.test.js +0 -156
  1883. package/dist/admin-console/__tests__/backoffice.service.test.js.map +0 -1
  1884. package/dist/audit/__tests__/audit.service.test.d.ts +0 -2
  1885. package/dist/audit/__tests__/audit.service.test.d.ts.map +0 -1
  1886. package/dist/audit/__tests__/audit.service.test.js +0 -442
  1887. package/dist/audit/__tests__/audit.service.test.js.map +0 -1
  1888. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts +0 -2
  1889. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts.map +0 -1
  1890. package/dist/casino/gaming/__tests__/gaming.service.test.js +0 -55
  1891. package/dist/casino/gaming/__tests__/gaming.service.test.js.map +0 -1
  1892. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts +0 -2
  1893. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts.map +0 -1
  1894. package/dist/casino/lobby/__tests__/lobby.cache.test.js +0 -47
  1895. package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +0 -1
  1896. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts +0 -2
  1897. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts.map +0 -1
  1898. package/dist/casino/lobby/__tests__/lobby.service.test.js +0 -11
  1899. package/dist/casino/lobby/__tests__/lobby.service.test.js.map +0 -1
  1900. package/dist/cms/__tests__/cms.cache.test.d.ts +0 -2
  1901. package/dist/cms/__tests__/cms.cache.test.d.ts.map +0 -1
  1902. package/dist/cms/__tests__/cms.cache.test.js +0 -87
  1903. package/dist/cms/__tests__/cms.cache.test.js.map +0 -1
  1904. package/dist/cms/__tests__/cms.router.test.d.ts +0 -2
  1905. package/dist/cms/__tests__/cms.router.test.d.ts.map +0 -1
  1906. package/dist/cms/__tests__/cms.router.test.js +0 -51
  1907. package/dist/cms/__tests__/cms.router.test.js.map +0 -1
  1908. package/dist/cms/__tests__/cms.service.test.d.ts +0 -2
  1909. package/dist/cms/__tests__/cms.service.test.d.ts.map +0 -1
  1910. package/dist/cms/__tests__/cms.service.test.js +0 -17
  1911. package/dist/cms/__tests__/cms.service.test.js.map +0 -1
  1912. package/dist/compliance/__tests__/compliance.service.test.d.ts +0 -2
  1913. package/dist/compliance/__tests__/compliance.service.test.d.ts.map +0 -1
  1914. package/dist/compliance/__tests__/compliance.service.test.js +0 -96
  1915. package/dist/compliance/__tests__/compliance.service.test.js.map +0 -1
  1916. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts +0 -2
  1917. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts.map +0 -1
  1918. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +0 -25
  1919. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +0 -1
  1920. package/dist/compliance/__tests__/kyc.service.test.d.ts +0 -2
  1921. package/dist/compliance/__tests__/kyc.service.test.d.ts.map +0 -1
  1922. package/dist/compliance/__tests__/kyc.service.test.js +0 -177
  1923. package/dist/compliance/__tests__/kyc.service.test.js.map +0 -1
  1924. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts +0 -2
  1925. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts.map +0 -1
  1926. package/dist/compliance/__tests__/rg-monitoring.service.test.js +0 -110
  1927. package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +0 -1
  1928. package/dist/compliance/__tests__/rg.router.test.d.ts +0 -2
  1929. package/dist/compliance/__tests__/rg.router.test.d.ts.map +0 -1
  1930. package/dist/compliance/__tests__/rg.router.test.js +0 -66
  1931. package/dist/compliance/__tests__/rg.router.test.js.map +0 -1
  1932. package/dist/compliance/__tests__/rg.service.test.d.ts +0 -2
  1933. package/dist/compliance/__tests__/rg.service.test.d.ts.map +0 -1
  1934. package/dist/compliance/__tests__/rg.service.test.js +0 -212
  1935. package/dist/compliance/__tests__/rg.service.test.js.map +0 -1
  1936. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts +0 -2
  1937. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts.map +0 -1
  1938. package/dist/contracts/schemas/__tests__/identity-schemas.test.js +0 -38
  1939. package/dist/contracts/schemas/__tests__/identity-schemas.test.js.map +0 -1
  1940. package/dist/engagement/chat/__tests__/chat.service.test.d.ts +0 -2
  1941. package/dist/engagement/chat/__tests__/chat.service.test.d.ts.map +0 -1
  1942. package/dist/engagement/chat/__tests__/chat.service.test.js +0 -170
  1943. package/dist/engagement/chat/__tests__/chat.service.test.js.map +0 -1
  1944. package/dist/engagement/chat/react/use-chat-stream.d.ts +0 -26
  1945. package/dist/engagement/chat/react/use-chat-stream.d.ts.map +0 -1
  1946. package/dist/engagement/chat/react/use-chat-stream.js +0 -54
  1947. package/dist/engagement/chat/react/use-chat-stream.js.map +0 -1
  1948. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts +0 -2
  1949. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts.map +0 -1
  1950. package/dist/engagement/notifications/__tests__/notifications.service.test.js +0 -84
  1951. package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +0 -1
  1952. package/dist/iam/__tests__/iam.service.test.d.ts +0 -2
  1953. package/dist/iam/__tests__/iam.service.test.d.ts.map +0 -1
  1954. package/dist/iam/__tests__/iam.service.test.js +0 -744
  1955. package/dist/iam/__tests__/iam.service.test.js.map +0 -1
  1956. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts +0 -2
  1957. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts.map +0 -1
  1958. package/dist/pam/identity/__tests__/admin-user-directory.test.js +0 -93
  1959. package/dist/pam/identity/__tests__/admin-user-directory.test.js.map +0 -1
  1960. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts +0 -2
  1961. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts.map +0 -1
  1962. package/dist/pam/identity/__tests__/identity.rate-limit.test.js +0 -127
  1963. package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +0 -1
  1964. package/dist/pam/identity/__tests__/identity.service.test.d.ts +0 -2
  1965. package/dist/pam/identity/__tests__/identity.service.test.d.ts.map +0 -1
  1966. package/dist/pam/identity/__tests__/identity.service.test.js +0 -292
  1967. package/dist/pam/identity/__tests__/identity.service.test.js.map +0 -1
  1968. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts +0 -2
  1969. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts.map +0 -1
  1970. package/dist/pam/identity/__tests__/login-enforcement.service.test.js +0 -41
  1971. package/dist/pam/identity/__tests__/login-enforcement.service.test.js.map +0 -1
  1972. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts +0 -2
  1973. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts.map +0 -1
  1974. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +0 -38
  1975. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +0 -1
  1976. package/dist/pam/player-management/__tests__/player.router.test.d.ts +0 -2
  1977. package/dist/pam/player-management/__tests__/player.router.test.d.ts.map +0 -1
  1978. package/dist/pam/player-management/__tests__/player.router.test.js +0 -57
  1979. package/dist/pam/player-management/__tests__/player.router.test.js.map +0 -1
  1980. package/dist/pam/player-management/__tests__/player.service.test.d.ts +0 -2
  1981. package/dist/pam/player-management/__tests__/player.service.test.d.ts.map +0 -1
  1982. package/dist/pam/player-management/__tests__/player.service.test.js +0 -144
  1983. package/dist/pam/player-management/__tests__/player.service.test.js.map +0 -1
  1984. package/dist/pam/profile/__tests__/profile.service.test.d.ts +0 -2
  1985. package/dist/pam/profile/__tests__/profile.service.test.d.ts.map +0 -1
  1986. package/dist/pam/profile/__tests__/profile.service.test.js +0 -48
  1987. package/dist/pam/profile/__tests__/profile.service.test.js.map +0 -1
  1988. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts +0 -2
  1989. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts.map +0 -1
  1990. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +0 -38
  1991. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +0 -1
  1992. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts +0 -2
  1993. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts.map +0 -1
  1994. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +0 -269
  1995. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +0 -1
  1996. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts +0 -2
  1997. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts.map +0 -1
  1998. package/dist/pam/tag/__tests__/tag-rule.service.test.js +0 -149
  1999. package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +0 -1
  2000. package/dist/pam/tag/__tests__/tag.router.test.d.ts +0 -2
  2001. package/dist/pam/tag/__tests__/tag.router.test.d.ts.map +0 -1
  2002. package/dist/pam/tag/__tests__/tag.router.test.js +0 -38
  2003. package/dist/pam/tag/__tests__/tag.router.test.js.map +0 -1
  2004. package/dist/pam/tag/__tests__/tag.service.test.d.ts +0 -2
  2005. package/dist/pam/tag/__tests__/tag.service.test.d.ts.map +0 -1
  2006. package/dist/pam/tag/__tests__/tag.service.test.js +0 -262
  2007. package/dist/pam/tag/__tests__/tag.service.test.js.map +0 -1
  2008. package/dist/server/auth/__tests__/admin-guard.test.d.ts +0 -2
  2009. package/dist/server/auth/__tests__/admin-guard.test.d.ts.map +0 -1
  2010. package/dist/server/auth/__tests__/admin-guard.test.js +0 -133
  2011. package/dist/server/auth/__tests__/admin-guard.test.js.map +0 -1
  2012. package/dist/server/auth/__tests__/session-resolver.test.d.ts +0 -2
  2013. package/dist/server/auth/__tests__/session-resolver.test.d.ts.map +0 -1
  2014. package/dist/server/auth/__tests__/session-resolver.test.js +0 -27
  2015. package/dist/server/auth/__tests__/session-resolver.test.js.map +0 -1
  2016. package/dist/server/db/outbox/__tests__/relay.test.d.ts +0 -2
  2017. package/dist/server/db/outbox/__tests__/relay.test.d.ts.map +0 -1
  2018. package/dist/server/db/outbox/__tests__/relay.test.js +0 -124
  2019. package/dist/server/db/outbox/__tests__/relay.test.js.map +0 -1
  2020. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts +0 -2
  2021. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts.map +0 -1
  2022. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js +0 -190
  2023. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js.map +0 -1
  2024. package/dist/server/kernel/__tests__/cache.test.d.ts +0 -2
  2025. package/dist/server/kernel/__tests__/cache.test.d.ts.map +0 -1
  2026. package/dist/server/kernel/__tests__/cache.test.js +0 -84
  2027. package/dist/server/kernel/__tests__/cache.test.js.map +0 -1
  2028. package/dist/server/kernel/__tests__/event-bus.test.d.ts +0 -2
  2029. package/dist/server/kernel/__tests__/event-bus.test.d.ts.map +0 -1
  2030. package/dist/server/kernel/__tests__/event-bus.test.js +0 -116
  2031. package/dist/server/kernel/__tests__/event-bus.test.js.map +0 -1
  2032. package/dist/server/kernel/__tests__/job-queue.test.d.ts +0 -2
  2033. package/dist/server/kernel/__tests__/job-queue.test.d.ts.map +0 -1
  2034. package/dist/server/kernel/__tests__/job-queue.test.js +0 -135
  2035. package/dist/server/kernel/__tests__/job-queue.test.js.map +0 -1
  2036. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts +0 -2
  2037. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts.map +0 -1
  2038. package/dist/server/kernel/__tests__/rate-limiter.test.js +0 -74
  2039. package/dist/server/kernel/__tests__/rate-limiter.test.js.map +0 -1
  2040. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts +0 -2
  2041. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts.map +0 -1
  2042. package/dist/server/kernel/__tests__/realtime-authorizer.test.js +0 -19
  2043. package/dist/server/kernel/__tests__/realtime-authorizer.test.js.map +0 -1
  2044. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts +0 -2
  2045. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +0 -1
  2046. package/dist/server/kernel/__tests__/realtime-transport.test.js +0 -50
  2047. package/dist/server/kernel/__tests__/realtime-transport.test.js.map +0 -1
  2048. package/dist/server/kernel/__tests__/redis-cache.test.d.ts +0 -2
  2049. package/dist/server/kernel/__tests__/redis-cache.test.d.ts.map +0 -1
  2050. package/dist/server/kernel/__tests__/redis-cache.test.js +0 -49
  2051. package/dist/server/kernel/__tests__/redis-cache.test.js.map +0 -1
  2052. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts +0 -2
  2053. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts.map +0 -1
  2054. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js +0 -56
  2055. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js.map +0 -1
  2056. package/dist/server/kernel/job-queue.d.ts +0 -40
  2057. package/dist/server/kernel/job-queue.d.ts.map +0 -1
  2058. package/dist/server/kernel/job-queue.js +0 -200
  2059. package/dist/server/kernel/job-queue.js.map +0 -1
  2060. package/dist/server/kernel/realtime-transport.d.ts +0 -8
  2061. package/dist/server/kernel/realtime-transport.d.ts.map +0 -1
  2062. package/dist/server/kernel/realtime-transport.js +0 -57
  2063. package/dist/server/kernel/realtime-transport.js.map +0 -1
  2064. package/dist/server/runtime/openapi.d.ts +0 -15
  2065. package/dist/server/runtime/openapi.d.ts.map +0 -1
  2066. package/dist/server/runtime/openapi.js +0 -26
  2067. package/dist/server/runtime/openapi.js.map +0 -1
  2068. package/dist/wallet/__tests__/admin-reporting.test.d.ts +0 -2
  2069. package/dist/wallet/__tests__/admin-reporting.test.d.ts.map +0 -1
  2070. package/dist/wallet/__tests__/admin-reporting.test.js +0 -124
  2071. package/dist/wallet/__tests__/admin-reporting.test.js.map +0 -1
  2072. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts +0 -2
  2073. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts.map +0 -1
  2074. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +0 -98
  2075. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +0 -1
  2076. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts +0 -2
  2077. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts.map +0 -1
  2078. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +0 -419
  2079. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +0 -1
  2080. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts +0 -2
  2081. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts.map +0 -1
  2082. package/dist/wallet/__tests__/wallet-commands.service.test.js +0 -176
  2083. package/dist/wallet/__tests__/wallet-commands.service.test.js.map +0 -1
  2084. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts +0 -2
  2085. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts.map +0 -1
  2086. package/dist/wallet/__tests__/wallet-kyc-gate.test.js +0 -61
  2087. package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +0 -1
  2088. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts +0 -2
  2089. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts.map +0 -1
  2090. package/dist/wallet/__tests__/wallet.rate-limit.test.js +0 -34
  2091. package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +0 -1
  2092. package/dist/wallet/__tests__/wallet.router.test.d.ts +0 -2
  2093. package/dist/wallet/__tests__/wallet.router.test.d.ts.map +0 -1
  2094. package/dist/wallet/__tests__/wallet.router.test.js +0 -43
  2095. package/dist/wallet/__tests__/wallet.router.test.js.map +0 -1
  2096. package/dist/wallet/__tests__/wallet.service.test.d.ts +0 -2
  2097. package/dist/wallet/__tests__/wallet.service.test.d.ts.map +0 -1
  2098. package/dist/wallet/__tests__/wallet.service.test.js +0 -726
  2099. package/dist/wallet/__tests__/wallet.service.test.js.map +0 -1
  2100. package/turbo-generators/src/config.ts +0 -478
  2101. package/turbo-generators/src/templates/adapter.hbs +0 -19
  2102. package/turbo-generators/src/templates/contract.hbs +0 -18
  2103. package/turbo-generators/src/templates/job-worker.hbs +0 -34
  2104. package/turbo-generators/src/templates/module/agents.hbs +0 -67
  2105. package/turbo-generators/src/templates/module/drizzle.config.hbs +0 -22
  2106. package/turbo-generators/src/templates/module/index.hbs +0 -5
  2107. package/turbo-generators/src/templates/module/migrate.hbs +0 -15
  2108. package/turbo-generators/src/templates/module/package.json.hbs +0 -62
  2109. package/turbo-generators/src/templates/module/plugin.hbs +0 -20
  2110. package/turbo-generators/src/templates/module/router.hbs +0 -19
  2111. package/turbo-generators/src/templates/module/schema.hbs +0 -21
  2112. package/turbo-generators/src/templates/module/service.hbs +0 -26
  2113. package/turbo-generators/src/templates/module/tsconfig.json.hbs +0 -8
  2114. package/turbo-generators/src/templates/plugin.hbs +0 -20
  2115. /package/{turbo-generators → generators}/src/templates/adr.hbs +0 -0
  2116. /package/{turbo-generators → generators}/src/templates/config.hbs +0 -0
@@ -1,32 +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, } 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
- // Statuses that satisfy the withdrawal KYC gate.
13
- const KYC_PASS_STATUSES = new Set(['verified', 'manually_overridden']);
14
- export const CurrencyMismatchError = createDomainError('CurrencyMismatchError', (requested, walletCurrency) => `Currency mismatch: requested ${requested}, wallet holds ${walletCurrency}`);
15
- // Crypto currencies settle on the crypto rail (Fireblocks); everything else on the
16
- // fiat rail (a PSP). The concrete provider is recorded per transaction, not here.
17
- const CRYPTO_CURRENCIES = new Set(['BTC', 'ETH', 'USDT']);
17
+ export const DepositAddressUnsupportedError = makeConflictError('DepositAddressUnsupportedError', 'The bound payment adapter does not support address-based deposits');
18
+ export const DestinationAddressRequiredError = makeConflictError('DestinationAddressRequiredError', 'A destination address is required for a crypto-rail withdrawal');
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';
18
57
  // Per-user throttle on money mutations - guards a runaway/misbehaving client, not
19
58
  // fraud (idempotency + the ledger guard cover correctness). An overlay rebinds
20
59
  // RATE_LIMITER to change the backend, not this policy.
21
60
  const WALLET_MUTATION_RATE_LIMIT = { limit: 30, windowMs: 60 * 1000 };
22
- export function railFor(currency) {
23
- 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';
24
219
  }
25
220
  // Namespace the key per operation so the same raw key on a deposit then a withdraw can't
26
221
  // collide on the (walletId, idempotencyKey) unique index. The column is a uuid, so a string
27
222
  // prefix won't parse - hash namespace + key into a stable pseudo-uuid instead.
28
223
  const DEPOSIT_IDEMPOTENCY_NAMESPACE = 'deposit';
29
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']);
30
229
  function namespacedIdempotencyKey(namespace, rawKey) {
31
230
  const hex = createHash('sha256').update(`${namespace}:${rawKey}`).digest('hex');
32
231
  return [
@@ -47,6 +246,14 @@ const HIGH_FREQUENCY_MIN_COUNT = 3;
47
246
  const DAILY_CAP_WINDOW_MS = 24 * 60 * 60 * 1000;
48
247
  // Also the marker the cumulative-cap query reads back to identify auto-approved payouts - keep write and read in lockstep.
49
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
+ }
50
257
  function toAutoWithdrawalRuleDto(row) {
51
258
  return {
52
259
  id: row.id,
@@ -58,10 +265,49 @@ function toAutoWithdrawalRuleDto(row) {
58
265
  updatedAt: row.updatedAt.toISOString(),
59
266
  };
60
267
  }
61
- // The concrete settlement provider recorded per transaction: the crypto rail settles
62
- // through Fireblocks, the fiat rail through a PSP.
63
- function providerNameFor(rail) {
64
- 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: [] });
65
311
  }
66
312
  /**
67
313
  * Owns all wallet balance mutations and the withdrawal review/auto-approval
@@ -75,46 +321,151 @@ export class WalletService {
75
321
  drizzle;
76
322
  events;
77
323
  payment;
324
+ paymentProviders;
325
+ identityReader;
78
326
  directory;
79
327
  platformConfig;
80
328
  limiter;
81
329
  riskTags;
330
+ tagEvaluationCommands;
82
331
  audit;
83
- 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, }) {
84
334
  this.drizzle = drizzle;
85
335
  this.events = events;
86
336
  this.payment = payment;
337
+ this.paymentProviders = paymentProviders;
87
338
  this.directory = directory;
339
+ this.identityReader = identityReader;
88
340
  this.platformConfig = platformConfig;
89
341
  this.limiter = limiter;
90
342
  this.riskTags = riskTags;
343
+ this.tagEvaluationCommands = tagEvaluationCommands;
91
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 };
92
426
  }
93
427
  rateLimit(userId) {
94
428
  return this.limiter
95
429
  ? assertRateLimit(this.limiter, `wallet-mutation:${userId}`, WALLET_MUTATION_RATE_LIMIT)
96
430
  : Promise.resolve();
97
431
  }
98
- /** Fail-closed KYC gate: when enabled, a withdrawal needs a passing status (verified|manually_overridden). */
99
432
  async assertKycForWithdrawal(userId) {
100
433
  if (!this.platformConfig?.kyc?.gateWithdrawals) {
101
434
  return;
102
435
  }
103
436
  const status = await this.autoApprovalKycStatus(userId);
104
- if (!status || !KYC_PASS_STATUSES.has(status)) {
437
+ if (!status || !KYC_PASS_STATUSES.has(normalizeKycStatus(status))) {
105
438
  throw new KycRequiredError();
106
439
  }
107
440
  }
108
441
  async getBalance(userId) {
109
442
  const [record] = await this.drizzle.db.select().from(wallet).where(eq(wallet.userId, userId));
110
443
  if (!record) {
111
- return { balance: '0', currency: 'USD' };
444
+ return { balance: '0', currency: DEFAULT_WALLET_CURRENCY };
112
445
  }
113
446
  return {
114
- balance: record.balance,
447
+ balance: await readWalletBalance(this.drizzle.db, record.id, record.currency),
115
448
  currency: record.currency,
116
449
  };
117
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
+ }
118
469
  /**
119
470
  * `idempotencyKey` (when supplied) makes a retried deposit a no-op: a replay
120
471
  * returns the original committed result WITHOUT calling the PSP again or
@@ -124,9 +475,16 @@ export class WalletService {
124
475
  * reach the PSP, but the ledger insert's unique-index conflict still
125
476
  * guarantees only one balance credit - the loser's write becomes a replay
126
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.
127
484
  */
128
485
  async deposit({ userId, amount, currency, provider, idempotencyKey, }) {
129
486
  await this.rateLimit(userId);
487
+ await this.assertDepositable(currency, amount);
130
488
  // Short-circuit a replay BEFORE the PSP call - the common retry case (client
131
489
  // resends after a timeout) must not re-charge. A genuine concurrent race (two
132
490
  // first-attempts for the same key landing here at once) can still both reach the
@@ -139,52 +497,222 @@ export class WalletService {
139
497
  }
140
498
  preResolvedWallet = found.walletRecord;
141
499
  }
142
- const psp = await this.payment.processDeposit(amount, currency, { userId, provider });
143
- 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) => {
144
510
  let walletRecord = preResolvedWallet;
145
511
  if (!walletRecord) {
146
512
  [walletRecord] = await txn.select().from(wallet).where(eq(wallet.userId, userId));
147
513
  }
148
514
  if (!walletRecord) {
149
- 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 };
150
616
  }
151
617
  const { row, replayed } = await this.insertIdempotentTransaction(txn, {
152
- namespace: DEPOSIT_IDEMPOTENCY_NAMESPACE,
618
+ namespace: MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE,
153
619
  walletId: walletRecord.id,
154
620
  rawIdempotencyKey: idempotencyKey,
155
621
  amount,
156
622
  currency,
157
623
  values: {
158
624
  walletId: walletRecord.id,
159
- type: 'deposit',
625
+ type: direction === 'credit' ? 'manual_credit' : 'manual_debit',
160
626
  amount,
161
627
  currency,
162
628
  status: 'completed',
163
- rail: railFor(currency),
164
- providerName: provider,
165
- providerRefId: psp.externalId,
629
+ direction,
630
+ reviewedBy: adminId,
631
+ reviewedAt: new Date(),
632
+ reviewReason: reason,
166
633
  },
167
634
  });
168
- if (!replayed) {
169
- await txn
170
- .update(wallet)
171
- .set({ balance: sql `${wallet.balance} + ${amount}::numeric` })
172
- .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 };
644
+ }
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);
173
651
  }
174
- return { transactionId: row.id, replayed };
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 };
175
678
  });
176
- if (!replayed) {
177
- 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', {
178
684
  userId,
685
+ playerId,
686
+ adminId,
179
687
  amount,
180
688
  currency,
181
- transactionId,
689
+ transactionId: result.transactionId,
690
+ direction,
691
+ reason,
692
+ ip,
693
+ userAgent,
182
694
  });
183
695
  }
184
- return { transactionId, status: 'completed' };
696
+ return result;
185
697
  }
186
698
  // Pre-PSP replay check for deposit; also returns the resolved wallet so the transaction
187
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
+ }
188
716
  async findDepositReplay({ userId, idempotencyKey, amount, currency, }) {
189
717
  const [walletRecord] = await this.drizzle.db
190
718
  .select()
@@ -200,14 +728,23 @@ export class WalletService {
200
728
  this.assertReplayMatches(existing, amount, currency);
201
729
  return { walletRecord, replay: { transactionId: existing.id, status: existing.status } };
202
730
  }
203
- // Replay comparison only (not a ledger write) - moneyToNumber avoids a false mismatch
204
- // 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.
205
734
  assertReplayMatches(existing, amount, currency) {
206
- if (moneyToNumber(existing.amount) !== moneyToNumber(amount) ||
735
+ if (!moneyEquals(existing.amount, amount) ||
207
736
  existing.currency.toUpperCase() !== currency.toUpperCase()) {
208
737
  throw new IdempotencyKeyReuseError();
209
738
  }
210
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
+ }
211
748
  // Two concurrent requests with the same key can both pass the pre-insert check and race
212
749
  // on the unique index; onConflictDoNothing makes the loser's insert a no-op so it re-reads
213
750
  // the winner's committed row and returns it as a replay instead of aborting the transaction.
@@ -246,16 +783,19 @@ export class WalletService {
246
783
  * return an already-`completed`/`processing` result if the request
247
784
  * qualifies for (and passes) auto-approval - see `maybeAutoApprove`.
248
785
  */
249
- async withdraw({ userId, amount, currency, idempotencyKey, }) {
786
+ async withdraw({ userId, amount, currency, network, idempotencyKey, destinationAddress, destinationTag, ip, userAgent, }) {
250
787
  await this.rateLimit(userId);
251
788
  await this.assertKycForWithdrawal(userId);
789
+ if (this.resolveRail(currency) === 'crypto' && !destinationAddress) {
790
+ throw new DestinationAddressRequiredError();
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);
252
796
  const { transactionId, status, replayed, walletId, rail } = await this.drizzle.db.transaction(async (txn) => {
253
797
  // FOR UPDATE serializes concurrent withdrawals against a double-debit TOCTOU under READ COMMITTED.
254
798
  const current = findOneOrThrow(await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update'), new WalletNotFoundError(userId));
255
- // Single-currency wallet: reject a mismatch rather than coerce it onto the wrong rail.
256
- if (currency.toUpperCase() !== current.currency.toUpperCase()) {
257
- throw new CurrencyMismatchError(currency, current.currency);
258
- }
259
799
  // Replay of an already-committed key: return the original untouched. The new-key race is caught by the insert below.
260
800
  if (idempotencyKey) {
261
801
  const existing = await this.findByIdempotencyKey(txn, current.id, namespacedIdempotencyKey(WITHDRAW_IDEMPOTENCY_NAMESPACE, idempotencyKey));
@@ -266,7 +806,7 @@ export class WalletService {
266
806
  status: existing.status,
267
807
  replayed: true,
268
808
  walletId: current.id,
269
- rail: railFor(currency),
809
+ rail: this.resolveRail(currency),
270
810
  };
271
811
  }
272
812
  }
@@ -282,7 +822,12 @@ export class WalletService {
282
822
  amount,
283
823
  currency,
284
824
  status: 'pending',
285
- rail: railFor(currency),
825
+ direction: 'debit',
826
+ rail: this.resolveRail(currency),
827
+ network: settlementNetwork,
828
+ destinationAddress: destinationAddress ?? null,
829
+ destinationTag: destinationTag ?? null,
830
+ destinationWalletId,
286
831
  },
287
832
  });
288
833
  if (replayed) {
@@ -291,24 +836,29 @@ export class WalletService {
291
836
  status: row.status,
292
837
  replayed,
293
838
  walletId: current.id,
294
- rail: railFor(currency),
839
+ rail: this.resolveRail(currency),
295
840
  };
296
841
  }
297
- // Guarded conditional debit: the WHERE makes balance>=amount atomic with the write; 0 rows back rolls back the whole tx.
298
- const debited = await txn
299
- .update(wallet)
300
- .set({ balance: sql `${wallet.balance} - ${amount}::numeric` })
301
- .where(and(eq(wallet.id, current.id), gte(wallet.balance, amount)))
302
- .returning({ id: wallet.id });
842
+ const debited = await debitWithdrawableBalance(txn, current.id, currency, amount);
303
843
  if (debited.length !== 1) {
304
- 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 });
305
855
  }
306
856
  return {
307
857
  transactionId: row.id,
308
858
  status: row.status,
309
859
  replayed,
310
860
  walletId: current.id,
311
- rail: railFor(currency),
861
+ rail: this.resolveRail(currency),
312
862
  };
313
863
  });
314
864
  if (replayed) {
@@ -316,9 +866,12 @@ export class WalletService {
316
866
  }
317
867
  this.events.emit('wallet.withdrawal.requested', {
318
868
  userId,
869
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
319
870
  amount,
320
871
  currency,
321
872
  transactionId,
873
+ ip: ip ?? null,
874
+ userAgent: userAgent ?? null,
322
875
  });
323
876
  // Fail-closed post-step: decides who approves (system vs manual queue), never throws out of withdraw() - failure leaves the row pending.
324
877
  const auto = await this.maybeAutoApprove({
@@ -358,17 +911,38 @@ export class WalletService {
358
911
  }
359
912
  // Bounded queue: fetch all SQL-matching rows, then enrich + kycStatus-filter + paginate in memory,
360
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
+ };
361
924
  const rows = await db
362
925
  .select({ tx: walletTransaction, userId: wallet.userId })
363
926
  .from(walletTransaction)
364
927
  .innerJoin(wallet, eq(wallet.id, walletTransaction.walletId))
365
928
  .where(and(...conditions))
366
- .orderBy(desc(walletTransaction.createdAt));
929
+ .orderBy(wdDir(WD_SORT_COLS[wdSortBy]), desc(walletTransaction.id));
367
930
  const userIds = [...new Set(rows.map((r) => r.userId))];
368
931
  const summaries = this.directory ? await this.directory.lookupPlayers(userIds) : [];
369
932
  const byUserId = new Map(summaries.map((s) => [s.userId, s]));
370
- const matching = filters.kycStatus
371
- ? 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
+ })
372
946
  : rows;
373
947
  const start = pageToOffset(page, limit);
374
948
  const pageRows = matching.slice(start, start + limit);
@@ -387,14 +961,19 @@ export class WalletService {
387
961
  return {
388
962
  transactionId: r.tx.id,
389
963
  userId: r.userId,
964
+ playerId: summary?.playerId ?? null,
390
965
  username: summary?.username ?? '',
391
966
  amount: r.tx.amount,
392
967
  currency: r.tx.currency,
968
+ network: r.tx.network,
393
969
  rail: r.tx.rail ?? null,
394
970
  status: r.tx.status,
395
971
  kycStatus: summary?.kycStatus ?? null,
396
972
  riskTags,
397
973
  requestedAt: r.tx.createdAt.toISOString(),
974
+ destinationAddress: r.tx.destinationAddress,
975
+ destinationTag: r.tx.destinationTag,
976
+ txHash: r.tx.txHash,
398
977
  };
399
978
  });
400
979
  return { items, total: matching.length, page, limit };
@@ -404,11 +983,11 @@ export class WalletService {
404
983
  * or Failed + refund on PSP error. Robust PSP idempotency-key/reconciliation for a
405
984
  * lost-response is deferred - same scope boundary the deposit path declares.
406
985
  */
407
- async approveWithdrawal(adminId, withdrawalId) {
986
+ async approveWithdrawal(adminId, withdrawalId, meta) {
408
987
  // Two-phase: commit the `processing` flip first (FOR UPDATE lock), then call the PSP OUTSIDE
409
988
  // the tx (a failure refunds in a second tx). Never inline the PSP call inside the hold transaction.
410
989
  const tx = await this.drizzle.db.transaction((txn) => this.flipToProcessing({ txn, withdrawalId, adminId }));
411
- return this.settleApproved(tx, adminId);
990
+ return this.settleApproved(tx, adminId, meta);
412
991
  }
413
992
  // Phase one: the pending -> processing flip under a FOR UPDATE lock. Extracted so the auto path can run it
414
993
  // inside its advisory-locked cap-check transaction, committing the marker atomically. Never call the PSP here.
@@ -435,7 +1014,7 @@ export class WalletService {
435
1014
  }
436
1015
  // Phase two: settle a `processing` withdrawal via the PSP (Completed on success, Failed + refund on error).
437
1016
  // Runs OUTSIDE the hold/flip transaction so the external PSP call never holds a DB lock.
438
- async settleApproved(tx, adminId) {
1017
+ async settleApproved(tx, adminId, meta) {
439
1018
  const userId = await this.userIdForWallet(tx.walletId);
440
1019
  const amount = tx.amount;
441
1020
  // approved/failed are admin-attributed events (schema requires a uuid adminId); the system auto path
@@ -447,61 +1026,128 @@ export class WalletService {
447
1026
  currency: tx.currency,
448
1027
  transactionId: tx.id,
449
1028
  adminId,
1029
+ ip: meta?.ip ?? null,
1030
+ userAgent: meta?.userAgent ?? null,
450
1031
  });
451
1032
  }
1033
+ const { providerName, adapter } = await this.paymentAdapterFor(tx.currency, tx.network);
452
1034
  let result;
453
1035
  try {
454
- result = await this.payment.processWithdrawal(amount, tx.currency, {
1036
+ result = await adapter.processWithdrawal(amount, tx.currency, {
455
1037
  transactionId: tx.id,
456
1038
  userId,
457
1039
  rail: tx.rail,
458
1040
  adminId,
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,
459
1050
  });
460
1051
  }
461
1052
  catch (err) {
462
1053
  // Payout did not happen - mark failed and return the held funds in one transaction.
463
- await this.drizzle.db.transaction(async (txn) => {
464
- await txn
465
- .update(walletTransaction)
466
- .set({ status: 'failed' })
467
- .where(eq(walletTransaction.id, tx.id));
468
- await txn
469
- .update(wallet)
470
- .set({ balance: sql `${wallet.balance} + ${amount}::numeric` })
471
- .where(eq(wallet.id, tx.walletId));
472
- });
473
- if (adminId) {
474
- this.events.emit('wallet.withdrawal.failed', {
475
- userId,
476
- amount,
477
- currency: tx.currency,
478
- transactionId: tx.id,
479
- adminId,
480
- });
481
- }
1054
+ await this.finalizeFailedWithdrawal({ tx, adminId, userId, amount });
482
1055
  throw err;
483
1056
  }
1057
+ if (result.status === 'failed') {
1058
+ await this.finalizeFailedWithdrawal({ tx, adminId, userId, amount });
1059
+ return { transactionId: tx.id, status: 'failed' };
1060
+ }
1061
+ if (result.status !== 'completed') {
1062
+ await this.drizzle.db
1063
+ .update(walletTransaction)
1064
+ .set({
1065
+ providerName,
1066
+ providerRefId: result.externalId,
1067
+ })
1068
+ .where(eq(walletTransaction.id, tx.id));
1069
+ return { transactionId: tx.id, status: 'processing' };
1070
+ }
484
1071
  await this.drizzle.db
485
1072
  .update(walletTransaction)
486
1073
  .set({
487
1074
  status: 'completed',
488
- providerName: providerNameFor(tx.rail),
1075
+ providerName,
489
1076
  providerRefId: result.externalId,
490
1077
  })
491
1078
  .where(eq(walletTransaction.id, tx.id));
492
1079
  this.events.emit('wallet.withdrawal.completed', {
493
1080
  userId,
1081
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
494
1082
  amount,
495
1083
  currency: tx.currency,
496
1084
  transactionId: tx.id,
497
1085
  });
498
1086
  return { transactionId: tx.id, status: 'completed' };
499
1087
  }
1088
+ async finalizeFailedWithdrawal({ tx, adminId, userId, amount, }) {
1089
+ const transitioned = await this.drizzle.db.transaction(async (txn) => {
1090
+ const updated = await txn
1091
+ .update(walletTransaction)
1092
+ .set({ status: 'failed' })
1093
+ .where(and(eq(walletTransaction.id, tx.id), eq(walletTransaction.status, 'processing')))
1094
+ .returning({ id: walletTransaction.id });
1095
+ if (updated.length === 0) {
1096
+ return false;
1097
+ }
1098
+ await creditWalletBalance(txn, tx.walletId, tx.currency, amount);
1099
+ return true;
1100
+ });
1101
+ if (transitioned && adminId) {
1102
+ this.events.emit('wallet.withdrawal.failed', {
1103
+ userId,
1104
+ amount,
1105
+ currency: tx.currency,
1106
+ transactionId: tx.id,
1107
+ adminId,
1108
+ });
1109
+ }
1110
+ }
1111
+ async reconcileWithdrawalStatus(event) {
1112
+ const { externalId, status, txHash } = event;
1113
+ const [tx] = await this.drizzle.db
1114
+ .select()
1115
+ .from(walletTransaction)
1116
+ .where(eq(walletTransaction.providerRefId, externalId));
1117
+ if (!tx || tx.type !== 'withdrawal') {
1118
+ logger.warn({ externalId }, 'payment webhook: no matching withdrawal for providerRefId');
1119
+ return;
1120
+ }
1121
+ if (tx.status !== 'processing') {
1122
+ return;
1123
+ }
1124
+ const userId = await this.userIdForWallet(tx.walletId);
1125
+ if (status === 'completed') {
1126
+ const updated = await this.drizzle.db
1127
+ .update(walletTransaction)
1128
+ .set({ status: 'completed', txHash: txHash ?? tx.txHash })
1129
+ .where(and(eq(walletTransaction.id, tx.id), eq(walletTransaction.status, 'processing')))
1130
+ .returning({ id: walletTransaction.id });
1131
+ if (updated.length === 0) {
1132
+ return;
1133
+ }
1134
+ this.events.emit('wallet.withdrawal.completed', {
1135
+ userId,
1136
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
1137
+ amount: tx.amount,
1138
+ currency: tx.currency,
1139
+ transactionId: tx.id,
1140
+ });
1141
+ return;
1142
+ }
1143
+ if (status === 'failed') {
1144
+ await this.finalizeFailedWithdrawal({ tx, adminId: null, userId, amount: tx.amount });
1145
+ }
1146
+ }
500
1147
  // Evaluates the auto-approval gates and settles the payout if all pass; returns undefined to
501
1148
  // leave the row pending for the manual queue. NEVER throws: any error fails closed to manual.
502
1149
  async maybeAutoApprove(args) {
503
- // Cheap gates first (auto-approval off, or crypto - never auto-approved): skip opening a tx/lock.
504
- if (!this.platformConfig?.autoWithdrawal?.enabled || args.rail !== 'fiat') {
1150
+ if (!this.platformConfig?.autoWithdrawal?.enabled) {
505
1151
  return undefined;
506
1152
  }
507
1153
  try {
@@ -577,11 +1223,7 @@ export class WalletService {
577
1223
  if (!cfg?.enabled) {
578
1224
  return null;
579
1225
  }
580
- // Hard stop: crypto is irreversible and AML-sensitive - never auto-approved.
581
- if (rail !== 'fiat') {
582
- return null;
583
- }
584
- const threshold = await this.resolveAutoThreshold(userId);
1226
+ const threshold = await this.resolveAutoThreshold(userId, rail);
585
1227
  if (!threshold || moneyToNumber(threshold.value) <= 0) {
586
1228
  return null;
587
1229
  }
@@ -590,15 +1232,16 @@ export class WalletService {
590
1232
  }
591
1233
  // Independent of kyc.gateWithdrawals: auto-approval always demands a passing status; anything else fails closed.
592
1234
  const kycStatus = await this.autoApprovalKycStatus(userId);
593
- if (!kycStatus || !KYC_PASS_STATUSES.has(kycStatus)) {
1235
+ if (!kycStatus || !KYC_PASS_STATUSES.has(normalizeKycStatus(kycStatus))) {
594
1236
  return null;
595
1237
  }
596
- const riskTags = await this.autoApprovalRiskTags(userId, cfg.excludeRiskFlags);
1238
+ const effectiveExcludeTags = threshold.config.excludeRiskFlags;
1239
+ const riskTags = await this.autoApprovalRiskTags(userId, effectiveExcludeTags);
597
1240
  // null = exclusions configured but the lookup port is unavailable => fail closed.
598
1241
  if (riskTags === null) {
599
1242
  return null;
600
1243
  }
601
- if (riskTags.some((t) => cfg.excludeRiskFlags.includes(t))) {
1244
+ if (riskTags.some((t) => effectiveExcludeTags.includes(t))) {
602
1245
  return null;
603
1246
  }
604
1247
  const heuristics = await this.autoApprovalHeuristics({ walletId, amount });
@@ -610,22 +1253,300 @@ export class WalletService {
610
1253
  thresholdSource: threshold.source,
611
1254
  kycStatus,
612
1255
  riskTagsEvaluated: riskTags,
1256
+ effectiveExcludeTags,
613
1257
  };
614
1258
  }
615
- // Per-player rule wins over the global fiat threshold; null when neither is set.
616
- async resolveAutoThreshold(userId) {
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();
617
1264
  const [rule] = await this.drizzle.db
618
1265
  .select()
619
1266
  .from(autoWithdrawalRule)
620
1267
  .where(eq(autoWithdrawalRule.userId, userId));
621
1268
  if (rule) {
622
- return { value: rule.threshold, source: 'per-player' };
1269
+ return { value: rule.threshold, source: 'per-player', config };
623
1270
  }
624
- const global = this.platformConfig?.autoWithdrawal?.fiatThreshold;
625
- if (global !== undefined) {
626
- 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');
627
1283
  }
628
- return null;
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');
1360
+ }
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
+ });
629
1550
  }
630
1551
  async autoApprovalKycStatus(userId) {
631
1552
  // No directory bound => cannot verify KYC => fail closed.
@@ -718,7 +1639,7 @@ export class WalletService {
718
1639
  .returning({ id: autoWithdrawalRule.id });
719
1640
  return deleted.length > 0;
720
1641
  }
721
- async rejectWithdrawal(adminId, withdrawalId, reason) {
1642
+ async rejectWithdrawal(adminId, withdrawalId, reason, meta) {
722
1643
  const reviewedAt = new Date();
723
1644
  const tx = await this.drizzle.db.transaction(async (txn) => {
724
1645
  const current = findOneOrThrow(await txn
@@ -734,10 +1655,7 @@ export class WalletService {
734
1655
  .set({ status: 'rejected', reviewedBy: adminId, reviewedAt, reviewReason: reason })
735
1656
  .where(eq(walletTransaction.id, withdrawalId))
736
1657
  .returning(), new WithdrawalNotFoundError(withdrawalId));
737
- await txn
738
- .update(wallet)
739
- .set({ balance: sql `${wallet.balance} + ${updated.amount}::numeric` })
740
- .where(eq(wallet.id, updated.walletId));
1658
+ await creditWalletBalance(txn, updated.walletId, updated.currency, updated.amount);
741
1659
  return updated;
742
1660
  });
743
1661
  const userId = await this.userIdForWallet(tx.walletId);
@@ -748,22 +1666,35 @@ export class WalletService {
748
1666
  transactionId: tx.id,
749
1667
  adminId,
750
1668
  reason,
1669
+ ip: meta?.ip ?? null,
1670
+ userAgent: meta?.userAgent ?? null,
751
1671
  });
752
1672
  return { transactionId: tx.id, status: 'rejected' };
753
1673
  }
754
- async getTransactions(userId, page, limit) {
1674
+ async getTransactions({ userId, page, limit, sortBy, sortOrder, includeInternal = false, }) {
755
1675
  const db = this.drizzle.db;
756
1676
  const [walletRecord] = await db.select().from(wallet).where(eq(wallet.userId, userId));
757
1677
  if (!walletRecord) {
758
1678
  return { items: [], total: 0, page, limit };
759
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'];
760
1691
  const where = eq(walletTransaction.walletId, walletRecord.id);
761
1692
  const [txs, [{ n }]] = await Promise.all([
762
1693
  db
763
1694
  .select()
764
1695
  .from(walletTransaction)
765
1696
  .where(where)
766
- .orderBy(desc(walletTransaction.createdAt))
1697
+ .orderBy(dir(col), desc(walletTransaction.id))
767
1698
  .limit(limit)
768
1699
  .offset(pageToOffset(page, limit)),
769
1700
  db.select({ n: count() }).from(walletTransaction).where(where),
@@ -774,14 +1705,163 @@ export class WalletService {
774
1705
  type: tx.type,
775
1706
  amount: tx.amount,
776
1707
  currency: tx.currency,
1708
+ network: tx.network,
777
1709
  status: tx.status,
1710
+ direction: tx.direction,
778
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,
779
1715
  })),
780
1716
  total: Number(n),
781
1717
  page,
782
1718
  limit,
783
1719
  };
784
1720
  }
1721
+ async getOrCreateDepositAddress(userId, currency, network) {
1722
+ await this.assertDepositable(currency, undefined, network);
1723
+ const existing = await this.findDepositAddress(userId, currency, network);
1724
+ if (existing) {
1725
+ return toDepositAddressResult(existing);
1726
+ }
1727
+ const { providerName, adapter } = await this.paymentAdapterFor(currency, network ?? null);
1728
+ if (!adapter.issueDepositAddress) {
1729
+ throw new DepositAddressUnsupportedError();
1730
+ }
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
+ });
1750
+ if (row) {
1751
+ return toDepositAddressResult(row);
1752
+ }
1753
+ const winner = await this.findDepositAddress(userId, currency, network);
1754
+ if (!winner) {
1755
+ throw new Error(`wallet deposit address: idempotency conflict but no row found (userId=${userId}, currency=${currency}, network=${network ?? 'none'})`);
1756
+ }
1757
+ return toDepositAddressResult(winner);
1758
+ }
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);
1767
+ if (!depositAddress) {
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);
1785
+ return;
1786
+ }
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;
1810
+ }
1811
+ const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
1812
+ let [walletRecord] = await txn
1813
+ .select()
1814
+ .from(wallet)
1815
+ .where(eq(wallet.userId, depositAddress.userId));
1816
+ if (!walletRecord) {
1817
+ walletRecord = findOneOrThrow(await txn
1818
+ .insert(wallet)
1819
+ .values({ userId: depositAddress.userId, currency: event.currency })
1820
+ .returning(), new WalletNotFoundError(depositAddress.userId));
1821
+ }
1822
+ const [inserted] = await txn
1823
+ .insert(walletTransaction)
1824
+ .values({
1825
+ walletId: walletRecord.id,
1826
+ type: 'deposit',
1827
+ amount: event.amount,
1828
+ currency: event.currency,
1829
+ status: 'completed',
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,
1835
+ providerName: depositAddress.providerName,
1836
+ providerRefId: event.externalId,
1837
+ destinationAddress: event.address,
1838
+ txHash: event.txHash,
1839
+ })
1840
+ .onConflictDoNothing()
1841
+ .returning();
1842
+ if (inserted) {
1843
+ await creditWalletBalance(txn, walletRecord.id, event.currency, event.amount);
1844
+ return { transactionId: inserted.id, replayed: false };
1845
+ }
1846
+ const [winner] = await txn
1847
+ .select()
1848
+ .from(walletTransaction)
1849
+ .where(eq(walletTransaction.providerRefId, event.externalId));
1850
+ if (!winner) {
1851
+ throw new Error(`payment webhook: idempotency conflict but no row found (externalId=${event.externalId})`);
1852
+ }
1853
+ return { transactionId: winner.id, replayed: true };
1854
+ });
1855
+ if (!replayed) {
1856
+ this.events.emit('wallet.deposit.completed', {
1857
+ userId: depositAddress.userId,
1858
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(depositAddress.userId),
1859
+ amount: event.amount,
1860
+ currency: event.currency,
1861
+ transactionId,
1862
+ });
1863
+ }
1864
+ }
785
1865
  async userIdForWallet(walletId) {
786
1866
  const record = findOneOrThrow(await this.drizzle.db
787
1867
  .select({ userId: wallet.userId })
@@ -796,5 +1876,220 @@ export class WalletService {
796
1876
  .where(and(eq(walletTransaction.walletId, walletId), eq(walletTransaction.idempotencyKey, idempotencyKey)));
797
1877
  return existing;
798
1878
  }
1879
+ async findDepositAddress(userId, currency, network) {
1880
+ const [row] = await this.drizzle.db
1881
+ .select()
1882
+ .from(walletDepositAddress)
1883
+ .where(and(eq(walletDepositAddress.userId, userId), eq(walletDepositAddress.currency, currency), network === undefined
1884
+ ? isNull(walletDepositAddress.network)
1885
+ : eq(walletDepositAddress.network, network)));
1886
+ return row;
1887
+ }
1888
+ async findDepositAddressByAddress({ address, network, tag, }) {
1889
+ const rows = await this.drizzle.db
1890
+ .select()
1891
+ .from(walletDepositAddress)
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;
2093
+ }
799
2094
  }
800
2095
  //# sourceMappingURL=wallet.service.js.map