@openora/core 0.4.1-canary.93 → 0.4.1-canary.95

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 (78) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/audit/plugin.d.ts.map +1 -1
  3. package/dist/audit/plugin.js +13 -0
  4. package/dist/audit/plugin.js.map +1 -1
  5. package/dist/contracts/adapters/audit.d.ts +1 -1
  6. package/dist/contracts/adapters/audit.d.ts.map +1 -1
  7. package/dist/contracts/adapters/audit.js.map +1 -1
  8. package/dist/contracts/schemas/events.d.ts +5 -0
  9. package/dist/contracts/schemas/events.d.ts.map +1 -1
  10. package/dist/contracts/schemas/events.js +9 -0
  11. package/dist/contracts/schemas/events.js.map +1 -1
  12. package/dist/testing/mock.d.ts +6 -1
  13. package/dist/testing/mock.d.ts.map +1 -1
  14. package/dist/testing/mock.js +9 -0
  15. package/dist/testing/mock.js.map +1 -1
  16. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
  17. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
  18. package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
  19. package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
  20. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
  21. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
  22. package/dist/wallet/__tests__/custody-sweep.service.int.test.js +246 -0
  23. package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
  24. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts +2 -0
  25. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts.map +1 -0
  26. package/dist/wallet/__tests__/reconciliation-diff.test.js +49 -0
  27. package/dist/wallet/__tests__/reconciliation-diff.test.js.map +1 -0
  28. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts +2 -0
  29. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts.map +1 -0
  30. package/dist/wallet/__tests__/reconciliation.service.int.test.js +395 -0
  31. package/dist/wallet/__tests__/reconciliation.service.int.test.js.map +1 -0
  32. package/dist/wallet/__tests__/wallet-asset.router.int.test.js +12 -2
  33. package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -1
  34. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +12 -2
  35. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -1
  36. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +12 -2
  37. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -1
  38. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts +2 -0
  39. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts.map +1 -0
  40. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js +128 -0
  41. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js.map +1 -0
  42. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +32 -4
  43. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -1
  44. package/dist/wallet/__tests__/wallet.router.int.test.js +12 -2
  45. package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -1
  46. package/dist/wallet/__tests__/wallet.service.int.test.js +34 -11
  47. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -1
  48. package/dist/wallet/contract/index.d.ts.map +1 -1
  49. package/dist/wallet/contract/index.js +8 -8
  50. package/dist/wallet/contract/index.js.map +1 -1
  51. package/dist/wallet/plugin.d.ts.map +1 -1
  52. package/dist/wallet/plugin.js +91 -17
  53. package/dist/wallet/plugin.js.map +1 -1
  54. package/dist/wallet/router/index.d.ts +19 -2
  55. package/dist/wallet/router/index.d.ts.map +1 -1
  56. package/dist/wallet/router/index.js +32 -17
  57. package/dist/wallet/router/index.js.map +1 -1
  58. package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
  59. package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
  60. package/dist/wallet/service/custody-sweep.service.js +354 -0
  61. package/dist/wallet/service/custody-sweep.service.js.map +1 -0
  62. package/dist/wallet/service/reconciliation-finding.service.d.ts +39 -0
  63. package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
  64. package/dist/wallet/service/reconciliation-finding.service.js +36 -0
  65. package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
  66. package/dist/wallet/service/reconciliation.service.d.ts +112 -0
  67. package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
  68. package/dist/wallet/service/reconciliation.service.js +509 -0
  69. package/dist/wallet/service/reconciliation.service.js.map +1 -0
  70. package/dist/wallet/service/wallet.service.d.ts +7 -2
  71. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  72. package/dist/wallet/service/wallet.service.js +45 -3
  73. package/dist/wallet/service/wallet.service.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.d.ts +0 -2
  76. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.d.ts.map +0 -1
  77. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.js +0 -80
  78. package/dist/wallet/__tests__/wallet-custody-stubs.router.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wallet/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAE5B,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EAsBd,MAAM,8BAA8B,CAAC;AAgDtC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,cAAc,EACrB,gBAAgB,EAAE,uBAAuB,EACzC,OAAO,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmU3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wallet/router/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE5B,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,aAAa,EAqBd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,qBAAqB,EAItB,MAAM,sCAAsC,CAAC;AA0C9C;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,cAAc,EAAE,qBAAqB,CAAC;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B,mBAAmB,EAAE,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;CAC5C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,OAAO,GACR,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2VlB"}
