@openora/core 0.4.1-canary.92 → 0.4.1-canary.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/contract/index.d.ts +12 -0
  3. package/dist/admin-console/contract/index.d.ts.map +1 -1
  4. package/dist/admin-console/plugin.d.ts +18 -1
  5. package/dist/admin-console/plugin.d.ts.map +1 -1
  6. package/dist/admin-console/router/index.d.ts +6 -0
  7. package/dist/admin-console/router/index.d.ts.map +1 -1
  8. package/dist/analytics/plugin.d.ts +18 -1
  9. package/dist/analytics/plugin.d.ts.map +1 -1
  10. package/dist/audit/plugin.d.ts +18 -1
  11. package/dist/audit/plugin.d.ts.map +1 -1
  12. package/dist/casino/gaming/plugin.d.ts +18 -1
  13. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  14. package/dist/casino/lobby/plugin.d.ts +18 -1
  15. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  16. package/dist/cms/plugin.d.ts +18 -1
  17. package/dist/cms/plugin.d.ts.map +1 -1
  18. package/dist/compliance/plugin.d.ts +18 -1
  19. package/dist/compliance/plugin.d.ts.map +1 -1
  20. package/dist/contracts/adapters/audit.d.ts +1 -1
  21. package/dist/contracts/adapters/audit.d.ts.map +1 -1
  22. package/dist/contracts/adapters/audit.js.map +1 -1
  23. package/dist/contracts/adapters/index.d.ts +4 -2
  24. package/dist/contracts/adapters/index.d.ts.map +1 -1
  25. package/dist/contracts/adapters/index.js +2 -1
  26. package/dist/contracts/adapters/index.js.map +1 -1
  27. package/dist/contracts/adapters/payment.d.ts +99 -0
  28. package/dist/contracts/adapters/payment.d.ts.map +1 -1
  29. package/dist/contracts/adapters/payment.js +6 -0
  30. package/dist/contracts/adapters/payment.js.map +1 -1
  31. package/dist/contracts/adapters/rate-limit.d.ts +1 -0
  32. package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
  33. package/dist/contracts/adapters/rate-limit.js +1 -0
  34. package/dist/contracts/adapters/rate-limit.js.map +1 -1
  35. package/dist/contracts/adapters/wallet-asset-catalog.d.ts +34 -0
  36. package/dist/contracts/adapters/wallet-asset-catalog.d.ts.map +1 -0
  37. package/dist/contracts/adapters/wallet-asset-catalog.js +3 -0
  38. package/dist/contracts/adapters/wallet-asset-catalog.js.map +1 -0
  39. package/dist/contracts/schemas/__tests__/common-schemas.test.js +2 -1
  40. package/dist/contracts/schemas/__tests__/common-schemas.test.js.map +1 -1
  41. package/dist/contracts/schemas/common.d.ts.map +1 -1
  42. package/dist/contracts/schemas/common.js +7 -4
  43. package/dist/contracts/schemas/common.js.map +1 -1
  44. package/dist/contracts/schemas/events.d.ts +15 -0
  45. package/dist/contracts/schemas/events.d.ts.map +1 -1
  46. package/dist/contracts/schemas/events.js +16 -2
  47. package/dist/contracts/schemas/events.js.map +1 -1
  48. package/dist/contracts/schemas/platform-config.d.ts +45 -0
  49. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  50. package/dist/contracts/schemas/platform-config.js +47 -0
  51. package/dist/contracts/schemas/platform-config.js.map +1 -1
  52. package/dist/contracts/schemas/wallet-tx.d.ts +38 -1
  53. package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
  54. package/dist/contracts/schemas/wallet-tx.js +32 -3
  55. package/dist/contracts/schemas/wallet-tx.js.map +1 -1
  56. package/dist/engagement/chat/plugin.d.ts +18 -1
  57. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  58. package/dist/engagement/chat-commands/plugin.d.ts +18 -1
  59. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -1
  60. package/dist/engagement/notifications/plugin.d.ts +18 -1
  61. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  62. package/dist/engagement/social/plugin.d.ts +18 -1
  63. package/dist/engagement/social/plugin.d.ts.map +1 -1
  64. package/dist/engagement/social-transfers/plugin.d.ts +18 -1
  65. package/dist/engagement/social-transfers/plugin.d.ts.map +1 -1
  66. package/dist/iam/plugin.d.ts +18 -1
  67. package/dist/iam/plugin.d.ts.map +1 -1
  68. package/dist/iam/service/iam.service.d.ts +1 -1
  69. package/dist/pam/identity/plugin.d.ts +18 -1
  70. package/dist/pam/identity/plugin.d.ts.map +1 -1
  71. package/dist/pam/player-management/plugin.d.ts +18 -1
  72. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  73. package/dist/pam/player-note/plugin.d.ts +18 -1
  74. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  75. package/dist/pam/profile/plugin.d.ts +18 -1
  76. package/dist/pam/profile/plugin.d.ts.map +1 -1
  77. package/dist/pam/tag/plugin.d.ts +18 -1
  78. package/dist/pam/tag/plugin.d.ts.map +1 -1
  79. package/dist/server/auth/permissions.d.ts +36 -0
  80. package/dist/server/auth/permissions.d.ts.map +1 -1
  81. package/dist/server/auth/permissions.js +6 -0
  82. package/dist/server/auth/permissions.js.map +1 -1
  83. package/dist/server/db/__tests__/query-helpers.test.js +38 -1
  84. package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
  85. package/dist/server/db/index.d.ts +1 -1
  86. package/dist/server/db/index.d.ts.map +1 -1
  87. package/dist/server/db/index.js +1 -1
  88. package/dist/server/db/index.js.map +1 -1
  89. package/dist/server/db/query-helpers.d.ts +4 -0
  90. package/dist/server/db/query-helpers.d.ts.map +1 -1
  91. package/dist/server/db/query-helpers.js +31 -0
  92. package/dist/server/db/query-helpers.js.map +1 -1
  93. package/dist/server/runtime/core-token-catalog.d.ts +18 -1
  94. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -1
  95. package/dist/server/runtime/core-token-catalog.js +3 -1
  96. package/dist/server/runtime/core-token-catalog.js.map +1 -1
  97. package/dist/testing/mock.d.ts +12 -1
  98. package/dist/testing/mock.d.ts.map +1 -1
  99. package/dist/testing/mock.js +16 -0
  100. package/dist/testing/mock.js.map +1 -1
  101. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
  102. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
  103. package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
  104. package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
  105. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
  106. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
  107. package/dist/wallet/__tests__/custody-sweep.service.int.test.js +246 -0
  108. package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
  109. package/dist/wallet/__tests__/settlement-network.test.d.ts +2 -0
  110. package/dist/wallet/__tests__/settlement-network.test.d.ts.map +1 -0
  111. package/dist/wallet/__tests__/settlement-network.test.js +54 -0
  112. package/dist/wallet/__tests__/settlement-network.test.js.map +1 -0
  113. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts +2 -0
  114. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts.map +1 -0
  115. package/dist/wallet/__tests__/wallet-asset.router.int.test.js +239 -0
  116. package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -0
  117. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +5 -3
  118. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -1
  119. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +4 -2
  120. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -1
  121. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +6 -3
  122. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -1
  123. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.d.ts +2 -0
  124. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.d.ts.map +1 -0
  125. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.js +91 -0
  126. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.js.map +1 -0
  127. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js +2 -1
  128. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js.map +1 -1
  129. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +125 -4
  130. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -1
  131. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js +2 -1
  132. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js.map +1 -1
  133. package/dist/wallet/__tests__/wallet.router.int.test.js +28 -3
  134. package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -1
  135. package/dist/wallet/__tests__/wallet.service.int.test.js +265 -12
  136. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -1
  137. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts +14 -0
  138. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts.map +1 -0
  139. package/dist/wallet/adapters/wallet-asset-catalog.service.js +37 -0
  140. package/dist/wallet/adapters/wallet-asset-catalog.service.js.map +1 -0
  141. package/dist/wallet/admin-reporting.d.ts +2 -2
  142. package/dist/wallet/contract/index.d.ts +428 -4
  143. package/dist/wallet/contract/index.d.ts.map +1 -1
  144. package/dist/wallet/contract/index.js +203 -5
  145. package/dist/wallet/contract/index.js.map +1 -1
  146. package/dist/wallet/drizzle/migrations/0010_worthless_quasimodo.sql +84 -0
  147. package/dist/wallet/drizzle/migrations/meta/0010_snapshot.json +1565 -0
  148. package/dist/wallet/drizzle/migrations/meta/_journal.json +7 -0
  149. package/dist/wallet/plugin.d.ts +18 -1
  150. package/dist/wallet/plugin.d.ts.map +1 -1
  151. package/dist/wallet/plugin.js +72 -14
  152. package/dist/wallet/plugin.js.map +1 -1
  153. package/dist/wallet/router/index.d.ts +249 -3
  154. package/dist/wallet/router/index.d.ts.map +1 -1
  155. package/dist/wallet/router/index.js +130 -20
  156. package/dist/wallet/router/index.js.map +1 -1
  157. package/dist/wallet/schema/index.d.ts +984 -3
  158. package/dist/wallet/schema/index.d.ts.map +1 -1
  159. package/dist/wallet/schema/index.js +141 -2
  160. package/dist/wallet/schema/index.js.map +1 -1
  161. package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
  162. package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
  163. package/dist/wallet/service/custody-sweep.service.js +357 -0
  164. package/dist/wallet/service/custody-sweep.service.js.map +1 -0
  165. package/dist/wallet/service/wallet.service.d.ts +70 -6
  166. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  167. package/dist/wallet/service/wallet.service.js +379 -16
  168. package/dist/wallet/service/wallet.service.js.map +1 -1
  169. package/package.json +1 -1
