@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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_user_portfolio Tool
|
|
3
|
+
*
|
|
4
|
+
* Fetch user's complete portfolio across all chains with 5-minute caching.
|
|
5
|
+
* Optimized for cross-chain portfolio aggregation using single query.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Multi-chain portfolio analysis
|
|
9
|
+
* - User position tracking across all supported chains
|
|
10
|
+
* - Portfolio value aggregation
|
|
11
|
+
* - Performance: ~500-1000 tokens per user (depending on position count)
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 5-minute TTL for frequently changing user positions
|
|
15
|
+
* - Cache key: portfolio:{address}
|
|
16
|
+
* - Single query returns all chains at once
|
|
17
|
+
* - Cache hit rate target: 70-80%
|
|
18
|
+
* - Cache tags: [CacheTag.PORTFOLIO] for invalidation
|
|
19
|
+
*/
|
|
20
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
21
|
+
import { createGetUserPortfolioQuery } from '../graphql/queries/portfolio.queries.js';
|
|
22
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
23
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
24
|
+
import { cacheKeys, cacheTTL, generateCacheKey } from '../cache/index.js';
|
|
25
|
+
/**
|
|
26
|
+
* Transform raw GraphQL response into aggregated portfolio
|
|
27
|
+
*/
|
|
28
|
+
function createTransformPortfolioData(userAddress) {
|
|
29
|
+
return (data) => {
|
|
30
|
+
const positions = [];
|
|
31
|
+
let totalValueUsd = 0;
|
|
32
|
+
// Process all user items (typically one user)
|
|
33
|
+
for (const user of data.users.items) {
|
|
34
|
+
// Add user's total value
|
|
35
|
+
const userTotalUsd = parseFloat(user.state.totalSharesUsd || '0');
|
|
36
|
+
totalValueUsd += userTotalUsd;
|
|
37
|
+
// Process each vault position
|
|
38
|
+
for (const position of user.vaultPositions) {
|
|
39
|
+
positions.push({
|
|
40
|
+
// Vault identification
|
|
41
|
+
vaultAddress: position.vault.address,
|
|
42
|
+
vaultSymbol: position.vault.symbol,
|
|
43
|
+
vaultName: position.vault.name,
|
|
44
|
+
// Asset information
|
|
45
|
+
assetSymbol: position.vault.asset.symbol,
|
|
46
|
+
assetAddress: position.vault.asset.address,
|
|
47
|
+
// Position state
|
|
48
|
+
shares: position.state.shares,
|
|
49
|
+
assets: position.state.assets,
|
|
50
|
+
sharesUsd: position.state.sharesUsd,
|
|
51
|
+
// Complete vault metadata
|
|
52
|
+
vault: position.vault,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Sort positions by USD value (descending)
|
|
57
|
+
positions.sort((a, b) => {
|
|
58
|
+
const aUsd = parseFloat(a.sharesUsd || '0');
|
|
59
|
+
const bUsd = parseFloat(b.sharesUsd || '0');
|
|
60
|
+
return bUsd - aUsd;
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
userAddress,
|
|
64
|
+
positions,
|
|
65
|
+
totalValueUsd: totalValueUsd.toFixed(2),
|
|
66
|
+
positionCount: positions.length,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create the executeGetUserPortfolio function with DI container
|
|
72
|
+
*
|
|
73
|
+
* @param container - Service container with dependencies
|
|
74
|
+
* @returns Configured tool executor function
|
|
75
|
+
*/
|
|
76
|
+
export function createExecuteGetUserPortfolio(container) {
|
|
77
|
+
return async (input) => {
|
|
78
|
+
// Determine response format (default to 'summary' for balanced performance)
|
|
79
|
+
const responseFormat = input.responseFormat === 'list'
|
|
80
|
+
? 'list'
|
|
81
|
+
: input.responseFormat === 'full'
|
|
82
|
+
? 'full'
|
|
83
|
+
: 'summary';
|
|
84
|
+
// Generate cache key (responseFormat doesn't affect caching since fragments are structural)
|
|
85
|
+
const cacheKey = cacheKeys.userPortfolio(input.userAddress);
|
|
86
|
+
// Create dynamic query based on responseFormat
|
|
87
|
+
const query = createGetUserPortfolioQuery(responseFormat);
|
|
88
|
+
const executor = executeToolWithCache({
|
|
89
|
+
container,
|
|
90
|
+
cacheKey: () => cacheKey,
|
|
91
|
+
cacheTTL: cacheTTL.userPortfolio,
|
|
92
|
+
query,
|
|
93
|
+
variables: (input) => ({
|
|
94
|
+
where: {
|
|
95
|
+
user_eq: input.userAddress,
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
validateResult: (data) => ({
|
|
99
|
+
valid: !!(data.users.items && data.users.items.length > 0),
|
|
100
|
+
message: data.users.items && data.users.items.length > 0
|
|
101
|
+
? undefined
|
|
102
|
+
: `No portfolio data found for user: ${String(data)}`,
|
|
103
|
+
}),
|
|
104
|
+
transformResult: createTransformPortfolioData(input.userAddress),
|
|
105
|
+
toolName: 'get_user_portfolio',
|
|
106
|
+
});
|
|
107
|
+
// Register cache tags for invalidation
|
|
108
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.PORTFOLIO]);
|
|
109
|
+
// Execute query
|
|
110
|
+
const result = await executor(input);
|
|
111
|
+
// NEW: Fragment-level caching - cache each vault from positions for reuse
|
|
112
|
+
// This enables vault_data tool to reuse vaults from portfolio results
|
|
113
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
114
|
+
try {
|
|
115
|
+
const responseData = JSON.parse(result.content[0].text);
|
|
116
|
+
if (responseData.positions && Array.isArray(responseData.positions)) {
|
|
117
|
+
// Cache each vault from positions individually with vault-specific key
|
|
118
|
+
const positions = responseData.positions;
|
|
119
|
+
positions.forEach((position) => {
|
|
120
|
+
if (position.vault && position.vault.address && position.vault.chain?.id) {
|
|
121
|
+
const vaultCacheKey = generateCacheKey(CacheTag.VAULT, {
|
|
122
|
+
address: String(position.vault.address),
|
|
123
|
+
chainId: Number(position.vault.chain.id),
|
|
124
|
+
});
|
|
125
|
+
container.cache.set(vaultCacheKey, position.vault, cacheTTL.vaultData);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// If parsing fails, just return the result without fragment caching
|
|
132
|
+
// This is a non-critical optimization
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Add legal disclaimer to output
|
|
136
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
137
|
+
result.content[0].text = result.content[0].text + getToolDisclaimer('user_portfolio');
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=user-portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-portfolio.js","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_vault_data Tool
|
|
3
|
+
*
|
|
4
|
+
* Fetch complete vault information with 15-minute caching.
|
|
5
|
+
* Optimized for detailed analysis of 1-5 vaults.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Detailed vault analysis with all fields
|
|
9
|
+
* - Single or small set of vaults (1-5)
|
|
10
|
+
* - Repeated queries for same vault data
|
|
11
|
+
* - Performance: ~500 tokens per vault
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 15-minute TTL for balance between freshness and performance
|
|
15
|
+
* - Cache key: vault:{address}:{chainId}
|
|
16
|
+
* - Cache hit rate target: 80-90%
|
|
17
|
+
* - Cache tags: [CacheTag.VAULT] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
20
|
+
import { GetVaultDataInput } from '../utils/validators.js';
|
|
21
|
+
import { ServiceContainer } from '../core/container.js';
|
|
22
|
+
export declare function createExecuteGetVaultData(container: ServiceContainer): (input: GetVaultDataInput) => Promise<CallToolResult>;
|
|
23
|
+
//# sourceMappingURL=vault-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-data.d.ts","sourceRoot":"","sources":["../../src/tools/vault-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA2BxD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CAmDvD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_vault_data Tool
|
|
3
|
+
*
|
|
4
|
+
* Fetch complete vault information with 15-minute caching.
|
|
5
|
+
* Optimized for detailed analysis of 1-5 vaults.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Detailed vault analysis with all fields
|
|
9
|
+
* - Single or small set of vaults (1-5)
|
|
10
|
+
* - Repeated queries for same vault data
|
|
11
|
+
* - Performance: ~500 tokens per vault
|
|
12
|
+
*
|
|
13
|
+
* Cache strategy:
|
|
14
|
+
* - 15-minute TTL for balance between freshness and performance
|
|
15
|
+
* - Cache key: vault:{address}:{chainId}
|
|
16
|
+
* - Cache hit rate target: 80-90%
|
|
17
|
+
* - Cache tags: [CacheTag.VAULT] for invalidation
|
|
18
|
+
*/
|
|
19
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
20
|
+
import { GET_VAULT_DATA_QUERY } from '../graphql/queries/index.js';
|
|
21
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
22
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
23
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
24
|
+
import { generateCacheKey } from '../cache/index.js';
|
|
25
|
+
import { createSuccessResponse } from '../utils/tool-response.js';
|
|
26
|
+
export function createExecuteGetVaultData(container) {
|
|
27
|
+
return async (input) => {
|
|
28
|
+
// NEW: Check fragment-level cache first (vaults from search_vaults)
|
|
29
|
+
// This enables data reuse across tools without duplicate GraphQL queries
|
|
30
|
+
const fragmentCacheKey = generateCacheKey(CacheTag.VAULT, {
|
|
31
|
+
address: input.vaultAddress,
|
|
32
|
+
chainId: input.chainId,
|
|
33
|
+
});
|
|
34
|
+
const cachedVault = container.cache.get(fragmentCacheKey);
|
|
35
|
+
if (cachedVault) {
|
|
36
|
+
// Cache hit from search_vaults - return immediately without GraphQL query
|
|
37
|
+
return createSuccessResponse({ vaultByAddress: cachedVault });
|
|
38
|
+
}
|
|
39
|
+
// Cache miss - execute GraphQL query with standard caching
|
|
40
|
+
const executor = executeToolWithCache({
|
|
41
|
+
container,
|
|
42
|
+
cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
|
|
43
|
+
cacheTTL: cacheTTL.vaultData,
|
|
44
|
+
query: GET_VAULT_DATA_QUERY,
|
|
45
|
+
variables: (input) => ({
|
|
46
|
+
address: input.vaultAddress,
|
|
47
|
+
chainId: input.chainId,
|
|
48
|
+
}),
|
|
49
|
+
validateResult: (data) => ({
|
|
50
|
+
valid: !!data.vaultByAddress,
|
|
51
|
+
message: data.vaultByAddress
|
|
52
|
+
? undefined
|
|
53
|
+
: `Vault not found: address ${String(data)} on requested chain`,
|
|
54
|
+
}),
|
|
55
|
+
toolName: 'get_vault_data',
|
|
56
|
+
});
|
|
57
|
+
// Register cache tags for invalidation
|
|
58
|
+
const cacheKey = cacheKeys.vaultData(input.vaultAddress, input.chainId);
|
|
59
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT]);
|
|
60
|
+
const result = await executor(input);
|
|
61
|
+
// Add legal disclaimer to output
|
|
62
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
63
|
+
result.content[0].text = result.content[0].text + getToolDisclaimer('vault_data');
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=vault-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-data.js","sourceRoot":"","sources":["../../src/tools/vault-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAuBlE,MAAM,UAAU,yBAAyB,CACvC,SAA2B;IAE3B,OAAO,KAAK,EAAE,KAAwB,EAA2B,EAAE;QACjE,oEAAoE;QACpE,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE;YACxD,OAAO,EAAE,KAAK,CAAC,YAAY;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,WAAW,EAAE,CAAC;YAChB,0EAA0E;YAC1E,OAAO,qBAAqB,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAInC;YACA,SAAS;YACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3E,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,YAAY;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;YACF,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;gBAC5B,OAAO,EAAE,IAAI,CAAC,cAAc;oBAC1B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,qBAAqB;aAClE,CAAC;YACF,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErC,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_vault_performance Tool
|
|
3
|
+
*
|
|
4
|
+
* Historical metrics and trend analysis for vaults with 30-minute caching.
|
|
5
|
+
* Aggregates transaction data to provide time-series performance metrics.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Performance tracking over time (7d, 30d, 90d, 1y)
|
|
9
|
+
* - TVL trend analysis and inflection point identification
|
|
10
|
+
* - Historical deposit/withdrawal volume analysis
|
|
11
|
+
* - Percent change calculations and performance comparison
|
|
12
|
+
* - Performance: ~400-600 tokens per vault per time range
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - 30-minute TTL (historical data changes infrequently)
|
|
16
|
+
* - Cache key: perf:{address}:{chainId}:{timeRange}
|
|
17
|
+
* - Cache hit rate target: 80-90%
|
|
18
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.APR] for invalidation
|
|
19
|
+
*/
|
|
20
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
21
|
+
import { GetVaultPerformanceInput } from '../utils/validators.js';
|
|
22
|
+
import { ServiceContainer } from '../core/container.js';
|
|
23
|
+
/**
|
|
24
|
+
* Create the executeGetVaultPerformance function with DI container
|
|
25
|
+
*
|
|
26
|
+
* @param container - Service container with dependencies
|
|
27
|
+
* @returns Configured tool executor function
|
|
28
|
+
*/
|
|
29
|
+
export declare function createExecuteGetVaultPerformance(container: ServiceContainer): (input: GetVaultPerformanceInput) => Promise<CallToolResult>;
|
|
30
|
+
//# sourceMappingURL=vault-performance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-performance.d.ts","sourceRoot":"","sources":["../../src/tools/vault-performance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqWxD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,cAAc,CAAC,CAwE9D"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_vault_performance Tool
|
|
3
|
+
*
|
|
4
|
+
* Historical metrics and trend analysis for vaults with 30-minute caching.
|
|
5
|
+
* Aggregates transaction data to provide time-series performance metrics.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Performance tracking over time (7d, 30d, 90d, 1y)
|
|
9
|
+
* - TVL trend analysis and inflection point identification
|
|
10
|
+
* - Historical deposit/withdrawal volume analysis
|
|
11
|
+
* - Percent change calculations and performance comparison
|
|
12
|
+
* - Performance: ~400-600 tokens per vault per time range
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - 30-minute TTL (historical data changes infrequently)
|
|
16
|
+
* - Cache key: perf:{address}:{chainId}:{timeRange}
|
|
17
|
+
* - Cache hit rate target: 80-90%
|
|
18
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.APR] for invalidation
|
|
19
|
+
*/
|
|
20
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
21
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
22
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
23
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
24
|
+
import { GET_VAULT_FOR_APR_QUERY, GET_VAULT_PERFORMANCE_QUERY, GET_PERIOD_SUMMARIES_QUERY, } from '../graphql/queries/index.js';
|
|
25
|
+
import { transformPeriodSummariesToAPRData, calculateCurrentAPR, } from '../sdk/apr-service.js';
|
|
26
|
+
/**
|
|
27
|
+
* Time range constants (in seconds)
|
|
28
|
+
*/
|
|
29
|
+
const TIME_RANGES = {
|
|
30
|
+
'7d': 7 * 24 * 60 * 60,
|
|
31
|
+
'30d': 30 * 24 * 60 * 60,
|
|
32
|
+
'90d': 90 * 24 * 60 * 60,
|
|
33
|
+
'1y': 365 * 24 * 60 * 60,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Type guard for TotalAssetsUpdatedData
|
|
37
|
+
*/
|
|
38
|
+
function isTotalAssetsUpdated(data) {
|
|
39
|
+
return (typeof data === 'object' && data !== null && 'totalAssetsUsd' in data && 'totalAssets' in data);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Type guard for PeriodSummaryData
|
|
43
|
+
*/
|
|
44
|
+
function isPeriodSummary(data) {
|
|
45
|
+
return (typeof data === 'object' &&
|
|
46
|
+
data !== null &&
|
|
47
|
+
'duration' in data &&
|
|
48
|
+
'totalAssetsAtStart' in data &&
|
|
49
|
+
'totalSupplyAtStart' in data);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Aggregate transaction data into time-series metrics
|
|
53
|
+
*/
|
|
54
|
+
function aggregateMetrics(transactions) {
|
|
55
|
+
const metrics = [];
|
|
56
|
+
for (const tx of transactions) {
|
|
57
|
+
if (tx.type === 'TotalAssetsUpdated' && isTotalAssetsUpdated(tx.data)) {
|
|
58
|
+
metrics.push({
|
|
59
|
+
timestamp: parseInt(tx.timestamp, 10),
|
|
60
|
+
totalAssetsUsd: tx.data.totalAssetsUsd,
|
|
61
|
+
blockNumber: tx.blockNumber,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (tx.type === 'PeriodSummary' && isPeriodSummary(tx.data)) {
|
|
65
|
+
// PeriodSummary contains totalAssetsAtEnd which represents the total assets at period end
|
|
66
|
+
metrics.push({
|
|
67
|
+
timestamp: parseInt(tx.timestamp, 10),
|
|
68
|
+
totalAssetsUsd: parseFloat(tx.data.totalAssetsAtEnd),
|
|
69
|
+
blockNumber: tx.blockNumber,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return metrics;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Calculate summary statistics from metrics
|
|
77
|
+
*/
|
|
78
|
+
function calculateSummary(metrics, transactions) {
|
|
79
|
+
if (metrics.length === 0) {
|
|
80
|
+
return {
|
|
81
|
+
startValue: 0,
|
|
82
|
+
endValue: 0,
|
|
83
|
+
percentChange: 0,
|
|
84
|
+
volumeUsd: 0,
|
|
85
|
+
transactionCount: 0,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const startValue = metrics[0].totalAssetsUsd;
|
|
89
|
+
const endValue = metrics[metrics.length - 1].totalAssetsUsd;
|
|
90
|
+
const percentChange = startValue > 0 ? ((endValue - startValue) / startValue) * 100 : 0;
|
|
91
|
+
// Volume calculation: deposit/withdrawal fields not available in current schema
|
|
92
|
+
// Frontend confirmed it doesn't use volume metrics, so we set to 0
|
|
93
|
+
// If volume is needed in future, fields must be added to GraphQL schema first
|
|
94
|
+
const volumeUsd = 0;
|
|
95
|
+
return {
|
|
96
|
+
startValue,
|
|
97
|
+
endValue,
|
|
98
|
+
percentChange,
|
|
99
|
+
volumeUsd,
|
|
100
|
+
transactionCount: transactions.length,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Calculate SDK APR data for vault
|
|
105
|
+
*
|
|
106
|
+
* Fetches period summaries and vault data to calculate protocol-accurate APR
|
|
107
|
+
* using Lagoon SDK functions.
|
|
108
|
+
*
|
|
109
|
+
* @param container - Service container with GraphQL client
|
|
110
|
+
* @param vaultAddress - Vault address
|
|
111
|
+
* @param chainId - Chain ID
|
|
112
|
+
* @returns SDK-calculated APR data or undefined if unavailable
|
|
113
|
+
*/
|
|
114
|
+
async function calculateSDKAPR(container, vaultAddress, chainId) {
|
|
115
|
+
try {
|
|
116
|
+
// Fetch period summaries for historical APR data
|
|
117
|
+
const periodSummariesData = await container.graphqlClient.request(GET_PERIOD_SUMMARIES_QUERY, {
|
|
118
|
+
where: {
|
|
119
|
+
vault_in: [vaultAddress],
|
|
120
|
+
chainId_eq: chainId,
|
|
121
|
+
type_in: ['PeriodSummary'],
|
|
122
|
+
},
|
|
123
|
+
orderBy: 'timestamp',
|
|
124
|
+
orderDirection: 'asc',
|
|
125
|
+
first: 1000,
|
|
126
|
+
});
|
|
127
|
+
// Fetch vault data for current price per share
|
|
128
|
+
const vaultData = await container.graphqlClient.request(GET_VAULT_FOR_APR_QUERY, {
|
|
129
|
+
address: vaultAddress,
|
|
130
|
+
chainId,
|
|
131
|
+
});
|
|
132
|
+
// Graceful degradation if no data available
|
|
133
|
+
if (!periodSummariesData.transactions?.items?.length || !vaultData.vaultByAddress) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const vault = vaultData.vaultByAddress;
|
|
137
|
+
// Extract PeriodSummary data from transaction items
|
|
138
|
+
const periodSummaries = periodSummariesData.transactions.items.map((tx) => ({
|
|
139
|
+
timestamp: tx.timestamp,
|
|
140
|
+
totalAssetsAtStart: tx.data.totalAssetsAtStart,
|
|
141
|
+
totalSupplyAtStart: tx.data.totalSupplyAtStart,
|
|
142
|
+
}));
|
|
143
|
+
// Transform period summaries to APR historical data
|
|
144
|
+
const aprData = transformPeriodSummariesToAPRData(periodSummaries, vault);
|
|
145
|
+
// Check if we have any APR data
|
|
146
|
+
if (!aprData.thirtyDay && !aprData.inception) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
// Get current price per share
|
|
150
|
+
const currentPricePerShare = BigInt(vault.state.pricePerShare);
|
|
151
|
+
// Calculate current APR values
|
|
152
|
+
const aprs = calculateCurrentAPR(aprData, currentPricePerShare);
|
|
153
|
+
// Build SDK APR response
|
|
154
|
+
const result = {
|
|
155
|
+
method: 'Lagoon SDK v0.10.1',
|
|
156
|
+
dataSource: 'Lagoon GraphQL period summaries',
|
|
157
|
+
};
|
|
158
|
+
// Add 30-day APR if available
|
|
159
|
+
if (aprData.thirtyDay && aprs.thirtyDay !== undefined) {
|
|
160
|
+
const assetDecimals = vault.asset.decimals;
|
|
161
|
+
result.thirtyDay = {
|
|
162
|
+
timestamp: aprData.thirtyDay.timestamp,
|
|
163
|
+
pricePerShare: aprData.thirtyDay.pricePerShare.toString(),
|
|
164
|
+
pricePerShareDecimal: (Number(aprData.thirtyDay.pricePerShare) /
|
|
165
|
+
10 ** assetDecimals).toFixed(assetDecimals),
|
|
166
|
+
apr: aprs.thirtyDay,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Add inception APR if available
|
|
170
|
+
if (aprData.inception && aprs.inception !== undefined) {
|
|
171
|
+
const assetDecimals = vault.asset.decimals;
|
|
172
|
+
result.inception = {
|
|
173
|
+
timestamp: aprData.inception.timestamp,
|
|
174
|
+
pricePerShare: aprData.inception.pricePerShare.toString(),
|
|
175
|
+
pricePerShareDecimal: (Number(aprData.inception.pricePerShare) /
|
|
176
|
+
10 ** assetDecimals).toFixed(assetDecimals),
|
|
177
|
+
apr: aprs.inception,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
// Log error but don't fail the entire request
|
|
184
|
+
console.error('Failed to calculate SDK APR:', error);
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Transform raw GraphQL response into performance output
|
|
190
|
+
* Uses closure to capture input values and timestamp filter
|
|
191
|
+
*/
|
|
192
|
+
function createTransformPerformanceData(input, timestampGte) {
|
|
193
|
+
return (data) => {
|
|
194
|
+
// Filter transactions by timestamp client-side
|
|
195
|
+
const filteredItems = data.transactions.items.filter((item) => parseInt(item.timestamp) >= timestampGte);
|
|
196
|
+
// Aggregate metrics from filtered transactions
|
|
197
|
+
const metrics = aggregateMetrics(filteredItems);
|
|
198
|
+
// Calculate summary statistics
|
|
199
|
+
const summary = calculateSummary(metrics, filteredItems);
|
|
200
|
+
return {
|
|
201
|
+
metrics,
|
|
202
|
+
summary,
|
|
203
|
+
vaultAddress: input.vaultAddress,
|
|
204
|
+
chainId: input.chainId,
|
|
205
|
+
timeRange: input.timeRange,
|
|
206
|
+
hasMoreData: data.transactions.pageInfo.hasNextPage,
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Create the executeGetVaultPerformance function with DI container
|
|
212
|
+
*
|
|
213
|
+
* @param container - Service container with dependencies
|
|
214
|
+
* @returns Configured tool executor function
|
|
215
|
+
*/
|
|
216
|
+
export function createExecuteGetVaultPerformance(container) {
|
|
217
|
+
return async (input) => {
|
|
218
|
+
// Calculate timestamp threshold for GraphQL query
|
|
219
|
+
const now = Math.floor(Date.now() / 1000);
|
|
220
|
+
const timeRangeSeconds = TIME_RANGES[input.timeRange];
|
|
221
|
+
const timestampGte = now - timeRangeSeconds;
|
|
222
|
+
// Create executor with caching
|
|
223
|
+
const executor = executeToolWithCache({
|
|
224
|
+
container,
|
|
225
|
+
cacheKey: (input) => cacheKeys.vaultPerformance(input.vaultAddress, input.chainId, input.timeRange),
|
|
226
|
+
cacheTTL: cacheTTL.performance,
|
|
227
|
+
query: GET_VAULT_PERFORMANCE_QUERY,
|
|
228
|
+
variables: (input) => ({
|
|
229
|
+
where: {
|
|
230
|
+
vault_in: [input.vaultAddress],
|
|
231
|
+
type_in: ['TotalAssetsUpdated', 'PeriodSummary'],
|
|
232
|
+
},
|
|
233
|
+
orderBy: 'timestamp',
|
|
234
|
+
orderDirection: 'asc',
|
|
235
|
+
first: 1000, // GraphQL API limit: 1-1000
|
|
236
|
+
}),
|
|
237
|
+
validateResult: (data) => ({
|
|
238
|
+
valid: !!(data.transactions && data.transactions.items.length > 0),
|
|
239
|
+
message: data.transactions && data.transactions.items.length > 0
|
|
240
|
+
? undefined
|
|
241
|
+
: `No transaction data found for vault ${input.vaultAddress} on chain ${input.chainId} in the ${input.timeRange} time range.`,
|
|
242
|
+
}),
|
|
243
|
+
transformResult: createTransformPerformanceData(input, timestampGte),
|
|
244
|
+
toolName: 'get_vault_performance',
|
|
245
|
+
});
|
|
246
|
+
// Register cache tags for invalidation
|
|
247
|
+
const cacheKey = cacheKeys.vaultPerformance(input.vaultAddress, input.chainId, input.timeRange);
|
|
248
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT, CacheTag.APR]);
|
|
249
|
+
// Execute main query with caching
|
|
250
|
+
const result = await executor(input);
|
|
251
|
+
// Post-processing: Add SDK APR calculations if requested
|
|
252
|
+
if (input.includeSDKCalculations && !result.isError && result.content[0]?.type === 'text') {
|
|
253
|
+
try {
|
|
254
|
+
const sdkAPR = await calculateSDKAPR(container, input.vaultAddress, input.chainId);
|
|
255
|
+
if (sdkAPR) {
|
|
256
|
+
// Parse existing JSON output
|
|
257
|
+
const output = JSON.parse(result.content[0].text);
|
|
258
|
+
// Add SDK APR data to output
|
|
259
|
+
output.sdkCalculatedAPR = sdkAPR;
|
|
260
|
+
// Update result with modified output
|
|
261
|
+
result.content[0].text = JSON.stringify(output, null, 2);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.error('Failed to add SDK APR to response:', error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Add legal disclaimer to output
|
|
269
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
270
|
+
result.content[0].text = result.content[0].text + getToolDisclaimer('vault_performance');
|
|
271
|
+
}
|
|
272
|
+
return result;
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=vault-performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-performance.js","sourceRoot":"","sources":["../../src/tools/vault-performance.ts"],"names":[],"mappings":"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"}
|