@@ -1,13 +1,11 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { implement, ORPCError } from '@orpc/server';
2
3
  import { getUserId, mapErrors, assertRateLimit, } from '@openora/core/server';
3
4
  import { DEFAULT_PAYMENT_PROVIDER, RATE_LIMIT_KEYS, makeRateLimitKey, } from '@openora/core/contracts';
4
5
  import { walletContract } from '../contract/index.js';
5
- import { WalletNotFoundError, WithdrawalNotFoundError, WithdrawalNotPendingError, InsufficientBalanceError, CurrencyMismatchError, KycRequiredError, IdempotencyKeyReuseError, DepositAddressUnsupportedError, DestinationAddressRequiredError, AutoWithdrawalConfigNotFoundError, WalletAssetNotFoundError, WalletAssetAlreadyExistsError, WalletAssetUnsupportedError, WalletAssetUnknownProviderError, WalletAssetInUseError, WalletAssetHasInFlightTransactionsError, AmbiguousNetworkError, UnsupportedNetworkError, WithdrawalDisabledError, BelowMinimumWithdrawalError, PlayerNotFoundError, } from '../service/wallet.service.js';
6
- // One helper so `grep notImplemented` finds every remaining stub; the count reaching
7
- // zero is the definition of done for the custody sweep / reconciliation feature set.
8
- const notImplemented = () => {
9
- throw new ORPCError('NOT_IMPLEMENTED');
10
- };
6
+ import { CUSTODY_SWEEP_QUEUE } from '../service/custody-sweep.service.js';
7
+ import { WalletNotFoundError, WithdrawalNotFoundError, WithdrawalNotPendingError, InsufficientBalanceError, KycRequiredError, IdempotencyKeyReuseError, DepositAddressUnsupportedError, DestinationAddressRequiredError, AutoWithdrawalConfigNotFoundError, WalletAssetNotFoundError, WalletAssetAlreadyExistsError, WalletAssetUnsupportedError, WalletAssetUnknownProviderError, WalletAssetInUseError, WalletAssetHasInFlightTransactionsError, AmbiguousNetworkError, UnsupportedNetworkError, WithdrawalDisabledError, BelowMinimumWithdrawalError, PlayerNotFoundError, } from '../service/wallet.service.js';
8
+ import { ReconciliationFindingNotFoundError, ReconciliationCreditTransactionNotFoundError, ReconciliationCreditMismatchError, } from '../service/reconciliation.service.js';
11
9
  // Unauthenticated route: it costs a signature verification (and, for a custody vendor,
12
10
  // a DB lookup) per request with nothing else gating it. Keyed on client IP, not a
13
11
  // vendor/account identity, since an attacker chooses neither. A request with no IP