@@ -0,0 +1,357 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import * as z from 'zod';
3
+ import { moneyCompare, moneyScaleBy, mapConcurrent, createLogger, } from '@openora/core/server';
4
+ import { queue, UuidSchema, } from '@openora/core/contracts';
5
+ import { and, eq, inArray, isNotNull, isNull } from 'drizzle-orm';
6
+ import { walletAsset, walletCustodySweep, walletJobRun, walletReconciliationFinding, } from '../schema/index.js';
7
+ const logger = createLogger('wallet-custody-sweep');
8
+ export const CUSTODY_SWEEP_JOB_NAME = 'wallet-custody-sweep';
9
+ export const CUSTODY_SWEEP_QUEUE = queue('wallet.custody-sweep');
10
+ // `runId` is only present when an admin's on-demand POST /wallet/custody/sweep/run
11
+ // enqueued this tick - the router mints it up front so it can hand the caller back a
12
+ // runId synchronously, before the job actually runs. A cron tick omits it and the
13
+ // service mints its own.
14
+ export const CustodySweepJobPayloadSchema = z.object({ runId: UuidSchema.optional() });
15
+ const IN_FLIGHT_STATUSES = ['pending', 'processing', 'unknown'];
16
+ /**
17
+ * Pure gate over a single custody balance, in the exact order
18
+ * docs/adapters/payment.md diagram D3 specifies: dust floor, then the fee-multiple
19
+ * floor, then the fee ceiling (overridden only when the pool is running dry).
20
+ *
21
+ * `poolBalance` is null whenever the caller hasn't fetched it (no ceiling breach yet,
22
+ * the adapter has no `getPoolBalance`, or the asset has no `poolLiquidityFloor`) - null
23
+ * always means "the ceiling stays absolute", never an accidental override.
24
+ */
25
+ export function gateSweepBalance(args) {
26
+ if (moneyCompare(args.amount, args.minDeposit) < 0) {
27
+ return 'dust';
28
+ }
29
+ const feeFloor = moneyScaleBy(args.estimatedFee, args.feeMultiple);
30
+ if (moneyCompare(args.amount, feeFloor) < 0) {
31
+ return 'fee';
32
+ }
33
+ if (args.sweepFeeCeiling !== null && moneyCompare(args.estimatedFee, args.sweepFeeCeiling) > 0) {
34
+ const poolBelowFloor = args.poolLiquidityFloor !== null &&
35
+ args.poolBalance !== null &&
36
+ moneyCompare(args.poolBalance, args.poolLiquidityFloor) < 0;
37
+ if (!poolBelowFloor) {
38
+ return 'ceiling';
39
+ }
40
+ }
41
+ return 'sweep';
42
+ }
43
+ /**
44
+ * Owns the custody sweep cron: moves vendor-side per-player custody balances into the
45
+ * pooled account they're paid out of. Deliberately separate from WalletService (which
46
+ * is already ~2000 lines) and deliberately never touches wallet_balance/wallet_transaction
47
+ * - the player was credited at deposit time, this only moves the vendor's own money
48
+ * between its own containers. See docs/adapters/payment.md, "Custody: pooling, sweeping
49
+ * and reconciliation".
50
+ */
51
+ export class CustodySweepService {
52
+ drizzle;
53
+ paymentProviders;
54
+ audit;
55
+ platformConfig;
56
+ constructor({ drizzle, paymentProviders, audit, platformConfig }) {
57
+ this.drizzle = drizzle;
58
+ this.paymentProviders = paymentProviders;
59
+ this.audit = audit;
60
+ this.platformConfig = platformConfig;
61
+ }
62
+ /**
63
+ * Runs one sweep cycle. No-ops (returns null, touches nothing) when
64
+ * `platformConfig.wallet.sweep` is absent - an operator who hasn't configured sweep
65
+ * policy still gets a scheduled job, it just never claims a run. Also returns null
66
+ * when another cycle already owns the claim.
67
+ */
68
+ async runCycle(requestedRunId) {
69
+ const sweepConfig = this.platformConfig?.wallet?.sweep;
70
+ if (!sweepConfig) {
71
+ return null;
72
+ }
73
+ const claim = await this.claimRun(requestedRunId, sweepConfig.staleRunAfterMinutes);
74
+ if (!claim) {
75
+ return null;
76
+ }
77
+ const { runId, jobRunId } = claim;
78
+ const summary = {
79
+ considered: 0,
80
+ swept: 0,
81
+ skippedDust: 0,
82
+ skippedFee: 0,
83
+ skippedCeiling: 0,
84
+ inFlight: 0,
85
+ failed: 0,
86
+ unknown: 0,
87
+ };
88
+ // Everything past the claim runs guarded: an adapter that throws (a vendor 5xx is
89
+ // the ordinary case) would otherwise leave this run's row with finishedAt NULL, and
90
+ // the partial unique index would then block every subsequent cycle until the
91
+ // staleness takeover window elapsed. A failed cycle must free its own slot.
92
+ try {
93
+ await this.resolveInFlightSweeps(sweepConfig.concurrency);
94
+ const poolBalanceCache = new Map();
95
+ for (const providerName of this.paymentProviders.names()) {
96
+ const adapter = this.paymentProviders.get(providerName)?.adapter;
97
+ // sweepToPool is checked here, not after a claim row exists: an adapter that
98
+ // advertises listSweepableBalances without it would otherwise claim a container,
99
+ // throw, and park an `unknown` row that holds the in-flight guard forever.
100
+ if (!adapter?.listSweepableBalances) {
101
+ continue;
102
+ }
103
+ if (!adapter.sweepToPool) {
104
+ logger.error({ providerName }, 'provider lists sweepable balances but cannot sweep them; skipping');
105
+ continue;
106
+ }
107
+ // listSweepableBalances is unbounded; sweeping is throughput work, so the cron
108
+ // cadence drains the backlog rather than one cycle chasing it all.
109
+ const balances = (await adapter.listSweepableBalances()).slice(0, sweepConfig.batchSize);
110
+ summary.considered += balances.length;
111
+ await mapConcurrent(balances, sweepConfig.concurrency, (balance) => this.processBalance({
112
+ providerName,
113
+ adapter,
114
+ balance,
115
+ runId,
116
+ sweepConfig,
117
+ summary,
118
+ poolBalanceCache,
119
+ }));
120
+ }
121
+ }
122
+ catch (err) {
123
+ await this.finishRun(jobRunId, runId, summary, 'failed', err);
124
+ throw err;
125
+ }
126
+ await this.finishRun(jobRunId, runId, summary);
127
+ return { runId, summary };
128
+ }
129
+ // The insert IS the claim: the partial unique index on wallet_job_run(job_name) WHERE
130
+ // finished_at IS NULL means a conflicting insert can only mean another cycle already
131
+ // owns it. A run whose startedAt outlives `staleAfterMinutes` is presumed crashed and
132
+ // taken over: marked abandoned, then re-claimed inside the same transaction.
133
+ async claimRun(requestedRunId, staleAfterMinutes) {
134
+ const runId = requestedRunId ?? randomUUID();
135
+ return this.drizzle.db.transaction(async (txn) => {
136
+ const [inserted] = await txn
137
+ .insert(walletJobRun)
138
+ .values({ jobName: CUSTODY_SWEEP_JOB_NAME, runId })
139
+ .onConflictDoNothing()
140
+ .returning();
141
+ if (inserted) {
142
+ return { runId, jobRunId: inserted.id };
143
+ }
144
+ const [existing] = await txn
145
+ .select()
146
+ .from(walletJobRun)
147
+ .where(and(eq(walletJobRun.jobName, CUSTODY_SWEEP_JOB_NAME), isNull(walletJobRun.finishedAt)))
148
+ .for('update');
149
+ if (!existing) {
150
+ // The owning run finished between our failed insert and this read - let the
151
+ // next tick claim cleanly instead of racing a second insert here.
152
+ return null;
153
+ }
154
+ const staleMs = staleAfterMinutes * 60_000;
155
+ if (Date.now() - existing.startedAt.getTime() < staleMs) {
156
+ return null;
157
+ }
158
+ await txn
159
+ .update(walletJobRun)
160
+ .set({ status: 'abandoned', finishedAt: new Date() })
161
+ .where(eq(walletJobRun.id, existing.id));
162
+ const [takenOver] = await txn
163
+ .insert(walletJobRun)
164
+ .values({ jobName: CUSTODY_SWEEP_JOB_NAME, runId })
165
+ .returning();
166
+ if (!takenOver) {
167
+ throw new Error('wallet-custody-sweep: failed to claim run after abandoning a stale one');
168
+ }
169
+ return { runId, jobRunId: takenOver.id };
170
+ });
171
+ }
172
+ // Reusing getWithdrawalStatus for a sweep is deliberate: its {status, txHash} shape
173
+ // is generic to any vendor transaction (a withdrawal or a sweep), and a sweep's
174
+ // externalId is exactly the reference such a lookup needs.
175
+ async resolveInFlightSweeps(concurrency) {
176
+ const rows = await this.drizzle.db
177
+ .select()
178
+ .from(walletCustodySweep)
179
+ .where(and(inArray(walletCustodySweep.status, IN_FLIGHT_STATUSES), isNotNull(walletCustodySweep.externalId)));
180
+ await mapConcurrent(rows, concurrency, async (row) => {
181
+ const adapter = this.paymentProviders.get(row.providerName)?.adapter;
182
+ if (!adapter?.getWithdrawalStatus || !row.externalId) {
183
+ return;
184
+ }
185
+ const result = await adapter.getWithdrawalStatus(row.externalId);
186
+ if (!result || result.status === 'processing') {
187
+ return;
188
+ }
189
+ await this.drizzle.db
190
+ .update(walletCustodySweep)
191
+ .set({ status: result.status, txHash: result.txHash ?? row.txHash })
192
+ .where(eq(walletCustodySweep.id, row.id));
193
+ });
194
+ }
195
+ async assetFor(currency, network) {
196
+ const [row] = await this.drizzle.db
197
+ .select()
198
+ .from(walletAsset)
199
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
200
+ return row ?? null;
201
+ }
202
+ async hasInFlightSweep(userId, currency, network) {
203
+ const [row] = await this.drizzle.db
204
+ .select({ id: walletCustodySweep.id })
205
+ .from(walletCustodySweep)
206
+ .where(and(eq(walletCustodySweep.userId, userId), eq(walletCustodySweep.currency, currency), eq(walletCustodySweep.network, network), inArray(walletCustodySweep.status, IN_FLIGHT_STATUSES)));
207
+ return row !== undefined;
208
+ }
209
+ async getPoolBalanceCached(cache, adapter, currency, network) {
210
+ if (!adapter.getPoolBalance) {
211
+ return null;
212
+ }
213
+ const key = `${currency}:${network}`;
214
+ const cached = cache.get(key);
215
+ if (cached !== undefined) {
216
+ return cached;
217
+ }
218
+ const balance = await adapter.getPoolBalance(currency, network);
219
+ cache.set(key, balance);
220
+ return balance;
221
+ }
222
+ async processBalance({ providerName, adapter, balance, runId, sweepConfig, summary, poolBalanceCache, }) {
223
+ const asset = await this.assetFor(balance.currency, balance.network);
224
+ if (!asset) {
225
+ // Funds sitting in a container the operator has no policy for must be visible,
226
+ // not a log line.
227
+ await this.drizzle.db
228
+ .insert(walletReconciliationFinding)
229
+ .values({
230
+ runId,
231
+ providerName,
232
+ kind: 'unconfigured_asset',
233
+ currency: balance.currency,
234
+ network: balance.network,
235
+ amount: balance.amount,
236
+ // The dedup key for the partial unique index on (kind, externalId). This
237
+ // finding has no vendor reference, and the condition recurs every single
238
+ // cycle until an operator configures the asset - without a stable stand-in
239
+ // one missing catalog row files a finding every cron tick, drowning the real
240
+ // findings and pinning the alert threshold permanently over the line. The
241
+ // asset, not the player, is the subject: one row to act on, not one per
242
+ // affected container.
243
+ externalId: `unconfigured:${providerName}:${balance.currency}:${balance.network}`,
244
+ detail: `no wallet_asset configured for ${balance.currency}/${balance.network}`,
245
+ })
246
+ .onConflictDoNothing();
247
+ return;
248
+ }
249
+ const gateArgs = {
250
+ amount: balance.amount,
251
+ estimatedFee: balance.estimatedFee,
252
+ minDeposit: asset.minDeposit,
253
+ feeMultiple: sweepConfig.feeMultiple,
254
+ sweepFeeCeiling: asset.sweepFeeCeiling,
255
+ poolLiquidityFloor: asset.poolLiquidityFloor,
256
+ };
257
+ let decision = gateSweepBalance({ ...gateArgs, poolBalance: null });
258
+ // Only fetch the pool balance when the ceiling actually blocks - it's an extra
259
+ // vendor call, not a free one.
260
+ if (decision === 'ceiling' && asset.poolLiquidityFloor) {
261
+ const poolBalance = await this.getPoolBalanceCached(poolBalanceCache, adapter, balance.currency, balance.network);
262
+ decision = gateSweepBalance({ ...gateArgs, poolBalance });
263
+ }
264
+ if (decision === 'dust') {
265
+ summary.skippedDust += 1;
266
+ return;
267
+ }
268
+ if (decision === 'fee') {
269
+ summary.skippedFee += 1;
270
+ return;
271
+ }
272
+ if (decision === 'ceiling') {
273
+ summary.skippedCeiling += 1;
274
+ return;
275
+ }
276
+ if (await this.hasInFlightSweep(balance.userId, balance.currency, balance.network)) {
277
+ summary.inFlight += 1;
278
+ return;
279
+ }
280
+ const [claimed] = await this.drizzle.db
281
+ .insert(walletCustodySweep)
282
+ .values({
283
+ userId: balance.userId,
284
+ providerName,
285
+ currency: balance.currency,
286
+ network: balance.network,
287
+ amount: balance.amount,
288
+ estimatedFee: balance.estimatedFee,
289
+ status: 'pending',
290
+ runId,
291
+ })
292
+ .onConflictDoNothing()
293
+ .returning();
294
+ if (!claimed) {
295
+ // Another cycle claimed this (userId, currency, network) between the check above
296
+ // and this insert - the partial unique index is the real guard, this is a race.
297
+ summary.inFlight += 1;
298
+ return;
299
+ }
300
+ // Deliberately outside any transaction - sweepToPool is a real vendor call
301
+ // (docs/standards/money.md: treat external payment calls as non-transactional).
302
+ // The claim row above already holds the durable guard.
303
+ try {
304
+ const result = await adapter.sweepToPool?.(balance, { idempotencyKey: claimed.id });
305
+ if (!result) {
306
+ throw new Error(`provider "${providerName}" advertised listSweepableBalances but has no sweepToPool`);
307
+ }
308
+ await this.drizzle.db
309
+ .update(walletCustodySweep)
310
+ // poolRef records WHICH pool received the funds, not just that a transfer
311
+ // happened. Player funds must stay separate from operator funds, and that is
312
+ // the question a regulator asks; without it the ledger cannot answer it.
313
+ .set({
314
+ status: 'processing',
315
+ externalId: result.externalId,
316
+ poolRef: result.poolRef ?? null,
317
+ })
318
+ .where(eq(walletCustodySweep.id, claimed.id));
319
+ summary.swept += 1;
320
+ }
321
+ catch (err) {
322
+ // A thrown sweepToPool cannot distinguish "the vendor never saw it" from "the
323
+ // vendor accepted it and the response was lost" - moving to `failed` on the
324
+ // second case would let the next cycle sweep the same container again and
325
+ // double-transfer real custody funds. `unknown` keeps the in-flight guard held
326
+ // (see IN_FLIGHT_STATUSES) until reconciliation or an operator resolves it.
327
+ logger.warn({ err, sweepId: claimed.id }, 'sweepToPool threw; parking sweep as unknown');
328
+ await this.drizzle.db
329
+ .update(walletCustodySweep)
330
+ .set({ status: 'unknown' })
331
+ .where(eq(walletCustodySweep.id, claimed.id));
332
+ summary.unknown += 1;
333
+ }
334
+ }
335
+ async finishRun(jobRunId, runId, summary, status = 'completed', err) {
336
+ const error = err === undefined ? {} : { error: err instanceof Error ? err.message : String(err) };
337
+ await this.drizzle.db.transaction(async (txn) => {
338
+ await txn
339
+ .update(walletJobRun)
340
+ .set({ finishedAt: new Date(), status, summary: { ...summary, ...error } })
341
+ .where(eq(walletJobRun.id, jobRunId));
342
+ // One entry for the whole cycle, never one per swept balance -
343
+ // AuditService.recordInTransaction takes a single global advisory lock (the audit
344
+ // log is a hash chain), so one row per container at thousands of containers would
345
+ // serialize the entire platform's audit stream behind this job. wallet_custody_sweep
346
+ // rows are the per-move record; this is the cycle record, joined on runId.
347
+ await this.audit.recordInTransaction(txn, {
348
+ actorType: 'system',
349
+ action: 'wallet.custody.sweep_cycle',
350
+ resourceType: 'wallet_job_run',
351
+ resourceId: runId,
352
+ after: { runId, status, ...summary, ...error },
353
+ });
354
+ });
355
+ }
356
+ }
357
+ //# sourceMappingURL=custody-sweep.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-sweep.service.js","sourceRoot":"","sources":["../../../src/wallet/service/custody-sweep.service.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,53 @@
1
1
  import { type EventBus, type DrizzleDb, DrizzleService } from '@openora/core/server';
