@waiaas/daemon 2.5.0 → 2.6.0-rc

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 (142) hide show
  1. package/dist/api/middleware/error-handler.d.ts +1 -1
  2. package/dist/api/middleware/error-handler.js +2 -2
  3. package/dist/api/middleware/error-handler.js.map +1 -1
  4. package/dist/api/routes/admin.d.ts.map +1 -1
  5. package/dist/api/routes/admin.js +6 -30
  6. package/dist/api/routes/admin.js.map +1 -1
  7. package/dist/api/routes/incoming.d.ts +40 -0
  8. package/dist/api/routes/incoming.d.ts.map +1 -0
  9. package/dist/api/routes/incoming.js +281 -0
  10. package/dist/api/routes/incoming.js.map +1 -0
  11. package/dist/api/routes/openapi-schemas.d.ts +243 -2
  12. package/dist/api/routes/openapi-schemas.d.ts.map +1 -1
  13. package/dist/api/routes/openapi-schemas.js +77 -0
  14. package/dist/api/routes/openapi-schemas.js.map +1 -1
  15. package/dist/api/routes/wallets.d.ts +4 -0
  16. package/dist/api/routes/wallets.d.ts.map +1 -1
  17. package/dist/api/routes/wallets.js +173 -1
  18. package/dist/api/routes/wallets.js.map +1 -1
  19. package/dist/api/routes/x402.js +1 -1
  20. package/dist/api/routes/x402.js.map +1 -1
  21. package/dist/api/server.d.ts +4 -0
  22. package/dist/api/server.d.ts.map +1 -1
  23. package/dist/api/server.js +12 -0
  24. package/dist/api/server.js.map +1 -1
  25. package/dist/infrastructure/config/loader.d.ts +43 -0
  26. package/dist/infrastructure/config/loader.d.ts.map +1 -1
  27. package/dist/infrastructure/config/loader.js +13 -1
  28. package/dist/infrastructure/config/loader.js.map +1 -1
  29. package/dist/infrastructure/database/index.d.ts +1 -1
  30. package/dist/infrastructure/database/index.d.ts.map +1 -1
  31. package/dist/infrastructure/database/index.js +1 -1
  32. package/dist/infrastructure/database/index.js.map +1 -1
  33. package/dist/infrastructure/database/migrate.d.ts +2 -2
  34. package/dist/infrastructure/database/migrate.d.ts.map +1 -1
  35. package/dist/infrastructure/database/migrate.js +83 -5
  36. package/dist/infrastructure/database/migrate.js.map +1 -1
  37. package/dist/infrastructure/database/schema.d.ts +381 -1
  38. package/dist/infrastructure/database/schema.d.ts.map +1 -1
  39. package/dist/infrastructure/database/schema.js +42 -2
  40. package/dist/infrastructure/database/schema.js.map +1 -1
  41. package/dist/infrastructure/settings/hot-reload.d.ts +9 -0
  42. package/dist/infrastructure/settings/hot-reload.d.ts.map +1 -1
  43. package/dist/infrastructure/settings/hot-reload.js +34 -5
  44. package/dist/infrastructure/settings/hot-reload.js.map +1 -1
  45. package/dist/infrastructure/settings/setting-keys.d.ts +2 -2
  46. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -1
  47. package/dist/infrastructure/settings/setting-keys.js +12 -3
  48. package/dist/infrastructure/settings/setting-keys.js.map +1 -1
  49. package/dist/lifecycle/daemon.d.ts +3 -1
  50. package/dist/lifecycle/daemon.d.ts.map +1 -1
  51. package/dist/lifecycle/daemon.js +84 -4
  52. package/dist/lifecycle/daemon.js.map +1 -1
  53. package/dist/notifications/channels/discord.d.ts.map +1 -1
  54. package/dist/notifications/channels/discord.js +17 -8
  55. package/dist/notifications/channels/discord.js.map +1 -1
  56. package/dist/notifications/channels/format-utils.d.ts +11 -0
  57. package/dist/notifications/channels/format-utils.d.ts.map +1 -0
  58. package/dist/notifications/channels/format-utils.js +19 -0
  59. package/dist/notifications/channels/format-utils.js.map +1 -0
  60. package/dist/notifications/channels/ntfy.d.ts.map +1 -1
  61. package/dist/notifications/channels/ntfy.js +15 -2
  62. package/dist/notifications/channels/ntfy.js.map +1 -1
  63. package/dist/notifications/channels/slack.d.ts.map +1 -1
  64. package/dist/notifications/channels/slack.js +16 -7
  65. package/dist/notifications/channels/slack.js.map +1 -1
  66. package/dist/notifications/channels/telegram.d.ts.map +1 -1
  67. package/dist/notifications/channels/telegram.js +17 -5
  68. package/dist/notifications/channels/telegram.js.map +1 -1
  69. package/dist/notifications/notification-service.d.ts +14 -0
  70. package/dist/notifications/notification-service.d.ts.map +1 -1
  71. package/dist/notifications/notification-service.js +83 -2
  72. package/dist/notifications/notification-service.js.map +1 -1
  73. package/dist/services/incoming/__tests__/incoming-tx-monitor-service.test.d.ts +11 -0
  74. package/dist/services/incoming/__tests__/incoming-tx-monitor-service.test.d.ts.map +1 -0
  75. package/dist/services/incoming/__tests__/incoming-tx-monitor-service.test.js +432 -0
  76. package/dist/services/incoming/__tests__/incoming-tx-monitor-service.test.js.map +1 -0
  77. package/dist/services/incoming/__tests__/incoming-tx-queue.test.d.ts +12 -0
  78. package/dist/services/incoming/__tests__/incoming-tx-queue.test.d.ts.map +1 -0
  79. package/dist/services/incoming/__tests__/incoming-tx-queue.test.js +419 -0
  80. package/dist/services/incoming/__tests__/incoming-tx-queue.test.js.map +1 -0
  81. package/dist/services/incoming/__tests__/incoming-tx-workers.test.d.ts +14 -0
  82. package/dist/services/incoming/__tests__/incoming-tx-workers.test.d.ts.map +1 -0
  83. package/dist/services/incoming/__tests__/incoming-tx-workers.test.js +452 -0
  84. package/dist/services/incoming/__tests__/incoming-tx-workers.test.js.map +1 -0
  85. package/dist/services/incoming/__tests__/integration-pitfall.test.d.ts +17 -0
  86. package/dist/services/incoming/__tests__/integration-pitfall.test.d.ts.map +1 -0
  87. package/dist/services/incoming/__tests__/integration-pitfall.test.js +653 -0
  88. package/dist/services/incoming/__tests__/integration-pitfall.test.js.map +1 -0
  89. package/dist/services/incoming/__tests__/integration-resilience.test.d.ts +14 -0
  90. package/dist/services/incoming/__tests__/integration-resilience.test.d.ts.map +1 -0
  91. package/dist/services/incoming/__tests__/integration-resilience.test.js +501 -0
  92. package/dist/services/incoming/__tests__/integration-resilience.test.js.map +1 -0
  93. package/dist/services/incoming/__tests__/integration-wiring.test.d.ts +15 -0
  94. package/dist/services/incoming/__tests__/integration-wiring.test.d.ts.map +1 -0
  95. package/dist/services/incoming/__tests__/integration-wiring.test.js +355 -0
  96. package/dist/services/incoming/__tests__/integration-wiring.test.js.map +1 -0
  97. package/dist/services/incoming/__tests__/safety-rules.test.d.ts +10 -0
  98. package/dist/services/incoming/__tests__/safety-rules.test.d.ts.map +1 -0
  99. package/dist/services/incoming/__tests__/safety-rules.test.js +165 -0
  100. package/dist/services/incoming/__tests__/safety-rules.test.js.map +1 -0
  101. package/dist/services/incoming/__tests__/subscription-multiplexer.test.d.ts +2 -0
  102. package/dist/services/incoming/__tests__/subscription-multiplexer.test.d.ts.map +1 -0
  103. package/dist/services/incoming/__tests__/subscription-multiplexer.test.js +267 -0
  104. package/dist/services/incoming/__tests__/subscription-multiplexer.test.js.map +1 -0
  105. package/dist/services/incoming/incoming-tx-monitor-service.d.ts +98 -0
  106. package/dist/services/incoming/incoming-tx-monitor-service.d.ts.map +1 -0
  107. package/dist/services/incoming/incoming-tx-monitor-service.js +336 -0
  108. package/dist/services/incoming/incoming-tx-monitor-service.js.map +1 -0
  109. package/dist/services/incoming/incoming-tx-queue.d.ts +52 -0
  110. package/dist/services/incoming/incoming-tx-queue.d.ts.map +1 -0
  111. package/dist/services/incoming/incoming-tx-queue.js +109 -0
  112. package/dist/services/incoming/incoming-tx-queue.js.map +1 -0
  113. package/dist/services/incoming/incoming-tx-workers.d.ts +89 -0
  114. package/dist/services/incoming/incoming-tx-workers.d.ts.map +1 -0
  115. package/dist/services/incoming/incoming-tx-workers.js +176 -0
  116. package/dist/services/incoming/incoming-tx-workers.js.map +1 -0
  117. package/dist/services/incoming/index.d.ts +14 -0
  118. package/dist/services/incoming/index.d.ts.map +1 -0
  119. package/dist/services/incoming/index.js +11 -0
  120. package/dist/services/incoming/index.js.map +1 -0
  121. package/dist/services/incoming/safety-rules.d.ts +70 -0
  122. package/dist/services/incoming/safety-rules.d.ts.map +1 -0
  123. package/dist/services/incoming/safety-rules.js +68 -0
  124. package/dist/services/incoming/safety-rules.js.map +1 -0
  125. package/dist/services/incoming/subscription-multiplexer.d.ts +87 -0
  126. package/dist/services/incoming/subscription-multiplexer.d.ts.map +1 -0
  127. package/dist/services/incoming/subscription-multiplexer.js +169 -0
  128. package/dist/services/incoming/subscription-multiplexer.js.map +1 -0
  129. package/dist/services/signing-sdk/approval-channel-router.d.ts +1 -1
  130. package/dist/services/signing-sdk/approval-channel-router.d.ts.map +1 -1
  131. package/dist/services/signing-sdk/approval-channel-router.js +2 -3
  132. package/dist/services/signing-sdk/approval-channel-router.js.map +1 -1
  133. package/dist/services/signing-sdk/channels/wallet-notification-channel.js +1 -1
  134. package/dist/services/signing-sdk/channels/wallet-notification-channel.js.map +1 -1
  135. package/dist/services/x402/x402-domain-policy.d.ts +6 -1
  136. package/dist/services/x402/x402-domain-policy.d.ts.map +1 -1
  137. package/dist/services/x402/x402-domain-policy.js +6 -2
  138. package/dist/services/x402/x402-domain-policy.js.map +1 -1
  139. package/package.json +4 -4
  140. package/public/admin/assets/index-D06O_cSo.js +1 -0
  141. package/public/admin/index.html +1 -1
  142. package/public/admin/assets/index-BLLOYSZp.js +0 -1
