@lagoon-protocol/lagoon-mcp 0.1.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.
- package/LICENSE +201 -0
- package/README.md +618 -0
- package/dist/cache/index.d.ts +97 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +106 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/core/cache-adapter.d.ts +73 -0
- package/dist/core/cache-adapter.d.ts.map +1 -0
- package/dist/core/cache-adapter.js +47 -0
- package/dist/core/cache-adapter.js.map +1 -0
- package/dist/core/cache-invalidation.d.ts +72 -0
- package/dist/core/cache-invalidation.d.ts.map +1 -0
- package/dist/core/cache-invalidation.js +114 -0
- package/dist/core/cache-invalidation.js.map +1 -0
- package/dist/core/container.d.ts +34 -0
- package/dist/core/container.d.ts.map +1 -0
- package/dist/core/container.js +75 -0
- package/dist/core/container.js.map +1 -0
- package/dist/graphql/client.d.ts +32 -0
- package/dist/graphql/client.d.ts.map +1 -0
- package/dist/graphql/client.js +49 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.js +36 -0
- package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.js +32 -0
- package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/index.d.ts +15 -0
- package/dist/graphql/fragments/index.d.ts.map +1 -0
- package/dist/graphql/fragments/index.js +21 -0
- package/dist/graphql/fragments/index.js.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
- package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
- package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.js +51 -0
- package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
- package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
- package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault.fragment.js +119 -0
- package/dist/graphql/fragments/vault.fragment.js.map +1 -0
- package/dist/graphql/fragments.d.ts +183 -0
- package/dist/graphql/fragments.d.ts.map +1 -0
- package/dist/graphql/fragments.js +297 -0
- package/dist/graphql/fragments.js.map +1 -0
- package/dist/graphql/queries/export.queries.d.ts +72 -0
- package/dist/graphql/queries/export.queries.d.ts.map +1 -0
- package/dist/graphql/queries/export.queries.js +202 -0
- package/dist/graphql/queries/export.queries.js.map +1 -0
- package/dist/graphql/queries/index.d.ts +15 -0
- package/dist/graphql/queries/index.d.ts.map +1 -0
- package/dist/graphql/queries/index.js +23 -0
- package/dist/graphql/queries/index.js.map +1 -0
- package/dist/graphql/queries/performance.queries.d.ts +63 -0
- package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
- package/dist/graphql/queries/performance.queries.js +133 -0
- package/dist/graphql/queries/performance.queries.js.map +1 -0
- package/dist/graphql/queries/period-summaries.d.ts +15 -0
- package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
- package/dist/graphql/queries/period-summaries.js +24 -0
- package/dist/graphql/queries/period-summaries.js.map +1 -0
- package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
- package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
- package/dist/graphql/queries/portfolio.queries.js +198 -0
- package/dist/graphql/queries/portfolio.queries.js.map +1 -0
- package/dist/graphql/queries/prediction.queries.d.ts +38 -0
- package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/prediction.queries.js +100 -0
- package/dist/graphql/queries/prediction.queries.js.map +1 -0
- package/dist/graphql/queries/risk.queries.d.ts +37 -0
- package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
- package/dist/graphql/queries/risk.queries.js +90 -0
- package/dist/graphql/queries/risk.queries.js.map +1 -0
- package/dist/graphql/queries/search.queries.d.ts +61 -0
- package/dist/graphql/queries/search.queries.d.ts.map +1 -0
- package/dist/graphql/queries/search.queries.js +103 -0
- package/dist/graphql/queries/search.queries.js.map +1 -0
- package/dist/graphql/queries/transaction.queries.d.ts +60 -0
- package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/transaction.queries.js +252 -0
- package/dist/graphql/queries/transaction.queries.js.map +1 -0
- package/dist/graphql/queries/vault.queries.d.ts +54 -0
- package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
- package/dist/graphql/queries/vault.queries.js +78 -0
- package/dist/graphql/queries/vault.queries.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/competitor-comparison.d.ts +8 -0
- package/dist/prompts/competitor-comparison.d.ts.map +1 -0
- package/dist/prompts/competitor-comparison.js +432 -0
- package/dist/prompts/competitor-comparison.js.map +1 -0
- package/dist/prompts/curator-performance.d.ts +8 -0
- package/dist/prompts/curator-performance.d.ts.map +1 -0
- package/dist/prompts/curator-performance.js +383 -0
- package/dist/prompts/curator-performance.js.map +1 -0
- package/dist/prompts/financial-analysis.d.ts +8 -0
- package/dist/prompts/financial-analysis.d.ts.map +1 -0
- package/dist/prompts/financial-analysis.js +480 -0
- package/dist/prompts/financial-analysis.js.map +1 -0
- package/dist/prompts/index.d.ts +21 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +50 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/onboarding-first-vault.d.ts +8 -0
- package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
- package/dist/prompts/onboarding-first-vault.js +317 -0
- package/dist/prompts/onboarding-first-vault.js.map +1 -0
- package/dist/prompts/portfolio-optimization.d.ts +8 -0
- package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
- package/dist/prompts/portfolio-optimization.js +412 -0
- package/dist/prompts/portfolio-optimization.js.map +1 -0
- package/dist/prompts/protocol-overview.d.ts +8 -0
- package/dist/prompts/protocol-overview.d.ts.map +1 -0
- package/dist/prompts/protocol-overview.js +398 -0
- package/dist/prompts/protocol-overview.js.map +1 -0
- package/dist/prompts/shared/disclaimers.d.ts +54 -0
- package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
- package/dist/prompts/shared/disclaimers.js +400 -0
- package/dist/prompts/shared/disclaimers.js.map +1 -0
- package/dist/resources/glossary.d.ts +8 -0
- package/dist/resources/glossary.d.ts.map +1 -0
- package/dist/resources/glossary.js +407 -0
- package/dist/resources/glossary.js.map +1 -0
- package/dist/resources/index.d.ts +18 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +29 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/schema.d.ts +22 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +67 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/schemas/config.schema.d.ts +46 -0
- package/dist/schemas/config.schema.d.ts.map +1 -0
- package/dist/schemas/config.schema.js +48 -0
- package/dist/schemas/config.schema.js.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.js +385 -0
- package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.js +185 -0
- package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.js +397 -0
- package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.js +189 -0
- package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
- package/dist/sdk/apr-service.d.ts +101 -0
- package/dist/sdk/apr-service.d.ts.map +1 -0
- package/dist/sdk/apr-service.js +175 -0
- package/dist/sdk/apr-service.js.map +1 -0
- package/dist/sdk/math-utils.d.ts +138 -0
- package/dist/sdk/math-utils.d.ts.map +1 -0
- package/dist/sdk/math-utils.js +218 -0
- package/dist/sdk/math-utils.js.map +1 -0
- package/dist/sdk/simulation-service.d.ts +106 -0
- package/dist/sdk/simulation-service.d.ts.map +1 -0
- package/dist/sdk/simulation-service.js +143 -0
- package/dist/sdk/simulation-service.js.map +1 -0
- package/dist/sdk/vault-utils.d.ts +125 -0
- package/dist/sdk/vault-utils.d.ts.map +1 -0
- package/dist/sdk/vault-utils.js +165 -0
- package/dist/sdk/vault-utils.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +225 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
- package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
- package/dist/services/analytics/protocol-overview.service.js +182 -0
- package/dist/services/analytics/protocol-overview.service.js.map +1 -0
- package/dist/services/analytics/risk.service.d.ts +92 -0
- package/dist/services/analytics/risk.service.d.ts.map +1 -0
- package/dist/services/analytics/risk.service.js +423 -0
- package/dist/services/analytics/risk.service.js.map +1 -0
- package/dist/services/base.service.d.ts +39 -0
- package/dist/services/base.service.d.ts.map +1 -0
- package/dist/services/base.service.js +37 -0
- package/dist/services/base.service.js.map +1 -0
- package/dist/services/index.d.ts +30 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +101 -0
- package/dist/services/index.js.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.js +363 -0
- package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
- package/dist/tools/analyze-risk.d.ts +34 -0
- package/dist/tools/analyze-risk.d.ts.map +1 -0
- package/dist/tools/analyze-risk.js +100 -0
- package/dist/tools/analyze-risk.js.map +1 -0
- package/dist/tools/compare-vaults.d.ts +29 -0
- package/dist/tools/compare-vaults.d.ts.map +1 -0
- package/dist/tools/compare-vaults.js +285 -0
- package/dist/tools/compare-vaults.js.map +1 -0
- package/dist/tools/export-data.d.ts +34 -0
- package/dist/tools/export-data.d.ts.map +1 -0
- package/dist/tools/export-data.js +309 -0
- package/dist/tools/export-data.js.map +1 -0
- package/dist/tools/get-price-history.d.ts +29 -0
- package/dist/tools/get-price-history.d.ts.map +1 -0
- package/dist/tools/get-price-history.js +236 -0
- package/dist/tools/get-price-history.js.map +1 -0
- package/dist/tools/get-transactions.d.ts +29 -0
- package/dist/tools/get-transactions.d.ts.map +1 -0
- package/dist/tools/get-transactions.js +181 -0
- package/dist/tools/get-transactions.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/optimize-portfolio.d.ts +37 -0
- package/dist/tools/optimize-portfolio.d.ts.map +1 -0
- package/dist/tools/optimize-portfolio.js +459 -0
- package/dist/tools/optimize-portfolio.js.map +1 -0
- package/dist/tools/predict-yield.d.ts +30 -0
- package/dist/tools/predict-yield.d.ts.map +1 -0
- package/dist/tools/predict-yield.js +248 -0
- package/dist/tools/predict-yield.js.map +1 -0
- package/dist/tools/query-graphql.d.ts +35 -0
- package/dist/tools/query-graphql.d.ts.map +1 -0
- package/dist/tools/query-graphql.js +54 -0
- package/dist/tools/query-graphql.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +231 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-vaults.d.ts +40 -0
- package/dist/tools/search-vaults.d.ts.map +1 -0
- package/dist/tools/search-vaults.js +184 -0
- package/dist/tools/search-vaults.js.map +1 -0
- package/dist/tools/simulate-vault.d.ts +80 -0
- package/dist/tools/simulate-vault.d.ts.map +1 -0
- package/dist/tools/simulate-vault.js +281 -0
- package/dist/tools/simulate-vault.js.map +1 -0
- package/dist/tools/user-portfolio.d.ts +30 -0
- package/dist/tools/user-portfolio.d.ts.map +1 -0
- package/dist/tools/user-portfolio.js +142 -0
- package/dist/tools/user-portfolio.js.map +1 -0
- package/dist/tools/vault-data.d.ts +23 -0
- package/dist/tools/vault-data.d.ts.map +1 -0
- package/dist/tools/vault-data.js +68 -0
- package/dist/tools/vault-data.js.map +1 -0
- package/dist/tools/vault-performance.d.ts +30 -0
- package/dist/tools/vault-performance.d.ts.map +1 -0
- package/dist/tools/vault-performance.js +275 -0
- package/dist/tools/vault-performance.js.map +1 -0
- package/dist/types/generated.d.ts +1109 -0
- package/dist/types/generated.d.ts.map +1 -0
- package/dist/types/generated.js +2 -0
- package/dist/types/generated.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/comparison-metrics.d.ts +120 -0
- package/dist/utils/comparison-metrics.d.ts.map +1 -0
- package/dist/utils/comparison-metrics.js +215 -0
- package/dist/utils/comparison-metrics.js.map +1 -0
- package/dist/utils/config-loader.d.ts +17 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +45 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/csv-generator.d.ts +89 -0
- package/dist/utils/csv-generator.d.ts.map +1 -0
- package/dist/utils/csv-generator.js +97 -0
- package/dist/utils/csv-generator.js.map +1 -0
- package/dist/utils/disclaimers.d.ts +70 -0
- package/dist/utils/disclaimers.d.ts.map +1 -0
- package/dist/utils/disclaimers.js +161 -0
- package/dist/utils/disclaimers.js.map +1 -0
- package/dist/utils/errors.d.ts +66 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +86 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/execute-tool-with-cache.d.ts +97 -0
- package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
- package/dist/utils/execute-tool-with-cache.js +105 -0
- package/dist/utils/execute-tool-with-cache.js.map +1 -0
- package/dist/utils/portfolio-optimization.d.ts +100 -0
- package/dist/utils/portfolio-optimization.d.ts.map +1 -0
- package/dist/utils/portfolio-optimization.js +283 -0
- package/dist/utils/portfolio-optimization.js.map +1 -0
- package/dist/utils/risk-scoring.d.ts +226 -0
- package/dist/utils/risk-scoring.d.ts.map +1 -0
- package/dist/utils/risk-scoring.js +523 -0
- package/dist/utils/risk-scoring.js.map +1 -0
- package/dist/utils/tool-error-handler.d.ts +16 -0
- package/dist/utils/tool-error-handler.d.ts.map +1 -0
- package/dist/utils/tool-error-handler.js +43 -0
- package/dist/utils/tool-error-handler.js.map +1 -0
- package/dist/utils/tool-handler.d.ts +33 -0
- package/dist/utils/tool-handler.d.ts.map +1 -0
- package/dist/utils/tool-handler.js +59 -0
- package/dist/utils/tool-handler.js.map +1 -0
- package/dist/utils/tool-response.d.ts +16 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +25 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/dist/utils/validators.d.ts +359 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +233 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/utils/yield-prediction.d.ts +69 -0
- package/dist/utils/yield-prediction.d.ts.map +1 -0
- package/dist/utils/yield-prediction.js +290 -0
- package/dist/utils/yield-prediction.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* compare_vaults Tool
|
|
3
|
+
*
|
|
4
|
+
* Side-by-side comparison of multiple vaults with normalized metrics and rankings.
|
|
5
|
+
* Supports comparing 2-10 vaults simultaneously.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Evaluate investment opportunities across similar vaults
|
|
9
|
+
* - Identify best/worst performers in a category
|
|
10
|
+
* - Risk-adjusted return analysis
|
|
11
|
+
* - Performance: ~300 tokens per vault
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 15-minute TTL for comparison results
|
|
15
|
+
* - Cache key: compare:{sorted_addresses}:{chainId}
|
|
16
|
+
* - Cache hit rate target: 70-80%
|
|
17
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.ANALYTICS] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
20
|
+
import { COMPARE_VAULTS_QUERY } from '../graphql/queries/index.js';
|
|
21
|
+
import { normalizeAndRankVaults, generateComparisonSummary, formatComparisonTable, } from '../utils/comparison-metrics.js';
|
|
22
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
23
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
24
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
25
|
+
import { createSuccessResponse } from '../utils/tool-response.js';
|
|
26
|
+
import { analyzeRisk } from '../utils/risk-scoring.js';
|
|
27
|
+
/**
|
|
28
|
+
* Convert VaultData to VaultComparisonData for metrics calculation
|
|
29
|
+
* Now includes 12-factor risk analysis
|
|
30
|
+
*/
|
|
31
|
+
function convertToComparisonData(vault, chainId, allVaults) {
|
|
32
|
+
// Extract APR from nested state structure with proper null checking
|
|
33
|
+
// Use weekly or monthly linearNetApr as the primary APR metric
|
|
34
|
+
const weeklyApr = vault.state?.weeklyApr?.linearNetApr;
|
|
35
|
+
const monthlyApr = vault.state?.monthlyApr?.linearNetApr;
|
|
36
|
+
const apr = typeof weeklyApr === 'number' ? weeklyApr : typeof monthlyApr === 'number' ? monthlyApr : 0;
|
|
37
|
+
const tvl = vault.state?.totalAssetsUsd;
|
|
38
|
+
// Calculate risk score using existing risk analysis utility
|
|
39
|
+
let riskBreakdown;
|
|
40
|
+
try {
|
|
41
|
+
// Extract data for risk calculation
|
|
42
|
+
const vaultTVL = typeof tvl === 'number' ? tvl : 0;
|
|
43
|
+
const totalProtocolTVL = allVaults.reduce((sum, v) => sum + (v.state?.totalAssetsUsd || 0), 0);
|
|
44
|
+
// Age in days - default to 180 days (6 months) as we don't have creation timestamp
|
|
45
|
+
// This is a reasonable middle-ground assumption for risk calculation
|
|
46
|
+
const ageInDays = 180;
|
|
47
|
+
// Curator data (simplified - vault count = 1 for now, as we don't have curator history here)
|
|
48
|
+
const curatorVaultCount = vault.curators?.length || 1;
|
|
49
|
+
const curators = vault.curators || [];
|
|
50
|
+
const professionalSignals = {
|
|
51
|
+
hasWebsite: curators.some((c) => c.url && c.url.trim() !== ''),
|
|
52
|
+
hasDescription: curators.some((c) => c.aboutDescription && c.aboutDescription.trim() !== ''),
|
|
53
|
+
multipleCurators: curators.length > 1,
|
|
54
|
+
curatorCount: curators.length,
|
|
55
|
+
};
|
|
56
|
+
// Fee data
|
|
57
|
+
const managementFee = vault.state?.managementFee || 0;
|
|
58
|
+
const performanceFee = vault.state?.performanceFee || 0;
|
|
59
|
+
const pricePerShare = BigInt(vault.state?.pricePerShare || '0');
|
|
60
|
+
const highWaterMark = BigInt(vault.state?.highWaterMark || '0');
|
|
61
|
+
const performanceFeeActive = pricePerShare > highWaterMark;
|
|
62
|
+
// Liquidity data
|
|
63
|
+
const safeAssets = vault.state?.safeAssetBalanceUsd || 0;
|
|
64
|
+
const pendingRedemptions = vault.state?.pendingSettlement?.assetsUsd || 0;
|
|
65
|
+
// APR consistency data
|
|
66
|
+
const aprData = {
|
|
67
|
+
weeklyApr: vault.state?.weeklyApr?.linearNetApr,
|
|
68
|
+
monthlyApr: vault.state?.monthlyApr?.linearNetApr,
|
|
69
|
+
yearlyApr: vault.state?.yearlyApr?.linearNetApr,
|
|
70
|
+
inceptionApr: vault.state?.inceptionApr?.linearNetApr,
|
|
71
|
+
};
|
|
72
|
+
// Yield composition
|
|
73
|
+
const weeklyAprData = vault.state?.weeklyApr;
|
|
74
|
+
const yieldComposition = weeklyAprData
|
|
75
|
+
? {
|
|
76
|
+
totalApr: weeklyAprData.linearNetApr || 0,
|
|
77
|
+
nativeYieldsApr: weeklyAprData.nativeYields?.reduce((sum, ny) => sum + (ny.apr || 0), 0) || 0,
|
|
78
|
+
airdropsApr: weeklyAprData.airdrops?.reduce((sum, ad) => sum + (ad.apr || 0), 0) || 0,
|
|
79
|
+
incentivesApr: weeklyAprData.incentives?.reduce((sum, inc) => sum + (inc.apr || 0), 0) || 0,
|
|
80
|
+
}
|
|
81
|
+
: undefined;
|
|
82
|
+
// Settlement data
|
|
83
|
+
const averageSettlement = vault.averageSettlement || 0;
|
|
84
|
+
const pendingOperationsRatio = safeAssets > 0 ? pendingRedemptions / safeAssets : 0;
|
|
85
|
+
const settlementData = {
|
|
86
|
+
averageSettlementDays: averageSettlement,
|
|
87
|
+
pendingOperationsRatio,
|
|
88
|
+
};
|
|
89
|
+
// Integration complexity
|
|
90
|
+
const integrationCount = vault.defiIntegrations?.length || 0;
|
|
91
|
+
// Capacity utilization
|
|
92
|
+
const totalAssets = parseFloat(vault.state?.totalAssets || '0');
|
|
93
|
+
const maxCapacity = vault.maxCapacity ? parseFloat(vault.maxCapacity) : null;
|
|
94
|
+
const capacityData = {
|
|
95
|
+
totalAssets,
|
|
96
|
+
maxCapacity,
|
|
97
|
+
};
|
|
98
|
+
// Price history (empty for now - would need separate query)
|
|
99
|
+
const priceHistory = [];
|
|
100
|
+
// Calculate risk
|
|
101
|
+
riskBreakdown = analyzeRisk({
|
|
102
|
+
tvl: vaultTVL,
|
|
103
|
+
totalProtocolTVL,
|
|
104
|
+
priceHistory,
|
|
105
|
+
ageInDays,
|
|
106
|
+
curatorVaultCount,
|
|
107
|
+
curatorSuccessRate: 0.5, // Default without historical data
|
|
108
|
+
curatorProfessionalSignals: professionalSignals,
|
|
109
|
+
managementFee,
|
|
110
|
+
performanceFee,
|
|
111
|
+
performanceFeeActive,
|
|
112
|
+
safeAssets,
|
|
113
|
+
pendingRedemptions,
|
|
114
|
+
aprData,
|
|
115
|
+
yieldComposition,
|
|
116
|
+
settlementData,
|
|
117
|
+
integrationCount,
|
|
118
|
+
capacityData,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error(`Failed to calculate risk for vault ${vault.address}:`, error);
|
|
123
|
+
riskBreakdown = undefined;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
address: vault.address,
|
|
127
|
+
name: vault.name || 'Unknown Vault',
|
|
128
|
+
symbol: vault.symbol || 'N/A',
|
|
129
|
+
chainId: chainId,
|
|
130
|
+
tvl: typeof tvl === 'number' ? tvl : 0,
|
|
131
|
+
apr: apr,
|
|
132
|
+
totalShares: vault.state?.totalSupply,
|
|
133
|
+
totalAssets: vault.state?.totalAssets,
|
|
134
|
+
riskScore: riskBreakdown?.overallRisk,
|
|
135
|
+
riskLevel: riskBreakdown?.riskLevel,
|
|
136
|
+
riskBreakdown,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build markdown output from comparison data
|
|
141
|
+
*/
|
|
142
|
+
function buildComparisonMarkdown(summary, table, chainId, cached = false) {
|
|
143
|
+
const hasRiskData = summary.averageRisk !== undefined && summary.safestVault && summary.riskiestVault;
|
|
144
|
+
let markdown = cached
|
|
145
|
+
? `# Vault Comparison Results (Cached)\n\n`
|
|
146
|
+
: `# Vault Comparison Results\n\n`;
|
|
147
|
+
markdown += `**Chain ID**: ${chainId}\n`;
|
|
148
|
+
markdown += `**Vaults Analyzed**: ${summary.totalVaults}\n\n`;
|
|
149
|
+
markdown += `## Summary Statistics\n\n`;
|
|
150
|
+
markdown += `- **Average TVL**: $${(summary.averageTvl / 1000000).toFixed(2)}M\n`;
|
|
151
|
+
markdown += `- **Average APR**: ${(summary.averageApr * 100).toFixed(2)}%\n`;
|
|
152
|
+
if (hasRiskData) {
|
|
153
|
+
markdown += `- **Average Risk**: ${(summary.averageRisk * 100).toFixed(1)}%\n`;
|
|
154
|
+
}
|
|
155
|
+
markdown += `\n### Best Performer\n`;
|
|
156
|
+
markdown += `- **Vault**: ${summary.bestPerformer.name}\n`;
|
|
157
|
+
markdown += `- **APR**: ${(summary.bestPerformer.apr * 100).toFixed(2)}%\n\n`;
|
|
158
|
+
markdown += `### Worst Performer\n`;
|
|
159
|
+
markdown += `- **Vault**: ${summary.worstPerformer.name}\n`;
|
|
160
|
+
markdown += `- **APR**: ${(summary.worstPerformer.apr * 100).toFixed(2)}%\n\n`;
|
|
161
|
+
markdown += `### Highest TVL\n`;
|
|
162
|
+
markdown += `- **Vault**: ${summary.highestTvl.name}\n`;
|
|
163
|
+
markdown += `- **TVL**: $${(summary.highestTvl.tvl / 1000000).toFixed(2)}M\n\n`;
|
|
164
|
+
markdown += `### Lowest TVL\n`;
|
|
165
|
+
markdown += `- **Vault**: ${summary.lowestTvl.name}\n`;
|
|
166
|
+
markdown += `- **TVL**: $${(summary.lowestTvl.tvl / 1000000).toFixed(2)}M\n\n`;
|
|
167
|
+
if (hasRiskData) {
|
|
168
|
+
markdown += `### Safest Vault\n`;
|
|
169
|
+
markdown += `- **Vault**: ${summary.safestVault.name}\n`;
|
|
170
|
+
markdown += `- **Risk Score**: ${(summary.safestVault.riskScore * 100).toFixed(1)}% (${summary.safestVault.riskLevel})\n\n`;
|
|
171
|
+
markdown += `### Riskiest Vault\n`;
|
|
172
|
+
markdown += `- **Vault**: ${summary.riskiestVault.name}\n`;
|
|
173
|
+
markdown += `- **Risk Score**: ${(summary.riskiestVault.riskScore * 100).toFixed(1)}% (${summary.riskiestVault.riskLevel})\n\n`;
|
|
174
|
+
}
|
|
175
|
+
markdown += `## Detailed Comparison\n\n`;
|
|
176
|
+
markdown += `${table}\n\n`;
|
|
177
|
+
markdown += `**Legend**:\n`;
|
|
178
|
+
markdown += `- **Rank**: Overall ranking based on weighted score`;
|
|
179
|
+
if (hasRiskData) {
|
|
180
|
+
markdown += ` (40% APR, 30% TVL, 30% Safety)\n`;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
markdown += ` (60% APR, 40% TVL)\n`;
|
|
184
|
+
}
|
|
185
|
+
markdown += `- **Score**: Overall performance score (0-100)\n`;
|
|
186
|
+
markdown += `- **TVL Δ**: Delta from average TVL (%)\n`;
|
|
187
|
+
markdown += `- **APR Δ**: Delta from average APR (%)\n`;
|
|
188
|
+
if (hasRiskData) {
|
|
189
|
+
markdown += `- **Risk**: 12-factor risk score (🟢 Low, 🟡 Medium, 🟠 High, 🔴 Critical)\n`;
|
|
190
|
+
markdown += `- **Risk Δ**: Delta from average risk (%)\n`;
|
|
191
|
+
}
|
|
192
|
+
return markdown;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Transform raw GraphQL response into comparison markdown output
|
|
196
|
+
* Uses closure to capture input values
|
|
197
|
+
*/
|
|
198
|
+
function createTransformComparisonData(input) {
|
|
199
|
+
return (data) => {
|
|
200
|
+
// Convert to comparison data
|
|
201
|
+
const comparisonData = data.vaults.items.map((vault) => convertToComparisonData(vault, input.chainId, data.vaults.items));
|
|
202
|
+
// Normalize and rank vaults
|
|
203
|
+
const normalizedVaults = normalizeAndRankVaults(comparisonData);
|
|
204
|
+
// Generate summary statistics
|
|
205
|
+
const summary = generateComparisonSummary(comparisonData);
|
|
206
|
+
// Format as markdown table
|
|
207
|
+
const table = formatComparisonTable(normalizedVaults);
|
|
208
|
+
// Build output markdown
|
|
209
|
+
const markdown = buildComparisonMarkdown(summary, table, input.chainId, false);
|
|
210
|
+
return { markdown };
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create the executeCompareVaults function with DI container
|
|
215
|
+
*
|
|
216
|
+
* @param container - Service container with dependencies
|
|
217
|
+
* @returns Configured tool executor function
|
|
218
|
+
*/
|
|
219
|
+
export function createExecuteCompareVaults(container) {
|
|
220
|
+
return async (input) => {
|
|
221
|
+
// NEW: Cache cascade pattern - check fragment cache for ALL vaults
|
|
222
|
+
const cachedVaults = [];
|
|
223
|
+
let allCached = true;
|
|
224
|
+
for (const address of input.vaultAddresses) {
|
|
225
|
+
const vaultCacheKey = cacheKeys.vaultData(address, input.chainId);
|
|
226
|
+
const cachedVault = container.cache.get(vaultCacheKey);
|
|
227
|
+
if (cachedVault) {
|
|
228
|
+
cachedVaults.push(cachedVault);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
allCached = false;
|
|
232
|
+
break; // If any vault is missing, we need to query all
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// If ALL vaults are cached, return immediately without GraphQL query
|
|
236
|
+
if (allCached && cachedVaults.length === input.vaultAddresses.length) {
|
|
237
|
+
const comparisonData = cachedVaults.map((vault) => convertToComparisonData(vault, input.chainId, cachedVaults));
|
|
238
|
+
const normalizedVaults = normalizeAndRankVaults(comparisonData);
|
|
239
|
+
const summary = generateComparisonSummary(comparisonData);
|
|
240
|
+
const table = formatComparisonTable(normalizedVaults);
|
|
241
|
+
const markdown = buildComparisonMarkdown(summary, table, input.chainId, true);
|
|
242
|
+
return createSuccessResponse({ markdown });
|
|
243
|
+
}
|
|
244
|
+
// Not all vaults cached - execute normal GraphQL query for all vaults
|
|
245
|
+
const executor = executeToolWithCache({
|
|
246
|
+
container,
|
|
247
|
+
cacheKey: (input) => cacheKeys.compareVaults(input.vaultAddresses, input.chainId),
|
|
248
|
+
cacheTTL: cacheTTL.comparison,
|
|
249
|
+
query: COMPARE_VAULTS_QUERY,
|
|
250
|
+
variables: (input) => ({
|
|
251
|
+
addresses: input.vaultAddresses,
|
|
252
|
+
chainId: input.chainId,
|
|
253
|
+
}),
|
|
254
|
+
validateResult: (data) => ({
|
|
255
|
+
valid: !!(data.vaults?.items && data.vaults.items.length > 0),
|
|
256
|
+
message: data.vaults?.items && data.vaults.items.length > 0
|
|
257
|
+
? undefined
|
|
258
|
+
: `No vaults found for the provided addresses on chain ${input.chainId}`,
|
|
259
|
+
}),
|
|
260
|
+
transformResult: createTransformComparisonData(input),
|
|
261
|
+
toolName: 'compare_vaults',
|
|
262
|
+
});
|
|
263
|
+
// Register cache tags for invalidation
|
|
264
|
+
const cacheKey = cacheKeys.compareVaults(input.vaultAddresses, input.chainId);
|
|
265
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT, CacheTag.ANALYTICS]);
|
|
266
|
+
// Execute GraphQL query for all vaults
|
|
267
|
+
const result = await executor(input);
|
|
268
|
+
// Transform JSON output to markdown text format with legal disclaimer
|
|
269
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
270
|
+
try {
|
|
271
|
+
const output = JSON.parse(result.content[0].text);
|
|
272
|
+
result.content[0].text = output.markdown + getToolDisclaimer('compare_vaults');
|
|
273
|
+
// NEW: Cache each vault individually for future reuse
|
|
274
|
+
// This enables vault_data and other tools to reuse these vaults
|
|
275
|
+
// Note: The raw vault data needs to be extracted before transformation
|
|
276
|
+
// For now, we rely on the comparison cache itself
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
console.error('Failed to parse comparison output:', error);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return result;
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=compare-vaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-vaults.js","sourceRoot":"","sources":["../../src/tools/compare-vaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export_data Tool
|
|
3
|
+
*
|
|
4
|
+
* Export vault data, transactions, price history, or performance metrics in CSV or JSON format.
|
|
5
|
+
* Supports multiple data types and formats for integration with external tools and analysis.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Export vault data for spreadsheet analysis
|
|
9
|
+
* - Generate transaction reports for accounting
|
|
10
|
+
* - Export price history for charting tools
|
|
11
|
+
* - Create performance datasets for custom analytics
|
|
12
|
+
* - Performance: ~200-400 tokens per export depending on data size
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - No caching (exports are generated on-demand with latest data)
|
|
16
|
+
*
|
|
17
|
+
* WHY NO CACHING?
|
|
18
|
+
* This tool is intentionally non-cached because:
|
|
19
|
+
* 1. Export format/data type varies per request (CSV/JSON, vaults/transactions/etc)
|
|
20
|
+
* 2. Exports need fresh data (no staleness tolerance)
|
|
21
|
+
* 3. Large dataset exports would waste cache memory
|
|
22
|
+
* 4. One-time use exports (unlikely to be re-requested with same parameters)
|
|
23
|
+
*/
|
|
24
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
25
|
+
import { ExportDataInput } from '../utils/validators.js';
|
|
26
|
+
import { ServiceContainer } from '../core/container.js';
|
|
27
|
+
/**
|
|
28
|
+
* Create the executeExportData function with DI container
|
|
29
|
+
*
|
|
30
|
+
* @param container - Service container with dependencies
|
|
31
|
+
* @returns Configured tool executor function
|
|
32
|
+
*/
|
|
33
|
+
export declare function createExecuteExportData(container: ServiceContainer): (input: ExportDataInput) => Promise<CallToolResult>;
|
|
34
|
+
//# sourceMappingURL=export-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-data.d.ts","sourceRoot":"","sources":["../../src/tools/export-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAqBzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA0BxD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAoCrD"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export_data Tool
|
|
3
|
+
*
|
|
4
|
+
* Export vault data, transactions, price history, or performance metrics in CSV or JSON format.
|
|
5
|
+
* Supports multiple data types and formats for integration with external tools and analysis.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Export vault data for spreadsheet analysis
|
|
9
|
+
* - Generate transaction reports for accounting
|
|
10
|
+
* - Export price history for charting tools
|
|
11
|
+
* - Create performance datasets for custom analytics
|
|
12
|
+
* - Performance: ~200-400 tokens per export depending on data size
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - No caching (exports are generated on-demand with latest data)
|
|
16
|
+
*
|
|
17
|
+
* WHY NO CACHING?
|
|
18
|
+
* This tool is intentionally non-cached because:
|
|
19
|
+
* 1. Export format/data type varies per request (CSV/JSON, vaults/transactions/etc)
|
|
20
|
+
* 2. Exports need fresh data (no staleness tolerance)
|
|
21
|
+
* 3. Large dataset exports would waste cache memory
|
|
22
|
+
* 4. One-time use exports (unlikely to be re-requested with same parameters)
|
|
23
|
+
*/
|
|
24
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
25
|
+
import { handleToolError } from '../utils/tool-error-handler.js';
|
|
26
|
+
import { calculatePricePerShare } from '../sdk/vault-utils.js';
|
|
27
|
+
import { EXPORT_VAULTS_QUERY, EXPORT_TRANSACTIONS_QUERY, EXPORT_PRICE_HISTORY_QUERY, EXPORT_PERFORMANCE_QUERY, } from '../graphql/queries/index.js';
|
|
28
|
+
import { generateVaultCSV, generateTransactionCSV, generatePriceHistoryCSV, generatePerformanceCSV, } from '../utils/csv-generator.js';
|
|
29
|
+
/**
|
|
30
|
+
* Convert VaultData to CSV format
|
|
31
|
+
*/
|
|
32
|
+
function convertVaultToCSV(vault, chainId) {
|
|
33
|
+
const weeklyApr = vault.state?.weeklyApr?.linearNetApr;
|
|
34
|
+
const monthlyApr = vault.state?.monthlyApr?.linearNetApr;
|
|
35
|
+
const apr = typeof weeklyApr === 'number' ? weeklyApr : typeof monthlyApr === 'number' ? monthlyApr : 0;
|
|
36
|
+
return {
|
|
37
|
+
address: vault.address,
|
|
38
|
+
name: vault.name || 'Unknown',
|
|
39
|
+
symbol: vault.symbol || 'N/A',
|
|
40
|
+
chainId,
|
|
41
|
+
tvl: vault.state?.totalAssetsUsd || 0,
|
|
42
|
+
apr,
|
|
43
|
+
pricePerShare: vault.state?.pricePerShareUsd || 0,
|
|
44
|
+
totalAssets: vault.state?.totalAssets || '0',
|
|
45
|
+
totalShares: vault.state?.totalSupply || '0',
|
|
46
|
+
assetSymbol: vault.asset?.symbol || 'N/A',
|
|
47
|
+
assetAddress: vault.asset?.address || '0x0',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create the executeExportData function with DI container
|
|
52
|
+
*
|
|
53
|
+
* @param container - Service container with dependencies
|
|
54
|
+
* @returns Configured tool executor function
|
|
55
|
+
*/
|
|
56
|
+
export function createExecuteExportData(container) {
|
|
57
|
+
return async (input) => {
|
|
58
|
+
try {
|
|
59
|
+
// Validate input
|
|
60
|
+
// Input already validated by createToolHandler
|
|
61
|
+
// Route to appropriate export handler
|
|
62
|
+
switch (input.dataType) {
|
|
63
|
+
case 'vaults':
|
|
64
|
+
return await exportVaults(container, input);
|
|
65
|
+
case 'transactions':
|
|
66
|
+
return await exportTransactions(container, input);
|
|
67
|
+
case 'price_history':
|
|
68
|
+
return await exportPriceHistory(container, input);
|
|
69
|
+
case 'performance':
|
|
70
|
+
return await exportPerformance(container, input);
|
|
71
|
+
default:
|
|
72
|
+
// Exhaustiveness check - all data types should be handled above
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: `Unknown data type: ${String(input.dataType)}`,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return handleToolError(error, 'export_data');
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Export vault data
|
|
91
|
+
*/
|
|
92
|
+
async function exportVaults(container, input) {
|
|
93
|
+
const data = await container.graphqlClient.request(EXPORT_VAULTS_QUERY, {
|
|
94
|
+
addresses: input.vaultAddresses,
|
|
95
|
+
chainId: input.chainId,
|
|
96
|
+
});
|
|
97
|
+
if (!data.vaults || !data.vaults.items || data.vaults.items.length === 0) {
|
|
98
|
+
return {
|
|
99
|
+
content: [
|
|
100
|
+
{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: `No vaults found for the provided addresses on chain ${input.chainId}`,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
isError: false,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const csvData = data.vaults.items.map((vault) => convertVaultToCSV(vault, input.chainId));
|
|
109
|
+
if (input.format === 'csv') {
|
|
110
|
+
const csv = generateVaultCSV(csvData);
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
type: 'text',
|
|
115
|
+
text: `# Vault Data Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Vaults${getToolDisclaimer('export_data')}`,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
isError: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// JSON format
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: 'text',
|
|
127
|
+
text: `# Vault Data Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Vaults${getToolDisclaimer('export_data')}`,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
isError: false,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Export transaction data
|
|
136
|
+
*/
|
|
137
|
+
async function exportTransactions(container, input) {
|
|
138
|
+
const data = await container.graphqlClient.request(EXPORT_TRANSACTIONS_QUERY, {
|
|
139
|
+
vault_in: input.vaultAddresses,
|
|
140
|
+
chainId: input.chainId,
|
|
141
|
+
first: 1000,
|
|
142
|
+
});
|
|
143
|
+
if (!data.transactions || data.transactions.items.length === 0) {
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: 'text',
|
|
148
|
+
text: `No transactions found for the provided vault addresses on chain ${input.chainId}`,
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
isError: false,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const csvData = data.transactions.items.map((tx) => {
|
|
155
|
+
const txData = tx.data;
|
|
156
|
+
return {
|
|
157
|
+
id: tx.id,
|
|
158
|
+
type: tx.type,
|
|
159
|
+
timestamp: new Date(parseInt(tx.timestamp, 10) * 1000).toISOString(),
|
|
160
|
+
blockNumber: tx.blockNumber,
|
|
161
|
+
vaultAddress: tx.vault.address,
|
|
162
|
+
userAddress: txData.user,
|
|
163
|
+
amount: txData.assets,
|
|
164
|
+
shares: txData.shares,
|
|
165
|
+
assets: txData.assets,
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
const disclaimer = getToolDisclaimer('export_data');
|
|
169
|
+
if (input.format === 'csv') {
|
|
170
|
+
const csv = generateTransactionCSV(csvData);
|
|
171
|
+
return {
|
|
172
|
+
content: [
|
|
173
|
+
{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: `# Transaction Data Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Transactions${disclaimer}`,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
isError: false,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
return {
|
|
183
|
+
content: [
|
|
184
|
+
{
|
|
185
|
+
type: 'text',
|
|
186
|
+
text: `# Transaction Data Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Transactions${disclaimer}`,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
isError: false,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Export price history data
|
|
195
|
+
*/
|
|
196
|
+
async function exportPriceHistory(container, input) {
|
|
197
|
+
const data = await container.graphqlClient.request(EXPORT_PRICE_HISTORY_QUERY, {
|
|
198
|
+
vault_in: input.vaultAddresses,
|
|
199
|
+
first: 1000,
|
|
200
|
+
});
|
|
201
|
+
if (!data.transactions || data.transactions.items.length === 0) {
|
|
202
|
+
return {
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: 'text',
|
|
206
|
+
text: `No price history found for the provided vault addresses`,
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
isError: false,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Aggregate by day for OHLCV
|
|
213
|
+
const dayBuckets = new Map();
|
|
214
|
+
for (const tx of data.transactions.items) {
|
|
215
|
+
const date = new Date(parseInt(tx.timestamp, 10) * 1000).toISOString().split('T')[0];
|
|
216
|
+
if (!dayBuckets.has(date)) {
|
|
217
|
+
dayBuckets.set(date, []);
|
|
218
|
+
}
|
|
219
|
+
// Calculate price per share using Lagoon SDK
|
|
220
|
+
const vaultDecimals = tx.data.vault.decimals ?? 18;
|
|
221
|
+
const assetDecimals = tx.data.vault.asset.decimals;
|
|
222
|
+
const pricePerShareBigInt = calculatePricePerShare(BigInt(tx.data.totalAssets), BigInt(tx.data.totalSupply), vaultDecimals, assetDecimals);
|
|
223
|
+
// Convert to number for OHLCV export (in asset decimals)
|
|
224
|
+
const pricePerShare = Number(pricePerShareBigInt) / 10 ** assetDecimals;
|
|
225
|
+
dayBuckets.get(date).push(pricePerShare);
|
|
226
|
+
}
|
|
227
|
+
const csvData = Array.from(dayBuckets.entries())
|
|
228
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
229
|
+
.map(([date, prices]) => ({
|
|
230
|
+
date,
|
|
231
|
+
open: prices[0],
|
|
232
|
+
high: Math.max(...prices),
|
|
233
|
+
low: Math.min(...prices),
|
|
234
|
+
close: prices[prices.length - 1],
|
|
235
|
+
volume: prices.length,
|
|
236
|
+
}));
|
|
237
|
+
if (input.format === 'csv') {
|
|
238
|
+
const csv = generatePriceHistoryCSV(csvData);
|
|
239
|
+
return {
|
|
240
|
+
content: [
|
|
241
|
+
{
|
|
242
|
+
type: 'text',
|
|
243
|
+
text: `# Price History Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Price History (OHLCV)`,
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
isError: false,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
return {
|
|
251
|
+
content: [
|
|
252
|
+
{
|
|
253
|
+
type: 'text',
|
|
254
|
+
text: `# Price History Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Price History (OHLCV)`,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
isError: false,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Export performance metrics
|
|
263
|
+
*/
|
|
264
|
+
async function exportPerformance(container, input) {
|
|
265
|
+
const data = await container.graphqlClient.request(EXPORT_PERFORMANCE_QUERY, {
|
|
266
|
+
vault_in: input.vaultAddresses,
|
|
267
|
+
first: 1000,
|
|
268
|
+
});
|
|
269
|
+
if (!data.transactions || data.transactions.items.length === 0) {
|
|
270
|
+
return {
|
|
271
|
+
content: [
|
|
272
|
+
{
|
|
273
|
+
type: 'text',
|
|
274
|
+
text: `No performance data found for the provided vault addresses`,
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
isError: false,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const csvData = data.transactions.items.map((tx) => ({
|
|
281
|
+
timestamp: new Date(parseInt(tx.timestamp, 10) * 1000).toISOString(),
|
|
282
|
+
totalAssetsUsd: tx.data.totalAssetsUsd,
|
|
283
|
+
blockNumber: tx.blockNumber,
|
|
284
|
+
}));
|
|
285
|
+
if (input.format === 'csv') {
|
|
286
|
+
const csv = generatePerformanceCSV(csvData);
|
|
287
|
+
return {
|
|
288
|
+
content: [
|
|
289
|
+
{
|
|
290
|
+
type: 'text',
|
|
291
|
+
text: `# Performance Metrics Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Performance Metrics`,
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
isError: false,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
return {
|
|
299
|
+
content: [
|
|
300
|
+
{
|
|
301
|
+
type: 'text',
|
|
302
|
+
text: `# Performance Metrics Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Performance Metrics`,
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
isError: false,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=export-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-data.js","sourceRoot":"","sources":["../../src/tools/export-data.ts"],"names":[],"mappings":"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"}
|