2
- import { type PaymentAdapter, type PaymentWebhookEvent, type AdminUserDirectory, type PlatformConfig, type RateLimiterAdapter, type RateLimitKey, type WalletRail, type PlayerTags, type AuditWritePort, type TagEvaluationCommands, type TagKey, type User, type IdentityReader, type ClientMeta, type PaginationOptions } from '@openora/core/contracts';
2
+ import { type PaymentAdapter, type PaymentProviderRegistry, type PaymentWebhookEvent, type AdminUserDirectory, type PlatformConfig, type RateLimiterAdapter, type RateLimitKey, type WalletRail, type PlayerTags, type AuditWritePort, type TagEvaluationCommands, type TagKey, type User, type IdentityReader, type ClientMeta, type PaginationOptions } from '@openora/core/contracts';
3
3
  import { type Wallet, type WalletTransaction } from '../schema/index.js';
4
- import type { TransactionResult, WithdrawalQueueFilter, AutoWithdrawalRule, WalletAutoWithdrawalConfig, WalletTransactionSortBy } from '../contract/index.js';
4
+ import type { TransactionResult, WithdrawalQueueFilter, AutoWithdrawalRule, WalletAutoWithdrawalConfig, WalletTransactionSortBy, WalletAsset, PublicWalletAsset, CreateWalletAssetInput, UpdateWalletAssetInput, ManualAdjustmentDirection } from '../contract/index.js';
5
5
  export declare const WalletNotFoundError: new (id: string) => Error;
