@openora/core 0.4.1-canary.13 → 0.4.1-canary.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +334 -0
- package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -0
- package/dist/admin-console/contract/index.d.ts +296 -28
- package/dist/admin-console/contract/index.d.ts.map +1 -1
- package/dist/admin-console/contract/index.js +74 -6
- package/dist/admin-console/contract/index.js.map +1 -1
- package/dist/admin-console/plugin.d.ts +180 -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 +132 -18
- package/dist/admin-console/router/index.d.ts.map +1 -1
- package/dist/admin-console/router/index.js +18 -2
- package/dist/admin-console/router/index.js.map +1 -1
- package/dist/admin-console/service/backoffice.service.d.ts +70 -10
- package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.js +67 -11
- 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 +182 -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 +145 -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 +196 -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 +181 -1
- package/dist/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +560 -50
- 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 -11
- 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 +126 -0
- package/dist/casino/gaming/__tests__/admin-reporting.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 +212 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.js.map +1 -0
- package/dist/casino/gaming/admin-reporting.d.ts +9 -0
- package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
- package/dist/casino/gaming/admin-reporting.js +79 -0
- package/dist/casino/gaming/admin-reporting.js.map +1 -0
- package/dist/casino/gaming/contract/index.d.ts +19 -0
- package/dist/casino/gaming/contract/index.d.ts.map +1 -1
- package/dist/casino/gaming/contract/index.js +7 -1
- 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/meta/0002_snapshot.json +237 -0
- package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/casino/gaming/plugin.d.ts +181 -1
- package/dist/casino/gaming/plugin.d.ts.map +1 -1
- package/dist/casino/gaming/plugin.js +9 -5
- package/dist/casino/gaming/plugin.js.map +1 -1
- package/dist/casino/gaming/router/index.d.ts +11 -0
- package/dist/casino/gaming/router/index.d.ts.map +1 -1
- package/dist/casino/gaming/router/index.js +7 -2
- package/dist/casino/gaming/router/index.js.map +1 -1
- package/dist/casino/gaming/schema/index.d.ts +18 -0
- package/dist/casino/gaming/schema/index.d.ts.map +1 -1
- package/dist/casino/gaming/schema/index.js +11 -1
- package/dist/casino/gaming/schema/index.js.map +1 -1
- package/dist/casino/gaming/service/gaming.service.d.ts +22 -6
- package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
- package/dist/casino/gaming/service/gaming.service.js +60 -13
- package/dist/casino/gaming/service/gaming.service.js.map +1 -1
- 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 +56 -0
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.js.map +1 -0
- package/dist/casino/lobby/plugin.d.ts +179 -1
- package/dist/casino/lobby/plugin.d.ts.map +1 -1
- package/dist/casino/lobby/plugin.js +3 -3
- package/dist/casino/lobby/plugin.js.map +1 -1
- package/dist/casino/lobby/service/lobby.service.d.ts +3 -1
- package/dist/casino/lobby/service/lobby.service.d.ts.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/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 +66 -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 +354 -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 +640 -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/meta/0001_snapshot.json +303 -0
- package/dist/cms/drizzle/migrations/meta/0002_snapshot.json +412 -0
- package/dist/cms/drizzle/migrations/meta/_journal.json +14 -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 +179 -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 +55 -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 +229 -45
- package/dist/cms/service/cms.service.d.ts.map +1 -1
- package/dist/cms/service/cms.service.js +615 -68
- 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 +81 -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__/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 +512 -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 +77 -15
- 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 +1318 -123
- package/dist/compliance/contract/index.d.ts.map +1 -1
- package/dist/compliance/contract/index.js +102 -8
- 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 +341 -11
- package/dist/compliance/contract/rg.d.ts.map +1 -1
- package/dist/compliance/contract/rg.js +64 -16
- 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/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/_journal.json +42 -0
- package/dist/compliance/plugin.d.ts +182 -1
- package/dist/compliance/plugin.d.ts.map +1 -1
- package/dist/compliance/plugin.js +86 -15
- package/dist/compliance/plugin.js.map +1 -1
- package/dist/compliance/router/index.d.ts +853 -67
- package/dist/compliance/router/index.d.ts.map +1 -1
- package/dist/compliance/router/index.js +106 -23
- package/dist/compliance/router/index.js.map +1 -1
- package/dist/compliance/schema/index.d.ts +222 -4
- package/dist/compliance/schema/index.d.ts.map +1 -1
- package/dist/compliance/schema/index.js +28 -5
- package/dist/compliance/schema/index.js.map +1 -1
- package/dist/compliance/service/compliance.service.d.ts +23 -33
- package/dist/compliance/service/compliance.service.d.ts.map +1 -1
- package/dist/compliance/service/compliance.service.js +20 -37
- package/dist/compliance/service/compliance.service.js.map +1 -1
- package/dist/compliance/service/kyc.service.d.ts +198 -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 +25 -7
- 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 +325 -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 +50 -0
- package/dist/contracts/__tests__/identity.test.js.map +1 -0
- 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__/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 +43 -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.d.ts +4 -0
- 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/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 +4 -0
- package/dist/contracts/adapters/geo-ip.d.ts.map +1 -1
- package/dist/contracts/adapters/geo-ip.js +4 -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 +68 -19
- package/dist/contracts/adapters/index.d.ts.map +1 -1
- package/dist/contracts/adapters/index.js +36 -13
- 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/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.d.ts +30 -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 +141 -3
- package/dist/contracts/adapters/payment.d.ts.map +1 -1
- package/dist/contracts/adapters/payment.js +11 -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 +41 -3
- package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
- package/dist/contracts/adapters/rate-limit.js +29 -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/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 +75 -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 +17 -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 +21 -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 +15 -0
- package/dist/contracts/kit.d.ts.map +1 -1
- package/dist/contracts/kit.js +1 -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 +169 -0
- package/dist/contracts/schemas/__tests__/events.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__/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 +23 -1
- package/dist/contracts/schemas/compliance.d.ts.map +1 -1
- package/dist/contracts/schemas/compliance.js +12 -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 +908 -7
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +564 -69
- package/dist/contracts/schemas/events.js.map +1 -1
- package/dist/contracts/schemas/game.d.ts +9 -0
- package/dist/contracts/schemas/game.d.ts.map +1 -0
- package/dist/contracts/schemas/game.js +4 -0
- package/dist/contracts/schemas/game.js.map +1 -0
- package/dist/contracts/schemas/iam.d.ts +30 -0
- package/dist/contracts/schemas/iam.d.ts.map +1 -1
- package/dist/contracts/schemas/iam.js +33 -0
- package/dist/contracts/schemas/iam.js.map +1 -1
- package/dist/contracts/schemas/identity.d.ts +156 -3
- package/dist/contracts/schemas/identity.d.ts.map +1 -1
- package/dist/contracts/schemas/identity.js +142 -8
- 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 +7 -0
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +7 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/contracts/schemas/mail.d.ts +166 -0
- package/dist/contracts/schemas/mail.d.ts.map +1 -0
- package/dist/contracts/schemas/mail.js +74 -0
- package/dist/contracts/schemas/mail.js.map +1 -0
- package/dist/contracts/schemas/platform-config.d.ts +206 -32
- package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
- package/dist/contracts/schemas/platform-config.js +226 -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 +20 -0
- package/dist/contracts/schemas/reporting.d.ts.map +1 -0
- package/dist/contracts/schemas/reporting.js +13 -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 +47 -3
- package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
- package/dist/contracts/schemas/wallet-tx.js +47 -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 +2349 -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 +2191 -17
- package/dist/engagement/chat/contract/index.d.ts.map +1 -1
- package/dist/engagement/chat/contract/index.js +458 -13
- 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 +181 -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 +1663 -17
- 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 +1630 -0
- package/dist/engagement/chat/schema/index.d.ts.map +1 -1
- package/dist/engagement/chat/schema/index.js +189 -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 +1220 -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 +52 -0
- package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js.map +1 -0
- package/dist/engagement/chat-commands/contract/index.d.ts +165 -0
- package/dist/engagement/chat-commands/contract/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/contract/index.js +67 -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/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/_journal.json +20 -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 +182 -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 +113 -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 +138 -0
- package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/schema/index.js +11 -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 +146 -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 +54 -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 +306 -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 +198 -1
- package/dist/engagement/notifications/plugin.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.js +421 -47
- 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 +182 -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 +222 -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 +59 -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 +212 -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 +181 -0
- package/dist/fx/exchange-rate/plugin.d.ts.map +1 -0
- package/dist/fx/exchange-rate/plugin.js +46 -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 +181 -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 +4 -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 +119 -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 +215 -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 +107 -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 +120 -0
- package/dist/mail/contract/index.d.ts.map +1 -0
- package/dist/mail/contract/index.js +17 -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 +181 -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 +152 -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 +137 -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 +191 -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 +114 -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 +881 -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 +273 -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.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 +88 -0
- package/dist/pam/identity/__tests__/session.service.int.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 +39 -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/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 +40 -8
- package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
- package/dist/pam/identity/admin-user-directory.js +92 -35
- package/dist/pam/identity/admin-user-directory.js.map +1 -1
- package/dist/pam/identity/contract/index.d.ts +345 -15
- package/dist/pam/identity/contract/index.d.ts.map +1 -1
- package/dist/pam/identity/contract/index.js +165 -7
- 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/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/_journal.json +70 -0
- package/dist/pam/identity/plugin.d.ts +180 -1
- package/dist/pam/identity/plugin.d.ts.map +1 -1
- package/dist/pam/identity/plugin.js +113 -18
- package/dist/pam/identity/plugin.js.map +1 -1
- package/dist/pam/identity/react/account.d.ts +59 -11
- package/dist/pam/identity/react/account.d.ts.map +1 -1
- package/dist/pam/identity/react/account.js +46 -6
- package/dist/pam/identity/react/account.js.map +1 -1
- package/dist/pam/identity/react/auth.d.ts +21 -13
- package/dist/pam/identity/react/auth.d.ts.map +1 -1
- package/dist/pam/identity/router/index.d.ts +295 -16
- package/dist/pam/identity/router/index.d.ts.map +1 -1
- package/dist/pam/identity/router/index.js +135 -14
- package/dist/pam/identity/router/index.js.map +1 -1
- package/dist/pam/identity/schema/index.d.ts +755 -0
- package/dist/pam/identity/schema/index.d.ts.map +1 -1
- package/dist/pam/identity/schema/index.js +96 -2
- 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 +277 -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/identity.service.d.ts +150 -36
- package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
- package/dist/pam/identity/service/identity.service.js +1110 -138
- 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 +38 -0
- package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
- package/dist/pam/identity/service/phone-verification.service.js +257 -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 +28 -0
- package/dist/pam/identity/service/security-controls.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 +113 -21
- package/dist/pam/identity/service/session.service.js.map +1 -1
- package/dist/pam/identity/service/trusted-device.service.d.ts +56 -0
- package/dist/pam/identity/service/trusted-device.service.d.ts.map +1 -0
- package/dist/pam/identity/service/trusted-device.service.js +157 -0
- package/dist/pam/identity/service/trusted-device.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/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 +76 -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 +180 -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 +180 -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 +180 -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 +180 -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 +42 -3
- package/dist/pam/tag/schema/index.d.ts.map +1 -1
- package/dist/pam/tag/schema/index.js +13 -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/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 +155 -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 +150 -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 +48 -5
- package/dist/server/auth/auth.d.ts.map +1 -1
- package/dist/server/auth/auth.js +75 -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 +121 -14
- package/dist/server/auth/permissions.d.ts.map +1 -1
- package/dist/server/auth/permissions.js +14 -20
- 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 +148 -0
- package/dist/server/db/__tests__/migrate.test.js.map +1 -0
- package/dist/server/db/__tests__/query-helpers.test.js +166 -1
- package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
- 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 +1 -1
- package/dist/server/db/index.d.ts.map +1 -1
- package/dist/server/db/index.js +1 -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 +117 -0
- package/dist/server/db/outbox/__tests__/relay.int.test.js.map +1 -0
- package/dist/server/db/query-helpers.d.ts +8 -0
- package/dist/server/db/query-helpers.d.ts.map +1 -1
- package/dist/server/db/query-helpers.js +67 -0
- package/dist/server/db/query-helpers.js.map +1 -1
- 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 +173 -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 +41 -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 +11 -34
- 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 +7 -0
- package/dist/server/kernel/logger.d.ts.map +1 -1
- package/dist/server/kernel/logger.js +36 -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 +2 -10
- package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/rate-limiter.js +0 -34
- 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-rate-limiter.d.ts +1 -0
- package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/redis-rate-limiter.js +11 -0
- package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
- 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 +98 -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 +179 -0
- package/dist/server/runtime/core-token-catalog.d.ts.map +1 -0
- package/dist/server/runtime/core-token-catalog.js +69 -0
- package/dist/server/runtime/core-token-catalog.js.map +1 -0
- package/dist/server/runtime/create-app.d.ts +18 -23
- package/dist/server/runtime/create-app.d.ts.map +1 -1
- package/dist/server/runtime/create-app.js +133 -80
- package/dist/server/runtime/create-app.js.map +1 -1
- package/dist/server/runtime/index.d.ts +2 -3
- package/dist/server/runtime/index.d.ts.map +1 -1
- package/dist/server/runtime/index.js +0 -2
- package/dist/server/runtime/index.js.map +1 -1
- 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 +47 -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 +107 -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 +444 -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__/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 +775 -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 +299 -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-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 +36 -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 +310 -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 +1483 -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 +3 -1
- package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
- package/dist/wallet/adapters/wallet-reader.service.js +22 -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 +925 -19
- package/dist/wallet/contract/index.d.ts.map +1 -1
- package/dist/wallet/contract/index.js +460 -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/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/_journal.json +105 -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 +181 -1
- package/dist/wallet/plugin.d.ts.map +1 -1
- package/dist/wallet/plugin.js +179 -19
- package/dist/wallet/plugin.js.map +1 -1
- package/dist/wallet/router/index.d.ts +499 -12
- package/dist/wallet/router/index.d.ts.map +1 -1
- package/dist/wallet/router/index.js +229 -37
- package/dist/wallet/router/index.js.map +1 -1
- package/dist/wallet/schema/index.d.ts +1956 -9
- package/dist/wallet/schema/index.d.ts.map +1 -1
- package/dist/wallet/schema/index.js +280 -6
- 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 +39 -0
- package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
- package/dist/wallet/service/reconciliation-finding.service.js +47 -0
- package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
- package/dist/wallet/service/reconciliation.service.d.ts +118 -0
- package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
- package/dist/wallet/service/reconciliation.service.js +533 -0
- package/dist/wallet/service/reconciliation.service.js.map +1 -0
- package/dist/wallet/service/wallet-commands.service.d.ts +18 -4
- package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet-commands.service.js +196 -29
- package/dist/wallet/service/wallet-commands.service.js.map +1 -1
- package/dist/wallet/service/wallet.service.d.ts +668 -29
- package/dist/wallet/service/wallet.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.js +1257 -127
- 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 +168 -11
- 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 -292
- 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,231 @@
|
|
|
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, railFor as sharedRailFor, } from '@openora/core/contracts';
|
|
3
|
+
import { eq, asc, desc, sql, and, gte, lte, count, inArray, isNull, or } from 'drizzle-orm';
|
|
3
4
|
import { createHash } from 'node:crypto';
|
|
4
|
-
import { wallet, walletTransaction, autoWithdrawalRule, walletDepositAddress, } from '../schema/index.js';
|
|
5
|
+
import { wallet, walletBalance, walletTransaction, autoWithdrawalRule, walletAutoWithdrawalConfig, walletDepositAddress, walletBonusCredit, walletBonusRolloverConfig, walletWithdrawalAddress, walletAsset, } from '../schema/index.js';
|
|
6
|
+
import { LIVE_WEBHOOK_RUN_ID, recordReconciliationFinding, } from './reconciliation-finding.service.js';
|
|
5
7
|
const logger = createLogger('wallet');
|
|
6
8
|
export const WalletNotFoundError = makeNotFoundError('Wallet');
|
|
7
9
|
export const WithdrawalNotFoundError = makeNotFoundError('Withdrawal');
|
|
10
|
+
export const AutoWithdrawalConfigNotFoundError = makeNotFoundError('AutoWithdrawalConfig');
|
|
11
|
+
export const BonusRolloverConfigNotFoundError = makeNotFoundError('BonusRolloverConfig');
|
|
12
|
+
export const PlayerNotFoundError = makeNotFoundError('Player');
|
|
8
13
|
export const InsufficientBalanceError = createDomainError('InsufficientBalanceError', (available, requested) => `Insufficient balance: available ${available}, requested ${requested}`);
|
|
9
14
|
export const WithdrawalNotPendingError = makeConflictError('WithdrawalNotPendingError', 'Withdrawal is not pending and cannot be reviewed');
|
|
10
15
|
export const KycRequiredError = makeConflictError('KycRequiredError', 'KYC verification required before withdrawal');
|
|
11
16
|
export const IdempotencyKeyReuseError = makeConflictError('IdempotencyKeyReuseError', 'Idempotency key was already used with a different amount');
|
|
12
17
|
export const DepositAddressUnsupportedError = makeConflictError('DepositAddressUnsupportedError', 'The bound payment adapter does not support address-based deposits');
|
|
13
18
|
export const DestinationAddressRequiredError = makeConflictError('DestinationAddressRequiredError', 'A destination address is required for a crypto-rail withdrawal');
|
|
14
|
-
|
|
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
|
+
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 function debitWithdrawableBalance(txn, walletId, currency, amount) {
|
|
186
|
+
const currencyKey = balanceKey(currency);
|
|
187
|
+
return txn
|
|
188
|
+
.update(walletBalance)
|
|
189
|
+
.set({ amount: sql `${walletBalance.amount} - ${amount}::numeric` })
|
|
190
|
+
.where(and(eq(walletBalance.walletId, walletId), eq(walletBalance.currency, currencyKey), gte(sql `${walletBalance.amount} - COALESCE((
|
|
191
|
+
SELECT SUM(
|
|
192
|
+
${walletBonusCredit.creditedAmount}
|
|
193
|
+
* GREATEST(
|
|
194
|
+
${walletBonusCredit.rolloverRequired} - ${walletBonusCredit.rolloverProgress},
|
|
195
|
+
0
|
|
196
|
+
)
|
|
197
|
+
/ NULLIF(${walletBonusCredit.rolloverRequired}, 0)
|
|
198
|
+
)
|
|
199
|
+
FROM ${walletBonusCredit}
|
|
200
|
+
WHERE ${walletBonusCredit.walletId} = ${walletId}
|
|
201
|
+
AND ${walletBonusCredit.currency} = ${currencyKey}
|
|
202
|
+
AND ${walletBonusCredit.status} = 'active'
|
|
203
|
+
), 0)`, amount)))
|
|
204
|
+
.returning({ amount: walletBalance.amount });
|
|
205
|
+
}
|
|
206
|
+
async function readLockedBonusAmount(txn, walletId, currency) {
|
|
207
|
+
const currencyKey = balanceKey(currency);
|
|
208
|
+
const [row] = await txn
|
|
209
|
+
.select({
|
|
210
|
+
locked: sql `coalesce(sum(
|
|
211
|
+
${walletBonusCredit.creditedAmount}
|
|
212
|
+
* greatest(${walletBonusCredit.rolloverRequired} - ${walletBonusCredit.rolloverProgress}, 0)
|
|
213
|
+
/ nullif(${walletBonusCredit.rolloverRequired}, 0)
|
|
214
|
+
), 0)`,
|
|
215
|
+
})
|
|
216
|
+
.from(walletBonusCredit)
|
|
217
|
+
.where(and(eq(walletBonusCredit.walletId, walletId), eq(walletBonusCredit.currency, currencyKey), eq(walletBonusCredit.status, 'active')));
|
|
218
|
+
return row?.locked ?? '0';
|
|
26
219
|
}
|
|
27
220
|
// Namespace the key per operation so the same raw key on a deposit then a withdraw can't
|
|
28
221
|
// collide on the (walletId, idempotencyKey) unique index. The column is a uuid, so a string
|
|
29
222
|
// prefix won't parse - hash namespace + key into a stable pseudo-uuid instead.
|
|
30
223
|
const DEPOSIT_IDEMPOTENCY_NAMESPACE = 'deposit';
|
|
31
224
|
const WITHDRAW_IDEMPOTENCY_NAMESPACE = 'withdraw';
|
|
225
|
+
const MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE = 'manual-adjustment';
|
|
226
|
+
/** Serialises one player's PSP deposits, so an RG reservation cannot be spent twice. */
|
|
227
|
+
const depositSlotKey = (userId) => `wallet-deposit:${userId}`;
|
|
228
|
+
const MANUAL_ADJUSTMENT_TYPES = new Set(['manual_credit', 'manual_debit']);
|
|
32
229
|
function namespacedIdempotencyKey(namespace, rawKey) {
|
|
33
230
|
const hex = createHash('sha256').update(`${namespace}:${rawKey}`).digest('hex');
|
|
34
231
|
return [
|
|
@@ -49,6 +246,14 @@ const HIGH_FREQUENCY_MIN_COUNT = 3;
|
|
|
49
246
|
const DAILY_CAP_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
50
247
|
// Also the marker the cumulative-cap query reads back to identify auto-approved payouts - keep write and read in lockstep.
|
|
51
248
|
const AUTO_APPROVED_REASON = 'auto-approved';
|
|
249
|
+
function toDepositAddressResult(row) {
|
|
250
|
+
return {
|
|
251
|
+
address: row.address,
|
|
252
|
+
currency: row.currency,
|
|
253
|
+
...(row.network === null ? {} : { network: row.network }),
|
|
254
|
+
...(row.tag === null ? {} : { tag: row.tag }),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
52
257
|
function toAutoWithdrawalRuleDto(row) {
|
|
53
258
|
return {
|
|
54
259
|
id: row.id,
|
|
@@ -60,10 +265,49 @@ function toAutoWithdrawalRuleDto(row) {
|
|
|
60
265
|
updatedAt: row.updatedAt.toISOString(),
|
|
61
266
|
};
|
|
62
267
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
268
|
+
function toAutoWithdrawalConfigDto(row) {
|
|
269
|
+
return {
|
|
270
|
+
id: row.id,
|
|
271
|
+
fiatThreshold: row.fiatThreshold,
|
|
272
|
+
cryptoThreshold: row.cryptoThreshold,
|
|
273
|
+
excludeRiskFlags: row.excludeRiskFlags,
|
|
274
|
+
updatedBy: row.updatedBy,
|
|
275
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
276
|
+
createdAt: row.createdAt.toISOString(),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function toBonusCreditDto(row) {
|
|
280
|
+
return {
|
|
281
|
+
id: row.id,
|
|
282
|
+
currency: row.currency,
|
|
283
|
+
sourceType: row.sourceType,
|
|
284
|
+
creditedAmount: row.creditedAmount,
|
|
285
|
+
rolloverMultiplier: row.rolloverMultiplier,
|
|
286
|
+
rolloverRequired: row.rolloverRequired,
|
|
287
|
+
rolloverProgress: row.rolloverProgress,
|
|
288
|
+
status: row.status,
|
|
289
|
+
createdAt: row.createdAt.toISOString(),
|
|
290
|
+
completedAt: row.completedAt ? row.completedAt.toISOString() : null,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function toBonusRolloverConfigDto(row) {
|
|
294
|
+
return {
|
|
295
|
+
id: row.id,
|
|
296
|
+
multiplier: row.multiplier,
|
|
297
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
const PUBLIC_ASSET_COLUMNS = {
|
|
301
|
+
currency: walletAsset.currency,
|
|
302
|
+
network: walletAsset.network,
|
|
303
|
+
minDeposit: walletAsset.minDeposit,
|
|
304
|
+
minWithdrawal: walletAsset.minWithdrawal,
|
|
305
|
+
withdrawalFee: walletAsset.withdrawalFee,
|
|
306
|
+
depositEnabled: walletAsset.depositEnabled,
|
|
307
|
+
withdrawalEnabled: walletAsset.withdrawalEnabled,
|
|
308
|
+
};
|
|
309
|
+
function toWalletAssetDto(row) {
|
|
310
|
+
return serializeRow(row, { dateFields: ['createdAt', 'updatedAt'], decimalFields: [] });
|
|
67
311
|
}
|
|
68
312
|
/**
|
|
69
313
|
* Owns all wallet balance mutations and the withdrawal review/auto-approval
|
|
@@ -77,46 +321,151 @@ export class WalletService {
|
|
|
77
321
|
drizzle;
|
|
78
322
|
events;
|
|
79
323
|
payment;
|
|
324
|
+
paymentProviders;
|
|
325
|
+
identityReader;
|
|
80
326
|
directory;
|
|
81
327
|
platformConfig;
|
|
82
328
|
limiter;
|
|
83
329
|
riskTags;
|
|
330
|
+
tagEvaluationCommands;
|
|
84
331
|
audit;
|
|
85
|
-
|
|
332
|
+
rgLimits;
|
|
333
|
+
constructor({ drizzle, events, payment, paymentProviders, directory, identityReader, platformConfig, limiter, riskTags, tagEvaluationCommands, audit, rgLimits, }) {
|
|
86
334
|
this.drizzle = drizzle;
|
|
87
335
|
this.events = events;
|
|
88
336
|
this.payment = payment;
|
|
337
|
+
this.paymentProviders = paymentProviders;
|
|
89
338
|
this.directory = directory;
|
|
339
|
+
this.identityReader = identityReader;
|
|
90
340
|
this.platformConfig = platformConfig;
|
|
91
341
|
this.limiter = limiter;
|
|
92
342
|
this.riskTags = riskTags;
|
|
343
|
+
this.tagEvaluationCommands = tagEvaluationCommands;
|
|
93
344
|
this.audit = audit;
|
|
345
|
+
this.rgLimits = rgLimits;
|
|
346
|
+
}
|
|
347
|
+
// Every catalog row for the currency, enabled or not - resolveWithdrawalNetwork needs
|
|
348
|
+
// both to tell "never configured" from "deliberately disabled".
|
|
349
|
+
assetsForCurrency(currency) {
|
|
350
|
+
return this.drizzle.db
|
|
351
|
+
.select({
|
|
352
|
+
network: walletAsset.network,
|
|
353
|
+
minWithdrawal: walletAsset.minWithdrawal,
|
|
354
|
+
withdrawalEnabled: walletAsset.withdrawalEnabled,
|
|
355
|
+
})
|
|
356
|
+
.from(walletAsset)
|
|
357
|
+
.where(eq(walletAsset.currency, currency.toUpperCase()));
|
|
358
|
+
}
|
|
359
|
+
// `for('share')` blocks a concurrent deleteWalletAsset (which takes `for('update')` on
|
|
360
|
+
// the same rows) from removing the pair while a deposit is being gated against it.
|
|
361
|
+
depositAssetsForCurrency(currency, db = this.drizzle.db) {
|
|
362
|
+
return db
|
|
363
|
+
.select({
|
|
364
|
+
network: walletAsset.network,
|
|
365
|
+
minDeposit: walletAsset.minDeposit,
|
|
366
|
+
depositEnabled: walletAsset.depositEnabled,
|
|
367
|
+
})
|
|
368
|
+
.from(walletAsset)
|
|
369
|
+
.where(eq(walletAsset.currency, currency.toUpperCase()))
|
|
370
|
+
.for('share');
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* `network` is optional because not every deposit path knows one: `deposit()` takes a
|
|
374
|
+
* PSP amount and currency only, so it is gated currency-wide (any enabled network
|
|
375
|
+
* clears it). Per-network gating applies where a network is actually chosen, ie
|
|
376
|
+
* `getOrCreateDepositAddress`, which is the path that hands a player a chain address.
|
|
377
|
+
*/
|
|
378
|
+
async assertDepositable(currency, amount, network, db = this.drizzle.db) {
|
|
379
|
+
const assets = await this.depositAssetsForCurrency(currency, db);
|
|
380
|
+
assertDepositAllowed(assets, currency, network);
|
|
381
|
+
if (amount !== undefined) {
|
|
382
|
+
assertAboveMinimumDeposit(assets, amount, currency, network);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async assertWithinRgDepositLimit(tx, userId, amount, currency) {
|
|
386
|
+
if (!this.rgLimits) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const decision = await this.rgLimits.checkDeposit(tx, userId, amount, currency);
|
|
390
|
+
if (!decision.allowed) {
|
|
391
|
+
throw new RgLimitExceededError('deposit_limit_exceeded', decision);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
resolveRail(currency) {
|
|
395
|
+
return railFor(currency, this.platformConfig?.wallet?.cryptoCurrencies);
|
|
396
|
+
}
|
|
397
|
+
// The concrete vendor a transaction/deposit-address settles through: the catalog row
|
|
398
|
+
// for the exact (currency, network) pair names the bound provider. Reconciliation
|
|
399
|
+
// scopes its diff by this column, so a null network (an unconfigured pair - no
|
|
400
|
+
// catalog row could ever match it) and a configured-but-null providerName column both
|
|
401
|
+
// resolve to the single default binding rather than leaving the column null.
|
|
402
|
+
async providerNameFor(currency, network) {
|
|
403
|
+
if (network === null) {
|
|
404
|
+
return DEFAULT_PAYMENT_PROVIDER;
|
|
405
|
+
}
|
|
406
|
+
const [row] = await this.drizzle.db
|
|
407
|
+
.select({ providerName: walletAsset.providerName })
|
|
408
|
+
.from(walletAsset)
|
|
409
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
|
|
410
|
+
return row?.providerName ?? DEFAULT_PAYMENT_PROVIDER;
|
|
411
|
+
}
|
|
412
|
+
// Fails closed on a named provider that is no longer registered (removed or
|
|
413
|
+
// misconfigured after the catalog row was written). Falling back to the default
|
|
414
|
+
// adapter would pay a withdrawal out through the wrong vendor while still recording
|
|
415
|
+
// the old provider name - money moved somewhere the ledger does not describe.
|
|
416
|
+
async paymentAdapterFor(currency, network) {
|
|
417
|
+
const providerName = await this.providerNameFor(currency, network);
|
|
418
|
+
if (providerName === DEFAULT_PAYMENT_PROVIDER) {
|
|
419
|
+
return { providerName, adapter: this.payment };
|
|
420
|
+
}
|
|
421
|
+
const adapter = this.paymentProviders.get(providerName)?.adapter;
|
|
422
|
+
if (!adapter) {
|
|
423
|
+
throw new WalletAssetUnknownProviderError();
|
|
424
|
+
}
|
|
425
|
+
return { providerName, adapter };
|
|
94
426
|
}
|
|
95
427
|
rateLimit(userId) {
|
|
96
428
|
return this.limiter
|
|
97
429
|
? assertRateLimit(this.limiter, `wallet-mutation:${userId}`, WALLET_MUTATION_RATE_LIMIT)
|
|
98
430
|
: Promise.resolve();
|
|
99
431
|
}
|
|
100
|
-
/** Fail-closed KYC gate: when enabled, a withdrawal needs a passing status (verified|manually_overridden). */
|
|
101
432
|
async assertKycForWithdrawal(userId) {
|
|
102
433
|
if (!this.platformConfig?.kyc?.gateWithdrawals) {
|
|
103
434
|
return;
|
|
104
435
|
}
|
|
105
436
|
const status = await this.autoApprovalKycStatus(userId);
|
|
106
|
-
if (!status || !KYC_PASS_STATUSES.has(status)) {
|
|
437
|
+
if (!status || !KYC_PASS_STATUSES.has(normalizeKycStatus(status))) {
|
|
107
438
|
throw new KycRequiredError();
|
|
108
439
|
}
|
|
109
440
|
}
|
|
110
441
|
async getBalance(userId) {
|
|
111
442
|
const [record] = await this.drizzle.db.select().from(wallet).where(eq(wallet.userId, userId));
|
|
112
443
|
if (!record) {
|
|
113
|
-
return { balance: '0', currency:
|
|
444
|
+
return { balance: '0', currency: DEFAULT_WALLET_CURRENCY };
|
|
114
445
|
}
|
|
115
446
|
return {
|
|
116
|
-
balance: record.
|
|
447
|
+
balance: await readWalletBalance(this.drizzle.db, record.id, record.currency),
|
|
117
448
|
currency: record.currency,
|
|
118
449
|
};
|
|
119
450
|
}
|
|
451
|
+
async getBalances(userId) {
|
|
452
|
+
return readWalletBalances(this.drizzle.db, userId);
|
|
453
|
+
}
|
|
454
|
+
// TODO: validate `currency` against a canonical supported-currency list once one
|
|
455
|
+
// exists - `platformConfig.wallet.cryptoCurrencies` classifies rails, it is not an
|
|
456
|
+
// allowlist, so today any non-empty string is accepted and persisted.
|
|
457
|
+
async setActiveCurrency(userId, currency) {
|
|
458
|
+
const updated = await this.drizzle.db
|
|
459
|
+
.update(wallet)
|
|
460
|
+
.set({ currency })
|
|
461
|
+
.where(eq(wallet.userId, userId))
|
|
462
|
+
.returning({ currency: wallet.currency });
|
|
463
|
+
const record = updated[0];
|
|
464
|
+
if (!record) {
|
|
465
|
+
throw new WalletNotFoundError(userId);
|
|
466
|
+
}
|
|
467
|
+
return { activeCurrency: record.currency };
|
|
468
|
+
}
|
|
120
469
|
/**
|
|
121
470
|
* `idempotencyKey` (when supplied) makes a retried deposit a no-op: a replay
|
|
122
471
|
* returns the original committed result WITHOUT calling the PSP again or
|
|
@@ -126,9 +475,16 @@ export class WalletService {
|
|
|
126
475
|
* reach the PSP, but the ledger insert's unique-index conflict still
|
|
127
476
|
* guarantees only one balance credit - the loser's write becomes a replay
|
|
128
477
|
* read of the winner's row.
|
|
478
|
+
*
|
|
479
|
+
* Deposit gating is network-aware when a network is known (e.g. via
|
|
480
|
+
* `getOrCreateDepositAddress`), but here we gate on "any network for this
|
|
481
|
+
* currency is enabled" because `provider` routing may resolve a specific
|
|
482
|
+
* network inside `processDeposit`. A fiat PSP (no networks) passes through
|
|
483
|
+
* unchecked; an explicit network route checks that specific network only.
|
|
129
484
|
*/
|
|
130
485
|
async deposit({ userId, amount, currency, provider, idempotencyKey, }) {
|
|
131
486
|
await this.rateLimit(userId);
|
|
487
|
+
await this.assertDepositable(currency, amount);
|
|
132
488
|
// Short-circuit a replay BEFORE the PSP call - the common retry case (client
|
|
133
489
|
// resends after a timeout) must not re-charge. A genuine concurrent race (two
|
|
134
490
|
// first-attempts for the same key landing here at once) can still both reach the
|
|
@@ -141,52 +497,222 @@ export class WalletService {
|
|
|
141
497
|
}
|
|
142
498
|
preResolvedWallet = found.walletRecord;
|
|
143
499
|
}
|
|
144
|
-
|
|
145
|
-
|
|
500
|
+
else {
|
|
501
|
+
[preResolvedWallet] = await this.drizzle.db
|
|
502
|
+
.select()
|
|
503
|
+
.from(wallet)
|
|
504
|
+
.where(eq(wallet.userId, userId));
|
|
505
|
+
}
|
|
506
|
+
// Reserve the RG headroom BEFORE charging the PSP: the check and the pending row that
|
|
507
|
+
// consumes it commit together under the player's deposit lock, so a second concurrent
|
|
508
|
+
// deposit reads the first one's reservation instead of spending the same headroom.
|
|
509
|
+
const reservation = await this.drizzle.db.transaction(async (txn) => {
|
|
146
510
|
let walletRecord = preResolvedWallet;
|
|
147
511
|
if (!walletRecord) {
|
|
148
512
|
[walletRecord] = await txn.select().from(wallet).where(eq(wallet.userId, userId));
|
|
149
513
|
}
|
|
150
514
|
if (!walletRecord) {
|
|
151
|
-
walletRecord = findOneOrThrow(await txn.insert(wallet).values({ userId,
|
|
515
|
+
walletRecord = findOneOrThrow(await txn.insert(wallet).values({ userId, currency }).returning(), new WalletNotFoundError(userId));
|
|
516
|
+
}
|
|
517
|
+
const holder = walletRecord;
|
|
518
|
+
return withAdvisoryXactLock(txn, depositSlotKey(userId), async () => {
|
|
519
|
+
const namespacedKey = idempotencyKey
|
|
520
|
+
? namespacedIdempotencyKey(DEPOSIT_IDEMPOTENCY_NAMESPACE, idempotencyKey)
|
|
521
|
+
: undefined;
|
|
522
|
+
const existing = namespacedKey
|
|
523
|
+
? await this.findByIdempotencyKey(txn, holder.id, namespacedKey)
|
|
524
|
+
: undefined;
|
|
525
|
+
if (existing) {
|
|
526
|
+
this.assertReplayMatches(existing, amount, currency);
|
|
527
|
+
return { walletRecord: holder, row: existing, replay: true };
|
|
528
|
+
}
|
|
529
|
+
await this.assertWithinRgDepositLimit(txn, userId, amount, currency);
|
|
530
|
+
const { row } = await this.insertIdempotentTransaction(txn, {
|
|
531
|
+
namespace: DEPOSIT_IDEMPOTENCY_NAMESPACE,
|
|
532
|
+
walletId: holder.id,
|
|
533
|
+
rawIdempotencyKey: idempotencyKey,
|
|
534
|
+
amount,
|
|
535
|
+
currency,
|
|
536
|
+
values: {
|
|
537
|
+
walletId: holder.id,
|
|
538
|
+
type: 'deposit',
|
|
539
|
+
amount,
|
|
540
|
+
currency,
|
|
541
|
+
status: 'pending',
|
|
542
|
+
direction: 'credit',
|
|
543
|
+
rail: this.resolveRail(currency),
|
|
544
|
+
providerName: provider,
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
return { walletRecord: holder, row, replay: false };
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
if (reservation.replay) {
|
|
551
|
+
return { transactionId: reservation.row.id, status: reservation.row.status };
|
|
552
|
+
}
|
|
553
|
+
let psp;
|
|
554
|
+
try {
|
|
555
|
+
psp = await this.payment.processDeposit(amount, currency, { userId, provider });
|
|
556
|
+
}
|
|
557
|
+
catch (err) {
|
|
558
|
+
await this.releaseDepositReservation(reservation.row.id);
|
|
559
|
+
throw err;
|
|
560
|
+
}
|
|
561
|
+
// The status guard is the settle-once lock: only the update that moves the row out of
|
|
562
|
+
// `pending` credits the balance, so a retry that races here reads a replay instead.
|
|
563
|
+
const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
|
|
564
|
+
const [settled] = await txn
|
|
565
|
+
.update(walletTransaction)
|
|
566
|
+
.set({ status: 'completed', providerRefId: psp.externalId })
|
|
567
|
+
.where(and(eq(walletTransaction.id, reservation.row.id), eq(walletTransaction.status, 'pending')))
|
|
568
|
+
.returning();
|
|
569
|
+
if (!settled) {
|
|
570
|
+
return { transactionId: reservation.row.id, replayed: true };
|
|
571
|
+
}
|
|
572
|
+
await creditWalletBalance(txn, reservation.walletRecord.id, currency, amount);
|
|
573
|
+
return { transactionId: settled.id, replayed: false };
|
|
574
|
+
});
|
|
575
|
+
if (!replayed) {
|
|
576
|
+
this.events.emit('wallet.deposit.completed', {
|
|
577
|
+
userId,
|
|
578
|
+
playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
|
|
579
|
+
amount,
|
|
580
|
+
currency,
|
|
581
|
+
transactionId,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
return { transactionId, status: 'completed' };
|
|
585
|
+
}
|
|
586
|
+
async manualAdjust({ adminId, userId, direction, amount, currency, reason, idempotencyKey, ip, userAgent, }) {
|
|
587
|
+
const playerId = await this.identityReader.getPlayerIdByUserId(userId);
|
|
588
|
+
if (!playerId) {
|
|
589
|
+
throw new PlayerNotFoundError(userId);
|
|
590
|
+
}
|
|
591
|
+
const { result, emitted } = await this.drizzle.db.transaction(async (txn) => {
|
|
592
|
+
let walletRecord = (await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update')).at(0);
|
|
593
|
+
if (!walletRecord) {
|
|
594
|
+
if (direction === 'debit') {
|
|
595
|
+
throw new InsufficientBalanceError('0', amount);
|
|
596
|
+
}
|
|
597
|
+
const [created] = await txn
|
|
598
|
+
.insert(wallet)
|
|
599
|
+
.values({ userId, currency })
|
|
600
|
+
.onConflictDoNothing()
|
|
601
|
+
.returning();
|
|
602
|
+
walletRecord =
|
|
603
|
+
created ??
|
|
604
|
+
findOneOrThrow(await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update'), new WalletNotFoundError(userId));
|
|
605
|
+
}
|
|
606
|
+
const existing = await this.findByIdempotencyKey(txn, walletRecord.id, namespacedIdempotencyKey(MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE, idempotencyKey));
|
|
607
|
+
if (existing) {
|
|
608
|
+
this.assertManualAdjustmentReplayMatches(existing, {
|
|
609
|
+
adminId,
|
|
610
|
+
direction,
|
|
611
|
+
amount,
|
|
612
|
+
currency,
|
|
613
|
+
reason,
|
|
614
|
+
});
|
|
615
|
+
return { result: { transactionId: existing.id, status: existing.status }, emitted: false };
|
|
152
616
|
}
|
|
153
617
|
const { row, replayed } = await this.insertIdempotentTransaction(txn, {
|
|
154
|
-
namespace:
|
|
618
|
+
namespace: MANUAL_ADJUSTMENT_IDEMPOTENCY_NAMESPACE,
|
|
155
619
|
walletId: walletRecord.id,
|
|
156
620
|
rawIdempotencyKey: idempotencyKey,
|
|
157
621
|
amount,
|
|
158
622
|
currency,
|
|
159
623
|
values: {
|
|
160
624
|
walletId: walletRecord.id,
|
|
161
|
-
type: '
|
|
625
|
+
type: direction === 'credit' ? 'manual_credit' : 'manual_debit',
|
|
162
626
|
amount,
|
|
163
627
|
currency,
|
|
164
628
|
status: 'completed',
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
629
|
+
direction,
|
|
630
|
+
reviewedBy: adminId,
|
|
631
|
+
reviewedAt: new Date(),
|
|
632
|
+
reviewReason: reason,
|
|
168
633
|
},
|
|
169
634
|
});
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
635
|
+
if (replayed) {
|
|
636
|
+
this.assertManualAdjustmentReplayMatches(row, {
|
|
637
|
+
adminId,
|
|
638
|
+
direction,
|
|
639
|
+
amount,
|
|
640
|
+
currency,
|
|
641
|
+
reason,
|
|
642
|
+
});
|
|
643
|
+
return { result: { transactionId: row.id, status: row.status }, emitted: false };
|
|
175
644
|
}
|
|
176
|
-
|
|
645
|
+
const balances = direction === 'credit'
|
|
646
|
+
? await creditWalletBalance(txn, walletRecord.id, currency, amount)
|
|
647
|
+
: await debitWalletBalance(txn, walletRecord.id, currency, amount);
|
|
648
|
+
const [balance] = balances;
|
|
649
|
+
if (!balance) {
|
|
650
|
+
throw new InsufficientBalanceError(await readWalletBalance(txn, walletRecord.id, currency), amount);
|
|
651
|
+
}
|
|
652
|
+
// Derived from the row the update returned, never read separately beforehand. The
|
|
653
|
+
// wallet row is locked here but the deposit credit path does not take that lock, so
|
|
654
|
+
// a deposit can commit between a pre-read and this update - and `before` is going
|
|
655
|
+
// into an append-only audit record that cannot be corrected later.
|
|
656
|
+
const balanceBefore = direction === 'credit'
|
|
657
|
+
? moneySubtract(balance.amount, amount)
|
|
658
|
+
: moneyAdd(balance.amount, amount);
|
|
659
|
+
await this.audit.recordInTransaction(txn, {
|
|
660
|
+
actorId: adminId,
|
|
661
|
+
actorType: 'admin',
|
|
662
|
+
action: 'wallet.manual_adjustment.created',
|
|
663
|
+
resourceType: 'wallet_transaction',
|
|
664
|
+
resourceId: row.id,
|
|
665
|
+
before: { balance: balanceBefore, currency },
|
|
666
|
+
after: {
|
|
667
|
+
balance: balance.amount,
|
|
668
|
+
currency,
|
|
669
|
+
transactionId: row.id,
|
|
670
|
+
direction,
|
|
671
|
+
amount,
|
|
672
|
+
reason,
|
|
673
|
+
},
|
|
674
|
+
ip,
|
|
675
|
+
userAgent,
|
|
676
|
+
});
|
|
677
|
+
return { result: { transactionId: row.id, status: row.status }, emitted: true };
|
|
177
678
|
});
|
|
178
|
-
|
|
179
|
-
|
|
679
|
+
// Every other balance-mutating path on this service emits; without this one an admin
|
|
680
|
+
// correction moves a real balance while responsible-gaming monitoring, analytics and
|
|
681
|
+
// any operator subscriber see nothing at all.
|
|
682
|
+
if (emitted) {
|
|
683
|
+
this.events.emit('wallet.manual_adjustment.created', {
|
|
180
684
|
userId,
|
|
685
|
+
playerId,
|
|
686
|
+
adminId,
|
|
181
687
|
amount,
|
|
182
688
|
currency,
|
|
183
|
-
transactionId,
|
|
689
|
+
transactionId: result.transactionId,
|
|
690
|
+
direction,
|
|
691
|
+
reason,
|
|
692
|
+
ip,
|
|
693
|
+
userAgent,
|
|
184
694
|
});
|
|
185
695
|
}
|
|
186
|
-
return
|
|
696
|
+
return result;
|
|
187
697
|
}
|
|
188
698
|
// Pre-PSP replay check for deposit; also returns the resolved wallet so the transaction
|
|
189
699
|
// below can skip re-selecting it. Throws IdempotencyKeyReuseError on an amount/currency mismatch.
|
|
700
|
+
/**
|
|
701
|
+
* Frees a reservation the PSP never charged. Failure to release only leaves the player's
|
|
702
|
+
* own headroom held until the row is reconciled, so it is logged rather than raised over
|
|
703
|
+
* the PSP error that caused it.
|
|
704
|
+
*/
|
|
705
|
+
async releaseDepositReservation(transactionId) {
|
|
706
|
+
try {
|
|
707
|
+
await this.drizzle.db
|
|
708
|
+
.update(walletTransaction)
|
|
709
|
+
.set({ status: 'failed' })
|
|
710
|
+
.where(and(eq(walletTransaction.id, transactionId), eq(walletTransaction.status, 'pending')));
|
|
711
|
+
}
|
|
712
|
+
catch (err) {
|
|
713
|
+
logger.error({ err, transactionId }, 'deposit reservation release failed');
|
|
714
|
+
}
|
|
715
|
+
}
|
|
190
716
|
async findDepositReplay({ userId, idempotencyKey, amount, currency, }) {
|
|
191
717
|
const [walletRecord] = await this.drizzle.db
|
|
192
718
|
.select()
|
|
@@ -202,14 +728,23 @@ export class WalletService {
|
|
|
202
728
|
this.assertReplayMatches(existing, amount, currency);
|
|
203
729
|
return { walletRecord, replay: { transactionId: existing.id, status: existing.status } };
|
|
204
730
|
}
|
|
205
|
-
// Replay comparison only (not a ledger write)
|
|
206
|
-
//
|
|
731
|
+
// Replay comparison only (not a ledger write). moneyEquals avoids a false mismatch between
|
|
732
|
+
// an unnormalized caller string (eg "10") and the DB's fixed-scale value ("10.00") while
|
|
733
|
+
// staying exact - a float compare would let two amounts differing past the 15th digit pass.
|
|
207
734
|
assertReplayMatches(existing, amount, currency) {
|
|
208
|
-
if (
|
|
735
|
+
if (!moneyEquals(existing.amount, amount) ||
|
|
209
736
|
existing.currency.toUpperCase() !== currency.toUpperCase()) {
|
|
210
737
|
throw new IdempotencyKeyReuseError();
|
|
211
738
|
}
|
|
212
739
|
}
|
|
740
|
+
assertManualAdjustmentReplayMatches(existing, { adminId, direction, amount, currency, reason, }) {
|
|
741
|
+
if (existing.type !== (direction === 'credit' ? 'manual_credit' : 'manual_debit') ||
|
|
742
|
+
existing.reviewedBy !== adminId ||
|
|
743
|
+
existing.reviewReason !== reason) {
|
|
744
|
+
throw new IdempotencyKeyReuseError();
|
|
745
|
+
}
|
|
746
|
+
this.assertReplayMatches(existing, amount, currency);
|
|
747
|
+
}
|
|
213
748
|
// Two concurrent requests with the same key can both pass the pre-insert check and race
|
|
214
749
|
// on the unique index; onConflictDoNothing makes the loser's insert a no-op so it re-reads
|
|
215
750
|
// the winner's committed row and returns it as a replay instead of aborting the transaction.
|
|
@@ -248,19 +783,19 @@ export class WalletService {
|
|
|
248
783
|
* return an already-`completed`/`processing` result if the request
|
|
249
784
|
* qualifies for (and passes) auto-approval - see `maybeAutoApprove`.
|
|
250
785
|
*/
|
|
251
|
-
async withdraw({ userId, amount, currency, idempotencyKey, destinationAddress, }) {
|
|
786
|
+
async withdraw({ userId, amount, currency, network, idempotencyKey, destinationAddress, destinationTag, ip, userAgent, }) {
|
|
252
787
|
await this.rateLimit(userId);
|
|
253
788
|
await this.assertKycForWithdrawal(userId);
|
|
254
|
-
if (
|
|
789
|
+
if (this.resolveRail(currency) === 'crypto' && !destinationAddress) {
|
|
255
790
|
throw new DestinationAddressRequiredError();
|
|
256
791
|
}
|
|
792
|
+
const assets = await this.assetsForCurrency(currency);
|
|
793
|
+
const settlementNetwork = resolveWithdrawalNetwork(assets, currency, network);
|
|
794
|
+
assertAboveMinimumWithdrawal(assets, amount, currency, settlementNetwork);
|
|
795
|
+
const destinationWalletId = await this.requireWhitelistedWalletId(userId, currency, settlementNetwork, destinationAddress, destinationTag);
|
|
257
796
|
const { transactionId, status, replayed, walletId, rail } = await this.drizzle.db.transaction(async (txn) => {
|
|
258
797
|
// FOR UPDATE serializes concurrent withdrawals against a double-debit TOCTOU under READ COMMITTED.
|
|
259
798
|
const current = findOneOrThrow(await txn.select().from(wallet).where(eq(wallet.userId, userId)).for('update'), new WalletNotFoundError(userId));
|
|
260
|
-
// Single-currency wallet: reject a mismatch rather than coerce it onto the wrong rail.
|
|
261
|
-
if (currency.toUpperCase() !== current.currency.toUpperCase()) {
|
|
262
|
-
throw new CurrencyMismatchError(currency, current.currency);
|
|
263
|
-
}
|
|
264
799
|
// Replay of an already-committed key: return the original untouched. The new-key race is caught by the insert below.
|
|
265
800
|
if (idempotencyKey) {
|
|
266
801
|
const existing = await this.findByIdempotencyKey(txn, current.id, namespacedIdempotencyKey(WITHDRAW_IDEMPOTENCY_NAMESPACE, idempotencyKey));
|
|
@@ -271,7 +806,7 @@ export class WalletService {
|
|
|
271
806
|
status: existing.status,
|
|
272
807
|
replayed: true,
|
|
273
808
|
walletId: current.id,
|
|
274
|
-
rail:
|
|
809
|
+
rail: this.resolveRail(currency),
|
|
275
810
|
};
|
|
276
811
|
}
|
|
277
812
|
}
|
|
@@ -287,8 +822,12 @@ export class WalletService {
|
|
|
287
822
|
amount,
|
|
288
823
|
currency,
|
|
289
824
|
status: 'pending',
|
|
290
|
-
|
|
825
|
+
direction: 'debit',
|
|
826
|
+
rail: this.resolveRail(currency),
|
|
827
|
+
network: settlementNetwork,
|
|
291
828
|
destinationAddress: destinationAddress ?? null,
|
|
829
|
+
destinationTag: destinationTag ?? null,
|
|
830
|
+
destinationWalletId,
|
|
292
831
|
},
|
|
293
832
|
});
|
|
294
833
|
if (replayed) {
|
|
@@ -297,24 +836,29 @@ export class WalletService {
|
|
|
297
836
|
status: row.status,
|
|
298
837
|
replayed,
|
|
299
838
|
walletId: current.id,
|
|
300
|
-
rail:
|
|
839
|
+
rail: this.resolveRail(currency),
|
|
301
840
|
};
|
|
302
841
|
}
|
|
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 });
|
|
842
|
+
const debited = await debitWithdrawableBalance(txn, current.id, currency, amount);
|
|
309
843
|
if (debited.length !== 1) {
|
|
310
|
-
|
|
844
|
+
const [available, locked] = await Promise.all([
|
|
845
|
+
readWalletBalance(txn, current.id, currency),
|
|
846
|
+
readLockedBonusAmount(txn, current.id, currency),
|
|
847
|
+
]);
|
|
848
|
+
if (moneyToNumber(available) < moneyToNumber(amount)) {
|
|
849
|
+
throw new InsufficientBalanceError(available, amount);
|
|
850
|
+
}
|
|
851
|
+
throw new BonusRolloverLockedError(locked);
|
|
852
|
+
}
|
|
853
|
+
if (this.tagEvaluationCommands) {
|
|
854
|
+
await this.tagEvaluationCommands.evaluateWithdrawalRequested(txn, { userId, amount });
|
|
311
855
|
}
|
|
312
856
|
return {
|
|
313
857
|
transactionId: row.id,
|
|
314
858
|
status: row.status,
|
|
315
859
|
replayed,
|
|
316
860
|
walletId: current.id,
|
|
317
|
-
rail:
|
|
861
|
+
rail: this.resolveRail(currency),
|
|
318
862
|
};
|
|
319
863
|
});
|
|
320
864
|
if (replayed) {
|
|
@@ -322,9 +866,12 @@ export class WalletService {
|
|
|
322
866
|
}
|
|
323
867
|
this.events.emit('wallet.withdrawal.requested', {
|
|
324
868
|
userId,
|
|
869
|
+
playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
|
|
325
870
|
amount,
|
|
326
871
|
currency,
|
|
327
872
|
transactionId,
|
|
873
|
+
ip: ip ?? null,
|
|
874
|
+
userAgent: userAgent ?? null,
|
|
328
875
|
});
|
|
329
876
|
// Fail-closed post-step: decides who approves (system vs manual queue), never throws out of withdraw() - failure leaves the row pending.
|
|
330
877
|
const auto = await this.maybeAutoApprove({
|
|
@@ -364,17 +911,38 @@ export class WalletService {
|
|
|
364
911
|
}
|
|
365
912
|
// Bounded queue: fetch all SQL-matching rows, then enrich + kycStatus-filter + paginate in memory,
|
|
366
913
|
// else DB-side pagination makes `total` wrong once kycStatus prunes.
|
|
914
|
+
const wdSortBy = filters.sortBy ?? 'createdAt';
|
|
915
|
+
const wdDir = (filters.sortOrder ?? 'desc') === 'asc' ? asc : desc;
|
|
916
|
+
const WD_SORT_COLS = {
|
|
917
|
+
createdAt: walletTransaction.createdAt,
|
|
918
|
+
amount: walletTransaction.amount,
|
|
919
|
+
status: walletTransaction.status,
|
|
920
|
+
currency: walletTransaction.currency,
|
|
921
|
+
rail: walletTransaction.rail,
|
|
922
|
+
reviewedAt: walletTransaction.reviewedAt,
|
|
923
|
+
};
|
|
367
924
|
const rows = await db
|
|
368
925
|
.select({ tx: walletTransaction, userId: wallet.userId })
|
|
369
926
|
.from(walletTransaction)
|
|
370
927
|
.innerJoin(wallet, eq(wallet.id, walletTransaction.walletId))
|
|
371
928
|
.where(and(...conditions))
|
|
372
|
-
.orderBy(desc(walletTransaction.
|
|
929
|
+
.orderBy(wdDir(WD_SORT_COLS[wdSortBy]), desc(walletTransaction.id));
|
|
373
930
|
const userIds = [...new Set(rows.map((r) => r.userId))];
|
|
374
931
|
const summaries = this.directory ? await this.directory.lookupPlayers(userIds) : [];
|
|
375
932
|
const byUserId = new Map(summaries.map((s) => [s.userId, s]));
|
|
376
|
-
|
|
377
|
-
|
|
933
|
+
// Normalize both sides before comparing: the ADMIN_USER_DIRECTORY port's return type
|
|
934
|
+
// still permits the deprecated `verified` value (it aliases `approved`), and this
|
|
935
|
+
// module cannot assume every bound implementation already normalized it at its own
|
|
936
|
+
// read boundary - a raw `===` here would silently hide every legacy-verified player
|
|
937
|
+
// from the queue the moment an admin filters by the canonical `approved`.
|
|
938
|
+
const kycStatusFilter = filters.kycStatus ? normalizeKycStatus(filters.kycStatus) : undefined;
|
|
939
|
+
const matching = kycStatusFilter
|
|
940
|
+
? rows.filter((r) => {
|
|
941
|
+
const kycStatus = byUserId.get(r.userId)?.kycStatus;
|
|
942
|
+
return kycStatus !== undefined && kycStatus !== null
|
|
943
|
+
? normalizeKycStatus(kycStatus) === kycStatusFilter
|
|
944
|
+
: false;
|
|
945
|
+
})
|
|
378
946
|
: rows;
|
|
379
947
|
const start = pageToOffset(page, limit);
|
|
380
948
|
const pageRows = matching.slice(start, start + limit);
|
|
@@ -393,15 +961,18 @@ export class WalletService {
|
|
|
393
961
|
return {
|
|
394
962
|
transactionId: r.tx.id,
|
|
395
963
|
userId: r.userId,
|
|
964
|
+
playerId: summary?.playerId ?? null,
|
|
396
965
|
username: summary?.username ?? '',
|
|
397
966
|
amount: r.tx.amount,
|
|
398
967
|
currency: r.tx.currency,
|
|
968
|
+
network: r.tx.network,
|
|
399
969
|
rail: r.tx.rail ?? null,
|
|
400
970
|
status: r.tx.status,
|
|
401
971
|
kycStatus: summary?.kycStatus ?? null,
|
|
402
972
|
riskTags,
|
|
403
973
|
requestedAt: r.tx.createdAt.toISOString(),
|
|
404
974
|
destinationAddress: r.tx.destinationAddress,
|
|
975
|
+
destinationTag: r.tx.destinationTag,
|
|
405
976
|
txHash: r.tx.txHash,
|
|
406
977
|
};
|
|
407
978
|
});
|
|
@@ -412,11 +983,11 @@ export class WalletService {
|
|
|
412
983
|
* or Failed + refund on PSP error. Robust PSP idempotency-key/reconciliation for a
|
|
413
984
|
* lost-response is deferred - same scope boundary the deposit path declares.
|
|
414
985
|
*/
|
|
415
|
-
async approveWithdrawal(adminId, withdrawalId) {
|
|
986
|
+
async approveWithdrawal(adminId, withdrawalId, meta) {
|
|
416
987
|
// Two-phase: commit the `processing` flip first (FOR UPDATE lock), then call the PSP OUTSIDE
|
|
417
988
|
// the tx (a failure refunds in a second tx). Never inline the PSP call inside the hold transaction.
|
|
418
989
|
const tx = await this.drizzle.db.transaction((txn) => this.flipToProcessing({ txn, withdrawalId, adminId }));
|
|
419
|
-
return this.settleApproved(tx, adminId);
|
|
990
|
+
return this.settleApproved(tx, adminId, meta);
|
|
420
991
|
}
|
|
421
992
|
// Phase one: the pending -> processing flip under a FOR UPDATE lock. Extracted so the auto path can run it
|
|
422
993
|
// inside its advisory-locked cap-check transaction, committing the marker atomically. Never call the PSP here.
|
|
@@ -443,7 +1014,7 @@ export class WalletService {
|
|
|
443
1014
|
}
|
|
444
1015
|
// Phase two: settle a `processing` withdrawal via the PSP (Completed on success, Failed + refund on error).
|
|
445
1016
|
// Runs OUTSIDE the hold/flip transaction so the external PSP call never holds a DB lock.
|
|
446
|
-
async settleApproved(tx, adminId) {
|
|
1017
|
+
async settleApproved(tx, adminId, meta) {
|
|
447
1018
|
const userId = await this.userIdForWallet(tx.walletId);
|
|
448
1019
|
const amount = tx.amount;
|
|
449
1020
|
// approved/failed are admin-attributed events (schema requires a uuid adminId); the system auto path
|
|
@@ -455,16 +1026,27 @@ export class WalletService {
|
|
|
455
1026
|
currency: tx.currency,
|
|
456
1027
|
transactionId: tx.id,
|
|
457
1028
|
adminId,
|
|
1029
|
+
ip: meta?.ip ?? null,
|
|
1030
|
+
userAgent: meta?.userAgent ?? null,
|
|
458
1031
|
});
|
|
459
1032
|
}
|
|
1033
|
+
const { providerName, adapter } = await this.paymentAdapterFor(tx.currency, tx.network);
|
|
460
1034
|
let result;
|
|
461
1035
|
try {
|
|
462
|
-
result = await
|
|
1036
|
+
result = await adapter.processWithdrawal(amount, tx.currency, {
|
|
463
1037
|
transactionId: tx.id,
|
|
464
1038
|
userId,
|
|
465
1039
|
rail: tx.rail,
|
|
466
1040
|
adminId,
|
|
467
1041
|
destinationAddress: tx.destinationAddress,
|
|
1042
|
+
destinationTag: tx.destinationTag,
|
|
1043
|
+
// The provider-side whitelisted destination for that address, when the bound adapter
|
|
1044
|
+
// whitelists at all. Absent for an address that predates whitelisting or was never in
|
|
1045
|
+
// the book, and such an adapter is expected to refuse rather than pay out to the raw
|
|
1046
|
+
// address - the whitelist is the control, so bypassing it would defeat the point.
|
|
1047
|
+
...(tx.destinationWalletId ? { destinationWalletId: tx.destinationWalletId } : {}),
|
|
1048
|
+
// Pinned at request time; without it an adapter cannot tell ERC20 USDT from TRC20.
|
|
1049
|
+
network: tx.network,
|
|
468
1050
|
});
|
|
469
1051
|
}
|
|
470
1052
|
catch (err) {
|
|
@@ -479,7 +1061,10 @@ export class WalletService {
|
|
|
479
1061
|
if (result.status !== 'completed') {
|
|
480
1062
|
await this.drizzle.db
|
|
481
1063
|
.update(walletTransaction)
|
|
482
|
-
.set({
|
|
1064
|
+
.set({
|
|
1065
|
+
providerName,
|
|
1066
|
+
providerRefId: result.externalId,
|
|
1067
|
+
})
|
|
483
1068
|
.where(eq(walletTransaction.id, tx.id));
|
|
484
1069
|
return { transactionId: tx.id, status: 'processing' };
|
|
485
1070
|
}
|
|
@@ -487,12 +1072,13 @@ export class WalletService {
|
|
|
487
1072
|
.update(walletTransaction)
|
|
488
1073
|
.set({
|
|
489
1074
|
status: 'completed',
|
|
490
|
-
providerName
|
|
1075
|
+
providerName,
|
|
491
1076
|
providerRefId: result.externalId,
|
|
492
1077
|
})
|
|
493
1078
|
.where(eq(walletTransaction.id, tx.id));
|
|
494
1079
|
this.events.emit('wallet.withdrawal.completed', {
|
|
495
1080
|
userId,
|
|
1081
|
+
playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
|
|
496
1082
|
amount,
|
|
497
1083
|
currency: tx.currency,
|
|
498
1084
|
transactionId: tx.id,
|
|
@@ -509,10 +1095,7 @@ export class WalletService {
|
|
|
509
1095
|
if (updated.length === 0) {
|
|
510
1096
|
return false;
|
|
511
1097
|
}
|
|
512
|
-
await txn
|
|
513
|
-
.update(wallet)
|
|
514
|
-
.set({ balance: sql `${wallet.balance} + ${amount}::numeric` })
|
|
515
|
-
.where(eq(wallet.id, tx.walletId));
|
|
1098
|
+
await creditWalletBalance(txn, tx.walletId, tx.currency, amount);
|
|
516
1099
|
return true;
|
|
517
1100
|
});
|
|
518
1101
|
if (transitioned && adminId) {
|
|
@@ -550,6 +1133,7 @@ export class WalletService {
|
|
|
550
1133
|
}
|
|
551
1134
|
this.events.emit('wallet.withdrawal.completed', {
|
|
552
1135
|
userId,
|
|
1136
|
+
playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
|
|
553
1137
|
amount: tx.amount,
|
|
554
1138
|
currency: tx.currency,
|
|
555
1139
|
transactionId: tx.id,
|
|
@@ -648,15 +1232,16 @@ export class WalletService {
|
|
|
648
1232
|
}
|
|
649
1233
|
// Independent of kyc.gateWithdrawals: auto-approval always demands a passing status; anything else fails closed.
|
|
650
1234
|
const kycStatus = await this.autoApprovalKycStatus(userId);
|
|
651
|
-
if (!kycStatus || !KYC_PASS_STATUSES.has(kycStatus)) {
|
|
1235
|
+
if (!kycStatus || !KYC_PASS_STATUSES.has(normalizeKycStatus(kycStatus))) {
|
|
652
1236
|
return null;
|
|
653
1237
|
}
|
|
654
|
-
const
|
|
1238
|
+
const effectiveExcludeTags = threshold.config.excludeRiskFlags;
|
|
1239
|
+
const riskTags = await this.autoApprovalRiskTags(userId, effectiveExcludeTags);
|
|
655
1240
|
// null = exclusions configured but the lookup port is unavailable => fail closed.
|
|
656
1241
|
if (riskTags === null) {
|
|
657
1242
|
return null;
|
|
658
1243
|
}
|
|
659
|
-
if (riskTags.some((t) =>
|
|
1244
|
+
if (riskTags.some((t) => effectiveExcludeTags.includes(t))) {
|
|
660
1245
|
return null;
|
|
661
1246
|
}
|
|
662
1247
|
const heuristics = await this.autoApprovalHeuristics({ walletId, amount });
|
|
@@ -668,23 +1253,300 @@ export class WalletService {
|
|
|
668
1253
|
thresholdSource: threshold.source,
|
|
669
1254
|
kycStatus,
|
|
670
1255
|
riskTagsEvaluated: riskTags,
|
|
1256
|
+
effectiveExcludeTags,
|
|
671
1257
|
};
|
|
672
1258
|
}
|
|
673
1259
|
async resolveAutoThreshold(userId, rail) {
|
|
1260
|
+
// Always read the global singleton first, even when a per-player override may end up
|
|
1261
|
+
// winning below - an unseeded install (missing row) must fail closed for EVERY player,
|
|
1262
|
+
// not just those without an override. getAutoWithdrawalConfig() throws when absent.
|
|
1263
|
+
const config = await this.getAutoWithdrawalConfig();
|
|
674
1264
|
const [rule] = await this.drizzle.db
|
|
675
1265
|
.select()
|
|
676
1266
|
.from(autoWithdrawalRule)
|
|
677
1267
|
.where(eq(autoWithdrawalRule.userId, userId));
|
|
678
1268
|
if (rule) {
|
|
679
|
-
return { value: rule.threshold, source: 'per-player' };
|
|
1269
|
+
return { value: rule.threshold, source: 'per-player', config };
|
|
680
1270
|
}
|
|
681
|
-
const global = rail === 'crypto'
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
1271
|
+
const global = rail === 'crypto' ? config.cryptoThreshold : config.fiatThreshold;
|
|
1272
|
+
return { value: global, source: 'global', config };
|
|
1273
|
+
}
|
|
1274
|
+
// The row always exists in a properly-seeded install (seeded once) - a
|
|
1275
|
+
// missing row is an unexpected failure mode on the READ path, not a normal
|
|
1276
|
+
// "unconfigured" state, so this throws rather than silently defaulting.
|
|
1277
|
+
// maybeAutoApprove's outer try/catch handles that thrown error the same as any
|
|
1278
|
+
// other unexpected error: fail closed to pending.
|
|
1279
|
+
async getAutoWithdrawalConfig() {
|
|
1280
|
+
const config = await this.getAutoWithdrawalConfigOrNull();
|
|
1281
|
+
if (!config) {
|
|
1282
|
+
throw new AutoWithdrawalConfigNotFoundError('global');
|
|
1283
|
+
}
|
|
1284
|
+
return config;
|
|
1285
|
+
}
|
|
1286
|
+
// Non-throwing variant for callers that need to tell "missing" from "found"
|
|
1287
|
+
// without a try/catch (eg the router's audit `before` read).
|
|
1288
|
+
async getAutoWithdrawalConfigOrNull() {
|
|
1289
|
+
const [row] = await this.drizzle.db
|
|
1290
|
+
.select()
|
|
1291
|
+
.from(walletAutoWithdrawalConfig)
|
|
1292
|
+
.where(eq(walletAutoWithdrawalConfig.singletonKey, 'global'));
|
|
1293
|
+
return row ? toAutoWithdrawalConfigDto(row) : null;
|
|
1294
|
+
}
|
|
1295
|
+
// Upsert, not a plain UPDATE: the WRITE path lets a Super Admin self-heal a
|
|
1296
|
+
// missing singleton row (eg an install that skipped the seed step) through the
|
|
1297
|
+
// existing route with zero new surface. The READ path (getAutoWithdrawalConfig,
|
|
1298
|
+
// resolveAutoThreshold) still throws on a missing row and stays fail-closed -
|
|
1299
|
+
// a withdrawal must never silently create config.
|
|
1300
|
+
//
|
|
1301
|
+
// Update + audit write run in one transaction: an audit-write failure must roll back
|
|
1302
|
+
// the threshold change too, or the config could change with no audit trail.
|
|
1303
|
+
async setAutoWithdrawalConfig(adminId, { fiatThreshold, cryptoThreshold, excludeRiskFlags, }, meta) {
|
|
1304
|
+
return this.drizzle.db.transaction(async (txn) => {
|
|
1305
|
+
const [before] = await txn
|
|
1306
|
+
.select()
|
|
1307
|
+
.from(walletAutoWithdrawalConfig)
|
|
1308
|
+
.where(eq(walletAutoWithdrawalConfig.singletonKey, 'global'));
|
|
1309
|
+
const rows = await txn
|
|
1310
|
+
.insert(walletAutoWithdrawalConfig)
|
|
1311
|
+
.values({
|
|
1312
|
+
singletonKey: 'global',
|
|
1313
|
+
fiatThreshold,
|
|
1314
|
+
cryptoThreshold,
|
|
1315
|
+
excludeRiskFlags,
|
|
1316
|
+
updatedBy: adminId,
|
|
1317
|
+
})
|
|
1318
|
+
.onConflictDoUpdate({
|
|
1319
|
+
target: walletAutoWithdrawalConfig.singletonKey,
|
|
1320
|
+
set: { fiatThreshold, cryptoThreshold, excludeRiskFlags, updatedBy: adminId },
|
|
1321
|
+
})
|
|
1322
|
+
.returning();
|
|
1323
|
+
const config = toAutoWithdrawalConfigDto(findOneOrThrow(rows, new AutoWithdrawalConfigNotFoundError('global')));
|
|
1324
|
+
await this.audit.recordInTransaction(txn, {
|
|
1325
|
+
actorId: adminId,
|
|
1326
|
+
actorType: 'admin',
|
|
1327
|
+
action: 'wallet.auto_withdrawal_config.set',
|
|
1328
|
+
resourceType: 'auto_withdrawal_config',
|
|
1329
|
+
resourceId: config.id,
|
|
1330
|
+
before: before
|
|
1331
|
+
? {
|
|
1332
|
+
fiatThreshold: before.fiatThreshold,
|
|
1333
|
+
cryptoThreshold: before.cryptoThreshold,
|
|
1334
|
+
excludeRiskFlags: before.excludeRiskFlags,
|
|
1335
|
+
}
|
|
1336
|
+
: null,
|
|
1337
|
+
after: {
|
|
1338
|
+
fiatThreshold: config.fiatThreshold,
|
|
1339
|
+
cryptoThreshold: config.cryptoThreshold,
|
|
1340
|
+
excludeRiskFlags: config.excludeRiskFlags,
|
|
1341
|
+
},
|
|
1342
|
+
...meta,
|
|
1343
|
+
});
|
|
1344
|
+
return config;
|
|
1345
|
+
});
|
|
1346
|
+
}
|
|
1347
|
+
async getBonusRolloverStatus(userId, status = 'active') {
|
|
1348
|
+
const rows = await this.drizzle.db
|
|
1349
|
+
.select()
|
|
1350
|
+
.from(walletBonusCredit)
|
|
1351
|
+
.where(and(eq(walletBonusCredit.userId, userId), eq(walletBonusCredit.status, status)))
|
|
1352
|
+
.orderBy(desc(walletBonusCredit.createdAt))
|
|
1353
|
+
.limit(50);
|
|
1354
|
+
return { credits: rows.map(toBonusCreditDto) };
|
|
1355
|
+
}
|
|
1356
|
+
async getBonusRolloverConfig() {
|
|
1357
|
+
const config = await this.getBonusRolloverConfigOrNull();
|
|
1358
|
+
if (!config) {
|
|
1359
|
+
throw new BonusRolloverConfigNotFoundError('global');
|
|
686
1360
|
}
|
|
687
|
-
return
|
|
1361
|
+
return config;
|
|
1362
|
+
}
|
|
1363
|
+
async getBonusRolloverConfigOrNull() {
|
|
1364
|
+
const [row] = await this.drizzle.db
|
|
1365
|
+
.select()
|
|
1366
|
+
.from(walletBonusRolloverConfig)
|
|
1367
|
+
.where(eq(walletBonusRolloverConfig.singletonKey, 'global'));
|
|
1368
|
+
return row ? toBonusRolloverConfigDto(row) : null;
|
|
1369
|
+
}
|
|
1370
|
+
async setBonusRolloverConfig(adminId, { multiplier }, meta) {
|
|
1371
|
+
return this.drizzle.db.transaction(async (txn) => {
|
|
1372
|
+
const [before] = await txn
|
|
1373
|
+
.select()
|
|
1374
|
+
.from(walletBonusRolloverConfig)
|
|
1375
|
+
.where(eq(walletBonusRolloverConfig.singletonKey, 'global'));
|
|
1376
|
+
const rows = await txn
|
|
1377
|
+
.insert(walletBonusRolloverConfig)
|
|
1378
|
+
.values({ singletonKey: 'global', multiplier, updatedBy: adminId })
|
|
1379
|
+
.onConflictDoUpdate({
|
|
1380
|
+
target: walletBonusRolloverConfig.singletonKey,
|
|
1381
|
+
set: { multiplier, updatedBy: adminId, updatedAt: new Date() },
|
|
1382
|
+
})
|
|
1383
|
+
.returning();
|
|
1384
|
+
const config = toBonusRolloverConfigDto(findOneOrThrow(rows, new BonusRolloverConfigNotFoundError('global')));
|
|
1385
|
+
await this.audit.recordInTransaction(txn, {
|
|
1386
|
+
actorId: adminId,
|
|
1387
|
+
actorType: 'admin',
|
|
1388
|
+
action: 'wallet.bonus_rollover_config.set',
|
|
1389
|
+
resourceType: 'bonus_rollover_config',
|
|
1390
|
+
resourceId: config.id,
|
|
1391
|
+
before: before ? { multiplier: before.multiplier } : null,
|
|
1392
|
+
after: { multiplier: config.multiplier },
|
|
1393
|
+
...meta,
|
|
1394
|
+
});
|
|
1395
|
+
return config;
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
async listWalletAssets() {
|
|
1399
|
+
const rows = await this.drizzle.db
|
|
1400
|
+
.select()
|
|
1401
|
+
.from(walletAsset)
|
|
1402
|
+
.orderBy(asc(walletAsset.currency), asc(walletAsset.network));
|
|
1403
|
+
return rows.map(toWalletAssetDto);
|
|
1404
|
+
}
|
|
1405
|
+
listEnabledWalletAssets() {
|
|
1406
|
+
return this.drizzle.db
|
|
1407
|
+
.select(PUBLIC_ASSET_COLUMNS)
|
|
1408
|
+
.from(walletAsset)
|
|
1409
|
+
.where(or(eq(walletAsset.depositEnabled, true), eq(walletAsset.withdrawalEnabled, true)))
|
|
1410
|
+
.orderBy(asc(walletAsset.currency), asc(walletAsset.network));
|
|
1411
|
+
}
|
|
1412
|
+
async getWalletAsset(currency, network) {
|
|
1413
|
+
const [row] = await this.drizzle.db
|
|
1414
|
+
.select()
|
|
1415
|
+
.from(walletAsset)
|
|
1416
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
|
|
1417
|
+
return row ? toWalletAssetDto(row) : null;
|
|
1418
|
+
}
|
|
1419
|
+
// The catalog is operator-editable, so an admin can name a pair the bound vendor has
|
|
1420
|
+
// never heard of. Reject at write time rather than at a player's deposit request.
|
|
1421
|
+
assertAdapterSupports(currency, network, providerName) {
|
|
1422
|
+
const adapter = (providerName ? this.paymentProviders.get(providerName)?.adapter : undefined) ?? this.payment;
|
|
1423
|
+
if (adapter.supportsAsset && !adapter.supportsAsset(currency, network)) {
|
|
1424
|
+
throw new WalletAssetUnsupportedError();
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
// Same discipline as assertAdapterSupports, for the provider key itself: an
|
|
1428
|
+
// unvalidated typo silently falls back to the default adapter, which means eg a
|
|
1429
|
+
// crypto payout attempted through a PSP. Undefined (the default binding) always passes.
|
|
1430
|
+
assertProviderNameValid(providerName) {
|
|
1431
|
+
if (providerName !== undefined && !this.paymentProviders.names().includes(providerName)) {
|
|
1432
|
+
throw new WalletAssetUnknownProviderError();
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
async createWalletAsset(adminId, input, meta) {
|
|
1436
|
+
this.assertProviderNameValid(input.providerName);
|
|
1437
|
+
this.assertAdapterSupports(input.currency, input.network, input.providerName);
|
|
1438
|
+
return this.drizzle.db.transaction(async (txn) => {
|
|
1439
|
+
const rows = await txn.insert(walletAsset).values(input).onConflictDoNothing().returning();
|
|
1440
|
+
// Empty => the (currency, network) unique index rejected it.
|
|
1441
|
+
const asset = toWalletAssetDto(findOneOrThrow(rows, new WalletAssetAlreadyExistsError()));
|
|
1442
|
+
await this.audit.recordInTransaction(txn, {
|
|
1443
|
+
actorId: adminId,
|
|
1444
|
+
actorType: 'admin',
|
|
1445
|
+
action: 'wallet.wallet_asset.created',
|
|
1446
|
+
resourceType: 'wallet_asset',
|
|
1447
|
+
resourceId: asset.id,
|
|
1448
|
+
before: null,
|
|
1449
|
+
after: asset,
|
|
1450
|
+
...meta,
|
|
1451
|
+
});
|
|
1452
|
+
return asset;
|
|
1453
|
+
});
|
|
1454
|
+
}
|
|
1455
|
+
// Deliberately touches only the catalog row: a withdrawal already pending or processing
|
|
1456
|
+
// in this currency keeps its own terms and is never cancelled by disabling the pair.
|
|
1457
|
+
async updateWalletAsset(adminId, { currency, network, ...changes }, meta) {
|
|
1458
|
+
return this.drizzle.db.transaction(async (txn) => {
|
|
1459
|
+
const [before] = await txn
|
|
1460
|
+
.select()
|
|
1461
|
+
.from(walletAsset)
|
|
1462
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
|
|
1463
|
+
// Held until commit, so an address issuance that already gated against this row
|
|
1464
|
+
// (see depositAssetsForCurrency) commits its address first and is then seen by
|
|
1465
|
+
// the in-use count below, instead of slipping in behind the delete.
|
|
1466
|
+
.for('update');
|
|
1467
|
+
if (!before) {
|
|
1468
|
+
throw new WalletAssetNotFoundError(`${currency}/${network}`);
|
|
1469
|
+
}
|
|
1470
|
+
if (changes.providerAssetId !== undefined) {
|
|
1471
|
+
this.assertAdapterSupports(currency, network, before.providerName ?? undefined);
|
|
1472
|
+
}
|
|
1473
|
+
const rows = await txn
|
|
1474
|
+
.update(walletAsset)
|
|
1475
|
+
.set(changes)
|
|
1476
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
|
|
1477
|
+
.returning();
|
|
1478
|
+
const asset = toWalletAssetDto(findOneOrThrow(rows, new WalletAssetNotFoundError(`${currency}/${network}`)));
|
|
1479
|
+
await this.audit.recordInTransaction(txn, {
|
|
1480
|
+
actorId: adminId,
|
|
1481
|
+
actorType: 'admin',
|
|
1482
|
+
action: 'wallet.wallet_asset.updated',
|
|
1483
|
+
resourceType: 'wallet_asset',
|
|
1484
|
+
resourceId: asset.id,
|
|
1485
|
+
before: toWalletAssetDto(before),
|
|
1486
|
+
after: asset,
|
|
1487
|
+
...meta,
|
|
1488
|
+
});
|
|
1489
|
+
return asset;
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
async deleteWalletAsset(adminId, currency, network, meta) {
|
|
1493
|
+
return this.drizzle.db.transaction(async (txn) => {
|
|
1494
|
+
const [before] = await txn
|
|
1495
|
+
.select()
|
|
1496
|
+
.from(walletAsset)
|
|
1497
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)))
|
|
1498
|
+
// Held until commit, so an address issuance that already gated against this row
|
|
1499
|
+
// (see depositAssetsForCurrency) commits its address first and is then seen by
|
|
1500
|
+
// the in-use count below, instead of slipping in behind the delete.
|
|
1501
|
+
.for('update');
|
|
1502
|
+
if (!before) {
|
|
1503
|
+
return false;
|
|
1504
|
+
}
|
|
1505
|
+
// wallet_balance is keyed by currency only (no network column), so this guard is
|
|
1506
|
+
// necessarily currency-wide: removing one network of a currency players still hold
|
|
1507
|
+
// is blocked even if their balance arrived over another network. Fails safe.
|
|
1508
|
+
const held = await txn
|
|
1509
|
+
.select({ id: walletBalance.id })
|
|
1510
|
+
.from(walletBalance)
|
|
1511
|
+
.where(and(eq(walletBalance.currency, currency), sql `${walletBalance.amount} > 0`))
|
|
1512
|
+
.for('update');
|
|
1513
|
+
if (held.length > 0) {
|
|
1514
|
+
throw new WalletAssetInUseError();
|
|
1515
|
+
}
|
|
1516
|
+
const [issued] = await txn
|
|
1517
|
+
.select({ n: count() })
|
|
1518
|
+
.from(walletDepositAddress)
|
|
1519
|
+
.where(and(eq(walletDepositAddress.currency, currency), eq(walletDepositAddress.network, network)));
|
|
1520
|
+
if ((issued?.n ?? 0) > 0) {
|
|
1521
|
+
throw new WalletAssetHasIssuedAddressesError();
|
|
1522
|
+
}
|
|
1523
|
+
// Renaming a pair is a delete plus a create (the (currency, network) key AND
|
|
1524
|
+
// providerName are immutable), so this delete is the only way providerName ever
|
|
1525
|
+
// effectively changes. Block it while a pending/processing transaction exists for
|
|
1526
|
+
// this exact (currency, network) pair - otherwise the vendor reference an in-flight
|
|
1527
|
+
// payout is settling through gets rewritten out from under it.
|
|
1528
|
+
const [inFlight] = await txn
|
|
1529
|
+
.select({ n: count() })
|
|
1530
|
+
.from(walletTransaction)
|
|
1531
|
+
.where(and(eq(walletTransaction.currency, currency), eq(walletTransaction.network, network), inArray(walletTransaction.status, ['pending', 'processing'])));
|
|
1532
|
+
if ((inFlight?.n ?? 0) > 0) {
|
|
1533
|
+
throw new WalletAssetHasInFlightTransactionsError();
|
|
1534
|
+
}
|
|
1535
|
+
await txn
|
|
1536
|
+
.delete(walletAsset)
|
|
1537
|
+
.where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
|
|
1538
|
+
await this.audit.recordInTransaction(txn, {
|
|
1539
|
+
actorId: adminId,
|
|
1540
|
+
actorType: 'admin',
|
|
1541
|
+
action: 'wallet.wallet_asset.deleted',
|
|
1542
|
+
resourceType: 'wallet_asset',
|
|
1543
|
+
resourceId: before.id,
|
|
1544
|
+
before: toWalletAssetDto(before),
|
|
1545
|
+
after: null,
|
|
1546
|
+
...meta,
|
|
1547
|
+
});
|
|
1548
|
+
return true;
|
|
1549
|
+
});
|
|
688
1550
|
}
|
|
689
1551
|
async autoApprovalKycStatus(userId) {
|
|
690
1552
|
// No directory bound => cannot verify KYC => fail closed.
|
|
@@ -777,7 +1639,7 @@ export class WalletService {
|
|
|
777
1639
|
.returning({ id: autoWithdrawalRule.id });
|
|
778
1640
|
return deleted.length > 0;
|
|
779
1641
|
}
|
|
780
|
-
async rejectWithdrawal(adminId, withdrawalId, reason) {
|
|
1642
|
+
async rejectWithdrawal(adminId, withdrawalId, reason, meta) {
|
|
781
1643
|
const reviewedAt = new Date();
|
|
782
1644
|
const tx = await this.drizzle.db.transaction(async (txn) => {
|
|
783
1645
|
const current = findOneOrThrow(await txn
|
|
@@ -793,10 +1655,7 @@ export class WalletService {
|
|
|
793
1655
|
.set({ status: 'rejected', reviewedBy: adminId, reviewedAt, reviewReason: reason })
|
|
794
1656
|
.where(eq(walletTransaction.id, withdrawalId))
|
|
795
1657
|
.returning(), new WithdrawalNotFoundError(withdrawalId));
|
|
796
|
-
await txn
|
|
797
|
-
.update(wallet)
|
|
798
|
-
.set({ balance: sql `${wallet.balance} + ${updated.amount}::numeric` })
|
|
799
|
-
.where(eq(wallet.id, updated.walletId));
|
|
1658
|
+
await creditWalletBalance(txn, updated.walletId, updated.currency, updated.amount);
|
|
800
1659
|
return updated;
|
|
801
1660
|
});
|
|
802
1661
|
const userId = await this.userIdForWallet(tx.walletId);
|
|
@@ -807,22 +1666,35 @@ export class WalletService {
|
|
|
807
1666
|
transactionId: tx.id,
|
|
808
1667
|
adminId,
|
|
809
1668
|
reason,
|
|
1669
|
+
ip: meta?.ip ?? null,
|
|
1670
|
+
userAgent: meta?.userAgent ?? null,
|
|
810
1671
|
});
|
|
811
1672
|
return { transactionId: tx.id, status: 'rejected' };
|
|
812
1673
|
}
|
|
813
|
-
async getTransactions(userId, page, limit) {
|
|
1674
|
+
async getTransactions({ userId, page, limit, sortBy, sortOrder, includeInternal = false, }) {
|
|
814
1675
|
const db = this.drizzle.db;
|
|
815
1676
|
const [walletRecord] = await db.select().from(wallet).where(eq(wallet.userId, userId));
|
|
816
1677
|
if (!walletRecord) {
|
|
817
1678
|
return { items: [], total: 0, page, limit };
|
|
818
1679
|
}
|
|
1680
|
+
const dir = (sortOrder ?? 'desc') === 'asc' ? asc : desc;
|
|
1681
|
+
const TX_SORT_COLS = {
|
|
1682
|
+
createdAt: walletTransaction.createdAt,
|
|
1683
|
+
amount: walletTransaction.amount,
|
|
1684
|
+
type: walletTransaction.type,
|
|
1685
|
+
status: walletTransaction.status,
|
|
1686
|
+
currency: walletTransaction.currency,
|
|
1687
|
+
rail: walletTransaction.rail,
|
|
1688
|
+
reviewedAt: walletTransaction.reviewedAt,
|
|
1689
|
+
};
|
|
1690
|
+
const col = TX_SORT_COLS[sortBy ?? 'createdAt'];
|
|
819
1691
|
const where = eq(walletTransaction.walletId, walletRecord.id);
|
|
820
1692
|
const [txs, [{ n }]] = await Promise.all([
|
|
821
1693
|
db
|
|
822
1694
|
.select()
|
|
823
1695
|
.from(walletTransaction)
|
|
824
1696
|
.where(where)
|
|
825
|
-
.orderBy(desc(walletTransaction.
|
|
1697
|
+
.orderBy(dir(col), desc(walletTransaction.id))
|
|
826
1698
|
.limit(limit)
|
|
827
1699
|
.offset(pageToOffset(page, limit)),
|
|
828
1700
|
db.select({ n: count() }).from(walletTransaction).where(where),
|
|
@@ -833,50 +1705,108 @@ export class WalletService {
|
|
|
833
1705
|
type: tx.type,
|
|
834
1706
|
amount: tx.amount,
|
|
835
1707
|
currency: tx.currency,
|
|
1708
|
+
network: tx.network,
|
|
836
1709
|
status: tx.status,
|
|
1710
|
+
direction: tx.direction,
|
|
837
1711
|
createdAt: tx.createdAt.toISOString(),
|
|
1712
|
+
reviewedBy: includeInternal ? tx.reviewedBy : null,
|
|
1713
|
+
reviewedAt: includeInternal ? (tx.reviewedAt?.toISOString() ?? null) : null,
|
|
1714
|
+
reviewReason: includeInternal || MANUAL_ADJUSTMENT_TYPES.has(tx.type) ? tx.reviewReason : null,
|
|
838
1715
|
})),
|
|
839
1716
|
total: Number(n),
|
|
840
1717
|
page,
|
|
841
1718
|
limit,
|
|
842
1719
|
};
|
|
843
1720
|
}
|
|
844
|
-
async getOrCreateDepositAddress(userId, currency) {
|
|
845
|
-
|
|
1721
|
+
async getOrCreateDepositAddress(userId, currency, network) {
|
|
1722
|
+
await this.assertDepositable(currency, undefined, network);
|
|
1723
|
+
const existing = await this.findDepositAddress(userId, currency, network);
|
|
846
1724
|
if (existing) {
|
|
847
|
-
return
|
|
1725
|
+
return toDepositAddressResult(existing);
|
|
848
1726
|
}
|
|
849
|
-
|
|
1727
|
+
const { providerName, adapter } = await this.paymentAdapterFor(currency, network ?? null);
|
|
1728
|
+
if (!adapter.issueDepositAddress) {
|
|
850
1729
|
throw new DepositAddressUnsupportedError();
|
|
851
1730
|
}
|
|
852
|
-
const issued = await
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
currency,
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
1731
|
+
const issued = await adapter.issueDepositAddress(userId, currency, network);
|
|
1732
|
+
// Re-gate inside the transaction that writes the row: the catalog pair can be
|
|
1733
|
+
// disabled or deleted while the vendor call is in flight, and this is what makes
|
|
1734
|
+
// deleteWalletAsset's in-use check race-free.
|
|
1735
|
+
const [row] = await this.drizzle.db.transaction(async (txn) => {
|
|
1736
|
+
await this.assertDepositable(currency, undefined, network, txn);
|
|
1737
|
+
return txn
|
|
1738
|
+
.insert(walletDepositAddress)
|
|
1739
|
+
.values({
|
|
1740
|
+
userId,
|
|
1741
|
+
currency,
|
|
1742
|
+
network: network ?? null,
|
|
1743
|
+
address: issued.address,
|
|
1744
|
+
tag: issued.tag ?? null,
|
|
1745
|
+
providerName,
|
|
1746
|
+
})
|
|
1747
|
+
.onConflictDoNothing()
|
|
1748
|
+
.returning();
|
|
1749
|
+
});
|
|
863
1750
|
if (row) {
|
|
864
|
-
return
|
|
1751
|
+
return toDepositAddressResult(row);
|
|
865
1752
|
}
|
|
866
|
-
const winner = await this.findDepositAddress(userId, currency);
|
|
1753
|
+
const winner = await this.findDepositAddress(userId, currency, network);
|
|
867
1754
|
if (!winner) {
|
|
868
|
-
throw new Error(`wallet deposit address: idempotency conflict but no row found (userId=${userId}, currency=${currency})`);
|
|
1755
|
+
throw new Error(`wallet deposit address: idempotency conflict but no row found (userId=${userId}, currency=${currency}, network=${network ?? 'none'})`);
|
|
869
1756
|
}
|
|
870
|
-
return
|
|
1757
|
+
return toDepositAddressResult(winner);
|
|
871
1758
|
}
|
|
872
|
-
|
|
873
|
-
|
|
1759
|
+
/**
|
|
1760
|
+
* `providerName` is the vendor the webhook route already resolved (verifier + adapter
|
|
1761
|
+
* came from the same registry entry) - it is only used to label a finding when this
|
|
1762
|
+
* deposit can't be attributed, never to look anything up. Defaults to the single
|
|
1763
|
+
* default binding for callers (tests, a poller with no named provider) that don't care.
|
|
1764
|
+
*/
|
|
1765
|
+
async creditDepositByAddress(event, providerName = DEFAULT_PAYMENT_PROVIDER) {
|
|
1766
|
+
const depositAddress = await this.findDepositAddressByAddress(event);
|
|
874
1767
|
if (!depositAddress) {
|
|
875
|
-
|
|
1768
|
+
// A known vendor defect hits this live: a token deposit reported under a sibling
|
|
1769
|
+
// token's asset id never resolves to a row. Never let it survive only as a log
|
|
1770
|
+
// line - file a finding so an operator can attribute and manually credit it.
|
|
1771
|
+
logger.warn({ address: event.address, network: event.network, tag: event.tag }, 'payment webhook: no wallet_deposit_address for inbound deposit');
|
|
1772
|
+
await recordReconciliationFinding(this.drizzle.db, {
|
|
1773
|
+
runId: LIVE_WEBHOOK_RUN_ID,
|
|
1774
|
+
providerName,
|
|
1775
|
+
kind: 'unattributed_deposit',
|
|
1776
|
+
currency: event.currency,
|
|
1777
|
+
network: event.network ?? null,
|
|
1778
|
+
amount: event.amount,
|
|
1779
|
+
address: event.address,
|
|
1780
|
+
tag: event.tag ?? null,
|
|
1781
|
+
txHash: event.txHash,
|
|
1782
|
+
externalId: event.externalId,
|
|
1783
|
+
detail: 'no wallet_deposit_address matched this address/network/tag',
|
|
1784
|
+
}, this.audit);
|
|
876
1785
|
return;
|
|
877
1786
|
}
|
|
878
|
-
if (event.
|
|
879
|
-
|
|
1787
|
+
if (event.network === undefined &&
|
|
1788
|
+
event.currency.toUpperCase() !== depositAddress.currency.toUpperCase()) {
|
|
1789
|
+
// Same "do not silently drop" discipline as the no-address branch above - this is
|
|
1790
|
+
// the push-path counterpart to the poll-path's currency_mismatch finding.
|
|
1791
|
+
logger.warn({
|
|
1792
|
+
address: event.address,
|
|
1793
|
+
eventCurrency: event.currency,
|
|
1794
|
+
addressCurrency: depositAddress.currency,
|
|
1795
|
+
}, 'payment webhook: currency mismatch for inbound deposit');
|
|
1796
|
+
await recordReconciliationFinding(this.drizzle.db, {
|
|
1797
|
+
runId: LIVE_WEBHOOK_RUN_ID,
|
|
1798
|
+
providerName: depositAddress.providerName,
|
|
1799
|
+
kind: 'currency_mismatch',
|
|
1800
|
+
currency: event.currency,
|
|
1801
|
+
network: event.network ?? depositAddress.network,
|
|
1802
|
+
amount: event.amount,
|
|
1803
|
+
address: event.address,
|
|
1804
|
+
tag: event.tag ?? null,
|
|
1805
|
+
txHash: event.txHash,
|
|
1806
|
+
externalId: event.externalId,
|
|
1807
|
+
detail: `currency mismatch: event reported ${event.currency}, address issued for ${depositAddress.currency}`,
|
|
1808
|
+
}, this.audit);
|
|
1809
|
+
return;
|
|
880
1810
|
}
|
|
881
1811
|
const { transactionId, replayed } = await this.drizzle.db.transaction(async (txn) => {
|
|
882
1812
|
let [walletRecord] = await txn
|
|
@@ -886,12 +1816,9 @@ export class WalletService {
|
|
|
886
1816
|
if (!walletRecord) {
|
|
887
1817
|
walletRecord = findOneOrThrow(await txn
|
|
888
1818
|
.insert(wallet)
|
|
889
|
-
.values({ userId: depositAddress.userId,
|
|
1819
|
+
.values({ userId: depositAddress.userId, currency: event.currency })
|
|
890
1820
|
.returning(), new WalletNotFoundError(depositAddress.userId));
|
|
891
1821
|
}
|
|
892
|
-
else if (walletRecord.currency.toUpperCase() !== event.currency.toUpperCase()) {
|
|
893
|
-
throw new CurrencyMismatchError(event.currency, walletRecord.currency);
|
|
894
|
-
}
|
|
895
1822
|
const [inserted] = await txn
|
|
896
1823
|
.insert(walletTransaction)
|
|
897
1824
|
.values({
|
|
@@ -900,7 +1827,11 @@ export class WalletService {
|
|
|
900
1827
|
amount: event.amount,
|
|
901
1828
|
currency: event.currency,
|
|
902
1829
|
status: 'completed',
|
|
903
|
-
|
|
1830
|
+
direction: 'credit',
|
|
1831
|
+
rail: this.resolveRail(event.currency),
|
|
1832
|
+
// Prefer the chain the vendor reported; fall back to the one the address was
|
|
1833
|
+
// issued on, which is the only network an address-only webhook can imply.
|
|
1834
|
+
network: event.network ?? depositAddress.network,
|
|
904
1835
|
providerName: depositAddress.providerName,
|
|
905
1836
|
providerRefId: event.externalId,
|
|
906
1837
|
destinationAddress: event.address,
|
|
@@ -909,10 +1840,7 @@ export class WalletService {
|
|
|
909
1840
|
.onConflictDoNothing()
|
|
910
1841
|
.returning();
|
|
911
1842
|
if (inserted) {
|
|
912
|
-
await txn
|
|
913
|
-
.update(wallet)
|
|
914
|
-
.set({ balance: sql `${wallet.balance} + ${event.amount}::numeric` })
|
|
915
|
-
.where(eq(wallet.id, walletRecord.id));
|
|
1843
|
+
await creditWalletBalance(txn, walletRecord.id, event.currency, event.amount);
|
|
916
1844
|
return { transactionId: inserted.id, replayed: false };
|
|
917
1845
|
}
|
|
918
1846
|
const [winner] = await txn
|
|
@@ -927,6 +1855,7 @@ export class WalletService {
|
|
|
927
1855
|
if (!replayed) {
|
|
928
1856
|
this.events.emit('wallet.deposit.completed', {
|
|
929
1857
|
userId: depositAddress.userId,
|
|
1858
|
+
playerId: await this.identityReader.getPlayerIdByUserIdSafe(depositAddress.userId),
|
|
930
1859
|
amount: event.amount,
|
|
931
1860
|
currency: event.currency,
|
|
932
1861
|
transactionId,
|
|
@@ -947,19 +1876,220 @@ export class WalletService {
|
|
|
947
1876
|
.where(and(eq(walletTransaction.walletId, walletId), eq(walletTransaction.idempotencyKey, idempotencyKey)));
|
|
948
1877
|
return existing;
|
|
949
1878
|
}
|
|
950
|
-
async findDepositAddress(userId, currency) {
|
|
1879
|
+
async findDepositAddress(userId, currency, network) {
|
|
951
1880
|
const [row] = await this.drizzle.db
|
|
952
1881
|
.select()
|
|
953
1882
|
.from(walletDepositAddress)
|
|
954
|
-
.where(and(eq(walletDepositAddress.userId, userId), eq(walletDepositAddress.currency, currency)
|
|
1883
|
+
.where(and(eq(walletDepositAddress.userId, userId), eq(walletDepositAddress.currency, currency), network === undefined
|
|
1884
|
+
? isNull(walletDepositAddress.network)
|
|
1885
|
+
: eq(walletDepositAddress.network, network)));
|
|
955
1886
|
return row;
|
|
956
1887
|
}
|
|
957
|
-
async findDepositAddressByAddress(address) {
|
|
958
|
-
const
|
|
1888
|
+
async findDepositAddressByAddress({ address, network, tag, }) {
|
|
1889
|
+
const rows = await this.drizzle.db
|
|
959
1890
|
.select()
|
|
960
1891
|
.from(walletDepositAddress)
|
|
961
|
-
.where(eq(walletDepositAddress.address, address))
|
|
962
|
-
|
|
1892
|
+
.where(and(eq(walletDepositAddress.address, address), tag === undefined ? isNull(walletDepositAddress.tag) : eq(walletDepositAddress.tag, tag), network === undefined
|
|
1893
|
+
? undefined
|
|
1894
|
+
: or(eq(walletDepositAddress.network, network), isNull(walletDepositAddress.network))));
|
|
1895
|
+
const owners = new Set(rows.map((row) => row.userId));
|
|
1896
|
+
if (owners.size > 1) {
|
|
1897
|
+
throw new AmbiguousDepositAddressError(address, network);
|
|
1898
|
+
}
|
|
1899
|
+
return rows.find((row) => row.network === network) ?? rows[0];
|
|
1900
|
+
}
|
|
1901
|
+
/**
|
|
1902
|
+
* The player's own payout address book. Every method here is scoped on `userId` - a
|
|
1903
|
+
* saved address is personal data with no admin read path, so there is
|
|
1904
|
+
* deliberately no variant of these that takes an arbitrary user id.
|
|
1905
|
+
*/
|
|
1906
|
+
async listWithdrawalAddresses(userId, currency) {
|
|
1907
|
+
const rows = await this.drizzle.db
|
|
1908
|
+
.select()
|
|
1909
|
+
.from(walletWithdrawalAddress)
|
|
1910
|
+
.where(and(eq(walletWithdrawalAddress.userId, userId), currency === undefined ? undefined : eq(walletWithdrawalAddress.currency, currency)))
|
|
1911
|
+
.orderBy(desc(walletWithdrawalAddress.createdAt));
|
|
1912
|
+
return rows.map(toWithdrawalAddressDto);
|
|
1913
|
+
}
|
|
1914
|
+
async createWithdrawalAddress(userId, input, meta) {
|
|
1915
|
+
// Shares the wallet mutation budget with deposit/withdraw: the row cap alone does
|
|
1916
|
+
// not bound writes, since deleting frees a slot and lets a client churn forever.
|
|
1917
|
+
await this.rateLimit(userId);
|
|
1918
|
+
// The slot is taken durably BEFORE the vendor call. Whitelisting first let every request
|
|
1919
|
+
// past the cap reach the provider and create a destination there that no local row would
|
|
1920
|
+
// ever describe, because the cap check only ran afterwards. The row is the reservation, and
|
|
1921
|
+
// it is deleted again if the vendor refuses, so a rejected or unreachable provider still
|
|
1922
|
+
// leaves the player no address they would believe they can withdraw to.
|
|
1923
|
+
const reserved = await this.drizzle.db.transaction((txn) => withAdvisoryXactLock(txn, `withdrawal-address-cap:${userId}`, async () => {
|
|
1924
|
+
const [existing] = await txn
|
|
1925
|
+
.select({ total: count() })
|
|
1926
|
+
.from(walletWithdrawalAddress)
|
|
1927
|
+
.where(eq(walletWithdrawalAddress.userId, userId));
|
|
1928
|
+
if ((existing?.total ?? 0) >= WITHDRAWAL_ADDRESS_LIMIT) {
|
|
1929
|
+
throw new WithdrawalAddressLimitReachedError(WITHDRAWAL_ADDRESS_LIMIT);
|
|
1930
|
+
}
|
|
1931
|
+
const [inserted] = await txn
|
|
1932
|
+
.insert(walletWithdrawalAddress)
|
|
1933
|
+
.values({ userId, ...input })
|
|
1934
|
+
.onConflictDoNothing()
|
|
1935
|
+
.returning();
|
|
1936
|
+
if (!inserted) {
|
|
1937
|
+
throw new WithdrawalAddressAlreadyExistsError();
|
|
1938
|
+
}
|
|
1939
|
+
return inserted;
|
|
1940
|
+
}));
|
|
1941
|
+
// The port is required to be idempotent, so releasing and retrying cannot orphan a
|
|
1942
|
+
// destination. A row left behind by a failed release carries no providerWalletId, which
|
|
1943
|
+
// the payout path re-registers rather than trusts - it is never a whitelist bypass.
|
|
1944
|
+
let whitelisted;
|
|
1945
|
+
try {
|
|
1946
|
+
whitelisted = await this.whitelistWithdrawalAddress(userId, input);
|
|
1947
|
+
}
|
|
1948
|
+
catch (err) {
|
|
1949
|
+
await this.releaseWithdrawalAddressSlot(reserved.id);
|
|
1950
|
+
throw err;
|
|
1951
|
+
}
|
|
1952
|
+
const [updated] = Object.keys(whitelisted).length
|
|
1953
|
+
? await this.drizzle.db
|
|
1954
|
+
.update(walletWithdrawalAddress)
|
|
1955
|
+
.set(whitelisted)
|
|
1956
|
+
.where(eq(walletWithdrawalAddress.id, reserved.id))
|
|
1957
|
+
.returning()
|
|
1958
|
+
: [];
|
|
1959
|
+
const row = updated ?? reserved;
|
|
1960
|
+
await this.audit.record({
|
|
1961
|
+
actorId: userId,
|
|
1962
|
+
actorType: 'player',
|
|
1963
|
+
action: 'wallet.withdrawal_address.created',
|
|
1964
|
+
resourceType: 'wallet_withdrawal_address',
|
|
1965
|
+
resourceId: row.id,
|
|
1966
|
+
// The address string is deliberately absent: the audit log is admin-readable and
|
|
1967
|
+
// a player's saved addresses are not. The row id is enough to correlate.
|
|
1968
|
+
after: { label: row.label, currency: row.currency, network: row.network },
|
|
1969
|
+
...meta,
|
|
1970
|
+
});
|
|
1971
|
+
return toWithdrawalAddressDto(row);
|
|
1972
|
+
}
|
|
1973
|
+
/**
|
|
1974
|
+
* Refuses a payout to a destination the provider has not approved. A no-op for an adapter that
|
|
1975
|
+
* does not whitelist, and for a fiat rail, which has no address at all.
|
|
1976
|
+
*
|
|
1977
|
+
* The tag is matched as strictly as the address. On a tag chain one exchange address is shared
|
|
1978
|
+
* by every account behind it, so an address-only check would let a player whitelist their own
|
|
1979
|
+
* account at that exchange and then pay out to a stranger's tag at the same address - an
|
|
1980
|
+
* auto-approved withdrawal would do it with nobody looking.
|
|
1981
|
+
*/
|
|
1982
|
+
async requireWhitelistedWalletId(userId, currency, network, destinationAddress, destinationTag) {
|
|
1983
|
+
if (!this.payment.whitelistWithdrawalAddress || !destinationAddress) {
|
|
1984
|
+
return null;
|
|
1985
|
+
}
|
|
1986
|
+
const walletId = await this.whitelistedWalletId(userId, currency, network, destinationAddress, destinationTag);
|
|
1987
|
+
if (!walletId) {
|
|
1988
|
+
throw new DestinationAddressNotWhitelistedError();
|
|
1989
|
+
}
|
|
1990
|
+
return walletId;
|
|
1991
|
+
}
|
|
1992
|
+
/**
|
|
1993
|
+
* The approved destination saved for this (address, tag) pair, or null. Matched on the pair
|
|
1994
|
+
* itself rather than an id on the transaction, because a withdrawal is requested by address
|
|
1995
|
+
* and may name one the player never saved. An absent tag matches only a row saved without
|
|
1996
|
+
* one: a tagged payout against an untagged whitelist row is a different beneficiary.
|
|
1997
|
+
*/
|
|
1998
|
+
async whitelistedWalletId(userId, currency, network, address, destinationTag) {
|
|
1999
|
+
if (!this.payment.whitelistWithdrawalAddress || !address) {
|
|
2000
|
+
return null;
|
|
2001
|
+
}
|
|
2002
|
+
const providerName = await this.providerNameFor(currency, network);
|
|
2003
|
+
const [row] = await this.drizzle.db
|
|
2004
|
+
.select({
|
|
2005
|
+
id: walletWithdrawalAddress.id,
|
|
2006
|
+
network: walletWithdrawalAddress.network,
|
|
2007
|
+
destinationTag: walletWithdrawalAddress.destinationTag,
|
|
2008
|
+
providerName: walletWithdrawalAddress.providerName,
|
|
2009
|
+
providerWalletId: walletWithdrawalAddress.providerWalletId,
|
|
2010
|
+
})
|
|
2011
|
+
.from(walletWithdrawalAddress)
|
|
2012
|
+
.where(and(eq(walletWithdrawalAddress.userId, userId), eq(walletWithdrawalAddress.currency, currency), eq(walletWithdrawalAddress.address, address), destinationTag
|
|
2013
|
+
? eq(walletWithdrawalAddress.destinationTag, destinationTag)
|
|
2014
|
+
: isNull(walletWithdrawalAddress.destinationTag), ...(network ? [eq(walletWithdrawalAddress.network, network)] : [])))
|
|
2015
|
+
.limit(1);
|
|
2016
|
+
if (!row) {
|
|
2017
|
+
return null;
|
|
2018
|
+
}
|
|
2019
|
+
// An id minted by a different provider names nothing in the current one, and a row
|
|
2020
|
+
// saved while no whitelisting adapter was bound has no id at all. Both re-register
|
|
2021
|
+
// with the provider that will actually settle, rather than failing a payout on a
|
|
2022
|
+
// saved address the player cannot fix themselves.
|
|
2023
|
+
if (row.providerWalletId && row.providerName === providerName) {
|
|
2024
|
+
return row.providerWalletId;
|
|
2025
|
+
}
|
|
2026
|
+
const { providerWalletId } = await this.payment.whitelistWithdrawalAddress({
|
|
2027
|
+
userId,
|
|
2028
|
+
currency,
|
|
2029
|
+
network: row.network,
|
|
2030
|
+
address,
|
|
2031
|
+
...(row.destinationTag ? { destinationTag: row.destinationTag } : {}),
|
|
2032
|
+
});
|
|
2033
|
+
await this.drizzle.db
|
|
2034
|
+
.update(walletWithdrawalAddress)
|
|
2035
|
+
.set({ providerName, providerWalletId })
|
|
2036
|
+
.where(eq(walletWithdrawalAddress.id, row.id));
|
|
2037
|
+
return providerWalletId;
|
|
2038
|
+
}
|
|
2039
|
+
/** Frees a reserved slot the vendor refused. Idempotent: a row already gone is a no-op. */
|
|
2040
|
+
async releaseWithdrawalAddressSlot(id) {
|
|
2041
|
+
try {
|
|
2042
|
+
await this.drizzle.db
|
|
2043
|
+
.delete(walletWithdrawalAddress)
|
|
2044
|
+
.where(eq(walletWithdrawalAddress.id, id));
|
|
2045
|
+
}
|
|
2046
|
+
catch (err) {
|
|
2047
|
+
logger.error({ err, withdrawalAddressId: id }, 'withdrawal address slot release failed');
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
/**
|
|
2051
|
+
* Delegates to the bound payment adapter when it whitelists destinations, and returns nothing
|
|
2052
|
+
* to store when it does not. A vendor failure propagates rather than being swallowed: saving
|
|
2053
|
+
* the address anyway would produce a row that looks usable and fails only once the player has
|
|
2054
|
+
* committed to a payout.
|
|
2055
|
+
*/
|
|
2056
|
+
async whitelistWithdrawalAddress(userId, input) {
|
|
2057
|
+
if (!this.payment.whitelistWithdrawalAddress) {
|
|
2058
|
+
return {};
|
|
2059
|
+
}
|
|
2060
|
+
const { providerWalletId } = await this.payment.whitelistWithdrawalAddress({
|
|
2061
|
+
userId,
|
|
2062
|
+
currency: input.currency,
|
|
2063
|
+
network: input.network,
|
|
2064
|
+
address: input.address,
|
|
2065
|
+
...(input.destinationTag ? { destinationTag: input.destinationTag } : {}),
|
|
2066
|
+
});
|
|
2067
|
+
return {
|
|
2068
|
+
providerName: await this.providerNameFor(input.currency, input.network),
|
|
2069
|
+
providerWalletId,
|
|
2070
|
+
};
|
|
2071
|
+
}
|
|
2072
|
+
/** False when the row does not exist OR belongs to someone else - the caller cannot
|
|
2073
|
+
* tell the two apart, which is what stops the id space being probed. */
|
|
2074
|
+
async deleteWithdrawalAddress(userId, id, meta) {
|
|
2075
|
+
await this.rateLimit(userId);
|
|
2076
|
+
const [row] = await this.drizzle.db
|
|
2077
|
+
.delete(walletWithdrawalAddress)
|
|
2078
|
+
.where(and(eq(walletWithdrawalAddress.id, id), eq(walletWithdrawalAddress.userId, userId)))
|
|
2079
|
+
.returning();
|
|
2080
|
+
if (!row) {
|
|
2081
|
+
return false;
|
|
2082
|
+
}
|
|
2083
|
+
await this.audit.record({
|
|
2084
|
+
actorId: userId,
|
|
2085
|
+
actorType: 'player',
|
|
2086
|
+
action: 'wallet.withdrawal_address.deleted',
|
|
2087
|
+
resourceType: 'wallet_withdrawal_address',
|
|
2088
|
+
resourceId: row.id,
|
|
2089
|
+
before: { label: row.label, currency: row.currency, network: row.network },
|
|
2090
|
+
...meta,
|
|
2091
|
+
});
|
|
2092
|
+
return true;
|
|
963
2093
|
}
|
|
964
2094
|
}
|
|
965
2095
|
//# sourceMappingURL=wallet.service.js.map
|