@@ -28,7 +26,7 @@ async function dispatchWebhook(wallet, paymentProviders, providerName, rawBody,
28
26
  const event = provider.adapter.parseWebhook?.(rawBody, headers);
29
27
  if (event) {
30
28
  if (event.kind === 'deposit') {
31
- await wallet.creditDepositByAddress(event);
29
+ await wallet.creditDepositByAddress(event, providerName);
32
30
  }
33
31
  else {
34
32
  await wallet.reconcileWithdrawalStatus(event);
@@ -36,14 +34,14 @@ async function dispatchWebhook(wallet, paymentProviders, providerName, rawBody,
36
34
  }
37
35
  return { ok: true };
38
36
  }
39
- export function createWalletRouter(wallet, adminGuard, audit, paymentProviders, limiter) {
37
+ export function createWalletRouter({ wallet, adminGuard, audit, paymentProviders, reconciliation, jobQueue, reconciliationQueue, limiter, }) {
40
38
  const os = implement(walletContract).$context();
41
39
  const throttleWebhook = (context) => assertRateLimit(limiter, makeRateLimitKey(RATE_LIMIT_KEYS.WALLET_WEBHOOK, context.clientMeta.ip ?? 'unknown'), WALLET_WEBHOOK_RATE_LIMIT);
42
40
  return os.router({
43
41
  getBalance: os.getBalance.handler(({ context }) => wallet.getBalance(getUserId(context))),
44
42
  getBalances: os.getBalances.handler(({ context }) => wallet.getBalances(getUserId(context))),
45
43
  setActiveCurrency: os.setActiveCurrency.handler(({ input, context }) => mapErrors({ NOT_FOUND: WalletNotFoundError }, () => wallet.setActiveCurrency(getUserId(context), input.currency))),
46
- deposit: os.deposit.handler(({ input, context }) => mapErrors({ BAD_REQUEST: CurrencyMismatchError, CONFLICT: IdempotencyKeyReuseError }, () => wallet.deposit({
44
+ deposit: os.deposit.handler(({ input, context }) => mapErrors({ CONFLICT: IdempotencyKeyReuseError }, () => wallet.deposit({
47
45
  userId: getUserId(context),
48
46
  amount: input.amount,
49
47
  currency: input.currency,
@@ -55,7 +53,6 @@ export function createWalletRouter(wallet, adminGuard, audit, paymentProviders,
55
53
  NOT_FOUND: WalletNotFoundError,
56
54
  BAD_REQUEST: [
57
55
  InsufficientBalanceError,
58
- CurrencyMismatchError,
59
56
  AmbiguousNetworkError,
60
57
  UnsupportedNetworkError,
61
58
  BelowMinimumWithdrawalError,
@@ -218,22 +215,40 @@ export function createWalletRouter(wallet, adminGuard, audit, paymentProviders,
218
215
  sweep: {
219
216
  run: os.custody.sweep.run.handler(async ({ context }) => {
220
217
  await adminGuard.assert(context, 'wallet-custody', 'run');
221
- return notImplemented();
218
+ // The run claim (a unique-index insert in wallet_job_run) is the sole
219
+ // concurrency authority, not this request - enqueue and return immediately so
220
+ // an HTTP timeout can never orphan a cycle. runId is minted here so the caller
221
+ // gets it back synchronously, before the job actually runs.
222
+ const runId = randomUUID();
223
+ await jobQueue.enqueue(CUSTODY_SWEEP_QUEUE, { runId });
224
+ return { runId };
222
225
  }),
223
226
  },
224
227
  },
225
228
  reconciliation: {
226
- list: os.reconciliation.list.handler(async ({ context }) => {
229
+ list: os.reconciliation.list.handler(async ({ input, context }) => {
227
230
  await adminGuard.assert(context, 'wallet-reconciliation', 'view');
228
- return notImplemented();
231
+ return reconciliation.listFindings(input);
229
232
  }),
230
- resolve: os.reconciliation.resolve.handler(async ({ context }) => {
231
- await adminGuard.assert(context, 'wallet-reconciliation', 'resolve');
232
- return notImplemented();
233
+ resolve: os.reconciliation.resolve.handler(async ({ input, context }) => {
234
+ const { userId: adminId, ip, userAgent, } = await adminGuard.assert(context, 'wallet-reconciliation', 'resolve');
235
+ return mapErrors({
236
+ NOT_FOUND: [
237
+ ReconciliationFindingNotFoundError,
238
+ ReconciliationCreditTransactionNotFoundError,
239
+ ],
240
+ CONFLICT: ReconciliationCreditMismatchError,
241
+ }, () => reconciliation.resolveFinding(adminId, input.id, input.resolution, { ip, userAgent }));
233
242
  }),
243
+ // Enqueues the job and returns the runId immediately - never runs inline. The
244
+ // eventual worker's own claim (wallet_job_run's partial unique index) stays the
245
+ // single concurrency authority; this route does not know or care whether its
246
+ // claim will win.
234
247
  run: os.reconciliation.run.handler(async ({ context }) => {
235
248
  await adminGuard.assert(context, 'wallet-reconciliation', 'run');
236
- return notImplemented();
249
+ const runId = randomUUID();
250
+ await jobQueue.enqueue(reconciliationQueue, { runId });
251
+ return { runId };
237
252
  }),
238
253
  },
239
254
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wallet/router/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wallet/router/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import * as z from 'zod';
2
+ import { type DrizzleService } from '@openora/core/server';
3
+ import { type AuditWritePort, type PaymentProviderRegistry, type PlatformConfig, type Uuid } from '@openora/core/contracts';
4
+ export declare const CUSTODY_SWEEP_JOB_NAME = "wallet-custody-sweep";
5
+ export declare const CUSTODY_SWEEP_QUEUE: import("@openora/core/contracts").QueueName;
6
+ export declare const CustodySweepJobPayloadSchema: z.ZodObject<{
7
+ runId: z.ZodOptional<z.ZodUUID>;
8
+ }, z.core.$strip>;
9
+ export type CustodySweepJobPayload = z.infer<typeof CustodySweepJobPayloadSchema>;
10
+ export type SweepCycleSummary = {
11
+ considered: number;
12
+ swept: number;
13
+ skippedDust: number;
14
+ skippedFee: number;
15
+ skippedCeiling: number;
16
+ inFlight: number;
17
+ failed: number;
18
+ unknown: number;
19
+ };
20
+ export type SweepGateDecision = 'sweep' | 'dust' | 'fee' | 'ceiling';
21
+ /**
22
+ * Pure gate over a single custody balance, in the exact order
23
+ * docs/adapters/payment.md diagram D3 specifies: dust floor, then the fee-multiple
24
+ * floor, then the fee ceiling (overridden only when the pool is running dry).
25
+ *
26
+ * `poolBalance` is null whenever the caller hasn't fetched it (no ceiling breach yet,
27
+ * the adapter has no `getPoolBalance`, or the asset has no `poolLiquidityFloor`) - null
28
+ * always means "the ceiling stays absolute", never an accidental override.
29
+ */
30
+ export declare function gateSweepBalance(args: {
31
+ amount: string;
32
+ estimatedFee: string;
33
+ minDeposit: string;
34
+ feeMultiple: string;
35
+ sweepFeeCeiling: string | null;
36
+ poolLiquidityFloor: string | null;
37
+ poolBalance: string | null;
38
+ }): SweepGateDecision;
39
+ export type CustodySweepServiceDeps = {
40
+ drizzle: DrizzleService;
41
+ paymentProviders: PaymentProviderRegistry;
42
+ audit: AuditWritePort;
43
+ platformConfig?: PlatformConfig;
44
+ };
45
+ /**
46
+ * Owns the custody sweep cron: moves vendor-side per-player custody balances into the
47
+ * pooled account they're paid out of. Deliberately separate from WalletService (which
48
+ * is already ~2000 lines) and deliberately never touches wallet_balance/wallet_transaction
49
+ * - the player was credited at deposit time, this only moves the vendor's own money
50
+ * between its own containers. See docs/adapters/payment.md, "Custody: pooling, sweeping
51
+ * and reconciliation".
52
+ */
53
+ export declare class CustodySweepService {
54
+ private readonly drizzle;
55
+ private readonly paymentProviders;
56
+ private readonly audit;
57
+ private readonly platformConfig?;
58
+ constructor({ drizzle, paymentProviders, audit, platformConfig }: CustodySweepServiceDeps);
59
+ /**
60
+ * Runs one sweep cycle. No-ops (returns null, touches nothing) when
61
+ * `platformConfig.wallet.sweep` is absent - an operator who hasn't configured sweep
62
+ * policy still gets a scheduled job, it just never claims a run. Also returns null
63
+ * when another cycle already owns the claim.
64
+ */
65
+ runCycle(requestedRunId?: Uuid): Promise<{
66
+ runId: Uuid;
67
+ summary: SweepCycleSummary;
68
+ } | null>;
69
+ private claimRun;
70
+ private resolveInFlightSweeps;
71
+ private assetFor;
72
+ private hasInFlightSweep;
73
+ private getPoolBalanceCached;
74
+ private processBalance;
75
+ private finishRun;
76
+ }
77
+ //# sourceMappingURL=custody-sweep.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-sweep.service.d.ts","sourceRoot":"","sources":["../../../src/wallet/service/custody-sweep.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,cAAc,EAGnB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EAEnB,KAAK,IAAI,EACV,MAAM,yBAAyB,CAAC;AAajC,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAC7D,eAAO,MAAM,mBAAmB,6CAAgC,CAAC;AAMjE,eAAO,MAAM,4BAA4B;;iBAA6C,CAAC;AACvF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMlF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IAKjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAErE;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,iBAAiB,CAkBpB;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;gBAErC,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,uBAAuB;IAOzF;;;;;OAKG;IACG,QAAQ,CACZ,cAAc,CAAC,EAAE,IAAI,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,GAAG,IAAI,CAAC;YA2EhD,QAAQ;YAiDR,qBAAqB;YA0BrB,QAAQ;YAQR,gBAAgB;YAmBhB,oBAAoB;YAmBpB,cAAc;YAyId,SAAS;CA4BxB"}
@@ -0,0 +1,354 @@
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, } from '../schema/index.js';
7
+ import { recordReconciliationFinding } from './reconciliation-finding.service.js';
8
+ const logger = createLogger('wallet-custody-sweep');
9
+ export const CUSTODY_SWEEP_JOB_NAME = 'wallet-custody-sweep';
10
+ export const CUSTODY_SWEEP_QUEUE = queue('wallet.custody-sweep');
11
+ // `runId` is only present when an admin's on-demand POST /wallet/custody/sweep/run
12
+ // enqueued this tick - the router mints it up front so it can hand the caller back a
13
+ // runId synchronously, before the job actually runs. A cron tick omits it and the
14
+ // service mints its own.
15
+ export const CustodySweepJobPayloadSchema = z.object({ runId: UuidSchema.optional() });
16
+ const IN_FLIGHT_STATUSES = ['pending', 'processing', 'unknown'];
17
+ /**
18
+ * Pure gate over a single custody balance, in the exact order
19
+ * docs/adapters/payment.md diagram D3 specifies: dust floor, then the fee-multiple
20
+ * floor, then the fee ceiling (overridden only when the pool is running dry).
21
+ *
22
+ * `poolBalance` is null whenever the caller hasn't fetched it (no ceiling breach yet,
23
+ * the adapter has no `getPoolBalance`, or the asset has no `poolLiquidityFloor`) - null
24
+ * always means "the ceiling stays absolute", never an accidental override.
25
+ */
26
+ export function gateSweepBalance(args) {
27
+ if (moneyCompare(args.amount, args.minDeposit) < 0) {
28
+ return 'dust';
29
+ }
30
+ const feeFloor = moneyScaleBy(args.estimatedFee, args.feeMultiple);
31
+ if (moneyCompare(args.amount, feeFloor) < 0) {
32
+ return 'fee';
33
+ }
34
+ if (args.sweepFeeCeiling !== null && moneyCompare(args.estimatedFee, args.sweepFeeCeiling) > 0) {
35
+ const poolBelowFloor = args.poolLiquidityFloor !== null &&
36
+ args.poolBalance !== null &&
37
+ moneyCompare(args.poolBalance, args.poolLiquidityFloor) < 0;
38
+ if (!poolBelowFloor) {
39
+ return 'ceiling';
40
+ }
41
+ }
42
+ return 'sweep';
43
+ }
44
+ /**
45
+ * Owns the custody sweep cron: moves vendor-side per-player custody balances into the
46
+ * pooled account they're paid out of. Deliberately separate from WalletService (which
47
+ * is already ~2000 lines) and deliberately never touches wallet_balance/wallet_transaction
48
+ * - the player was credited at deposit time, this only moves the vendor's own money
49
+ * between its own containers. See docs/adapters/payment.md, "Custody: pooling, sweeping
50
+ * and reconciliation".
51
+ */
52
+ export class CustodySweepService {
53
+ drizzle;
54
+ paymentProviders;
55
+ audit;
56
+ platformConfig;
57
+ constructor({ drizzle, paymentProviders, audit, platformConfig }) {
58
+ this.drizzle = drizzle;
59
+ this.paymentProviders = paymentProviders;
60
+ this.audit = audit;
61
+ this.platformConfig = platformConfig;
62
+ }
63
+ /**
64
+ * Runs one sweep cycle. No-ops (returns null, touches nothing) when
65
+ * `platformConfig.wallet.sweep` is absent - an operator who hasn't configured sweep
66
+ * policy still gets a scheduled job, it just never claims a run. Also returns null
67
+ * when another cycle already owns the claim.
68
+ */
69
+ async runCycle(requestedRunId) {
70
+ const sweepConfig = this.platformConfig?.wallet?.sweep;
71
+ if (!sweepConfig) {
72
+ return null;
73
+ }
74
+ const claim = await this.claimRun(requestedRunId, sweepConfig.staleRunAfterMinutes);
75
+ if (!claim) {
76
+ return null;
77
+ }
78
+ const { runId, jobRunId } = claim;
79
+ const summary = {
80
+ considered: 0,
81
+ swept: 0,
82
+ skippedDust: 0,
83
+ skippedFee: 0,
84
+ skippedCeiling: 0,
85
+ inFlight: 0,
86
+ failed: 0,
87
+ unknown: 0,
88
+ };
89
+ // Everything past the claim runs guarded: an adapter that throws (a vendor 5xx is
90
+ // the ordinary case) would otherwise leave this run's row with finishedAt NULL, and
91
+ // the partial unique index would then block every subsequent cycle until the
92
+ // staleness takeover window elapsed. A failed cycle must free its own slot.
93
+ try {
94
+ await this.resolveInFlightSweeps(sweepConfig.concurrency);
95
+ const poolBalanceCache = new Map();
96
+ for (const providerName of this.paymentProviders.names()) {
97
+ const adapter = this.paymentProviders.get(providerName)?.adapter;
98
+ // sweepToPool is checked here, not after a claim row exists: an adapter that
99
+ // advertises listSweepableBalances without it would otherwise claim a container,
100
+ // throw, and park an `unknown` row that holds the in-flight guard forever.
101
+ if (!adapter?.listSweepableBalances) {
102
+ continue;
103
+ }
104
+ if (!adapter.sweepToPool) {
105
+ logger.error({ providerName }, 'provider lists sweepable balances but cannot sweep them; skipping');
106
+ continue;
107
+ }
108
+ // listSweepableBalances is unbounded; sweeping is throughput work, so the cron
109
+ // cadence drains the backlog rather than one cycle chasing it all.
110
+ const balances = (await adapter.listSweepableBalances()).slice(0, sweepConfig.batchSize);
111
+ summary.considered += balances.length;
112
+ await mapConcurrent(balances, sweepConfig.concurrency, (balance) => this.processBalance({
113
+ providerName,
114
+ adapter,
115
+ balance,
116
+ runId,
117
+ sweepConfig,
118
+ summary,
119
+ poolBalanceCache,
120
+ }));
121
+ }
122
+ }
123
+ catch (err) {
124
+ await this.finishRun(jobRunId, runId, summary, 'failed', err);
125
+ throw err;
126
+ }
127
+ await this.finishRun(jobRunId, runId, summary);
128
+ return { runId, summary };
129
+ }
130
+ // The insert IS the claim: the partial unique index on wallet_job_run(job_name) WHERE
131
+ // finished_at IS NULL means a conflicting insert can only mean another cycle already
132
+ // owns it. A run whose startedAt outlives `staleAfterMinutes` is presumed crashed and
133
+ // taken over: marked abandoned, then re-claimed inside the same transaction.
134
+ async claimRun(requestedRunId, staleAfterMinutes) {
135
+ const runId = requestedRunId ?? randomUUID();
136
+ return this.drizzle.db.transaction(async (txn) => {
137
+ const [inserted] = await txn
138
+ .insert(walletJobRun)
139
+ .values({ jobName: CUSTODY_SWEEP_JOB_NAME, runId })
140
+ .onConflictDoNothing()
141
+ .returning();
142
+ if (inserted) {
143
+ return { runId, jobRunId: inserted.id };
144
+ }
145
+ const [existing] = await txn
146
+ .select()
147
+ .from(walletJobRun)
148
+ .where(and(eq(walletJobRun.jobName, CUSTODY_SWEEP_JOB_NAME), isNull(walletJobRun.finishedAt)))
149
+ .for('update');
150
+ if (!existing) {
151
+ // The owning run finished between our failed insert and this read - let the
152
+ // next tick claim cleanly instead of racing a second insert here.
153
+ return null;
154
+ }
155
+ const staleMs = staleAfterMinutes * 60_000;
156
+ if (Date.now() - existing.startedAt.getTime() < staleMs) {
157
+ return null;
158
+ }
159
+ await txn
160
+ .update(walletJobRun)
161
+ .set({ status: 'abandoned', finishedAt: new Date() })
162
+ .where(eq(walletJobRun.id, existing.id));
163
+ const [takenOver] = await txn
164
+ .insert(walletJobRun)
165
+ .values({ jobName: CUSTODY_SWEEP_JOB_NAME, runId })
166
+ .returning();
167
+ if (!takenOver) {
168
+ throw new Error('wallet-custody-sweep: failed to claim run after abandoning a stale one');
169
+ }
170
+ return { runId, jobRunId: takenOver.id };
171
+ });
172
+ }
173
+ // Reusing getWithdrawalStatus for a sweep is deliberate: its {status, txHash} shape
174
+ // is generic to any vendor transaction (a withdrawal or a sweep), and a sweep's
175
+ // externalId is exactly the reference such a lookup needs.
176
+ async resolveInFlightSweeps(concurrency) {
177
+ const rows = await this.drizzle.db
178
+ .select()
179
+ .from(walletCustodySweep)
180
+ .where(and(inArray(walletCustodySweep.status, IN_FLIGHT_STATUSES), isNotNull(walletCustodySweep.externalId)));
181
+ await mapConcurrent(rows, concurrency, async (row) => {
182
+ const adapter = this.paymentProviders.get(row.providerName)?.adapter;
183
+ if (!adapter?.getWithdrawalStatus || !row.externalId) {
184
+ return;
185
+ }
186
+ const result = await adapter.getWithdrawalStatus(row.externalId);
187
+ if (!result || result.status === 'processing') {
188
+ return;
189
+ }
190
+ await this.drizzle.db
191
+ .update(walletCustodySweep)
192
+ .set({ status: result.status, txHash: result.txHash ?? row.txHash })
193
+ .where(eq(walletCustodySweep.id, row.id));
194
+ });
195
+ }
196
+ async assetFor(currency, network) {
197
+ const [row] = await this.drizzle.db
198
+ .select()
199
+ .from(walletAsset)
200
+ .where(and(eq(walletAsset.currency, currency), eq(walletAsset.network, network)));
201
+ return row ?? null;
202
+ }
203
+ async hasInFlightSweep(userId, currency, network) {
204
+ const [row] = await this.drizzle.db
205
+ .select({ id: walletCustodySweep.id })
206
+ .from(walletCustodySweep)
207
+ .where(and(eq(walletCustodySweep.userId, userId), eq(walletCustodySweep.currency, currency), eq(walletCustodySweep.network, network), inArray(walletCustodySweep.status, IN_FLIGHT_STATUSES)));
208
+ return row !== undefined;
209
+ }
210
+ async getPoolBalanceCached(cache, adapter, currency, network) {
211
+ if (!adapter.getPoolBalance) {
212
+ return null;
213
+ }
214
+ const key = `${currency}:${network}`;
215
+ const cached = cache.get(key);
216
+ if (cached !== undefined) {
217
+ return cached;
218
+ }
219
+ const balance = await adapter.getPoolBalance(currency, network);
220
+ cache.set(key, balance);
221
+ return balance;
222
+ }
223
+ async processBalance({ providerName, adapter, balance, runId, sweepConfig, summary, poolBalanceCache, }) {
224
+ const asset = await this.assetFor(balance.currency, balance.network);
225
+ if (!asset) {
226
+ // Funds sitting in a container the operator has no policy for must be visible,
227
+ // not a log line.
228
+ await recordReconciliationFinding(this.drizzle.db, {
229
+ runId,
230
+ providerName,
231
+ kind: 'unconfigured_asset',
232
+ currency: balance.currency,
233
+ network: balance.network,
234
+ amount: balance.amount,
235
+ // No vendor reference exists for this finding, and the condition recurs every
236
+ // single cycle until an operator configures the asset - without a stable
237
+ // stand-in one missing catalog row files a finding every cron tick, drowning
238
+ // the real findings and pinning the alert threshold permanently over the line.
239
+ // The asset, not the player, is the subject: one row to act on, not one per
240
+ // affected container.
241
+ externalId: `unconfigured:${providerName}:${balance.currency}:${balance.network}`,
242
+ detail: `no wallet_asset configured for ${balance.currency}/${balance.network}`,
243
+ });
244
+ return;
245
+ }
246
+ const gateArgs = {
247
+ amount: balance.amount,
248
+ estimatedFee: balance.estimatedFee,
249
+ minDeposit: asset.minDeposit,
250
+ feeMultiple: sweepConfig.feeMultiple,
251
+ sweepFeeCeiling: asset.sweepFeeCeiling,
252
+ poolLiquidityFloor: asset.poolLiquidityFloor,
253
+ };
254
+ let decision = gateSweepBalance({ ...gateArgs, poolBalance: null });
255
+ // Only fetch the pool balance when the ceiling actually blocks - it's an extra
256
+ // vendor call, not a free one.
257
+ if (decision === 'ceiling' && asset.poolLiquidityFloor) {
258
+ const poolBalance = await this.getPoolBalanceCached(poolBalanceCache, adapter, balance.currency, balance.network);
259
+ decision = gateSweepBalance({ ...gateArgs, poolBalance });
260
+ }
261
+ if (decision === 'dust') {
262
+ summary.skippedDust += 1;
263
+ return;
264
+ }
265
+ if (decision === 'fee') {
266
+ summary.skippedFee += 1;
267
+ return;
268
+ }
269
+ if (decision === 'ceiling') {
270
+ summary.skippedCeiling += 1;
271
+ return;
272
+ }
273
+ if (await this.hasInFlightSweep(balance.userId, balance.currency, balance.network)) {
274
+ summary.inFlight += 1;
275
+ return;
276
+ }
277
+ const [claimed] = await this.drizzle.db
278
+ .insert(walletCustodySweep)
279
+ .values({
280
+ userId: balance.userId,
281
+ providerName,
282
+ currency: balance.currency,
283
+ network: balance.network,
284
+ amount: balance.amount,
285
+ estimatedFee: balance.estimatedFee,
286
+ status: 'pending',
287
+ runId,
288
+ })
289
+ .onConflictDoNothing()
290
+ .returning();
291
+ if (!claimed) {
292
+ // Another cycle claimed this (userId, currency, network) between the check above
293
+ // and this insert - the partial unique index is the real guard, this is a race.
294
+ summary.inFlight += 1;
295
+ return;
296
+ }
297
+ // Deliberately outside any transaction - sweepToPool is a real vendor call
298
+ // (docs/standards/money.md: treat external payment calls as non-transactional).
299
+ // The claim row above already holds the durable guard.
300
+ try {
301
+ const result = await adapter.sweepToPool?.(balance, { idempotencyKey: claimed.id });
302
+ if (!result) {
303
+ throw new Error(`provider "${providerName}" advertised listSweepableBalances but has no sweepToPool`);
304
+ }
305
+ await this.drizzle.db
306
+ .update(walletCustodySweep)
307
+ // poolRef records WHICH pool received the funds, not just that a transfer
308
+ // happened. Player funds must stay separate from operator funds, and that is
309
+ // the question a regulator asks; without it the ledger cannot answer it.
310
+ .set({
311
+ status: 'processing',
312
+ externalId: result.externalId,
313
+ poolRef: result.poolRef ?? null,
314
+ })
315
+ .where(eq(walletCustodySweep.id, claimed.id));
316
+ summary.swept += 1;
317
+ }
318
+ catch (err) {
319
+ // A thrown sweepToPool cannot distinguish "the vendor never saw it" from "the
320
+ // vendor accepted it and the response was lost" - moving to `failed` on the
321
+ // second case would let the next cycle sweep the same container again and
322
+ // double-transfer real custody funds. `unknown` keeps the in-flight guard held
323
+ // (see IN_FLIGHT_STATUSES) until reconciliation or an operator resolves it.
324
+ logger.warn({ err, sweepId: claimed.id }, 'sweepToPool threw; parking sweep as unknown');
325
+ await this.drizzle.db
326
+ .update(walletCustodySweep)
327
+ .set({ status: 'unknown' })
328
+ .where(eq(walletCustodySweep.id, claimed.id));
329
+ summary.unknown += 1;
330
+ }
331
+ }
332
+ async finishRun(jobRunId, runId, summary, status = 'completed', err) {
333
+ const error = err === undefined ? {} : { error: err instanceof Error ? err.message : String(err) };
334
+ await this.drizzle.db.transaction(async (txn) => {
335
+ await txn
336
+ .update(walletJobRun)
337
+ .set({ finishedAt: new Date(), status, summary: { ...summary, ...error } })
338
+ .where(eq(walletJobRun.id, jobRunId));
339
+ // One entry for the whole cycle, never one per swept balance -
340
+ // AuditService.recordInTransaction takes a single global advisory lock (the audit
341
+ // log is a hash chain), so one row per container at thousands of containers would
342
+ // serialize the entire platform's audit stream behind this job. wallet_custody_sweep
343
+ // rows are the per-move record; this is the cycle record, joined on runId.
344
+ await this.audit.recordInTransaction(txn, {
345
+ actorType: 'system',
346
+ action: 'wallet.custody.sweep_cycle',
347
+ resourceType: 'wallet_job_run',
348
+ resourceId: runId,
349
+ after: { runId, status, ...summary, ...error },
350
+ });
351
+ });
352
+ }
353
+ }
354
+ //# 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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"}