6
6
  export declare const WithdrawalNotFoundError: new (id: string) => Error;
7
7
  export declare const AutoWithdrawalConfigNotFoundError: new (id: string) => Error;
8
+ export declare const PlayerNotFoundError: new (id: string) => Error;
8
9
  export declare const InsufficientBalanceError: new (available: string, requested: string) => Error;
9
10
  export declare const WithdrawalNotPendingError: new () => Error;
10
11
  export declare const KycRequiredError: new () => Error;
11
12
  export declare const IdempotencyKeyReuseError: new () => Error;
12
13
  export declare const DepositAddressUnsupportedError: new () => Error;
13
14
  export declare const DestinationAddressRequiredError: new () => Error;
15
+ export declare const WalletAssetNotFoundError: new (id: string) => Error;
16
+ export declare const WalletAssetAlreadyExistsError: new () => Error;
17
+ export declare const WalletAssetUnsupportedError: new () => Error;
18
+ export declare const WalletAssetInUseError: new () => Error;
19
+ export declare const WalletAssetUnknownProviderError: new () => Error;
20
+ export declare const WalletAssetHasInFlightTransactionsError: new () => Error;
21
+ export declare const AmbiguousNetworkError: new (currency: unknown, networks: unknown) => Error;
22
+ export declare const UnsupportedNetworkError: new (currency: unknown, network: unknown) => Error;
23
+ export declare const WithdrawalDisabledError: new (currency: unknown) => Error;
24
+ export declare const BelowMinimumWithdrawalError: new (amount: unknown, minimum: unknown, currency: unknown, network: unknown) => Error;
14
25
  export declare const CurrencyMismatchError: new (requested: unknown, walletCurrency: unknown) => Error;
