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