obol-mcp 2.0.0

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 (58) hide show
  1. package/README.md +195 -0
  2. package/dist/app.d.ts +3 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +130 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config/env.d.ts +47 -0
  7. package/dist/config/env.d.ts.map +1 -0
  8. package/dist/config/env.js +63 -0
  9. package/dist/config/env.js.map +1 -0
  10. package/dist/config/pricing.d.ts +12 -0
  11. package/dist/config/pricing.d.ts.map +1 -0
  12. package/dist/config/pricing.js +99 -0
  13. package/dist/config/pricing.js.map +1 -0
  14. package/dist/mcp.d.ts +35 -0
  15. package/dist/mcp.d.ts.map +1 -0
  16. package/dist/mcp.js +150 -0
  17. package/dist/mcp.js.map +1 -0
  18. package/dist/middleware/validation.d.ts +6 -0
  19. package/dist/middleware/validation.d.ts.map +1 -0
  20. package/dist/middleware/validation.js +40 -0
  21. package/dist/middleware/validation.js.map +1 -0
  22. package/dist/middleware/x402.d.ts +33 -0
  23. package/dist/middleware/x402.d.ts.map +1 -0
  24. package/dist/middleware/x402.js +294 -0
  25. package/dist/middleware/x402.js.map +1 -0
  26. package/dist/plugins/defi/routes.d.ts +12 -0
  27. package/dist/plugins/defi/routes.d.ts.map +1 -0
  28. package/dist/plugins/defi/routes.js +430 -0
  29. package/dist/plugins/defi/routes.js.map +1 -0
  30. package/dist/plugins/token/routes.d.ts +10 -0
  31. package/dist/plugins/token/routes.d.ts.map +1 -0
  32. package/dist/plugins/token/routes.js +111 -0
  33. package/dist/plugins/token/routes.js.map +1 -0
  34. package/dist/plugins/wallet/routes.d.ts +13 -0
  35. package/dist/plugins/wallet/routes.d.ts.map +1 -0
  36. package/dist/plugins/wallet/routes.js +235 -0
  37. package/dist/plugins/wallet/routes.js.map +1 -0
  38. package/dist/server.d.ts +2 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +38 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/services/cache.d.ts +25 -0
  43. package/dist/services/cache.d.ts.map +1 -0
  44. package/dist/services/cache.js +82 -0
  45. package/dist/services/cache.js.map +1 -0
  46. package/dist/services/helius.d.ts +102 -0
  47. package/dist/services/helius.d.ts.map +1 -0
  48. package/dist/services/helius.js +456 -0
  49. package/dist/services/helius.js.map +1 -0
  50. package/dist/utils/logger.d.ts +3 -0
  51. package/dist/utils/logger.d.ts.map +1 -0
  52. package/dist/utils/logger.js +15 -0
  53. package/dist/utils/logger.js.map +1 -0
  54. package/dist/utils/retry.d.ts +9 -0
  55. package/dist/utils/retry.d.ts.map +1 -0
  56. package/dist/utils/retry.js +45 -0
  57. package/dist/utils/retry.js.map +1 -0
  58. package/package.json +81 -0