15
26
  export declare const AmbiguousDepositAddressError: new (address: unknown, network: unknown) => Error;
27
+ /** The catalog fields a payout decision needs - a structural subset of a wallet_asset row. */
28
+ type WithdrawalAsset = {
29
+ network: string;
30
+ minWithdrawal: string;
31
+ withdrawalEnabled: boolean;
32
+ };
33
+ /**
34
+ * Pins the chain a payout settles on. With one payable network the choice is implied; with
35
+ * several an explicit network is mandatory, because picking one silently would send a
36
+ * player's USDT over a chain their receiving wallet may not support.
37
+ *
38
+ * `assets` is every catalog row for the currency, enabled or not, so the two empty cases
39
+ * stay distinguishable: no rows at all means the operator never configured this currency
40
+ * (a fiat PSP), and the caller's choice passes through unchecked; rows that are all
41
+ * withdrawal-disabled is a deliberate operator decision and fails closed.
42
+ */
43
+ export declare function resolveWithdrawalNetwork(assets: readonly WithdrawalAsset[], currency: string, network?: string): string | null;
44
+ /**
45
+ * Rejects a payout worth less than the operator's per-network floor. The floor is per chain,
46
+ * not per currency: moving USDT costs cents on BEP20 and dollars on ERC20, so one
47
+ * currency-wide minimum is either too high for the cheap chain or below the fee on the
48
+ * expensive one.
49
+ */
50
+ export declare function assertAboveMinimumWithdrawal(assets: readonly WithdrawalAsset[], amount: string, currency: string, network: string | null): void;
16
51
  export declare function railFor(currency: string, cryptoCurrencies?: readonly string[]): WalletRail;
