@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
@@ -71,6 +71,13 @@
71
71
  "when": 1787059873921,
72
72
  "tag": "0009_smooth_sue_storm",
73
73
  "breakpoints": true
74
+ },
75
+ {
76
+ "idx": 10,
77
+ "version": "7",
78
+ "when": 1787270367938,
79
+ "tag": "0010_worthless_quasimodo",
80
+ "breakpoints": true
74
81
  }
75
82
  ]
76
83
  }
@@ -62,6 +62,7 @@ declare const _default: {
62
62
  NOTIFICATION_DELIVERY_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").NotificationDeliveryAdapter>;
63
63
  OUTBOX: import("@openora/core/contracts").Token<import("@openora/core/contracts").OutboxWriter>;
64
64
  PAYMENT_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PaymentAdapter>;
65
+ PAYMENT_PROVIDERS: import("@openora/core/contracts").Token<import("@openora/core/contracts").PaymentProviderRegistry>;
65
66
  PAYMENT_WEBHOOK_VERIFIER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PaymentWebhookVerifier>;
66
67
  PLATFORM_CONFIG: import("@openora/core/contracts").Token<{
67
68
  features: Record<string, boolean>;
@@ -92,6 +93,21 @@ declare const _default: {
92
93
  } | undefined;
93
94
  wallet?: {
94
95
  cryptoCurrencies?: string[] | undefined;
96
+ sweep?: {
97
+ cron: string;
98
+ feeMultiple: string;
99
+ batchSize: number;
100
+ concurrency: number;
101
+ unknownAfterMinutes: number;
102
+ staleRunAfterMinutes: number;
103
+ } | undefined;
104
+ reconciliation?: {
105
+ cron: string;
106
+ lookbackHours: number;
107
+ stuckAfterMinutes: number;
108
+ staleRunAfterMinutes: number;
109
+ alertThreshold: number;
110
+ } | undefined;
95
111
  } | undefined;
96
112
  registration?: {
97
113
  termsVersion: string;
@@ -104,7 +120,7 @@ declare const _default: {
104
120
  PLAYER_TAGS: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerTags>;
105
121
  PLAY_ELIGIBILITY: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayEligibilityPort>;
106
122
  RAIN_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").RainCommands>;
107
- RATE_LIMITER: import("@openora/core/contracts").Token<import("@openora/core/contracts").RateLimiterAdapter<`register:${string}` | `login:${string}` | `enable2fa:${string}` | `verify2fa:${string}` | `disable2fa:${string}` | `pwreset-req:${string}` | `pwreset-verify:${string}` | `pwreset:${string}` | `change-password:${string}` | `email-verify:${string}` | `verify-email:${string}` | `wallet-mutation:${string}` | `chat-room-join:${string}` | `chat-send:${string}` | `report-access-denied:${string}`>>;
123
+ RATE_LIMITER: import("@openora/core/contracts").Token<import("@openora/core/contracts").RateLimiterAdapter<`register:${string}` | `login:${string}` | `enable2fa:${string}` | `verify2fa:${string}` | `disable2fa:${string}` | `pwreset-req:${string}` | `pwreset-verify:${string}` | `pwreset:${string}` | `change-password:${string}` | `email-verify:${string}` | `verify-email:${string}` | `wallet-mutation:${string}` | `wallet-webhook:${string}` | `chat-room-join:${string}` | `chat-send:${string}` | `report-access-denied:${string}`>>;
108
124
  REALTIME_CLIENT_AUTHORIZER: import("@openora/core/contracts").Token<import("@openora/core/contracts").RealtimeClientAuthorizer>;
109
125
  REALTIME_TRANSPORT: import("@openora/core/contracts").Token<import("@openora/core/contracts").RealtimeTransport>;
110
126
  RNG_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").RngAdapter>;
@@ -114,6 +130,7 @@ declare const _default: {
114
130
  SMS_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").SmsAdapter>;
115
131
  SOCIAL_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SocialCommands>;
116
132
  TAG_EVALUATION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").TagEvaluationCommands>;
133
+ WALLET_ASSET_CATALOG: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletAssetCatalog, string>;
117
134
  WALLET_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletCommands>;
118
135
  WALLET_READER: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletReader, string>;
119
136
  }>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/wallet/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,wBAoD8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/wallet/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,wBAsG8C"}
@@ -1,13 +1,20 @@
1
- import { ADMIN_GUARD, EVENT_BUS, DRIZZLE } from '@openora/core/server';
1
+ import { ADMIN_GUARD, EVENT_BUS, DRIZZLE, createLogger } from '@openora/core/server';
2
2
  import * as z from 'zod';
3
- import { ADMIN_USER_DIRECTORY, IDENTITY_READER, ADMIN_WALLET_REPORTING, PAYMENT_ADAPTER, PAYMENT_WEBHOOK_VERIFIER, WALLET_COMMANDS, WALLET_READER, PLATFORM_CONFIG, RATE_LIMITER, PLAYER_TAGS, TAG_EVALUATION_COMMANDS, PLAY_ELIGIBILITY, AUDIT_WRITER, } from '@openora/core/contracts';
3
+ import { ADMIN_USER_DIRECTORY, IDENTITY_READER, ADMIN_WALLET_REPORTING, PAYMENT_ADAPTER, PAYMENT_WEBHOOK_VERIFIER, PAYMENT_PROVIDERS, DEFAULT_PAYMENT_PROVIDER, WALLET_COMMANDS, WALLET_READER, WALLET_ASSET_CATALOG, PLATFORM_CONFIG, RATE_LIMITER, PLAYER_TAGS, TAG_EVALUATION_COMMANDS, PLAY_ELIGIBILITY, AUDIT_WRITER, JOB_QUEUE, } from '@openora/core/contracts';
4
4
  import { WalletService } from './service/wallet.service.js';
5
5
  import { WalletCommandsService } from './service/wallet-commands.service.js';
6
+ import { CustodySweepService, CUSTODY_SWEEP_QUEUE, CustodySweepJobPayloadSchema, } from './service/custody-sweep.service.js';
6
7
  import { WalletReaderService } from './adapters/wallet-reader.service.js';
8
+ import { WalletAssetCatalogService } from './adapters/wallet-asset-catalog.service.js';
7
9
  import { DrizzleAdminWalletReporting } from './admin-reporting.js';
8
10
  import { createWalletRouter } from './router/index.js';
9
11
  import { MockPaymentAdapter } from './adapters/mock/mock-payment-adapter.js';
10
12
  import { HmacPaymentWebhookVerifier } from './adapters/hmac-payment-webhook-verifier.js';
13
+ const logger = createLogger('wallet');
14
+ // Mirrors WalletConfigSchema's wallet.sweep.cron default - used only when the operator
15
+ // hasn't configured platformConfig.wallet.sweep at all, so the job is still scheduled
16
+ // (CustodySweepService.runCycle no-ops every tick until sweep policy is configured).
17
+ const DEFAULT_SWEEP_CRON = '*/15 * * * *';
11
18
  export default {
12
19
  // NOT dependsOn 'tag': that would cycle (tag hard-depends on wallet's WALLET_READER).
13
20
  // wallet's use of tag's PLAYER_TAGS / TAG_EVALUATION_COMMANDS is optional and resolved
@@ -25,25 +32,76 @@ export default {
25
32
  .parse(process.env.PAYMENT_WEBHOOK_SECRET || undefined);
26
33
  return new HmacPaymentWebhookVerifier(webhookSecret);
27
34
  });
35
+ // Wraps the single PAYMENT_ADAPTER/PAYMENT_WEBHOOK_VERIFIER tokens as the 'default'
36
+ // registry entry, so a one-vendor operator changes nothing. Core only looks a
37
+ // providerName up here - it never discovers vendors itself, because Container.register
38
+ // is last-wins: two overlays each rebinding the single tokens would clobber each
39
+ // other, so running more than one vendor at once needs an operator-composed map
40
+ // (rebind PAYMENT_PROVIDERS entirely) rather than a second core-discovered slot.
41
+ ctx.provide(PAYMENT_PROVIDERS, (c) => ({
42
+ get: (name) => name === DEFAULT_PAYMENT_PROVIDER
43
+ ? { adapter: c.get(PAYMENT_ADAPTER), webhookVerifier: c.get(PAYMENT_WEBHOOK_VERIFIER) }
44
+ : null,
45
+ names: () => [DEFAULT_PAYMENT_PROVIDER],
46
+ }));
28
47
  // Other modules debit through this port within their own transaction (never importing wallet tables). See ADR-0016.
29
48
  ctx.provide(WALLET_COMMANDS, (c) => new WalletCommandsService(c.get(PLAY_ELIGIBILITY), c.has(PLATFORM_CONFIG) ? c.get(PLATFORM_CONFIG) : undefined));
30
49
  // Read-only queries for cross-module consumers (eg tag evaluation). Never exposes wallet internals.
31
50
  ctx.provide(WALLET_READER, (c) => new WalletReaderService(c.get(DRIZZLE)));
32
51
  ctx.provide(ADMIN_WALLET_REPORTING, (c) => new DrizzleAdminWalletReporting(c.get(DRIZZLE)));
33
- ctx.routers.add('wallet', (c) => createWalletRouter(new WalletService({
52
+ // Operator-editable currency/network config, readable by a payment adapter without
53
+ // importing wallet tables. Overlay-rebindable, but bound here so it always works.
54
+ ctx.provide(WALLET_ASSET_CATALOG, (c) => new WalletAssetCatalogService(c.get(DRIZZLE)));
55
+ // One memoized instance backs the cron worker and the router factory below - lazily
56
+ // constructed (subscriptions/workers wire before router factories run), matching
57
+ // pam/tag's and compliance's job-worker shape.
58
+ let sweepSvc = null;
59
+ const custodySweepService = (c) => (sweepSvc ??= new CustodySweepService({
34
60
  drizzle: c.get(DRIZZLE),
35
- events: c.get(EVENT_BUS),
36
- payment: c.get(PAYMENT_ADAPTER),
37
- identityReader: c.get(IDENTITY_READER),
38
- directory: c.get(ADMIN_USER_DIRECTORY),
39
- platformConfig: c.has(PLATFORM_CONFIG) ? c.get(PLATFORM_CONFIG) : undefined,
40
- limiter: c.get(RATE_LIMITER),
41
- riskTags: c.has(PLAYER_TAGS) ? c.get(PLAYER_TAGS) : undefined,
42
- tagEvaluationCommands: c.has(TAG_EVALUATION_COMMANDS)
43
- ? c.get(TAG_EVALUATION_COMMANDS)
44
- : undefined,
61
+ paymentProviders: c.get(PAYMENT_PROVIDERS),
45
62
  audit: c.get(AUDIT_WRITER),
46
- }), c.get(ADMIN_GUARD), c.get(AUDIT_WRITER), c.get(PAYMENT_ADAPTER), c.get(PAYMENT_WEBHOOK_VERIFIER)));
63
+ platformConfig: c.has(PLATFORM_CONFIG) ? c.get(PLATFORM_CONFIG) : undefined,
64
+ }));
65
+ ctx.jobs.worker({
66
+ queue: CUSTODY_SWEEP_QUEUE,
67
+ schema: CustodySweepJobPayloadSchema,
68
+ handler: async ({ payload }) => {
69
+ await sweepSvc?.runCycle(payload.runId);
70
+ },
71
+ });
72
+ ctx.routers.add('wallet', (c) => {
73
+ const jobQueue = c.get(JOB_QUEUE);
74
+ custodySweepService(c); // ensure sweepSvc is constructed for the job worker above
75
+ const sweepCron = (c.has(PLATFORM_CONFIG) ? c.get(PLATFORM_CONFIG) : undefined)?.wallet?.sweep?.cron ??
76
+ DEFAULT_SWEEP_CRON;
77
+ // Idempotent schedule (keyed by scheduleId). If platformConfig.wallet.sweep is
78
+ // absent, this still registers the tick - the handler just no-ops every time.
79
+ void jobQueue
80
+ .schedule(CUSTODY_SWEEP_QUEUE, 'wallet-custody-sweep.cron', {}, { cron: sweepCron })
81
+ .catch((err) => logger.error({ err }, 'wallet-custody-sweep schedule failed'));
82
+ return createWalletRouter({
83
+ wallet: new WalletService({
84
+ drizzle: c.get(DRIZZLE),
85
+ events: c.get(EVENT_BUS),
86
+ payment: c.get(PAYMENT_ADAPTER),
87
+ paymentProviders: c.get(PAYMENT_PROVIDERS),
88
+ identityReader: c.get(IDENTITY_READER),
89
+ directory: c.get(ADMIN_USER_DIRECTORY),
90
+ platformConfig: c.has(PLATFORM_CONFIG) ? c.get(PLATFORM_CONFIG) : undefined,
91
+ limiter: c.get(RATE_LIMITER),
92
+ riskTags: c.has(PLAYER_TAGS) ? c.get(PLAYER_TAGS) : undefined,
93
+ tagEvaluationCommands: c.has(TAG_EVALUATION_COMMANDS)
94
+ ? c.get(TAG_EVALUATION_COMMANDS)
95
+ : undefined,
96
+ audit: c.get(AUDIT_WRITER),
97
+ }),
98
+ adminGuard: c.get(ADMIN_GUARD),
99
+ audit: c.get(AUDIT_WRITER),
100
+ paymentProviders: c.get(PAYMENT_PROVIDERS),
101
+ limiter: c.get(RATE_LIMITER),
102
+ jobQueue,
103
+ });
104
+ });
47
105
  },
48
106
  };
49
107
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/wallet/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/wallet/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErF,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,YAAY,EACZ,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAEzF,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEtC,uFAAuF;AACvF,sFAAsF;AACtF,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,eAAe;IACb,sFAAsF;IACtF,uFAAuF;IACvF,iFAAiF;IACjF,yEAAyE;IACzE,EAAE,EAAE,QAAQ;IACZ,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,GAAG;QACV,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACzC,MAAM,aAAa,GAAG,CAAC;iBACpB,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,SAAS,CAAC,CAAC;YAC1D,OAAO,IAAI,0BAA0B,CAAC,aAAa,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,oFAAoF;QACpF,8EAA8E;QAC9E,uFAAuF;QACvF,iFAAiF;QACjF,gFAAgF;QAChF,iFAAiF;QACjF,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CACpB,IAAI,KAAK,wBAAwB;gBAC/B,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;gBACvF,CAAC,CAAC,IAAI;YACV,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,wBAAwB,CAAC;SACxC,CAAC,CAAC,CAAC;QACJ,oHAAoH;QACpH,GAAG,CAAC,OAAO,CACT,eAAe,EACf,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,qBAAqB,CACvB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EACvB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAC5D,CACJ,CAAC;QACF,oGAAoG;QACpG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3E,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5F,mFAAmF;QACnF,kFAAkF;QAClF,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAExF,oFAAoF;QACpF,iFAAiF;QACjF,+CAA+C;QAC/C,IAAI,QAAQ,GAA+B,IAAI,CAAC;QAChD,MAAM,mBAAmB,GAAG,CAAC,CAAmC,EAAE,EAAE,CAClE,CAAC,QAAQ,KAAK,IAAI,mBAAmB,CAAC;YACpC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAC1C,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;YAC1B,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC,CAAC,CAAC;QAEN,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACd,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,4BAA4B;YACpC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC7B,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;QAEH,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,0DAA0D;YAClF,MAAM,SAAS,GACb,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;gBAClF,kBAAkB,CAAC;YACrB,+EAA+E;YAC/E,8EAA8E;YAC9E,KAAK,QAAQ;iBACV,QAAQ,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iBACnF,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sCAAsC,CAAC,CAAC,CAAC;YAEjF,OAAO,kBAAkB,CAAC;gBACxB,MAAM,EAAE,IAAI,aAAa,CAAC;oBACxB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;oBACvB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;oBACxB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;oBAC/B,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;oBAC1C,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;oBACtC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC;oBACtC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3E,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;oBAC5B,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC7D,qBAAqB,EAAE,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC;wBACnD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC;wBAChC,CAAC,CAAC,SAAS;oBACb,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;iBAC3B,CAAC;gBACF,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC9B,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1B,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC1C,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CAC0C,CAAC"}
@@ -1,7 +1,21 @@
1
1
  import { type AdminGuard, type OssContext } from '@openora/core/server';
2
- import type { AuditWritePort, PaymentAdapter, PaymentWebhookVerifier } from '@openora/core/contracts';
2
+ import { type AuditWritePort, type JobQueueAdapter, type PaymentProviderRegistry, type RateLimiterAdapter, type RateLimitKey } from '@openora/core/contracts';
3
3
  import { WalletService } from '../service/wallet.service.js';
4
- export declare function createWalletRouter(wallet: WalletService, adminGuard: AdminGuard, audit: AuditWritePort, paymentAdapter: PaymentAdapter, webhookVerifier: PaymentWebhookVerifier): {
4
+ /**
5
+ * Named rather than positional. Half of these are structurally similar ports, so a
6
+ * positional slip type-checks; and the sweep and reconciliation branches each add their
7
+ * own dependencies here, which as positional parameters git merges into a signature that
8
+ * declares one twice without ever reporting a conflict.
9
+ */
10
+ export type WalletRouterDeps = {
11
+ wallet: WalletService;
12
+ adminGuard: AdminGuard;
13
+ audit: AuditWritePort;
14
+ paymentProviders: PaymentProviderRegistry;
15
+ limiter?: RateLimiterAdapter<RateLimitKey>;
16
+ jobQueue?: JobQueueAdapter;
17
+ };
18
+ export declare function createWalletRouter({ wallet, adminGuard, audit, paymentProviders, limiter, jobQueue, }: WalletRouterDeps): {
5
19
  getBalance: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodObject<{
6
20
  balance: import("zod").ZodString;
7
21
  currency: import("zod").ZodString;
@@ -38,6 +52,7 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
38
52
  withdraw: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
39
53
  amount: import("zod").ZodString;
40
54
  currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
55
+ network: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
41
56
  provider: import("zod").ZodOptional<import("zod").ZodString>;
42
57
  idempotencyKey: import("zod").ZodOptional<import("zod").ZodUUID>;
43
58
  destinationAddress: import("zod").ZodOptional<import("zod").ZodString>;
@@ -53,6 +68,28 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
53
68
  cancelled: "cancelled";
54
69
  }>;
55
70
  }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
71
+ manualAdjustment: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
72
+ userId: import("zod").ZodUUID;
73
+ direction: import("zod").ZodEnum<{
74
+ credit: "credit";
75
+ debit: "debit";
76
+ }>;
77
+ currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
78
+ amount: import("zod").ZodString;
79
+ reason: import("zod").ZodString;
80
+ idempotencyKey: import("zod").ZodUUID;
81
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
82
+ transactionId: import("zod").ZodUUID;
83
+ status: import("zod").ZodEnum<{
84
+ pending: "pending";
85
+ rejected: "rejected";
86
+ processing: "processing";
87
+ completed: "completed";
88
+ failed: "failed";
89
+ on_hold: "on_hold";
90
+ cancelled: "cancelled";
91
+ }>;
92
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
56
93
  listTransactions: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
57
94
  page: import("zod").ZodDefault<import("zod").ZodCoercedNumber<unknown>>;
58
95
  limit: import("zod").ZodDefault<import("zod").ZodCoercedNumber<unknown>>;
@@ -82,9 +119,12 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
82
119
  tip: "tip";
83
120
  gift: "gift";
84
121
  rain: "rain";
122
+ manual_credit: "manual_credit";
123
+ manual_debit: "manual_debit";
85
124
  }>;
86
125
  amount: import("zod").ZodString;
87
126
  currency: import("zod").ZodString;
127
+ network: import("zod").ZodNullable<import("zod").ZodString>;
88
128
  status: import("zod").ZodEnum<{
89
129
  pending: "pending";
90
130
  rejected: "rejected";
@@ -130,9 +170,12 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
130
170
  tip: "tip";
131
171
  gift: "gift";
132
172
  rain: "rain";
173
+ manual_credit: "manual_credit";
174
+ manual_debit: "manual_debit";
133
175
  }>;
134
176
  amount: import("zod").ZodString;
135
177
  currency: import("zod").ZodString;
178
+ network: import("zod").ZodNullable<import("zod").ZodString>;
136
179
  status: import("zod").ZodEnum<{
137
180
  pending: "pending";
138
181
  rejected: "rejected";
@@ -143,6 +186,9 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
143
186
  cancelled: "cancelled";
144
187
  }>;
145
188
  createdAt: import("zod").ZodISODateTime;
189
+ reviewedBy: import("zod").ZodNullable<import("zod").ZodUUID>;
190
+ reviewedAt: import("zod").ZodNullable<import("zod").ZodISODateTime>;
191
+ reviewReason: import("zod").ZodNullable<import("zod").ZodString>;
146
192
  }, import("zod/v4/core").$strip>>;
147
193
  total: import("zod").ZodNumber;
148
194
  page: import("zod").ZodNumber;
@@ -199,6 +245,7 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
199
245
  username: import("zod").ZodString;
200
246
  amount: import("zod").ZodString;
201
247
  currency: import("zod").ZodString;
248
+ network: import("zod").ZodNullable<import("zod").ZodString>;
202
249
  rail: import("zod").ZodNullable<import("zod").ZodEnum<{
203
250
  crypto: "crypto";
204
251
  fiat: "fiat";
@@ -364,10 +411,96 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
364
411
  createdAt: import("zod").ZodISODateTime;
365
412
  }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
366
413
  };
