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