17
52
  export declare function creditWalletBalance(txn: DrizzleDb, walletId: Wallet['id'], currency: string, amount: string): Omit<import("drizzle-orm/pg-core").PgInsertBase<import("drizzle-orm/pg-core").PgTableWithColumns<{
18
53
  name: "wallet_balance";
@@ -283,6 +318,7 @@ export type WalletServiceDeps = {
283
318
  drizzle: DrizzleService;
284
319
  events: EventBus;
285
320
  payment: PaymentAdapter;
321
+ paymentProviders: PaymentProviderRegistry;
286
322
  identityReader: IdentityReader;
287
323
  directory?: AdminUserDirectory;
288
324
  platformConfig?: PlatformConfig;
@@ -303,6 +339,7 @@ export declare class WalletService {
303
339
  private readonly drizzle;
304
340
  private readonly events;
305
341
  private readonly payment;
342
+ private readonly paymentProviders;
306
343
  private readonly identityReader;
307
344
  private readonly directory?;
308
345
  private readonly platformConfig?;
@@ -310,8 +347,10 @@ export declare class WalletService {
310
347
  private readonly riskTags?;
311
348
  private readonly tagEvaluationCommands?;
312
349
  private readonly audit;
313
- constructor({ drizzle, events, payment, directory, identityReader, platformConfig, limiter, riskTags, tagEvaluationCommands, audit, }: WalletServiceDeps);
350
+ constructor({ drizzle, events, payment, paymentProviders, directory, identityReader, platformConfig, limiter, riskTags, tagEvaluationCommands, audit, }: WalletServiceDeps);
351
+ private assetsForCurrency;
314
352
  private resolveRail;
353
+ private providerNameFor;
315
354
  private rateLimit;
316
355
  private assertKycForWithdrawal;
317
356
  getBalance(userId: User['id']): Promise<{
@@ -345,8 +384,18 @@ export declare class WalletService {
345
384
  provider?: string;
346
385
  idempotencyKey?: string;
347
386
  }): Promise<TransactionResult>;
387
+ manualAdjust({ adminId, userId, direction, amount, currency, reason, idempotencyKey, ip, userAgent, }: {
388
+ adminId: User['id'];
389
+ userId: User['id'];
390
+ direction: ManualAdjustmentDirection;
391
+ amount: string;
392
+ currency: string;
393
+ reason: string;
394
+ idempotencyKey: string;
395
+ } & ClientMeta): Promise<TransactionResult>;
348
396
  private findDepositReplay;
349
397
  private assertReplayMatches;
398
+ private assertManualAdjustmentReplayMatches;
350
399
  private insertIdempotentTransaction;
351
400
  /**
352
401
  * Creates a PENDING withdrawal and HOLDS the funds immediately (balance
@@ -358,10 +407,11 @@ export declare class WalletService {
358
407
  * return an already-`completed`/`processing` result if the request
359
408
  * qualifies for (and passes) auto-approval - see `maybeAutoApprove`.
360
409
  */
361
- withdraw({ userId, amount, currency, idempotencyKey, destinationAddress, ip, userAgent, }: {
410
+ withdraw({ userId, amount, currency, network, idempotencyKey, destinationAddress, ip, userAgent, }: {
362
411
  userId: User['id'];
363
412
  amount: string;
364
413
  currency: string;
414
+ network?: string;
365
415
  idempotencyKey?: string;
366
416
  destinationAddress?: string;
367
417
  } & ClientMeta): Promise<TransactionResult>;
@@ -373,6 +423,7 @@ export declare class WalletService {
373
423
  username: string;
374
424
  amount: string;
375
425
  currency: string;
426
+ network: string | null;
376
427
  rail: "crypto" | "fiat" | null;
377
428
  status: "pending" | "rejected" | "processing" | "completed" | "failed" | "on_hold" | "cancelled";
378
429
  kycStatus: "pending" | "not_started" | "approved" | "verified" | "rejected" | "resubmission_requested" | "manually_overridden" | null;
@@ -407,6 +458,14 @@ export declare class WalletService {
407
458
  cryptoThreshold: string;
408
459
  excludeRiskFlags: TagKey[];
409
460
  }, meta?: ClientMeta): Promise<WalletAutoWithdrawalConfig>;
461
+ listWalletAssets(): Promise<WalletAsset[]>;
462
+ listEnabledWalletAssets(): Promise<PublicWalletAsset[]>;
463
+ getWalletAsset(currency: string, network: string): Promise<WalletAsset | null>;
464
+ private assertAdapterSupports;
465
+ private assertProviderNameValid;
466
+ createWalletAsset(adminId: User['id'], input: CreateWalletAssetInput, meta?: ClientMeta): Promise<WalletAsset>;
467
+ updateWalletAsset(adminId: User['id'], { currency, network, ...changes }: UpdateWalletAssetInput, meta?: ClientMeta): Promise<WalletAsset>;
468
+ deleteWalletAsset(adminId: User['id'], currency: string, network: string, meta?: ClientMeta): Promise<boolean>;
410
469
  private autoApprovalKycStatus;
411
470
  private autoApprovalRiskTags;
412
471
  private autoApprovalHeuristics;
@@ -421,16 +480,21 @@ export declare class WalletService {
421
480
  getAutoWithdrawalRule(userId: User['id']): Promise<AutoWithdrawalRule | null>;
422
481
  deleteAutoWithdrawalRule(userId: User['id']): Promise<boolean>;
423
482
  rejectWithdrawal(adminId: User['id'], withdrawalId: WalletTransaction['id'], reason: string, meta?: ClientMeta): Promise<TransactionResult>;
424
- getTransactions({ userId, page, limit, sortBy, sortOrder, }: PaginationOptions<{
483
+ getTransactions({ userId, page, limit, sortBy, sortOrder, includeInternal, }: PaginationOptions<{
425
484
  userId: User['id'];
485
+ includeInternal?: boolean;
426
486
  }, WalletTransactionSortBy>): Promise<{
427
487
  items: {
428
488
  id: string;
429
- type: "deposit" | "loss" | "withdrawal" | "bet" | "win" | "bonus" | "tip" | "gift" | "rain";
489
+ type: "deposit" | "loss" | "withdrawal" | "bet" | "win" | "bonus" | "tip" | "gift" | "rain" | "manual_credit" | "manual_debit";
430
490
  amount: string;
431
491
  currency: string;
492
+ network: string | null;
432
493
  status: "pending" | "rejected" | "processing" | "completed" | "failed" | "on_hold" | "cancelled";
433
494
  createdAt: string;
495
+ reviewedBy: string | null;
496
+ reviewedAt: string | null;
497
+ reviewReason: string | null;
434
498
  }[];
435
499
  total: number;
436
500
  page: number;
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.service.d.ts","sourceRoot":"","sources":["../../../src/wallet/service/wallet.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wallet.service.d.ts","sourceRoot":"","sources":["../../../src/wallet/service/wallet.service.ts"],"names":[],"mappings":"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"}