@@ -0,0 +1,430 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { validateSolanaAddress } from '../../middleware/validation.js';
3
+ import { config } from '../../config/env.js';
4
+ import { cache } from '../../services/cache.js';
5
+ /** Validate a string is a valid Solana address/mint */
6
+ function isValidSolanaAddress(addr) {
7
+ try {
8
+ new PublicKey(addr);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * DeFi plugin — all /api/v1/defi/* routes
17
+ *
18
+ * Endpoints:
19
+ * GET /api/v1/defi/swap/quote ($0.005) — Jupiter swap quote
20
+ * POST /api/v1/defi/swap/execute ($0.25) — Jupiter swap transaction builder
21
+ * GET /api/v1/defi/positions/:addr ($0.10) — DeFi positions aggregation
22
+ * GET /api/v1/defi/lst/yields ($0.02) — LST yield comparison
23
+ */
24
+ export async function defiPlugin(app) {
25
+ const rateConfig = {
26
+ config: {
27
+ rateLimit: {
28
+ max: config.security.rateLimitMaxRequests,
29
+ timeWindow: config.security.rateLimitWindowMs,
30
+ },
31
+ },
32
+ };
33
+ // ── Swap Quote (Jupiter v6) ──
34
+ app.get('/api/v1/defi/swap/quote', rateConfig, async (request, reply) => {
35
+ const query = request.query;
36
+ if (!query.inputMint || !query.outputMint || !query.amount) {
37
+ return reply.code(400).send({
38
+ error: 'Bad Request',
39
+ message: 'Required query params: inputMint, outputMint, amount (in atomic units)',
40
+ });
41
+ }
42
+ if (!isValidSolanaAddress(query.inputMint) || !isValidSolanaAddress(query.outputMint)) {
43
+ return reply.code(400).send({
44
+ error: 'Bad Request',
45
+ message: 'Invalid mint address format',
46
+ });
47
+ }
48
+ if (!/^\d+$/.test(query.amount)) {
49
+ return reply.code(400).send({
50
+ error: 'Bad Request',
51
+ message: 'Amount must be a positive integer (atomic units)',
52
+ });
53
+ }
54
+ const slippageBps = query.slippageBps ?? '50'; // default 0.5%
55
+ try {
56
+ const cacheKey = `swap-quote:${query.inputMint}:${query.outputMint}:${query.amount}:${slippageBps}`;
57
+ const cached = await cache.get(cacheKey);
58
+ if (cached) {
59
+ return reply.send({ success: true, payment: request.payment, data: cached });
60
+ }
61
+ const params = new URLSearchParams({
62
+ inputMint: query.inputMint,
63
+ outputMint: query.outputMint,
64
+ amount: query.amount,
65
+ slippageBps,
66
+ });
67
+ const response = await fetch(`https://lite-api.jup.ag/swap/v1/quote?${params}`);
68
+ if (!response.ok) {
69
+ const text = await response.text();
70
+ return reply.code(response.status).send({
71
+ error: 'Jupiter API Error',
72
+ message: text || 'Failed to get swap quote',
73
+ });
74
+ }
75
+ const jupiterQuote = await response.json();
76
+ const quote = {
77
+ inputMint: jupiterQuote.inputMint,
78
+ outputMint: jupiterQuote.outputMint,
79
+ inAmount: jupiterQuote.inAmount,
80
+ outAmount: jupiterQuote.outAmount,
81
+ otherAmountThreshold: jupiterQuote.otherAmountThreshold,
82
+ priceImpactPct: jupiterQuote.priceImpactPct,
83
+ slippageBps: Number(slippageBps),
84
+ routePlan: jupiterQuote.routePlan?.map(r => ({
85
+ swapInfo: {
86
+ ammKey: r.swapInfo.ammKey,
87
+ label: r.swapInfo.label ?? 'Unknown',
88
+ inAmount: r.swapInfo.inAmount,
89
+ outAmount: r.swapInfo.outAmount,
90
+ feeAmount: r.swapInfo.feeAmount,
91
+ feeMint: r.swapInfo.feeMint,
92
+ },
93
+ percent: r.percent,
94
+ })) ?? [],
95
+ timestamp: new Date().toISOString(),
96
+ };
97
+ await cache.set(cacheKey, quote, 10); // 10s cache — quotes are time-sensitive
98
+ return reply.send({ success: true, payment: request.payment, data: quote });
99
+ }
100
+ catch (error) {
101
+ app.log.error({ error }, 'Swap quote failed');
102
+ return reply.code(500).send({
103
+ error: 'Internal Server Error',
104
+ message: 'Failed to fetch swap quote',
105
+ });
106
+ }
107
+ });
108
+ // ── Swap Execute (Jupiter v6) ──
109
+ app.post('/api/v1/defi/swap/execute', rateConfig, async (request, reply) => {
110
+ const body = request.body;
111
+ if (!body.inputMint || !body.outputMint || !body.amount || !body.userPublicKey) {
112
+ return reply.code(400).send({
113
+ error: 'Bad Request',
114
+ message: 'Required body params: inputMint, outputMint, amount (atomic units), userPublicKey',
115
+ });
116
+ }
117
+ if (!isValidSolanaAddress(body.inputMint) || !isValidSolanaAddress(body.outputMint)) {
118
+ return reply.code(400).send({
119
+ error: 'Bad Request',
120
+ message: 'Invalid mint address format',
121
+ });
122
+ }
123
+ if (!isValidSolanaAddress(body.userPublicKey)) {
124
+ return reply.code(400).send({
125
+ error: 'Bad Request',
126
+ message: 'Invalid userPublicKey address format',
127
+ });
128
+ }
129
+ if (!/^\d+$/.test(body.amount)) {
130
+ return reply.code(400).send({
131
+ error: 'Bad Request',
132
+ message: 'Amount must be a positive integer (atomic units)',
133
+ });
134
+ }
135
+ const slippageBps = body.slippageBps ?? '50';
136
+ try {
137
+ // Step 1: Get quote from Jupiter
138
+ const quoteParams = new URLSearchParams({
139
+ inputMint: body.inputMint,
140
+ outputMint: body.outputMint,
141
+ amount: body.amount,
142
+ slippageBps,
143
+ });
144
+ const quoteResponse = await fetch(`https://lite-api.jup.ag/swap/v1/quote?${quoteParams}`);
145
+ if (!quoteResponse.ok) {
146
+ const text = await quoteResponse.text();
147
+ return reply.code(quoteResponse.status).send({
148
+ error: 'Jupiter Quote Error',
149
+ message: text || 'Failed to get swap quote',
150
+ });
151
+ }
152
+ const quoteData = await quoteResponse.json();
153
+ // Step 2: Build the swap transaction
154
+ const swapBody = {
155
+ quoteResponse: quoteData,
156
+ userPublicKey: body.userPublicKey,
157
+ wrapAndUnwrapSol: body.wrapUnwrapSOL ?? true,
158
+ dynamicComputeUnitLimit: true,
159
+ dynamicSlippage: true,
160
+ };
161
+ if (body.priorityFee) {
162
+ swapBody.prioritizationFeeLamports = Number(body.priorityFee);
163
+ }
164
+ else {
165
+ // Auto priority fee
166
+ swapBody.prioritizationFeeLamports = 'auto';
167
+ }
168
+ const swapResponse = await fetch('https://lite-api.jup.ag/swap/v1/swap', {
169
+ method: 'POST',
170
+ headers: { 'Content-Type': 'application/json' },
171
+ body: JSON.stringify(swapBody),
172
+ });
173
+ if (!swapResponse.ok) {
174
+ const text = await swapResponse.text();
175
+ return reply.code(swapResponse.status).send({
176
+ error: 'Jupiter Swap Error',
177
+ message: text || 'Failed to build swap transaction',
178
+ });
179
+ }
180
+ const swapData = await swapResponse.json();
181
+ const result = {
182
+ swapTransaction: swapData.swapTransaction,
183
+ lastValidBlockHeight: swapData.lastValidBlockHeight,
184
+ prioritizationFeeLamports: swapData.prioritizationFeeLamports ?? 0,
185
+ dynamicSlippageReport: swapData.dynamicSlippageReport ?? null,
186
+ quote: {
187
+ inputMint: quoteData.inputMint,
188
+ outputMint: quoteData.outputMint,
189
+ inAmount: quoteData.inAmount,
190
+ outAmount: quoteData.outAmount,
191
+ priceImpactPct: quoteData.priceImpactPct,
192
+ },
193
+ instructions: [
194
+ '1. Decode swapTransaction from base64',
195
+ '2. Deserialize as a VersionedTransaction',
196
+ '3. Sign with your wallet keypair',
197
+ '4. Send via sendRawTransaction or Obol RPC proxy (POST /api/v1/rpc with sendTransaction)',
198
+ ],
199
+ timestamp: new Date().toISOString(),
200
+ };
201
+ return reply.send({ success: true, payment: request.payment, data: result });
202
+ }
203
+ catch (error) {
204
+ app.log.error({ error }, 'Swap execute failed');
205
+ return reply.code(500).send({
206
+ error: 'Internal Server Error',
207
+ message: 'Failed to build swap transaction',
208
+ });
209
+ }
210
+ });
211
+ // ── DeFi Positions ──
212
+ app.get('/api/v1/defi/positions/:address', { preHandler: validateSolanaAddress, ...rateConfig }, async (request, reply) => {
213
+ const { address } = request.params;
214
+ try {
215
+ const cacheKey = `defi-positions:${address}`;
216
+ const cached = await cache.get(cacheKey);
217
+ if (cached) {
218
+ return reply.send({ success: true, address, payment: request.payment, data: cached });
219
+ }
220
+ const heliusApiKey = config.solana.heliusApiKey;
221
+ if (!heliusApiKey) {
222
+ return reply.code(503).send({
223
+ error: 'Service Unavailable',
224
+ message: 'Helius API not configured',
225
+ });
226
+ }
227
+ // Fetch all token accounts to identify DeFi positions
228
+ const rpcUrl = `https://mainnet.helius-rpc.com/?api-key=${heliusApiKey}`;
229
+ // Get all assets via DAS — includes staked, lent, LP positions
230
+ const dasResponse = await fetch(rpcUrl, {
231
+ method: 'POST',
232
+ headers: { 'Content-Type': 'application/json' },
233
+ body: JSON.stringify({
234
+ jsonrpc: '2.0',
235
+ id: 'defi-positions',
236
+ method: 'searchAssets',
237
+ params: {
238
+ ownerAddress: address,
239
+ displayOptions: { showFungible: true, showNativeBalance: true },
240
+ },
241
+ }),
242
+ });
243
+ const dasResult = await dasResponse.json();
244
+ if (dasResult.error || !dasResult.result?.items) {
245
+ return reply.code(502).send({
246
+ error: 'DAS Error',
247
+ message: dasResult.error?.message ?? 'Failed to fetch assets',
248
+ });
249
+ }
250
+ const items = dasResult.result.items;
251
+ // Categorize assets into DeFi positions
252
+ const lstPositions = [];
253
+ const lpPositions = [];
254
+ const lendingPositions = [];
255
+ const otherDefi = [];
256
+ // Known LST mints
257
+ const LST_MINTS = {
258
+ 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So': 'mSOL (Marinade)',
259
+ 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn': 'jitoSOL (Jito)',
260
+ 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1': 'bSOL (BlazeStake)',
261
+ '7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn': 'jSOL (JPOOL)',
262
+ 'he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A': 'hSOL (Helius)',
263
+ 'vSoLxydx6akxyMD9XEcPvGYNGq6Nn66oqVb3UkGkei7': 'vSOL (The Vault)',
264
+ 'LSTxxxnJzKDFSLr4dUkPcmCf5VyryEqzPLz5j4bpxFp': 'lstSOL (Sanctum Infinity)',
265
+ 'jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v': 'jupSOL (Jupiter)',
266
+ 'Comp4ssDzXcLeu2MnLuGNNFC4cmLPMng8qWHPvzAMU1h': 'compassSOL (Compass)',
267
+ 'picobAEvs6w7QEknPce34wAE4gknZA9v5tTonnmHYdX': 'picoSOL',
268
+ 'inf5RhVRucEPaQTCE24a9EkwMHiajbGFRMGjgwrsCWK': 'infSOL (Sanctum)',
269
+ };
270
+ // Known LP / DeFi protocol indicators
271
+ const DEFI_PROTOCOLS = ['Raydium', 'Orca', 'Meteora', 'Kamino', 'Marinade', 'Lulo', 'Drift', 'Mango'];
272
+ for (const item of items) {
273
+ const mint = item.id;
274
+ const name = item.content?.metadata?.name ?? '';
275
+ const symbol = item.content?.metadata?.symbol ?? '';
276
+ const amount = item.token_info?.balance
277
+ ? Number(item.token_info.balance) / Math.pow(10, item.token_info.decimals ?? 0)
278
+ : 0;
279
+ if (amount === 0)
280
+ continue;
281
+ const pricePerToken = item.token_info?.price_info?.price_per_token ?? 0;
282
+ const valueUSD = amount * pricePerToken;
283
+ // Check if it's an LST
284
+ if (LST_MINTS[mint]) {
285
+ lstPositions.push({
286
+ mint,
287
+ name: LST_MINTS[mint],
288
+ amount,
289
+ valueUSD,
290
+ pricePerToken,
291
+ });
292
+ continue;
293
+ }
294
+ // Check if it's a known DeFi protocol position
295
+ const isDefi = DEFI_PROTOCOLS.some(p => name.toLowerCase().includes(p.toLowerCase()) ||
296
+ symbol.toLowerCase().includes(p.toLowerCase()));
297
+ if (isDefi) {
298
+ // Try to determine if it's LP, lending, or other
299
+ const isLp = name.toLowerCase().includes('lp') ||
300
+ symbol.toLowerCase().includes('lp') ||
301
+ name.toLowerCase().includes('pool');
302
+ if (isLp) {
303
+ lpPositions.push({
304
+ mint,
305
+ name: name || symbol,
306
+ amount,
307
+ valueUSD,
308
+ protocol: DEFI_PROTOCOLS.find(p => name.toLowerCase().includes(p.toLowerCase())) ?? 'Unknown',
309
+ });
310
+ }
311
+ else {
312
+ lendingPositions.push({ mint, name: name || symbol, amount, valueUSD });
313
+ }
314
+ continue;
315
+ }
316
+ // Check by symbol patterns common in DeFi
317
+ if (symbol.includes('LP') || symbol.includes('CLMM') || name.includes('Position')) {
318
+ lpPositions.push({
319
+ mint,
320
+ name: name || symbol,
321
+ amount,
322
+ valueUSD,
323
+ protocol: 'Unknown',
324
+ });
325
+ }
326
+ }
327
+ const positions = {
328
+ address,
329
+ lst: {
330
+ positions: lstPositions,
331
+ totalValueUSD: lstPositions.reduce((s, p) => s + p.valueUSD, 0),
332
+ },
333
+ lp: {
334
+ positions: lpPositions,
335
+ totalValueUSD: lpPositions.reduce((s, p) => s + p.valueUSD, 0),
336
+ },
337
+ lending: {
338
+ positions: lendingPositions,
339
+ totalValueUSD: lendingPositions.reduce((s, p) => s + p.valueUSD, 0),
340
+ },
341
+ other: {
342
+ positions: otherDefi,
343
+ totalValueUSD: otherDefi.reduce((s, p) => s + p.valueUSD, 0),
344
+ },
345
+ totalDefiValueUSD: lstPositions.reduce((s, p) => s + p.valueUSD, 0) +
346
+ lpPositions.reduce((s, p) => s + p.valueUSD, 0) +
347
+ lendingPositions.reduce((s, p) => s + p.valueUSD, 0) +
348
+ otherDefi.reduce((s, p) => s + p.valueUSD, 0),
349
+ timestamp: new Date().toISOString(),
350
+ };
351
+ await cache.set(cacheKey, positions, 120); // 2 min cache
352
+ return reply.send({ success: true, address, payment: request.payment, data: positions });
353
+ }
354
+ catch (error) {
355
+ app.log.error({ error, address }, 'DeFi positions failed');
356
+ return reply.code(500).send({
357
+ error: 'Internal Server Error',
358
+ message: 'Failed to fetch DeFi positions',
359
+ });
360
+ }
361
+ });
362
+ // ── LST Yield Comparison ──
363
+ app.get('/api/v1/defi/lst/yields', rateConfig, async (request, reply) => {
364
+ try {
365
+ const cacheKey = 'lst-yields';
366
+ const cached = await cache.get(cacheKey);
367
+ if (cached) {
368
+ return reply.send({ success: true, payment: request.payment, data: cached });
369
+ }
370
+ // Fetch from Sanctum's API — canonical source for LST yields
371
+ const [sanctumResponse, solPriceResponse] = await Promise.all([
372
+ fetch('https://sanctum-extra-api.ngrok.dev/v1/apy/latest'),
373
+ fetch('https://lite-api.jup.ag/price/v3?ids=So11111111111111111111111111111111111111112'),
374
+ ]);
375
+ let sanctumApys = {};
376
+ if (sanctumResponse.ok) {
377
+ const sanctumData = await sanctumResponse.json();
378
+ sanctumApys = sanctumData.apys ?? {};
379
+ }
380
+ const solPriceData = await solPriceResponse.json();
381
+ const solPrice = solPriceData['So11111111111111111111111111111111111111112']?.usdPrice ?? 0;
382
+ // Known LSTs with their mints
383
+ const LST_INFO = [
384
+ { mint: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So', name: 'mSOL', provider: 'Marinade' },
385
+ { mint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn', name: 'jitoSOL', provider: 'Jito' },
386
+ { mint: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1', name: 'bSOL', provider: 'BlazeStake' },
387
+ { mint: 'jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v', name: 'jupSOL', provider: 'Jupiter' },
388
+ { mint: 'he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A', name: 'hSOL', provider: 'Helius' },
389
+ { mint: 'vSoLxydx6akxyMD9XEcPvGYNGq6Nn66oqVb3UkGkei7', name: 'vSOL', provider: 'The Vault' },
390
+ { mint: 'LSTxxxnJzKDFSLr4dUkPcmCf5VyryEqzPLz5j4bpxFp', name: 'lstSOL', provider: 'Sanctum Infinity' },
391
+ { mint: 'Comp4ssDzXcLeu2MnLuGNNFC4cmLPMng8qWHPvzAMU1h', name: 'compassSOL', provider: 'Compass' },
392
+ { mint: 'inf5RhVRucEPaQTCE24a9EkwMHiajbGFRMGjgwrsCWK', name: 'infSOL', provider: 'Sanctum' },
393
+ ];
394
+ // Fetch exchange rates from Jupiter for each LST
395
+ const mintIds = LST_INFO.map(l => l.mint).join(',');
396
+ const priceResponse = await fetch(`https://lite-api.jup.ag/price/v3?ids=${mintIds}`);
397
+ const priceData = await priceResponse.json();
398
+ const yields = LST_INFO.map(lst => {
399
+ const apy = sanctumApys[lst.mint] ?? null;
400
+ const lstPrice = priceData[lst.mint]?.usdPrice ?? 0;
401
+ const exchangeRate = solPrice > 0 ? lstPrice / solPrice : 0;
402
+ return {
403
+ mint: lst.mint,
404
+ name: lst.name,
405
+ provider: lst.provider,
406
+ apy: apy !== null ? Number((apy * 100).toFixed(2)) : null,
407
+ exchangeRate: Number(exchangeRate.toFixed(6)),
408
+ priceUSD: lstPrice,
409
+ solPrice,
410
+ };
411
+ }).sort((a, b) => (b.apy ?? 0) - (a.apy ?? 0));
412
+ const comparison = {
413
+ yields,
414
+ solPriceUSD: solPrice,
415
+ bestYield: yields.find(y => y.apy !== null) ?? null,
416
+ timestamp: new Date().toISOString(),
417
+ };
418
+ await cache.set(cacheKey, comparison, 300); // 5 min cache
419
+ return reply.send({ success: true, payment: request.payment, data: comparison });
420
+ }
421
+ catch (error) {
422
+ app.log.error({ error }, 'LST yields failed');
423
+ return reply.code(500).send({
424
+ error: 'Internal Server Error',
425
+ message: 'Failed to fetch LST yields',
426
+ });
427
+ }
428
+ });
429
+ }
430
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/plugins/defi/routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,uDAAuD;AACvD,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAoB;IACnD,MAAM,UAAU,GAAG;QACjB,MAAM,EAAE;YACN,SAAS,EAAE;gBACT,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;gBACzC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB;aAC9C;SACF;KACF,CAAC;IAEF,gCAAgC;IAChC,GAAG,CAAC,GAAG,CACL,yBAAyB,EACzB,UAAU,EACV,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAKrB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,wEAAwE;aAClF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,eAAe;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAc,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YACpG,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAY,QAAQ,CAAC,CAAC;YACpD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW;aACZ,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;YAEhF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;oBACtC,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE,IAAI,IAAI,0BAA0B;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA0B,CAAC;YAEnE,MAAM,KAAK,GAAc;gBACvB,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,UAAU,EAAE,YAAY,CAAC,UAAU;gBACnC,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,oBAAoB,EAAE,YAAY,CAAC,oBAAoB;gBACvD,cAAc,EAAE,YAAY,CAAC,cAAc;gBAC3C,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;gBAChC,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC3C,QAAQ,EAAE;wBACR,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;wBACzB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS;wBACpC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;wBAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS;wBAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS;wBAC/B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO;qBAC5B;oBACD,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC,IAAI,EAAE;gBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wCAAwC;YAE9E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kCAAkC;IAClC,GAAG,CAAC,IAAI,CACN,2BAA2B,EAC3B,UAAU,EACV,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAQpB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,mFAAmF;aAC7F,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACpF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,sCAAsC;aAChD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAE7C,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;gBACtC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW;aACZ,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;oBAC3C,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,IAAI,IAAI,0BAA0B;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAA0B,CAAC;YAErE,qCAAqC;YACrC,MAAM,QAAQ,GAA4B;gBACxC,aAAa,EAAE,SAAS;gBACxB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,gBAAgB,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;gBAC5C,uBAAuB,EAAE,IAAI;gBAC7B,eAAe,EAAE,IAAI;aACtB,CAAC;YAEF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,QAAQ,CAAC,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,QAAQ,CAAC,yBAAyB,GAAG,MAAM,CAAC;YAC9C,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;aAC/B,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;oBAC1C,KAAK,EAAE,oBAAoB;oBAC3B,OAAO,EAAE,IAAI,IAAI,kCAAkC;iBACpD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAyB,CAAC;YAElE,MAAM,MAAM,GAAsB;gBAChC,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;gBACnD,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB,IAAI,CAAC;gBAClE,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,IAAI,IAAI;gBAC7D,KAAK,EAAE;oBACL,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,cAAc,EAAE,SAAS,CAAC,cAAc;iBACzC;gBACD,YAAY,EAAE;oBACZ,uCAAuC;oBACvC,0CAA0C;oBAC1C,kCAAkC;oBAClC,0FAA0F;iBAC3F;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,GAAG,CAAC,GAAG,CACL,iCAAiC,EACjC,EAAE,UAAU,EAAE,qBAAqB,EAAE,GAAG,UAAU,EAAE,EACpD,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAA6B,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,kBAAkB,OAAO,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAgB,QAAQ,CAAC,CAAC;YACxD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACxF,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAChD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,2BAA2B;iBACrC,CAAC,CAAC;YACL,CAAC;YAED,sDAAsD;YACtD,MAAM,MAAM,GAAG,2CAA2C,YAAY,EAAE,CAAC;YAEzE,+DAA+D;YAC/D,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,gBAAgB;oBACpB,MAAM,EAAE,cAAc;oBACtB,MAAM,EAAE;wBACN,YAAY,EAAE,OAAO;wBACrB,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;qBAChE;iBACF,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,IAAI,EAGvC,CAAC;YAEF,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBAChD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,wBAAwB;iBAC9D,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;YAErC,wCAAwC;YACxC,MAAM,YAAY,GAAkB,EAAE,CAAC;YACvC,MAAM,WAAW,GAAiB,EAAE,CAAC;YACrC,MAAM,gBAAgB,GAAsB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAsB,EAAE,CAAC;YAExC,kBAAkB;YAClB,MAAM,SAAS,GAA2B;gBACxC,6CAA6C,EAAE,iBAAiB;gBAChE,8CAA8C,EAAE,gBAAgB;gBAChE,6CAA6C,EAAE,mBAAmB;gBAClE,8CAA8C,EAAE,cAAc;gBAC9D,6CAA6C,EAAE,eAAe;gBAC9D,6CAA6C,EAAE,kBAAkB;gBACjE,6CAA6C,EAAE,2BAA2B;gBAC1E,6CAA6C,EAAE,kBAAkB;gBACjE,8CAA8C,EAAE,sBAAsB;gBACtE,6CAA6C,EAAE,SAAS;gBACxD,6CAA6C,EAAE,kBAAkB;aAClE,CAAC;YAEF,sCAAsC;YACtC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO;oBACrC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;oBAC/E,CAAC,CAAC,CAAC,CAAC;gBAEN,IAAI,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAE3B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,IAAI,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;gBAExC,uBAAuB;gBACvB,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI;wBACJ,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;wBACrB,MAAM;wBACN,QAAQ;wBACR,aAAa;qBACd,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,+CAA+C;gBAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACrC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC5C,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC/C,CAAC;gBAEF,IAAI,MAAM,EAAE,CAAC;oBACX,iDAAiD;oBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAC5C,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACnC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAEtC,IAAI,IAAI,EAAE,CAAC;wBACT,WAAW,CAAC,IAAI,CAAC;4BACf,IAAI;4BACJ,IAAI,EAAE,IAAI,IAAI,MAAM;4BACpB,MAAM;4BACN,QAAQ;4BACR,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,SAAS;yBAC9F,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC1E,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,0CAA0C;gBAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClF,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI;wBACJ,IAAI,EAAE,IAAI,IAAI,MAAM;wBACpB,MAAM;wBACN,QAAQ;wBACR,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAkB;gBAC/B,OAAO;gBACP,GAAG,EAAE;oBACH,SAAS,EAAE,YAAY;oBACvB,aAAa,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBAChE;gBACD,EAAE,EAAE;oBACF,SAAS,EAAE,WAAW;oBACtB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBAC/D;gBACD,OAAO,EAAE;oBACP,SAAS,EAAE,gBAAgB;oBAC3B,aAAa,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBACpE;gBACD,KAAK,EAAE;oBACL,SAAS,EAAE,SAAS;oBACpB,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBAC7D;gBACD,iBAAiB,EACf,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAChD,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC/C,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACpD,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC/C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;YAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6BAA6B;IAC7B,GAAG,CAAC,GAAG,CACL,yBAAyB,EACzB,UAAU,EACV,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,QAAQ,CAAC,CAAC;YAC7D,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,6DAA6D;YAC7D,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5D,KAAK,CAAC,mDAAmD,CAAC;gBAC1D,KAAK,CAAC,kFAAkF,CAAC;aAC1F,CAAC,CAAC;YAEH,IAAI,WAAW,GAA2B,EAAE,CAAC;YAC7C,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,EAAsC,CAAC;gBACrF,WAAW,GAAG,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;YACvC,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAA2C,CAAC;YAC5F,MAAM,QAAQ,GAAG,YAAY,CAAC,6CAA6C,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC;YAE5F,8BAA8B;YAC9B,MAAM,QAAQ,GAA4D;gBACxE,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;gBAC3F,EAAE,IAAI,EAAE,8CAA8C,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC3F,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;gBAC7F,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAC5F,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACzF,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE;gBAC5F,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE;gBACrG,EAAE,IAAI,EAAE,8CAA8C,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACjG,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;aAC7F,CAAC;YAEF,iDAAiD;YACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;YACrF,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAA2C,CAAC;YAEtF,MAAM,MAAM,GAAe,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC;gBACpD,MAAM,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5D,OAAO;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;oBACzD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC7C,QAAQ,EAAE,QAAQ;oBAClB,QAAQ;iBACT,CAAC;YACJ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/C,MAAM,UAAU,GAAuB;gBACrC,MAAM;gBACN,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI;gBACnD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;YAE1D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Token data plugin — all /api/v1/token/* routes
4
+ *
5
+ * Endpoints:
6
+ * GET /api/v1/token/:mint/price ($0.005)
7
+ * GET /api/v1/token/:mint/metadata ($0.01)
8
+ */
9
+ export declare function tokenPlugin(app: FastifyInstance): Promise<void>;
10
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/plugins/token/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyHrE"}
@@ -0,0 +1,111 @@
1
+ import { validateMintAddress } from '../../middleware/validation.js';
2
+ import { config } from '../../config/env.js';
3
+ import { cache } from '../../services/cache.js';
4
+ /**
5
+ * Token data plugin — all /api/v1/token/* routes
6
+ *
7
+ * Endpoints:
8
+ * GET /api/v1/token/:mint/price ($0.005)
9
+ * GET /api/v1/token/:mint/metadata ($0.01)
10
+ */
11
+ export async function tokenPlugin(app) {
12
+ const rateConfig = {
13
+ config: {
14
+ rateLimit: {
15
+ max: config.security.rateLimitMaxRequests,
16
+ timeWindow: config.security.rateLimitWindowMs,
17
+ },
18
+ },
19
+ };
20
+ // ── Price ──
21
+ app.get('/api/v1/token/:mint/price', { preHandler: validateMintAddress, ...rateConfig }, async (request, reply) => {
22
+ const { mint } = request.params;
23
+ try {
24
+ const cacheKey = `token-price:${mint}`;
25
+ const cached = await cache.get(cacheKey);
26
+ if (cached) {
27
+ return reply.send({ success: true, mint, payment: request.payment, data: cached });
28
+ }
29
+ const response = await fetch(`https://lite-api.jup.ag/price/v3?ids=${mint}`);
30
+ const data = await response.json();
31
+ const info = data[mint];
32
+ if (!info?.usdPrice) {
33
+ return reply.code(404).send({
34
+ error: 'Not Found',
35
+ message: `No price data for token: ${mint}`,
36
+ });
37
+ }
38
+ const price = {
39
+ mint,
40
+ priceUSD: info.usdPrice,
41
+ confidence: info.confidenceLevel ?? 'unknown',
42
+ timestamp: new Date().toISOString(),
43
+ };
44
+ await cache.set(cacheKey, price, 60); // 1 min cache for prices
45
+ return reply.send({ success: true, mint, payment: request.payment, data: price });
46
+ }
47
+ catch (error) {
48
+ app.log.error({ error, mint }, 'Token price failed');
49
+ return reply.code(500).send({
50
+ error: 'Internal Server Error',
51
+ message: 'Failed to fetch token price',
52
+ });
53
+ }
54
+ });
55
+ // ── Metadata ──
56
+ app.get('/api/v1/token/:mint/metadata', { preHandler: validateMintAddress, ...rateConfig }, async (request, reply) => {
57
+ const { mint } = request.params;
58
+ try {
59
+ const cacheKey = `token-meta:${mint}`;
60
+ const cached = await cache.get(cacheKey);
61
+ if (cached) {
62
+ return reply.send({ success: true, mint, payment: request.payment, data: cached });
63
+ }
64
+ const heliusApiKey = config.solana.heliusApiKey;
65
+ if (!heliusApiKey) {
66
+ return reply.code(503).send({
67
+ error: 'Service Unavailable',
68
+ message: 'Helius API not configured',
69
+ });
70
+ }
71
+ const rpcUrl = `https://mainnet.helius-rpc.com/?api-key=${heliusApiKey}`;
72
+ const response = await fetch(rpcUrl, {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({
76
+ jsonrpc: '2.0',
77
+ id: 'token-metadata',
78
+ method: 'getAsset',
79
+ params: { id: mint },
80
+ }),
81
+ });
82
+ const result = await response.json();
83
+ if (result.error || !result.result) {
84
+ return reply.code(404).send({
85
+ error: 'Not Found',
86
+ message: `No metadata for token: ${mint}`,
87
+ });
88
+ }
89
+ const asset = result.result;
90
+ const metadata = {
91
+ mint,
92
+ name: asset.content?.metadata?.name ?? 'Unknown',
93
+ symbol: asset.content?.metadata?.symbol ?? 'UNKNOWN',
94
+ decimals: asset.token_info?.decimals ?? 0,
95
+ supply: asset.token_info?.supply ? Number(asset.token_info.supply) : undefined,
96
+ logoURI: asset.content?.links?.image || asset.content?.files?.[0]?.uri,
97
+ description: asset.content?.metadata?.description,
98
+ };
99
+ await cache.set(cacheKey, metadata, 3600); // 1 hr cache for metadata
100
+ return reply.send({ success: true, mint, payment: request.payment, data: metadata });
101
+ }
102
+ catch (error) {
103
+ app.log.error({ error, mint }, 'Token metadata failed');
104
+ return reply.code(500).send({
105
+ error: 'Internal Server Error',
106
+ message: 'Failed to fetch token metadata',
107
+ });
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/plugins/token/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Wallet analytics plugin — all /api/v1/wallet/* routes
4
+ *
5
+ * Endpoints:
6
+ * GET /api/v1/wallet/:address/overview ($0.01)
7
+ * GET /api/v1/wallet/:address/portfolio ($0.05)
8
+ * GET /api/v1/wallet/:address/activity ($0.05)
9
+ * GET /api/v1/wallet/:address/risk ($0.10)
10
+ * GET /api/v1/wallet/:address/pnl ($0.15)
11
+ */
12
+ export declare function walletPlugin(app: FastifyInstance): Promise<void>;
13
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/plugins/wallet/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwQtE"}