@@ -0,0 +1,267 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { SubscriptionMultiplexer, } from '../subscription-multiplexer.js';
3
+ function createMockSubscriber(chain = 'solana') {
4
+ let disconnectResolve = null;
5
+ const mock = {
6
+ chain,
7
+ subscribe: vi.fn().mockResolvedValue(undefined),
8
+ unsubscribe: vi.fn().mockResolvedValue(undefined),
9
+ subscribedWallets: vi.fn().mockReturnValue([]),
10
+ connect: vi.fn().mockResolvedValue(undefined),
11
+ waitForDisconnect: vi.fn().mockImplementation(() => new Promise((resolve) => { disconnectResolve = resolve; })),
12
+ destroy: vi.fn().mockResolvedValue(undefined),
13
+ _triggerDisconnect() {
14
+ disconnectResolve?.();
15
+ disconnectResolve = null;
16
+ },
17
+ };
18
+ return mock;
19
+ }
20
+ // ── Tests ────────────────────────────────────────────────────────
21
+ describe('SubscriptionMultiplexer', () => {
22
+ let subscriberFactory;
23
+ let onTransaction;
24
+ let onGapRecovery;
25
+ let mockSubscribers;
26
+ beforeEach(() => {
27
+ mockSubscribers = [];
28
+ subscriberFactory = vi.fn().mockImplementation((chain) => {
29
+ const sub = createMockSubscriber(chain);
30
+ mockSubscribers.push(sub);
31
+ return sub;
32
+ });
33
+ onTransaction = vi.fn();
34
+ onGapRecovery = vi.fn().mockResolvedValue(undefined);
35
+ });
36
+ function createMultiplexer(overrides = {}) {
37
+ return new SubscriptionMultiplexer({
38
+ subscriberFactory,
39
+ onTransaction,
40
+ onGapRecovery,
41
+ reconnectConfig: {
42
+ initialDelayMs: 100,
43
+ maxDelayMs: 200,
44
+ maxAttempts: 3,
45
+ jitterFactor: 0,
46
+ pollingFallbackThreshold: 2,
47
+ },
48
+ ...overrides,
49
+ });
50
+ }
51
+ // ── Connection Sharing ──────────────────────────────────────
52
+ describe('connection sharing', () => {
53
+ it('reuses connection for same chain:network pair', async () => {
54
+ const mux = createMultiplexer();
55
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
56
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
57
+ // subscriberFactory should only be called once
58
+ expect(subscriberFactory).toHaveBeenCalledTimes(1);
59
+ expect(subscriberFactory).toHaveBeenCalledWith('solana', 'mainnet');
60
+ // Both wallets should be subscribed through the same subscriber
61
+ const sub = mockSubscribers[0];
62
+ expect(sub.subscribe).toHaveBeenCalledTimes(2);
63
+ expect(sub.subscribe).toHaveBeenCalledWith('w1', 'addr1', 'mainnet', onTransaction);
64
+ expect(sub.subscribe).toHaveBeenCalledWith('w2', 'addr2', 'mainnet', onTransaction);
65
+ // connect() only called once (for the first wallet)
66
+ expect(sub.connect).toHaveBeenCalledTimes(1);
67
+ await mux.stopAll();
68
+ });
69
+ it('reports shared connection with correct wallet count', async () => {
70
+ const mux = createMultiplexer();
71
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
72
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
73
+ const connections = mux.getActiveConnections();
74
+ expect(connections).toHaveLength(1);
75
+ expect(connections[0]).toEqual({
76
+ key: 'solana:mainnet',
77
+ walletCount: 2,
78
+ state: 'WS_ACTIVE',
79
+ });
80
+ await mux.stopAll();
81
+ });
82
+ });
83
+ // ── Different Networks Create Separate Connections ──────────
84
+ describe('separate connections per network', () => {
85
+ it('creates separate connections for different networks', async () => {
86
+ const mux = createMultiplexer();
87
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
88
+ await mux.addWallet('solana', 'devnet', 'w2', 'addr2');
89
+ expect(subscriberFactory).toHaveBeenCalledTimes(2);
90
+ expect(subscriberFactory).toHaveBeenCalledWith('solana', 'mainnet');
91
+ expect(subscriberFactory).toHaveBeenCalledWith('solana', 'devnet');
92
+ const connections = mux.getActiveConnections();
93
+ expect(connections).toHaveLength(2);
94
+ await mux.stopAll();
95
+ });
96
+ it('creates separate connections for different chains', async () => {
97
+ const mux = createMultiplexer();
98
+ await mux.addWallet('solana', 'mainnet', 'w1', 'sol-addr');
99
+ await mux.addWallet('evm', 'ethereum-mainnet', 'w2', 'evm-addr');
100
+ expect(subscriberFactory).toHaveBeenCalledTimes(2);
101
+ const connections = mux.getActiveConnections();
102
+ expect(connections).toHaveLength(2);
103
+ await mux.stopAll();
104
+ });
105
+ });
106
+ // ── removeWallet Cleanup ───────────────────────────────────
107
+ describe('removeWallet cleanup', () => {
108
+ it('keeps connection when other wallets remain', async () => {
109
+ const mux = createMultiplexer();
110
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
111
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
112
+ await mux.removeWallet('solana', 'mainnet', 'w1');
113
+ const sub = mockSubscribers[0];
114
+ expect(sub.unsubscribe).toHaveBeenCalledWith('w1');
115
+ expect(sub.destroy).not.toHaveBeenCalled();
116
+ const connections = mux.getActiveConnections();
117
+ expect(connections).toHaveLength(1);
118
+ expect(connections[0].walletCount).toBe(1);
119
+ await mux.stopAll();
120
+ });
121
+ it('destroys connection when last wallet is removed', async () => {
122
+ const mux = createMultiplexer();
123
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
124
+ await mux.removeWallet('solana', 'mainnet', 'w1');
125
+ const sub = mockSubscribers[0];
126
+ expect(sub.unsubscribe).toHaveBeenCalledWith('w1');
127
+ expect(sub.destroy).toHaveBeenCalledTimes(1);
128
+ const connections = mux.getActiveConnections();
129
+ expect(connections).toHaveLength(0);
130
+ });
131
+ it('is a no-op for unknown chain:network', async () => {
132
+ const mux = createMultiplexer();
133
+ // Should not throw
134
+ await mux.removeWallet('solana', 'mainnet', 'w1');
135
+ expect(mux.getActiveConnections()).toHaveLength(0);
136
+ });
137
+ it('removes two wallets sequentially, destroying connection on last', async () => {
138
+ const mux = createMultiplexer();
139
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
140
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
141
+ await mux.removeWallet('solana', 'mainnet', 'w1');
142
+ expect(mux.getActiveConnections()[0].walletCount).toBe(1);
143
+ await mux.removeWallet('solana', 'mainnet', 'w2');
144
+ expect(mux.getActiveConnections()).toHaveLength(0);
145
+ const sub = mockSubscribers[0];
146
+ expect(sub.destroy).toHaveBeenCalledTimes(1);
147
+ });
148
+ });
149
+ // ── getConnectionState ─────────────────────────────────────
150
+ describe('getConnectionState', () => {
151
+ it('returns null for unknown connection', () => {
152
+ const mux = createMultiplexer();
153
+ expect(mux.getConnectionState('solana', 'mainnet')).toBeNull();
154
+ });
155
+ it('returns WS_ACTIVE after successful addWallet', async () => {
156
+ const mux = createMultiplexer();
157
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
158
+ expect(mux.getConnectionState('solana', 'mainnet')).toBe('WS_ACTIVE');
159
+ await mux.stopAll();
160
+ });
161
+ it('returns null after all wallets removed', async () => {
162
+ const mux = createMultiplexer();
163
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
164
+ await mux.removeWallet('solana', 'mainnet', 'w1');
165
+ expect(mux.getConnectionState('solana', 'mainnet')).toBeNull();
166
+ });
167
+ });
168
+ // ── stopAll ────────────────────────────────────────────────
169
+ describe('stopAll', () => {
170
+ it('destroys all subscribers and clears connections', async () => {
171
+ const mux = createMultiplexer();
172
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
173
+ await mux.addWallet('solana', 'devnet', 'w2', 'addr2');
174
+ await mux.addWallet('evm', 'ethereum-mainnet', 'w3', 'evm-addr');
175
+ expect(mux.getActiveConnections()).toHaveLength(3);
176
+ await mux.stopAll();
177
+ expect(mux.getActiveConnections()).toHaveLength(0);
178
+ // All subscribers should be destroyed
179
+ for (const sub of mockSubscribers) {
180
+ expect(sub.destroy).toHaveBeenCalledTimes(1);
181
+ }
182
+ });
183
+ it('unsubscribes all wallets before destroying', async () => {
184
+ const mux = createMultiplexer();
185
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
186
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
187
+ await mux.stopAll();
188
+ const sub = mockSubscribers[0];
189
+ expect(sub.unsubscribe).toHaveBeenCalledWith('w1');
190
+ expect(sub.unsubscribe).toHaveBeenCalledWith('w2');
191
+ expect(sub.destroy).toHaveBeenCalledTimes(1);
192
+ });
193
+ it('is safe to call on empty multiplexer', async () => {
194
+ const mux = createMultiplexer();
195
+ await mux.stopAll();
196
+ expect(mux.getActiveConnections()).toHaveLength(0);
197
+ });
198
+ });
199
+ // ── Gap Recovery ───────────────────────────────────────────
200
+ describe('gap recovery', () => {
201
+ it('stores onGapRecovery callback and wires it for post-reconnect invocation', async () => {
202
+ const mux = createMultiplexer();
203
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
204
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
205
+ // Gap recovery not called on initial connect
206
+ expect(onGapRecovery).not.toHaveBeenCalled();
207
+ await mux.stopAll();
208
+ });
209
+ it('works without onGapRecovery callback (optional dep)', async () => {
210
+ const mux = createMultiplexer({ onGapRecovery: undefined });
211
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
212
+ // Should not throw
213
+ expect(mux.getConnectionState('solana', 'mainnet')).toBe('WS_ACTIVE');
214
+ await mux.stopAll();
215
+ });
216
+ });
217
+ // ── Edge Cases ─────────────────────────────────────────────
218
+ describe('edge cases', () => {
219
+ it('handles adding wallet to existing connection after removing another', async () => {
220
+ const mux = createMultiplexer();
221
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
222
+ await mux.addWallet('solana', 'mainnet', 'w2', 'addr2');
223
+ await mux.removeWallet('solana', 'mainnet', 'w1');
224
+ await mux.addWallet('solana', 'mainnet', 'w3', 'addr3');
225
+ // Still only one subscriber factory call (same connection)
226
+ expect(subscriberFactory).toHaveBeenCalledTimes(1);
227
+ const connections = mux.getActiveConnections();
228
+ expect(connections).toHaveLength(1);
229
+ expect(connections[0].walletCount).toBe(2); // w2 + w3
230
+ await mux.stopAll();
231
+ });
232
+ it('can re-add wallet after full removal + reconnection', async () => {
233
+ const mux = createMultiplexer();
234
+ // Add and fully remove
235
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
236
+ await mux.removeWallet('solana', 'mainnet', 'w1');
237
+ expect(mux.getActiveConnections()).toHaveLength(0);
238
+ // Re-add creates new connection
239
+ await mux.addWallet('solana', 'mainnet', 'w1', 'addr1');
240
+ expect(subscriberFactory).toHaveBeenCalledTimes(2);
241
+ expect(mux.getActiveConnections()).toHaveLength(1);
242
+ await mux.stopAll();
243
+ });
244
+ it('getActiveConnections returns correct state for multiple connections', async () => {
245
+ const mux = createMultiplexer();
246
+ await mux.addWallet('solana', 'mainnet', 'w1', 'sol-addr1');
247
+ await mux.addWallet('solana', 'mainnet', 'w2', 'sol-addr2');
248
+ await mux.addWallet('evm', 'ethereum-mainnet', 'w3', 'evm-addr1');
249
+ const connections = mux.getActiveConnections();
250
+ expect(connections).toHaveLength(2);
251
+ const solConnection = connections.find((c) => c.key === 'solana:mainnet');
252
+ const evmConnection = connections.find((c) => c.key === 'evm:ethereum-mainnet');
253
+ expect(solConnection).toEqual({
254
+ key: 'solana:mainnet',
255
+ walletCount: 2,
256
+ state: 'WS_ACTIVE',
257
+ });
258
+ expect(evmConnection).toEqual({
259
+ key: 'evm:ethereum-mainnet',
260
+ walletCount: 1,
261
+ state: 'WS_ACTIVE',
262
+ });
263
+ await mux.stopAll();
264
+ });
265
+ });
266
+ });
267
+ //# sourceMappingURL=subscription-multiplexer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-multiplexer.test.js","sourceRoot":"","sources":["../../../../src/services/incoming/__tests__/subscription-multiplexer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * IncomingTxMonitorService -- top-level orchestrator for incoming transaction monitoring.
3
+ *
4
+ * Wires together:
5
+ * - IncomingTxQueue (memory buffer + batch flush)
6
+ * - SubscriptionMultiplexer (shared chain connections per chain:network)
7
+ * - BackgroundWorkers (6 periodic tasks: flush, retention, 2x confirmation, 2x polling)
8
+ * - Safety rules (DustAttackRule, UnknownTokenRule, LargeAmountRule)
9
+ * - EventBus (transaction:incoming, transaction:incoming:suspicious events)
10
+ * - KillSwitchService (notification suppression when SUSPENDED/LOCKED)
11
+ * - NotificationService (per-wallet per-event-type cooldown)
12
+ *
13
+ * Lifecycle:
14
+ * - start(): create queue + multiplexer, load wallets, register workers
15
+ * - stop(): drain queue, stop all subscriptions, clear cooldowns
16
+ * - updateConfig(): merge partial config (used by HotReloadOrchestrator)
17
+ * - syncSubscriptions(): reconcile DB wallets with active multiplexer subscriptions
18
+ *
19
+ * @see docs/76-incoming-transaction-monitoring.md
20
+ */
21
+ import type { Database } from 'better-sqlite3';
22
+ import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
23
+ import type { EventBus, IChainSubscriber } from '@waiaas/core';
24
+ import type { BackgroundWorkers } from '../../lifecycle/workers.js';
25
+ import type { KillSwitchService } from '../kill-switch-service.js';
26
+ import type { NotificationService } from '../../notifications/notification-service.js';
27
+ export interface IncomingTxMonitorConfig {
28
+ enabled: boolean;
29
+ pollIntervalSec: number;
30
+ retentionDays: number;
31
+ dustThresholdUsd: number;
32
+ amountMultiplier: number;
33
+ cooldownMinutes: number;
34
+ }
35
+ export type SubscriberFactory = (chain: string, network: string) => IChainSubscriber | Promise<IChainSubscriber>;
36
+ export interface IncomingTxMonitorDeps {
37
+ sqlite: Database;
38
+ db: BetterSQLite3Database<any>;
39
+ workers: BackgroundWorkers;
40
+ eventBus: EventBus;
41
+ killSwitchService?: KillSwitchService | null;
42
+ notificationService?: NotificationService | null;
43
+ subscriberFactory: SubscriberFactory;
44
+ config: IncomingTxMonitorConfig;
45
+ }
46
+ export declare class IncomingTxMonitorService {
47
+ private readonly sqlite;
48
+ private readonly workers;
49
+ private readonly eventBus;
50
+ private readonly killSwitchService;
51
+ private readonly notificationService;
52
+ private readonly subscriberFactory;
53
+ private queue;
54
+ private multiplexer;
55
+ private readonly safetyRules;
56
+ private readonly notifyCooldown;
57
+ private config;
58
+ constructor(deps: IncomingTxMonitorDeps);
59
+ /**
60
+ * Start the monitoring service.
61
+ *
62
+ * 1. Create multiplexer with gap recovery handler
63
+ * 2. Load wallets with monitor_incoming = 1 from DB
64
+ * 3. Subscribe each wallet via multiplexer
65
+ * 4. Register 6 background workers
66
+ */
67
+ start(): Promise<void>;
68
+ /**
69
+ * Stop the monitoring service.
70
+ *
71
+ * 1. Drain queue (final flush of remaining items)
72
+ * 2. Stop all subscriber connections
73
+ * 3. Clear cooldown map
74
+ */
75
+ stop(): Promise<void>;
76
+ /**
77
+ * Update configuration (used by HotReloadOrchestrator).
78
+ */
79
+ updateConfig(partial: Partial<IncomingTxMonitorConfig>): void;
80
+ /**
81
+ * Re-read wallets with monitor_incoming=1 from DB and reconcile
82
+ * with current multiplexer subscriptions.
83
+ */
84
+ syncSubscriptions(): Promise<void>;
85
+ /**
86
+ * Core flush worker: flush queue, evaluate safety rules, emit events, send notifications.
87
+ */
88
+ private createFlushHandler;
89
+ /**
90
+ * Build safety rule context for a transaction.
91
+ * Uses best-effort data -- null for unavailable price/average data.
92
+ */
93
+ private buildSafetyRuleContext;
94
+ private isCooldownActive;
95
+ private recordCooldown;
96
+ private registerWorkers;
97
+ }
98
+ //# sourceMappingURL=incoming-tx-monitor-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming-tx-monitor-service.d.ts","sourceRoot":"","sources":["../../../src/services/incoming/incoming-tx-monitor-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAkBvF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,KACZ,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,QAAQ,CAAC;IACjB,EAAE,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,mBAAmB,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACjD,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,MAAM,EAAE,uBAAuB,CAAC;CACjC;AAID,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAC7D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAEtD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,MAAM,CAA0B;gBAE5B,IAAI,EAAE,qBAAqB;IAoBvC;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+D5B;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI;IAI7D;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCxC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqF1B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAwD9B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,eAAe;CA8DxB"}