@waiaas/daemon 2.10.0 → 2.11.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 (95) hide show
  1. package/dist/api/helpers/resolve-chain-id.d.ts +2 -0
  2. package/dist/api/helpers/resolve-chain-id.d.ts.map +1 -0
  3. package/dist/api/helpers/resolve-chain-id.js +21 -0
  4. package/dist/api/helpers/resolve-chain-id.js.map +1 -0
  5. package/dist/api/routes/actions.d.ts.map +1 -1
  6. package/dist/api/routes/actions.js +1 -20
  7. package/dist/api/routes/actions.js.map +1 -1
  8. package/dist/api/routes/admin-actions.d.ts.map +1 -1
  9. package/dist/api/routes/admin-actions.js +1 -19
  10. package/dist/api/routes/admin-actions.js.map +1 -1
  11. package/dist/api/routes/admin-auth.d.ts +9 -0
  12. package/dist/api/routes/admin-auth.d.ts.map +1 -0
  13. package/dist/api/routes/admin-auth.js +453 -0
  14. package/dist/api/routes/admin-auth.js.map +1 -0
  15. package/dist/api/routes/admin-monitoring.d.ts +10 -0
  16. package/dist/api/routes/admin-monitoring.d.ts.map +1 -0
  17. package/dist/api/routes/admin-monitoring.js +788 -0
  18. package/dist/api/routes/admin-monitoring.js.map +1 -0
  19. package/dist/api/routes/admin-notifications.d.ts +9 -0
  20. package/dist/api/routes/admin-notifications.d.ts.map +1 -0
  21. package/dist/api/routes/admin-notifications.js +210 -0
  22. package/dist/api/routes/admin-notifications.js.map +1 -0
  23. package/dist/api/routes/admin-settings.d.ts +9 -0
  24. package/dist/api/routes/admin-settings.d.ts.map +1 -0
  25. package/dist/api/routes/admin-settings.js +433 -0
  26. package/dist/api/routes/admin-settings.js.map +1 -0
  27. package/dist/api/routes/admin-wallets.d.ts +16 -0
  28. package/dist/api/routes/admin-wallets.d.ts.map +1 -0
  29. package/dist/api/routes/admin-wallets.js +582 -0
  30. package/dist/api/routes/admin-wallets.js.map +1 -0
  31. package/dist/api/routes/admin.d.ts +8 -26
  32. package/dist/api/routes/admin.d.ts.map +1 -1
  33. package/dist/api/routes/admin.js +20 -2536
  34. package/dist/api/routes/admin.js.map +1 -1
  35. package/dist/api/routes/erc8004.d.ts.map +1 -1
  36. package/dist/api/routes/erc8004.js +0 -1
  37. package/dist/api/routes/erc8004.js.map +1 -1
  38. package/dist/api/routes/mcp.d.ts +2 -0
  39. package/dist/api/routes/mcp.d.ts.map +1 -1
  40. package/dist/api/routes/mcp.js +2 -1
  41. package/dist/api/routes/mcp.js.map +1 -1
  42. package/dist/api/routes/nft-approvals.js +4 -4
  43. package/dist/api/routes/nft-approvals.js.map +1 -1
  44. package/dist/api/routes/sessions.d.ts +2 -0
  45. package/dist/api/routes/sessions.d.ts.map +1 -1
  46. package/dist/api/routes/sessions.js +5 -3
  47. package/dist/api/routes/sessions.js.map +1 -1
  48. package/dist/api/routes/wallets.d.ts.map +1 -1
  49. package/dist/api/routes/wallets.js +3 -3
  50. package/dist/api/routes/wallets.js.map +1 -1
  51. package/dist/api/server.d.ts.map +1 -1
  52. package/dist/api/server.js +2 -0
  53. package/dist/api/server.js.map +1 -1
  54. package/dist/constants.d.ts +17 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +17 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/infrastructure/nft/nft-indexer-client.d.ts.map +1 -1
  59. package/dist/infrastructure/nft/nft-indexer-client.js +3 -3
  60. package/dist/infrastructure/nft/nft-indexer-client.js.map +1 -1
  61. package/dist/infrastructure/oracle/coingecko-forex.d.ts.map +1 -1
  62. package/dist/infrastructure/oracle/coingecko-forex.js +2 -3
  63. package/dist/infrastructure/oracle/coingecko-forex.js.map +1 -1
  64. package/dist/infrastructure/oracle/coingecko-oracle.d.ts.map +1 -1
  65. package/dist/infrastructure/oracle/coingecko-oracle.js +2 -3
  66. package/dist/infrastructure/oracle/coingecko-oracle.js.map +1 -1
  67. package/dist/infrastructure/oracle/pyth-oracle.d.ts +0 -1
  68. package/dist/infrastructure/oracle/pyth-oracle.d.ts.map +1 -1
  69. package/dist/infrastructure/oracle/pyth-oracle.js +3 -3
  70. package/dist/infrastructure/oracle/pyth-oracle.js.map +1 -1
  71. package/dist/lifecycle/workers.d.ts.map +1 -1
  72. package/dist/lifecycle/workers.js +2 -1
  73. package/dist/lifecycle/workers.js.map +1 -1
  74. package/dist/pipeline/dry-run.d.ts.map +1 -1
  75. package/dist/pipeline/dry-run.js +4 -3
  76. package/dist/pipeline/dry-run.js.map +1 -1
  77. package/dist/pipeline/stages.d.ts.map +1 -1
  78. package/dist/pipeline/stages.js +4 -3
  79. package/dist/pipeline/stages.js.map +1 -1
  80. package/dist/services/signing-sdk/channels/ntfy-signing-channel.js +2 -2
  81. package/dist/services/signing-sdk/channels/ntfy-signing-channel.js.map +1 -1
  82. package/dist/services/signing-sdk/channels/telegram-signing-channel.js +1 -1
  83. package/dist/services/signing-sdk/channels/telegram-signing-channel.js.map +1 -1
  84. package/dist/services/signing-sdk/channels/wallet-notification-channel.js +2 -2
  85. package/dist/services/signing-sdk/channels/wallet-notification-channel.js.map +1 -1
  86. package/dist/services/signing-sdk/sign-request-builder.d.ts +2 -0
  87. package/dist/services/signing-sdk/sign-request-builder.d.ts.map +1 -1
  88. package/dist/services/signing-sdk/sign-request-builder.js +20 -3
  89. package/dist/services/signing-sdk/sign-request-builder.js.map +1 -1
  90. package/dist/services/signing-sdk/sign-response-handler.js +4 -4
  91. package/dist/services/signing-sdk/sign-response-handler.js.map +1 -1
  92. package/package.json +5 -5
  93. package/public/admin/assets/index-By5VUJ-B.js +3 -0
  94. package/public/admin/index.html +1 -1
  95. package/public/admin/assets/index--wQVT9Dz.js +0 -3
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Admin Wallet route handlers: wallet transactions, balance, staking, telegram users, defi positions.
3
+ *
4
+ * Extracted from admin.ts for maintainability.
5
+ */
6
+ import { createRoute, z } from '@hono/zod-openapi';
7
+ import { sql, eq, and, desc } from 'drizzle-orm';
8
+ import { WAIaaSError, getNetworksForEnvironment, formatAmount } from '@waiaas/core';
9
+ import { wallets, transactions, tokenRegistry } from '../../infrastructure/database/schema.js';
10
+ import { resolveRpcUrl } from '../../infrastructure/adapter-pool.js';
11
+ import { StakingPositionsResponseSchema, buildErrorResponses, } from './openapi-schemas.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Amount formatting helpers (#168)
14
+ // ---------------------------------------------------------------------------
15
+ const NATIVE_DECIMALS = { solana: 9, ethereum: 18 };
16
+ const NATIVE_SYMBOLS = { solana: 'SOL', ethereum: 'ETH' };
17
+ /**
18
+ * Format raw blockchain amount to human-readable string with token symbol.
19
+ * Returns null if formatting is not possible (unknown token, null amount, etc).
20
+ */
21
+ export function formatTxAmount(amount, chain, network, tokenAddress, db) {
22
+ if (!amount || amount === '0')
23
+ return amount;
24
+ try {
25
+ if (tokenAddress) {
26
+ // Token transfer: look up decimals/symbol from token_registry
27
+ const token = db
28
+ .select({ symbol: tokenRegistry.symbol, decimals: tokenRegistry.decimals })
29
+ .from(tokenRegistry)
30
+ .where(and(eq(tokenRegistry.address, tokenAddress), network ? eq(tokenRegistry.network, network) : undefined))
31
+ .limit(1)
32
+ .get();
33
+ if (!token)
34
+ return null; // unknown token -> caller falls back to raw
35
+ return `${formatAmount(BigInt(amount), token.decimals)} ${token.symbol}`;
36
+ }
37
+ // Native transfer
38
+ const decimals = NATIVE_DECIMALS[chain] ?? 18;
39
+ const symbol = NATIVE_SYMBOLS[chain] ?? chain.toUpperCase();
40
+ return `${formatAmount(BigInt(amount), decimals)} ${symbol}`;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Route definitions
48
+ // ---------------------------------------------------------------------------
49
+ const adminWalletTransactionsRoute = createRoute({
50
+ method: 'get',
51
+ path: '/admin/wallets/{id}/transactions',
52
+ tags: ['Admin'],
53
+ summary: 'Get wallet transactions',
54
+ request: {
55
+ params: z.object({ id: z.string().uuid() }),
56
+ query: z.object({
57
+ limit: z.coerce.number().int().min(1).max(100).default(20).optional(),
58
+ offset: z.coerce.number().int().min(0).default(0).optional(),
59
+ }),
60
+ },
61
+ responses: {
62
+ 200: {
63
+ description: 'Wallet transaction list',
64
+ content: {
65
+ 'application/json': {
66
+ schema: z.object({
67
+ items: z.array(z.object({
68
+ id: z.string(),
69
+ type: z.string(),
70
+ status: z.string(),
71
+ toAddress: z.string().nullable(),
72
+ amount: z.string().nullable(),
73
+ formattedAmount: z.string().nullable(),
74
+ amountUsd: z.number().nullable(),
75
+ network: z.string().nullable(),
76
+ txHash: z.string().nullable(),
77
+ createdAt: z.number().nullable(),
78
+ })),
79
+ total: z.number().int(),
80
+ }),
81
+ },
82
+ },
83
+ },
84
+ ...buildErrorResponses(['WALLET_NOT_FOUND']),
85
+ },
86
+ });
87
+ const adminWalletBalanceRoute = createRoute({
88
+ method: 'get',
89
+ path: '/admin/wallets/{id}/balance',
90
+ tags: ['Admin'],
91
+ summary: 'Get wallet balance across all available networks',
92
+ request: {
93
+ params: z.object({ id: z.string().uuid() }),
94
+ },
95
+ responses: {
96
+ 200: {
97
+ description: 'Wallet balances per network',
98
+ content: {
99
+ 'application/json': {
100
+ schema: z.object({
101
+ balances: z.array(z.object({
102
+ network: z.string(),
103
+ native: z
104
+ .object({
105
+ balance: z.string(),
106
+ symbol: z.string(),
107
+ usd: z.number().nullable().optional(),
108
+ })
109
+ .nullable(),
110
+ tokens: z.array(z.object({
111
+ symbol: z.string(),
112
+ balance: z.string(),
113
+ address: z.string(),
114
+ })),
115
+ error: z.string().optional(),
116
+ })),
117
+ }),
118
+ },
119
+ },
120
+ },
121
+ ...buildErrorResponses(['WALLET_NOT_FOUND']),
122
+ },
123
+ });
124
+ const adminWalletStakingRoute = createRoute({
125
+ method: 'get',
126
+ path: '/admin/wallets/{id}/staking',
127
+ tags: ['Admin'],
128
+ summary: 'Get wallet staking positions',
129
+ description: 'Returns staking positions (Lido stETH, Jito JitoSOL) for a specific wallet with balance, APY, pending unstake status.',
130
+ request: {
131
+ params: z.object({ id: z.string().uuid() }),
132
+ },
133
+ responses: {
134
+ 200: {
135
+ description: 'Staking positions for the wallet',
136
+ content: { 'application/json': { schema: StakingPositionsResponseSchema } },
137
+ },
138
+ ...buildErrorResponses(['WALLET_NOT_FOUND']),
139
+ },
140
+ });
141
+ const adminDefiPositionsRoute = createRoute({
142
+ method: 'get',
143
+ path: '/admin/defi/positions',
144
+ tags: ['Admin'],
145
+ summary: 'Get all DeFi positions across wallets',
146
+ description: 'Returns all active DeFi positions across all wallets with aggregated totals. ' +
147
+ 'Optionally filter by wallet_id. masterAuth required.',
148
+ request: {
149
+ query: z.object({
150
+ wallet_id: z.string().uuid().optional(),
151
+ }),
152
+ },
153
+ responses: {
154
+ 200: {
155
+ description: 'Active DeFi positions with aggregates',
156
+ content: {
157
+ 'application/json': {
158
+ schema: z.object({
159
+ positions: z.array(z.object({
160
+ id: z.string(),
161
+ walletId: z.string(),
162
+ category: z.string(),
163
+ provider: z.string(),
164
+ chain: z.string(),
165
+ network: z.string().nullable(),
166
+ assetId: z.string().nullable(),
167
+ amount: z.string(),
168
+ amountUsd: z.number().nullable(),
169
+ status: z.string(),
170
+ openedAt: z.number(),
171
+ lastSyncedAt: z.number(),
172
+ })),
173
+ totalValueUsd: z.number().nullable(),
174
+ worstHealthFactor: z.number().nullable(),
175
+ activeCount: z.number(),
176
+ }),
177
+ },
178
+ },
179
+ },
180
+ },
181
+ });
182
+ // Telegram Users route definitions
183
+ const TelegramUserSchema = z.object({
184
+ chat_id: z.number(),
185
+ username: z.string().nullable(),
186
+ role: z.enum(['PENDING', 'ADMIN', 'READONLY']),
187
+ registered_at: z.number(),
188
+ approved_at: z.number().nullable(),
189
+ });
190
+ const telegramUsersListRoute = createRoute({
191
+ method: 'get',
192
+ path: '/admin/telegram-users',
193
+ tags: ['Admin'],
194
+ summary: 'List Telegram bot users',
195
+ responses: {
196
+ 200: {
197
+ description: 'Telegram users list',
198
+ content: {
199
+ 'application/json': {
200
+ schema: z.object({
201
+ users: z.array(TelegramUserSchema),
202
+ total: z.number(),
203
+ }),
204
+ },
205
+ },
206
+ },
207
+ },
208
+ });
209
+ const telegramUserUpdateRoute = createRoute({
210
+ method: 'put',
211
+ path: '/admin/telegram-users/{chatId}',
212
+ tags: ['Admin'],
213
+ summary: 'Update Telegram user role',
214
+ request: {
215
+ params: z.object({ chatId: z.coerce.number() }),
216
+ body: {
217
+ content: {
218
+ 'application/json': {
219
+ schema: z.object({
220
+ role: z.enum(['ADMIN', 'READONLY']),
221
+ }),
222
+ },
223
+ },
224
+ required: true,
225
+ },
226
+ },
227
+ responses: {
228
+ 200: {
229
+ description: 'User role updated',
230
+ content: {
231
+ 'application/json': {
232
+ schema: z.object({
233
+ success: z.boolean(),
234
+ chat_id: z.number(),
235
+ role: z.enum(['ADMIN', 'READONLY']),
236
+ }),
237
+ },
238
+ },
239
+ },
240
+ ...buildErrorResponses(['WALLET_NOT_FOUND']),
241
+ },
242
+ });
243
+ const telegramUserDeleteRoute = createRoute({
244
+ method: 'delete',
245
+ path: '/admin/telegram-users/{chatId}',
246
+ tags: ['Admin'],
247
+ summary: 'Delete Telegram user',
248
+ request: {
249
+ params: z.object({ chatId: z.coerce.number() }),
250
+ },
251
+ responses: {
252
+ 200: {
253
+ description: 'User deleted',
254
+ content: {
255
+ 'application/json': {
256
+ schema: z.object({ success: z.boolean() }),
257
+ },
258
+ },
259
+ },
260
+ ...buildErrorResponses(['WALLET_NOT_FOUND']),
261
+ },
262
+ });
263
+ // ---------------------------------------------------------------------------
264
+ // Register handlers
265
+ // ---------------------------------------------------------------------------
266
+ export function registerAdminWalletRoutes(router, deps) {
267
+ // GET /admin/wallets/:id/transactions
268
+ router.openapi(adminWalletTransactionsRoute, async (c) => {
269
+ const { id } = c.req.valid('param');
270
+ const query = c.req.valid('query');
271
+ const limit = query.limit ?? 20;
272
+ const offset = query.offset ?? 0;
273
+ // Verify wallet exists
274
+ const wallet = deps.db.select().from(wallets).where(eq(wallets.id, id)).get();
275
+ if (!wallet) {
276
+ throw new WAIaaSError('WALLET_NOT_FOUND');
277
+ }
278
+ // Query transactions for this wallet
279
+ const rows = deps.db
280
+ .select()
281
+ .from(transactions)
282
+ .where(eq(transactions.walletId, id))
283
+ .orderBy(desc(transactions.createdAt))
284
+ .limit(limit)
285
+ .offset(offset)
286
+ .all();
287
+ // Total count
288
+ const totalResult = deps.db
289
+ .select({ count: sql `count(*)` })
290
+ .from(transactions)
291
+ .where(eq(transactions.walletId, id))
292
+ .get();
293
+ const total = totalResult?.count ?? 0;
294
+ const items = rows.map((tx) => {
295
+ const tokenAddr = tx.tokenMint ?? tx.contractAddress ?? null;
296
+ return {
297
+ id: tx.id,
298
+ type: tx.type,
299
+ status: tx.status,
300
+ toAddress: tx.toAddress ?? null,
301
+ amount: tx.amount ?? null,
302
+ formattedAmount: formatTxAmount(tx.amount ?? null, tx.chain, tx.network ?? null, tokenAddr, deps.db),
303
+ amountUsd: tx.amountUsd ?? null,
304
+ network: tx.network ?? null,
305
+ txHash: tx.txHash ?? null,
306
+ createdAt: tx.createdAt instanceof Date
307
+ ? Math.floor(tx.createdAt.getTime() / 1000)
308
+ : (typeof tx.createdAt === 'number' ? tx.createdAt : null),
309
+ };
310
+ });
311
+ return c.json({ items, total }, 200);
312
+ });
313
+ // GET /admin/wallets/:id/balance
314
+ router.openapi(adminWalletBalanceRoute, async (c) => {
315
+ const { id } = c.req.valid('param');
316
+ // Verify wallet exists
317
+ const wallet = deps.db.select().from(wallets).where(eq(wallets.id, id)).get();
318
+ if (!wallet) {
319
+ throw new WAIaaSError('WALLET_NOT_FOUND');
320
+ }
321
+ // If no adapter pool, return empty balances
322
+ if (!deps.adapterPool) {
323
+ return c.json({ balances: [] }, 200);
324
+ }
325
+ const chain = wallet.chain;
326
+ const env = wallet.environment;
327
+ const networks = getNetworksForEnvironment(chain, env);
328
+ const results = await Promise.allSettled(networks.map(async (network) => {
329
+ const rpcUrl = resolveRpcUrl(deps.daemonConfig.rpc, wallet.chain, network);
330
+ if (!rpcUrl) {
331
+ return { network, native: null, tokens: [], error: 'RPC endpoint not configured' };
332
+ }
333
+ const adapter = await deps.adapterPool.resolve(chain, network, rpcUrl);
334
+ const balanceInfo = await adapter.getBalance(wallet.publicKey);
335
+ const nativeBalance = (Number(balanceInfo.balance) / 10 ** balanceInfo.decimals).toString();
336
+ // Resolve USD price for native token if price oracle is available
337
+ let nativeUsd = null;
338
+ if (deps.priceOracle) {
339
+ try {
340
+ const priceInfo = await deps.priceOracle.getNativePrice(chain);
341
+ nativeUsd = Number(nativeBalance) * priceInfo.usdPrice;
342
+ }
343
+ catch { /* non-critical: USD price unavailable */ }
344
+ }
345
+ const assets = await adapter.getAssets(wallet.publicKey);
346
+ const tokens = assets
347
+ .filter((a) => !a.isNative)
348
+ .map((a) => ({
349
+ symbol: a.symbol,
350
+ balance: (Number(a.balance) / 10 ** a.decimals).toString(),
351
+ address: a.mint,
352
+ }));
353
+ return {
354
+ network,
355
+ native: { balance: nativeBalance, symbol: balanceInfo.symbol, usd: nativeUsd },
356
+ tokens,
357
+ };
358
+ }));
359
+ const balances = results.map((r, i) => {
360
+ if (r.status === 'fulfilled')
361
+ return r.value;
362
+ const errorMessage = r.reason instanceof Error ? r.reason.message : String(r.reason);
363
+ return { network: networks[i], native: null, tokens: [], error: errorMessage };
364
+ });
365
+ return c.json({ balances }, 200);
366
+ });
367
+ // GET /admin/wallets/:id/staking
368
+ router.openapi(adminWalletStakingRoute, async (c) => {
369
+ const { id } = c.req.valid('param');
370
+ // Verify wallet exists
371
+ const wallet = deps.db.select().from(wallets).where(eq(wallets.id, id)).get();
372
+ if (!wallet) {
373
+ throw new WAIaaSError('WALLET_NOT_FOUND');
374
+ }
375
+ const positions = [];
376
+ if (!deps.sqlite) {
377
+ return c.json({ walletId: id, positions }, 200);
378
+ }
379
+ const LIDO_APY = '~3.5%';
380
+ const JITO_APY = '~7.5%';
381
+ // Reuse aggregation logic inline (same as staking.ts)
382
+ function aggregateProvider(walletId, providerKey) {
383
+ const stakeRows = deps.sqlite.prepare(`SELECT amount, bridge_status, created_at, metadata
384
+ FROM transactions
385
+ WHERE wallet_id = ? AND status IN ('CONFIRMED', 'COMPLETED')
386
+ AND metadata LIKE ?
387
+ ORDER BY created_at ASC`).all(walletId, `%${providerKey}%`);
388
+ let totalStaked = 0n;
389
+ let totalUnstaked = 0n;
390
+ for (const row of stakeRows) {
391
+ // Fallback: if amount is NULL, try extracting from metadata (CONTRACT_CALL value)
392
+ let effectiveAmount = row.amount;
393
+ if (!effectiveAmount && row.metadata) {
394
+ try {
395
+ const meta = JSON.parse(row.metadata);
396
+ const origReq = meta.originalRequest;
397
+ if (origReq?.value && typeof origReq.value === 'string') {
398
+ effectiveAmount = origReq.value;
399
+ }
400
+ }
401
+ catch { /* ignore */ }
402
+ }
403
+ if (!effectiveAmount)
404
+ continue;
405
+ let isUnstake = false;
406
+ if (row.metadata) {
407
+ try {
408
+ const meta = JSON.parse(row.metadata);
409
+ if (meta.action === 'unstake' || meta.actionName === 'unstake')
410
+ isUnstake = true;
411
+ }
412
+ catch { /* ignore */ }
413
+ }
414
+ try {
415
+ const amountBig = BigInt(effectiveAmount);
416
+ if (isUnstake)
417
+ totalUnstaked += amountBig;
418
+ else
419
+ totalStaked += amountBig;
420
+ }
421
+ catch { /* skip */ }
422
+ }
423
+ const pendingRow = deps.sqlite.prepare(`SELECT amount, bridge_status, created_at
424
+ FROM transactions
425
+ WHERE wallet_id = ? AND bridge_status = 'PENDING'
426
+ AND metadata LIKE ?
427
+ ORDER BY created_at DESC
428
+ LIMIT 1`).get(walletId, `%${providerKey}%`);
429
+ let pendingUnstake = null;
430
+ if (pendingRow?.amount) {
431
+ pendingUnstake = {
432
+ amount: pendingRow.amount,
433
+ status: (pendingRow.bridge_status ?? 'PENDING'),
434
+ requestedAt: pendingRow.created_at ?? null,
435
+ };
436
+ }
437
+ const balanceWei = totalStaked > totalUnstaked ? totalStaked - totalUnstaked : 0n;
438
+ return { balanceWei, pendingUnstake };
439
+ }
440
+ // Ethereum wallet -> Lido
441
+ if (wallet.chain === 'ethereum') {
442
+ const { balanceWei, pendingUnstake } = aggregateProvider(id, 'lido_staking');
443
+ if (balanceWei > 0n || pendingUnstake) {
444
+ let balanceUsd = null;
445
+ if (deps.priceOracle && balanceWei > 0n) {
446
+ try {
447
+ const priceInfo = await deps.priceOracle.getNativePrice('ethereum');
448
+ balanceUsd = (Number(balanceWei) / 1e18 * priceInfo.usdPrice).toFixed(2);
449
+ }
450
+ catch { /* price unavailable */ }
451
+ }
452
+ positions.push({ protocol: 'lido', chain: 'ethereum', asset: 'stETH', balance: balanceWei.toString(), balanceUsd, apy: LIDO_APY, pendingUnstake });
453
+ }
454
+ }
455
+ // Solana wallet -> Jito
456
+ if (wallet.chain === 'solana') {
457
+ const { balanceWei: balanceLamports, pendingUnstake } = aggregateProvider(id, 'jito_staking');
458
+ if (balanceLamports > 0n || pendingUnstake) {
459
+ let balanceUsd = null;
460
+ if (deps.priceOracle && balanceLamports > 0n) {
461
+ try {
462
+ const priceInfo = await deps.priceOracle.getNativePrice('solana');
463
+ balanceUsd = (Number(balanceLamports) / 1e9 * priceInfo.usdPrice).toFixed(2);
464
+ }
465
+ catch { /* price unavailable */ }
466
+ }
467
+ positions.push({ protocol: 'jito', chain: 'solana', asset: 'JitoSOL', balance: balanceLamports.toString(), balanceUsd, apy: JITO_APY, pendingUnstake });
468
+ }
469
+ }
470
+ return c.json({ walletId: id, positions }, 200);
471
+ });
472
+ // GET /admin/telegram-users
473
+ router.openapi(telegramUsersListRoute, async (c) => {
474
+ if (!deps.sqlite) {
475
+ return c.json({ users: [], total: 0 }, 200);
476
+ }
477
+ const rows = deps.sqlite
478
+ .prepare('SELECT chat_id, username, role, registered_at, approved_at FROM telegram_users ORDER BY registered_at DESC')
479
+ .all();
480
+ return c.json({ users: rows, total: rows.length }, 200);
481
+ });
482
+ // PUT /admin/telegram-users/:chatId
483
+ router.openapi(telegramUserUpdateRoute, async (c) => {
484
+ if (!deps.sqlite) {
485
+ throw new WAIaaSError('ADAPTER_NOT_AVAILABLE', {
486
+ message: 'SQLite not available',
487
+ });
488
+ }
489
+ const { chatId } = c.req.valid('param');
490
+ const body = c.req.valid('json');
491
+ const now = Math.floor(Date.now() / 1000);
492
+ const result = deps.sqlite
493
+ .prepare('UPDATE telegram_users SET role = ?, approved_at = ? WHERE chat_id = ?')
494
+ .run(body.role, now, chatId);
495
+ if (result.changes === 0) {
496
+ throw new WAIaaSError('WALLET_NOT_FOUND', {
497
+ message: `Telegram user not found: ${chatId}`,
498
+ });
499
+ }
500
+ return c.json({ success: true, chat_id: chatId, role: body.role }, 200);
501
+ });
502
+ // DELETE /admin/telegram-users/:chatId
503
+ router.openapi(telegramUserDeleteRoute, async (c) => {
504
+ if (!deps.sqlite) {
505
+ throw new WAIaaSError('ADAPTER_NOT_AVAILABLE', {
506
+ message: 'SQLite not available',
507
+ });
508
+ }
509
+ const { chatId } = c.req.valid('param');
510
+ const result = deps.sqlite
511
+ .prepare('DELETE FROM telegram_users WHERE chat_id = ?')
512
+ .run(chatId);
513
+ if (result.changes === 0) {
514
+ throw new WAIaaSError('WALLET_NOT_FOUND', {
515
+ message: `Telegram user not found: ${chatId}`,
516
+ });
517
+ }
518
+ return c.json({ success: true }, 200);
519
+ });
520
+ // GET /admin/defi/positions
521
+ router.openapi(adminDefiPositionsRoute, async (c) => {
522
+ const { wallet_id } = c.req.valid('query');
523
+ if (!deps.sqlite) {
524
+ return c.json({ positions: [], totalValueUsd: null, worstHealthFactor: null, activeCount: 0 }, 200);
525
+ }
526
+ // Cross-wallet DeFi positions query
527
+ let rows;
528
+ if (wallet_id) {
529
+ rows = deps.sqlite.prepare(`SELECT id, wallet_id, category, provider, chain, network, asset_id,
530
+ amount, amount_usd, metadata, status, opened_at, last_synced_at
531
+ FROM defi_positions
532
+ WHERE wallet_id = ? AND status = 'ACTIVE'
533
+ ORDER BY category, provider`).all(wallet_id);
534
+ }
535
+ else {
536
+ rows = deps.sqlite.prepare(`SELECT id, wallet_id, category, provider, chain, network, asset_id,
537
+ amount, amount_usd, metadata, status, opened_at, last_synced_at
538
+ FROM defi_positions
539
+ WHERE status = 'ACTIVE'
540
+ ORDER BY category, provider`).all();
541
+ }
542
+ const positions = rows.map((row) => ({
543
+ id: row.id,
544
+ walletId: row.wallet_id,
545
+ category: row.category,
546
+ provider: row.provider,
547
+ chain: row.chain,
548
+ network: row.network,
549
+ assetId: row.asset_id,
550
+ amount: row.amount,
551
+ amountUsd: row.amount_usd,
552
+ status: row.status,
553
+ openedAt: row.opened_at,
554
+ lastSyncedAt: row.last_synced_at,
555
+ }));
556
+ // Aggregate totalValueUsd
557
+ const usdValues = positions.map((p) => p.amountUsd).filter((v) => v !== null);
558
+ const totalValueUsd = usdValues.length > 0 ? usdValues.reduce((a, b) => a + b, 0) : null;
559
+ // Worst health factor from metadata JSON
560
+ let worstHealthFactor = null;
561
+ for (const row of rows) {
562
+ if (row.category === 'LENDING' && row.metadata) {
563
+ try {
564
+ const meta = JSON.parse(row.metadata);
565
+ if (typeof meta.healthFactor === 'number' && meta.healthFactor > 0) {
566
+ if (worstHealthFactor === null || meta.healthFactor < worstHealthFactor) {
567
+ worstHealthFactor = meta.healthFactor;
568
+ }
569
+ }
570
+ }
571
+ catch { /* skip */ }
572
+ }
573
+ }
574
+ return c.json({
575
+ positions,
576
+ totalValueUsd,
577
+ worstHealthFactor,
578
+ activeCount: positions.length,
579
+ }, 200);
580
+ });
581
+ }
582
+ //# sourceMappingURL=admin-wallets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-wallets.js","sourceRoot":"","sources":["../../../src/api/routes/admin-wallets.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,13 @@
1
1
  /**
2
- * Admin route handlers: 27 daemon administration endpoints.
2
+ * Admin route aggregator: delegates to domain-specific modules.
3
3
  *
4
- * GET /admin/status - Daemon health/uptime/version (masterAuth)
5
- * POST /admin/kill-switch - Activate kill switch (masterAuth)
6
- * GET /admin/kill-switch - Get kill switch state (public)
7
- * POST /admin/recover - Deactivate kill switch (masterAuth)
8
- * POST /admin/shutdown - Graceful daemon shutdown (masterAuth)
9
- * POST /admin/rotate-secret - Rotate JWT secret (masterAuth)
10
- * GET /admin/notifications/status - Notification channel status (masterAuth)
11
- * POST /admin/notifications/test - Send test notification (masterAuth)
12
- * GET /admin/notifications/log - Query notification logs (masterAuth)
13
- * GET /admin/settings - Get all settings (masterAuth)
14
- * PUT /admin/settings - Update settings (masterAuth)
15
- * POST /admin/settings/test-rpc - Test RPC connectivity (masterAuth)
16
- * GET /admin/oracle-status - Oracle cache/source/cross-validation status (masterAuth)
17
- * GET /admin/api-keys - List Action Provider API key status (masterAuth)
18
- * PUT /admin/api-keys/:provider - Set or update API key (masterAuth)
19
- * DELETE /admin/api-keys/:provider - Delete API key (masterAuth)
20
- * GET /admin/forex/rates - Forex exchange rates for display currency (masterAuth)
21
- * GET /admin/telegram-users - List Telegram bot users (masterAuth)
22
- * PUT /admin/telegram-users/:chatId - Update Telegram user role (masterAuth)
23
- * DELETE /admin/telegram-users/:chatId - Delete Telegram user (masterAuth)
24
- * GET /admin/transactions - Cross-wallet transaction list with filters (masterAuth)
25
- * GET /admin/incoming - Cross-wallet incoming transaction list with filters (masterAuth)
26
- * GET /admin/rpc-status - Per-network RPC pool endpoint status (masterAuth)
27
- * POST /admin/transactions/:id/cancel - Cancel a QUEUED (DELAY) transaction (masterAuth)
28
- * POST /admin/transactions/:id/reject - Reject a pending approval transaction (masterAuth)
4
+ * Domain modules:
5
+ * - admin-auth.ts: status, kill-switch, recover, shutdown, password, rotate-secret
6
+ * - admin-notifications.ts: notifications status/test/log
7
+ * - admin-settings.ts: settings CRUD, test-rpc, oracle, API keys, forex, RPC status
8
+ * - admin-wallets.ts: wallet transactions/balance/staking, telegram users, DeFi positions
9
+ * - admin-monitoring.ts: cross-wallet transactions, incoming, agent-prompt, session-reissue,
10
+ * tx cancel/reject, backup, stats, autostop
29
11
  *
30
12
  * @see docs/37-rest-api-complete-spec.md
31
13
  * @see docs/36-killswitch-evm-freeze.md