414
+ listAssets: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodArray<import("zod").ZodObject<{
415
+ currency: import("zod").ZodString;
416
+ network: import("zod").ZodString;
417
+ minDeposit: import("zod").ZodString;
418
+ minWithdrawal: import("zod").ZodString;
419
+ withdrawalFee: import("zod").ZodString;
420
+ depositEnabled: import("zod").ZodBoolean;
421
+ withdrawalEnabled: import("zod").ZodBoolean;
422
+ }, import("zod/v4/core").$strip>>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
423
+ assets: {
424
+ list: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodArray<import("zod").ZodObject<{
425
+ currency: import("zod").ZodString;
426
+ network: import("zod").ZodString;
427
+ minDeposit: import("zod").ZodString;
428
+ minWithdrawal: import("zod").ZodString;
429
+ withdrawalFee: import("zod").ZodString;
430
+ depositEnabled: import("zod").ZodBoolean;
431
+ withdrawalEnabled: import("zod").ZodBoolean;
432
+ id: import("zod").ZodUUID;
433
+ providerAssetId: import("zod").ZodString;
434
+ providerName: import("zod").ZodNullable<import("zod").ZodString>;
435
+ sweepFeeCeiling: import("zod").ZodNullable<import("zod").ZodString>;
436
+ poolLiquidityFloor: import("zod").ZodNullable<import("zod").ZodString>;
437
+ createdAt: import("zod").ZodISODateTime;
438
+ updatedAt: import("zod").ZodISODateTime;
439
+ }, import("zod/v4/core").$strip>>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
440
+ create: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
441
+ currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
442
+ network: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
443
+ providerAssetId: import("zod").ZodString;
444
+ minDeposit: import("zod").ZodString;
445
+ minWithdrawal: import("zod").ZodString;
446
+ withdrawalFee: import("zod").ZodString;
447
+ depositEnabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
448
+ withdrawalEnabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
449
+ providerName: import("zod").ZodOptional<import("zod").ZodString>;
450
+ sweepFeeCeiling: import("zod").ZodOptional<import("zod").ZodString>;
451
+ poolLiquidityFloor: import("zod").ZodOptional<import("zod").ZodString>;
452
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
453
+ currency: import("zod").ZodString;
454
+ network: import("zod").ZodString;
455
+ minDeposit: import("zod").ZodString;
456
+ minWithdrawal: import("zod").ZodString;
457
+ withdrawalFee: import("zod").ZodString;
458
+ depositEnabled: import("zod").ZodBoolean;
459
+ withdrawalEnabled: import("zod").ZodBoolean;
460
+ id: import("zod").ZodUUID;
461
+ providerAssetId: import("zod").ZodString;
462
+ providerName: import("zod").ZodNullable<import("zod").ZodString>;
463
+ sweepFeeCeiling: import("zod").ZodNullable<import("zod").ZodString>;
464
+ poolLiquidityFloor: import("zod").ZodNullable<import("zod").ZodString>;
465
+ createdAt: import("zod").ZodISODateTime;
466
+ updatedAt: import("zod").ZodISODateTime;
467
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
468
+ update: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
469
+ currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
470
+ network: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
471
+ providerAssetId: import("zod").ZodOptional<import("zod").ZodString>;
472
+ minDeposit: import("zod").ZodOptional<import("zod").ZodString>;
473
+ minWithdrawal: import("zod").ZodOptional<import("zod").ZodString>;
474
+ withdrawalFee: import("zod").ZodOptional<import("zod").ZodString>;
475
+ depositEnabled: import("zod").ZodOptional<import("zod").ZodBoolean>;
476
+ withdrawalEnabled: import("zod").ZodOptional<import("zod").ZodBoolean>;
477
+ sweepFeeCeiling: import("zod").ZodOptional<import("zod").ZodString>;
478
+ poolLiquidityFloor: import("zod").ZodOptional<import("zod").ZodString>;
479
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
480
+ currency: import("zod").ZodString;
481
+ network: import("zod").ZodString;
482
+ minDeposit: import("zod").ZodString;
483
+ minWithdrawal: import("zod").ZodString;
484
+ withdrawalFee: import("zod").ZodString;
485
+ depositEnabled: import("zod").ZodBoolean;
486
+ withdrawalEnabled: import("zod").ZodBoolean;
487
+ id: import("zod").ZodUUID;
488
+ providerAssetId: import("zod").ZodString;
489
+ providerName: import("zod").ZodNullable<import("zod").ZodString>;
490
+ sweepFeeCeiling: import("zod").ZodNullable<import("zod").ZodString>;
491
+ poolLiquidityFloor: import("zod").ZodNullable<import("zod").ZodString>;
492
+ createdAt: import("zod").ZodISODateTime;
493
+ updatedAt: import("zod").ZodISODateTime;
494
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
495
+ delete: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
496
+ currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
497
+ network: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
498
+ }, import("zod/v4/core").$strip>, import("zod").ZodBoolean, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
499
+ };
367
500
  deposits: {
368
501
  getAddress: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
369
502
  currency: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
370
- network: import("zod").ZodOptional<import("zod").ZodString>;
503
+ network: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
371
504
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
372
505
  address: import("zod").ZodString;
373
506
  currency: import("zod").ZodString;
@@ -378,5 +511,118 @@ export declare function createWalletRouter(wallet: WalletService, adminGuard: Ad
378
511
  webhook: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>, import("zod").ZodObject<{
379
512
  ok: import("zod").ZodLiteral<true>;
380
513
  }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
514
+ webhookForProvider: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
515
+ provider: import("zod").ZodString;
516
+ }, import("zod/v4/core").$catchall<import("zod").ZodUnknown>>, import("zod").ZodObject<{
517
+ ok: import("zod").ZodLiteral<true>;
518
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
519
+ custody: {
520
+ sweep: {
521
+ run: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodObject<{
522
+ runId: import("zod").ZodUUID;
523
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
524
+ };
525
+ };
526
+ reconciliation: {
527
+ list: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
528
+ page: import("zod").ZodDefault<import("zod").ZodCoercedNumber<unknown>>;
529
+ limit: import("zod").ZodDefault<import("zod").ZodCoercedNumber<unknown>>;
530
+ status: import("zod").ZodOptional<import("zod").ZodEnum<{
531
+ open: "open";
532
+ resolved: "resolved";
533
+ }>>;
534
+ kind: import("zod").ZodOptional<import("zod").ZodEnum<{
535
+ missing_deposit: "missing_deposit";
536
+ unattributed_deposit: "unattributed_deposit";
537
+ amount_mismatch: "amount_mismatch";
538
+ currency_mismatch: "currency_mismatch";
539
+ status_mismatch: "status_mismatch";
540
+ unknown_at_provider: "unknown_at_provider";
541
+ unconfigured_asset: "unconfigured_asset";
542
+ stuck_sweep: "stuck_sweep";
543
+ }>>;
544
+ providerName: import("zod").ZodOptional<import("zod").ZodString>;
545
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
546
+ items: import("zod").ZodArray<import("zod").ZodObject<{
547
+ id: import("zod").ZodUUID;
548
+ runId: import("zod").ZodUUID;
549
+ providerName: import("zod").ZodString;
550
+ kind: import("zod").ZodEnum<{
551
+ missing_deposit: "missing_deposit";
552
+ unattributed_deposit: "unattributed_deposit";
553
+ amount_mismatch: "amount_mismatch";
554
+ currency_mismatch: "currency_mismatch";
555
+ status_mismatch: "status_mismatch";
556
+ unknown_at_provider: "unknown_at_provider";
557
+ unconfigured_asset: "unconfigured_asset";
558
+ stuck_sweep: "stuck_sweep";
559
+ }>;
560
+ currency: import("zod").ZodNullable<import("zod").ZodString>;
561
+ network: import("zod").ZodNullable<import("zod").ZodString>;
562
+ amount: import("zod").ZodNullable<import("zod").ZodString>;
563
+ address: import("zod").ZodNullable<import("zod").ZodString>;
564
+ tag: import("zod").ZodNullable<import("zod").ZodString>;
565
+ txHash: import("zod").ZodNullable<import("zod").ZodString>;
566
+ externalId: import("zod").ZodNullable<import("zod").ZodString>;
567
+ transactionId: import("zod").ZodNullable<import("zod").ZodUUID>;
568
+ detail: import("zod").ZodNullable<import("zod").ZodString>;
569
+ status: import("zod").ZodEnum<{
570
+ open: "open";
571
+ resolved: "resolved";
572
+ }>;
573
+ resolvedBy: import("zod").ZodNullable<import("zod").ZodUUID>;
574
+ resolvedAt: import("zod").ZodNullable<import("zod").ZodISODateTime>;
575
+ resolutionNote: import("zod").ZodNullable<import("zod").ZodString>;
576
+ createdAt: import("zod").ZodISODateTime;
577
+ }, import("zod/v4/core").$strip>>;
578
+ total: import("zod").ZodNumber;
579
+ page: import("zod").ZodNumber;
580
+ limit: import("zod").ZodNumber;
581
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
582
+ resolve: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("zod").ZodObject<{
583
+ id: import("zod").ZodUUID;
584
+ resolution: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
585
+ outcome: import("zod").ZodLiteral<"credited">;
586
+ transactionId: import("zod").ZodUUID;
587
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
588
+ outcome: import("zod").ZodLiteral<"dismissed">;
589
+ note: import("zod").ZodString;
590
+ }, import("zod/v4/core").$strip>], "outcome">;
591
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
592
+ id: import("zod").ZodUUID;
593
+ runId: import("zod").ZodUUID;
594
+ providerName: import("zod").ZodString;
595
+ kind: import("zod").ZodEnum<{
596
+ missing_deposit: "missing_deposit";
597
+ unattributed_deposit: "unattributed_deposit";
598
+ amount_mismatch: "amount_mismatch";
599
+ currency_mismatch: "currency_mismatch";
600
+ status_mismatch: "status_mismatch";
601
+ unknown_at_provider: "unknown_at_provider";
602
+ unconfigured_asset: "unconfigured_asset";
603
+ stuck_sweep: "stuck_sweep";
604
+ }>;
605
+ currency: import("zod").ZodNullable<import("zod").ZodString>;
606
+ network: import("zod").ZodNullable<import("zod").ZodString>;
607
+ amount: import("zod").ZodNullable<import("zod").ZodString>;
608
+ address: import("zod").ZodNullable<import("zod").ZodString>;
609
+ tag: import("zod").ZodNullable<import("zod").ZodString>;
610
+ txHash: import("zod").ZodNullable<import("zod").ZodString>;
611
+ externalId: import("zod").ZodNullable<import("zod").ZodString>;
612
+ transactionId: import("zod").ZodNullable<import("zod").ZodUUID>;
613
+ detail: import("zod").ZodNullable<import("zod").ZodString>;
614
+ status: import("zod").ZodEnum<{
615
+ open: "open";
616
+ resolved: "resolved";
617
+ }>;
618
+ resolvedBy: import("zod").ZodNullable<import("zod").ZodUUID>;
619
+ resolvedAt: import("zod").ZodNullable<import("zod").ZodISODateTime>;
620
+ resolutionNote: import("zod").ZodNullable<import("zod").ZodString>;
621
+ createdAt: import("zod").ZodISODateTime;
622
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
623
+ run: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<OssContext & Record<never, never>, OssContext & Record<never, never>, OssContext>, OssContext, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodObject<{
624
+ runId: import("zod").ZodUUID;
625
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
626
+ };
381
627
  };
382
628
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wallet/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EAWd,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,cAAc,EACrB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4MxC"}
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,kBAAkB,EACvB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,aAAa,EAsBd,MAAM,8BAA8B,CAAC;AAgDtC;;;;;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,OAAO,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,QAAQ,GACT,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6UlB"}