@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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_vaults Tool
|
|
3
|
+
*
|
|
4
|
+
* Vault discovery and filtering with advanced search capabilities.
|
|
5
|
+
* Supports 20+ filter options with pagination and 10-minute caching.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Discover vaults by asset, chain, TVL, curator
|
|
9
|
+
* - Filter vaults with complex criteria combinations
|
|
10
|
+
* - Paginate through large result sets
|
|
11
|
+
* - Sort by TVL, address, chainId, or id
|
|
12
|
+
* - Performance: ~300-500 tokens per page of results
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - 10-minute TTL for balance between freshness and performance
|
|
16
|
+
* - Cache key: search:{MD5 hash of filters}:{pagination}:{sort}
|
|
17
|
+
* - Repeated searches with same filters hit cache
|
|
18
|
+
* - Cache hit rate target: 70-80%
|
|
19
|
+
* - Cache tags: [CacheTag.VAULT] for invalidation
|
|
20
|
+
*/
|
|
21
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
22
|
+
import { SearchVaultsInput } from '../utils/validators.js';
|
|
23
|
+
import { ServiceContainer } from '../core/container.js';
|
|
24
|
+
/**
|
|
25
|
+
* Create the executeSearchVaults function with DI container
|
|
26
|
+
*
|
|
27
|
+
* This factory function demonstrates the moderate complexity pattern with optimizations:
|
|
28
|
+
* 1. Custom cache key generation with MD5 hashing
|
|
29
|
+
* 2. Complex variable mapping with filter transformation
|
|
30
|
+
* 3. Custom validation for empty results
|
|
31
|
+
* 4. Cache tag registration for invalidation
|
|
32
|
+
* 5. NEW: Dynamic fragment selection based on responseFormat
|
|
33
|
+
* 6. NEW: Fragment-level caching for individual vaults (enables data reuse)
|
|
34
|
+
* 7. NEW: maxResults override for pagination.first
|
|
35
|
+
*
|
|
36
|
+
* @param container - Service container with dependencies
|
|
37
|
+
* @returns Configured tool executor function
|
|
38
|
+
*/
|
|
39
|
+
export declare function createExecuteSearchVaults(container: ServiceContainer): (input: SearchVaultsInput) => Promise<CallToolResult>;
|
|
40
|
+
//# sourceMappingURL=search-vaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-vaults.d.ts","sourceRoot":"","sources":["../../src/tools/search-vaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiHxD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CA4FvD"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_vaults Tool
|
|
3
|
+
*
|
|
4
|
+
* Vault discovery and filtering with advanced search capabilities.
|
|
5
|
+
* Supports 20+ filter options with pagination and 10-minute caching.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Discover vaults by asset, chain, TVL, curator
|
|
9
|
+
* - Filter vaults with complex criteria combinations
|
|
10
|
+
* - Paginate through large result sets
|
|
11
|
+
* - Sort by TVL, address, chainId, or id
|
|
12
|
+
* - Performance: ~300-500 tokens per page of results
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - 10-minute TTL for balance between freshness and performance
|
|
16
|
+
* - Cache key: search:{MD5 hash of filters}:{pagination}:{sort}
|
|
17
|
+
* - Repeated searches with same filters hit cache
|
|
18
|
+
* - Cache hit rate target: 70-80%
|
|
19
|
+
* - Cache tags: [CacheTag.VAULT] for invalidation
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'crypto';
|
|
22
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
23
|
+
import { createSearchVaultsQuery } from '../graphql/queries/search.queries.js';
|
|
24
|
+
import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
25
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
26
|
+
import { cacheKeys, cacheTTL } from '../cache/index.js';
|
|
27
|
+
import { generateCacheKey } from '../cache/index.js';
|
|
28
|
+
/**
|
|
29
|
+
* Convert snake_case filters to GraphQL VaultFilterInput format
|
|
30
|
+
* Handles nested state filters by flattening them
|
|
31
|
+
*/
|
|
32
|
+
function buildGraphQLFilters(filters) {
|
|
33
|
+
if (!filters) {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
const graphqlFilters = {};
|
|
37
|
+
// Direct pass-through filters (no transformation needed)
|
|
38
|
+
const directFilters = [
|
|
39
|
+
'assetSymbol_eq',
|
|
40
|
+
'assetSymbol_in',
|
|
41
|
+
'assetId_eq',
|
|
42
|
+
'assetId_in',
|
|
43
|
+
'chainId_eq',
|
|
44
|
+
'chainId_in',
|
|
45
|
+
'curatorIds_contains',
|
|
46
|
+
'curatorIds_contains_any',
|
|
47
|
+
'isVisible_eq',
|
|
48
|
+
'address_eq',
|
|
49
|
+
'address_in',
|
|
50
|
+
'symbol_eq',
|
|
51
|
+
'symbol_in',
|
|
52
|
+
'integratorId_eq',
|
|
53
|
+
'integratorId_in',
|
|
54
|
+
];
|
|
55
|
+
for (const key of directFilters) {
|
|
56
|
+
if (key in filters && filters[key] !== undefined) {
|
|
57
|
+
graphqlFilters[key] = filters[key];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Handle nested state filters
|
|
61
|
+
// Note: Backend may not support these - will be tested in Phase 2.5
|
|
62
|
+
if (filters.state_totalAssetsUsd_gte !== undefined) {
|
|
63
|
+
graphqlFilters.state_totalAssetsUsd_gte = filters.state_totalAssetsUsd_gte;
|
|
64
|
+
}
|
|
65
|
+
if (filters.state_totalAssetsUsd_lte !== undefined) {
|
|
66
|
+
graphqlFilters.state_totalAssetsUsd_lte = filters.state_totalAssetsUsd_lte;
|
|
67
|
+
}
|
|
68
|
+
return graphqlFilters;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Generate MD5 hash of filter object for cache key
|
|
72
|
+
* Ensures consistent cache keys for identical filter combinations
|
|
73
|
+
*/
|
|
74
|
+
function hashFilters(filters) {
|
|
75
|
+
if (!filters || Object.keys(filters).length === 0) {
|
|
76
|
+
return 'empty';
|
|
77
|
+
}
|
|
78
|
+
const sortedFilters = Object.keys(filters)
|
|
79
|
+
.sort()
|
|
80
|
+
.reduce((acc, key) => {
|
|
81
|
+
const typedKey = key;
|
|
82
|
+
const value = filters[typedKey];
|
|
83
|
+
if (value !== undefined) {
|
|
84
|
+
// Safe assignment: we know the key exists in filters and we're assigning its value
|
|
85
|
+
acc[typedKey] = value;
|
|
86
|
+
}
|
|
87
|
+
return acc;
|
|
88
|
+
}, {});
|
|
89
|
+
const filterString = JSON.stringify(sortedFilters);
|
|
90
|
+
return createHash('md5').update(filterString).digest('hex');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create the executeSearchVaults function with DI container
|
|
94
|
+
*
|
|
95
|
+
* This factory function demonstrates the moderate complexity pattern with optimizations:
|
|
96
|
+
* 1. Custom cache key generation with MD5 hashing
|
|
97
|
+
* 2. Complex variable mapping with filter transformation
|
|
98
|
+
* 3. Custom validation for empty results
|
|
99
|
+
* 4. Cache tag registration for invalidation
|
|
100
|
+
* 5. NEW: Dynamic fragment selection based on responseFormat
|
|
101
|
+
* 6. NEW: Fragment-level caching for individual vaults (enables data reuse)
|
|
102
|
+
* 7. NEW: maxResults override for pagination.first
|
|
103
|
+
*
|
|
104
|
+
* @param container - Service container with dependencies
|
|
105
|
+
* @returns Configured tool executor function
|
|
106
|
+
*/
|
|
107
|
+
export function createExecuteSearchVaults(container) {
|
|
108
|
+
return async (input) => {
|
|
109
|
+
// Apply maxResults to pagination.first (overrides user-provided pagination.first)
|
|
110
|
+
const effectiveFirst = Number(input.maxResults) || Number(input.pagination?.first) || 100;
|
|
111
|
+
const pagination = {
|
|
112
|
+
first: Math.min(effectiveFirst, 100), // Enforce max 100
|
|
113
|
+
skip: Number(input.pagination?.skip) || 0,
|
|
114
|
+
};
|
|
115
|
+
// Determine response format
|
|
116
|
+
const responseFormat = input.responseFormat === 'summary'
|
|
117
|
+
? 'summary'
|
|
118
|
+
: input.responseFormat === 'full'
|
|
119
|
+
? 'full'
|
|
120
|
+
: 'list';
|
|
121
|
+
// Generate cache key including responseFormat
|
|
122
|
+
const filterHash = hashFilters(input.filters);
|
|
123
|
+
const cacheKey = `${cacheKeys.searchVaults({ filterHash })}:${pagination.first}:${pagination.skip}:${input.orderBy}:${input.orderDirection}:${responseFormat}`;
|
|
124
|
+
// Register cache tags for invalidation
|
|
125
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT]);
|
|
126
|
+
// Create executor with dynamic query based on responseFormat
|
|
127
|
+
const query = createSearchVaultsQuery(responseFormat);
|
|
128
|
+
const executor = executeToolWithCache({
|
|
129
|
+
container,
|
|
130
|
+
cacheKey: () => cacheKey,
|
|
131
|
+
cacheTTL: cacheTTL.searchResults,
|
|
132
|
+
query,
|
|
133
|
+
variables: () => {
|
|
134
|
+
const whereClause = buildGraphQLFilters(input.filters);
|
|
135
|
+
return {
|
|
136
|
+
first: pagination.first,
|
|
137
|
+
skip: pagination.skip,
|
|
138
|
+
orderBy: input.orderBy,
|
|
139
|
+
orderDirection: input.orderDirection,
|
|
140
|
+
where: Object.keys(whereClause).length > 0 ? whereClause : undefined,
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
validateResult: (data) => ({
|
|
144
|
+
valid: !!(data.vaults && data.vaults.items.length > 0),
|
|
145
|
+
message: data.vaults && data.vaults.items.length > 0
|
|
146
|
+
? undefined
|
|
147
|
+
: 'No vaults found matching the specified criteria.',
|
|
148
|
+
}),
|
|
149
|
+
toolName: 'search_vaults',
|
|
150
|
+
});
|
|
151
|
+
// Execute query
|
|
152
|
+
const result = await executor(input);
|
|
153
|
+
// NEW: Fragment-level caching - cache each vault individually for reuse
|
|
154
|
+
// This enables vault_data tool to reuse vaults from search results
|
|
155
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
156
|
+
try {
|
|
157
|
+
const responseData = JSON.parse(result.content[0].text);
|
|
158
|
+
if (responseData.vaults?.items && Array.isArray(responseData.vaults.items)) {
|
|
159
|
+
// Cache each vault individually with vault-specific key
|
|
160
|
+
const vaults = responseData.vaults.items;
|
|
161
|
+
vaults.forEach((vault) => {
|
|
162
|
+
if (vault.address && vault.chain?.id) {
|
|
163
|
+
const vaultCacheKey = generateCacheKey(CacheTag.VAULT, {
|
|
164
|
+
address: String(vault.address),
|
|
165
|
+
chainId: Number(vault.chain.id),
|
|
166
|
+
});
|
|
167
|
+
container.cache.set(vaultCacheKey, vault, cacheTTL.vaultData);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// If parsing fails, just return the result without fragment caching
|
|
174
|
+
// This is a non-critical optimization
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Add legal disclaimer to output
|
|
178
|
+
if (!result.isError && result.content[0]?.type === 'text') {
|
|
179
|
+
result.content[0].text = result.content[0].text + getToolDisclaimer('search_vaults');
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=search-vaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-vaults.js","sourceRoot":"","sources":["../../src/tools/search-vaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* simulate_vault Tool
|
|
3
|
+
*
|
|
4
|
+
* Simulates vault operations with new total assets to model deposit/withdrawal scenarios.
|
|
5
|
+
* Provides protocol-accurate fee calculations, APR impact analysis, and settlement requirements.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Simulate deposit/withdrawal impact on share price
|
|
9
|
+
* - Model fee accrual scenarios
|
|
10
|
+
* - Analyze settlement requirements
|
|
11
|
+
* - Validate protocol calculations
|
|
12
|
+
* - Performance: ~400-600 tokens per simulation
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - No caching (simulations are specific to input parameters and require fresh vault state)
|
|
16
|
+
*
|
|
17
|
+
* WHY NO CACHING?
|
|
18
|
+
* This tool is intentionally non-cached because:
|
|
19
|
+
* 1. Simulations are parameter-specific (newTotalAssets varies widely)
|
|
20
|
+
* 2. Vault state changes frequently (stale simulations are misleading)
|
|
21
|
+
* 3. One-time use simulations (rarely re-requested with same parameters)
|
|
22
|
+
* 4. SDK-based calculations (fast execution, no benefit from caching)
|
|
23
|
+
*
|
|
24
|
+
* @module tools/simulate-vault
|
|
25
|
+
*/
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
28
|
+
import { ServiceContainer } from '../core/container.js';
|
|
29
|
+
/**
|
|
30
|
+
* Input schema for simulate_vault tool
|
|
31
|
+
*/
|
|
32
|
+
export declare const simulateVaultInputSchema: z.ZodObject<{
|
|
33
|
+
vaultAddress: z.ZodString;
|
|
34
|
+
chainId: z.ZodNumber;
|
|
35
|
+
newTotalAssets: z.ZodString;
|
|
36
|
+
settleDeposit: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
37
|
+
includeAPRCalculations: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
38
|
+
}, "strip", z.ZodTypeAny, {
|
|
39
|
+
vaultAddress: string;
|
|
40
|
+
chainId: number;
|
|
41
|
+
settleDeposit: boolean;
|
|
42
|
+
newTotalAssets: string;
|
|
43
|
+
includeAPRCalculations: boolean;
|
|
44
|
+
}, {
|
|
45
|
+
vaultAddress: string;
|
|
46
|
+
chainId: number;
|
|
47
|
+
newTotalAssets: string;
|
|
48
|
+
settleDeposit?: boolean | undefined;
|
|
49
|
+
includeAPRCalculations?: boolean | undefined;
|
|
50
|
+
}>;
|
|
51
|
+
export type SimulateVaultInput = z.infer<typeof simulateVaultInputSchema>;
|
|
52
|
+
/**
|
|
53
|
+
* JSON schema for tool registration
|
|
54
|
+
*/
|
|
55
|
+
export declare const simulateVaultJsonSchema: import("zod-to-json-schema").JsonSchema7Type & {
|
|
56
|
+
$schema?: string | undefined;
|
|
57
|
+
definitions?: {
|
|
58
|
+
[key: string]: import("zod-to-json-schema").JsonSchema7Type;
|
|
59
|
+
} | undefined;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Create the executeSimulateVault function with DI container
|
|
63
|
+
*
|
|
64
|
+
* @param container - Service container with dependencies
|
|
65
|
+
* @returns Configured tool executor function
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const executor = createExecuteSimulateVault(container);
|
|
70
|
+
* const result = await executor({
|
|
71
|
+
* vaultAddress: '0x1234...',
|
|
72
|
+
* chainId: 42161,
|
|
73
|
+
* newTotalAssets: '2000000000',
|
|
74
|
+
* settleDeposit: true,
|
|
75
|
+
* includeAPRCalculations: true
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function createExecuteSimulateVault(container: ServiceContainer): (input: SimulateVaultInput) => Promise<CallToolResult>;
|
|
80
|
+
//# sourceMappingURL=simulate-vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate-vault.d.ts","sourceRoot":"","sources":["../../src/tools/simulate-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AASzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;EAgBnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;CAGnC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,cAAc,CAAC,CA+QxD"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* simulate_vault Tool
|
|
3
|
+
*
|
|
4
|
+
* Simulates vault operations with new total assets to model deposit/withdrawal scenarios.
|
|
5
|
+
* Provides protocol-accurate fee calculations, APR impact analysis, and settlement requirements.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Simulate deposit/withdrawal impact on share price
|
|
9
|
+
* - Model fee accrual scenarios
|
|
10
|
+
* - Analyze settlement requirements
|
|
11
|
+
* - Validate protocol calculations
|
|
12
|
+
* - Performance: ~400-600 tokens per simulation
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - No caching (simulations are specific to input parameters and require fresh vault state)
|
|
16
|
+
*
|
|
17
|
+
* WHY NO CACHING?
|
|
18
|
+
* This tool is intentionally non-cached because:
|
|
19
|
+
* 1. Simulations are parameter-specific (newTotalAssets varies widely)
|
|
20
|
+
* 2. Vault state changes frequently (stale simulations are misleading)
|
|
21
|
+
* 3. One-time use simulations (rarely re-requested with same parameters)
|
|
22
|
+
* 4. SDK-based calculations (fast execution, no benefit from caching)
|
|
23
|
+
*
|
|
24
|
+
* @module tools/simulate-vault
|
|
25
|
+
*/
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
28
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
29
|
+
import { simulateVaultManagement } from '../sdk/simulation-service.js';
|
|
30
|
+
import { transformPeriodSummariesToAPRData } from '../sdk/apr-service.js';
|
|
31
|
+
import { formatBigInt, safeBigIntStringify } from '../sdk/math-utils.js';
|
|
32
|
+
import { calculatePricePerShare } from '../sdk/vault-utils.js';
|
|
33
|
+
import { handleToolError } from '../utils/tool-error-handler.js';
|
|
34
|
+
import { GET_PERIOD_SUMMARIES_QUERY } from '../graphql/queries/index.js';
|
|
35
|
+
/**
|
|
36
|
+
* Input schema for simulate_vault tool
|
|
37
|
+
*/
|
|
38
|
+
export const simulateVaultInputSchema = z.object({
|
|
39
|
+
vaultAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address format'),
|
|
40
|
+
chainId: z.number().int().positive('Chain ID must be a positive integer'),
|
|
41
|
+
newTotalAssets: z
|
|
42
|
+
.string()
|
|
43
|
+
.regex(/^\d+$/, 'New total assets must be a positive integer string (wei)'),
|
|
44
|
+
settleDeposit: z
|
|
45
|
+
.boolean()
|
|
46
|
+
.optional()
|
|
47
|
+
.default(true)
|
|
48
|
+
.describe('Whether to settle pending deposits'),
|
|
49
|
+
includeAPRCalculations: z
|
|
50
|
+
.boolean()
|
|
51
|
+
.optional()
|
|
52
|
+
.default(true)
|
|
53
|
+
.describe('Include APR analysis in results'),
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* JSON schema for tool registration
|
|
57
|
+
*/
|
|
58
|
+
export const simulateVaultJsonSchema = zodToJsonSchema(simulateVaultInputSchema, 'simulateVaultInput');
|
|
59
|
+
/**
|
|
60
|
+
* Create the executeSimulateVault function with DI container
|
|
61
|
+
*
|
|
62
|
+
* @param container - Service container with dependencies
|
|
63
|
+
* @returns Configured tool executor function
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const executor = createExecuteSimulateVault(container);
|
|
68
|
+
* const result = await executor({
|
|
69
|
+
* vaultAddress: '0x1234...',
|
|
70
|
+
* chainId: 42161,
|
|
71
|
+
* newTotalAssets: '2000000000',
|
|
72
|
+
* settleDeposit: true,
|
|
73
|
+
* includeAPRCalculations: true
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export function createExecuteSimulateVault(container) {
|
|
78
|
+
return async (input) => {
|
|
79
|
+
try {
|
|
80
|
+
const { vaultAddress, chainId, newTotalAssets, settleDeposit, includeAPRCalculations } = input;
|
|
81
|
+
// 1. Fetch vault data
|
|
82
|
+
const vaultQuery = `
|
|
83
|
+
query GetVault($vaultAddress: Address!, $chainId: Int!) {
|
|
84
|
+
vault: vaultByAddress(address: $vaultAddress, chainId: $chainId) {
|
|
85
|
+
address
|
|
86
|
+
name
|
|
87
|
+
symbol
|
|
88
|
+
decimals
|
|
89
|
+
asset {
|
|
90
|
+
address
|
|
91
|
+
symbol
|
|
92
|
+
name
|
|
93
|
+
decimals
|
|
94
|
+
}
|
|
95
|
+
state {
|
|
96
|
+
totalSupply
|
|
97
|
+
totalAssets
|
|
98
|
+
highWaterMark
|
|
99
|
+
lastFeeTime
|
|
100
|
+
managementFee
|
|
101
|
+
performanceFee
|
|
102
|
+
version
|
|
103
|
+
safeAssetBalance
|
|
104
|
+
pendingSiloBalances {
|
|
105
|
+
assets
|
|
106
|
+
shares
|
|
107
|
+
}
|
|
108
|
+
pendingSettlement {
|
|
109
|
+
assets
|
|
110
|
+
shares
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
chain {
|
|
114
|
+
id
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
const vaultData = await container.graphqlClient.request(vaultQuery, {
|
|
120
|
+
vaultAddress,
|
|
121
|
+
chainId,
|
|
122
|
+
});
|
|
123
|
+
if (!vaultData?.vault) {
|
|
124
|
+
throw new Error(`Vault not found: ${vaultAddress} on chain ${chainId}`);
|
|
125
|
+
}
|
|
126
|
+
const vault = vaultData.vault;
|
|
127
|
+
// 2. Optionally fetch APR data
|
|
128
|
+
let aprData;
|
|
129
|
+
if (includeAPRCalculations) {
|
|
130
|
+
try {
|
|
131
|
+
const periodSummariesData = await container.graphqlClient.request(GET_PERIOD_SUMMARIES_QUERY, {
|
|
132
|
+
where: {
|
|
133
|
+
vault_in: [vaultAddress],
|
|
134
|
+
chainId_eq: chainId,
|
|
135
|
+
type_in: ['PeriodSummary'],
|
|
136
|
+
},
|
|
137
|
+
orderBy: 'timestamp',
|
|
138
|
+
orderDirection: 'asc',
|
|
139
|
+
first: 1000,
|
|
140
|
+
});
|
|
141
|
+
if (periodSummariesData?.transactions?.items?.length > 0) {
|
|
142
|
+
// Extract PeriodSummary data from transaction items
|
|
143
|
+
const periodSummaries = periodSummariesData.transactions.items.map((tx) => ({
|
|
144
|
+
timestamp: tx.timestamp,
|
|
145
|
+
totalAssetsAtStart: tx.data.totalAssetsAtStart,
|
|
146
|
+
totalSupplyAtStart: tx.data.totalSupplyAtStart,
|
|
147
|
+
}));
|
|
148
|
+
aprData = transformPeriodSummariesToAPRData(periodSummaries, vault);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
// Non-fatal: proceed without APR data
|
|
153
|
+
console.warn('Failed to fetch APR data:', error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// 3. Execute simulation
|
|
157
|
+
const newTotalAssetsBigInt = BigInt(newTotalAssets);
|
|
158
|
+
const simulationResult = simulateVaultManagement(vault, newTotalAssetsBigInt, aprData, settleDeposit);
|
|
159
|
+
// 4. Format response
|
|
160
|
+
const vaultDecimals = vault.decimals ?? 18;
|
|
161
|
+
const assetDecimals = vault.asset.decimals;
|
|
162
|
+
const currentTotalAssets = BigInt(vault.state.totalAssets);
|
|
163
|
+
const currentTotalSupply = BigInt(vault.state.totalSupply);
|
|
164
|
+
// Calculate price per share impact using Lagoon SDK
|
|
165
|
+
let priceImpactPercentage = 0;
|
|
166
|
+
let priceImpactAbsolute = BigInt(0);
|
|
167
|
+
let currentPricePerShare = BigInt(0);
|
|
168
|
+
let newPricePerShare = BigInt(0);
|
|
169
|
+
if (currentTotalSupply > 0n && simulationResult.totalSupply > 0n) {
|
|
170
|
+
// Calculate prices using SDK (returns price in asset decimals)
|
|
171
|
+
currentPricePerShare = calculatePricePerShare(currentTotalAssets, currentTotalSupply, vaultDecimals, assetDecimals);
|
|
172
|
+
newPricePerShare = calculatePricePerShare(simulationResult.totalAssets, simulationResult.totalSupply, vaultDecimals, assetDecimals);
|
|
173
|
+
priceImpactAbsolute = newPricePerShare - currentPricePerShare;
|
|
174
|
+
priceImpactPercentage =
|
|
175
|
+
currentPricePerShare > 0n
|
|
176
|
+
? Number((priceImpactAbsolute * 10000n) / currentPricePerShare) / 100
|
|
177
|
+
: 0;
|
|
178
|
+
}
|
|
179
|
+
else if (simulationResult.totalSupply > 0n) {
|
|
180
|
+
// New vault case - no current price to compare
|
|
181
|
+
newPricePerShare = calculatePricePerShare(simulationResult.totalAssets, simulationResult.totalSupply, vaultDecimals, assetDecimals);
|
|
182
|
+
currentPricePerShare = BigInt(10 ** assetDecimals); // 1.0 in asset decimals
|
|
183
|
+
priceImpactAbsolute = BigInt(0);
|
|
184
|
+
priceImpactPercentage = 0;
|
|
185
|
+
}
|
|
186
|
+
// Build response
|
|
187
|
+
const response = {
|
|
188
|
+
simulation: {
|
|
189
|
+
vaultAddress,
|
|
190
|
+
chainId,
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
sdkVersion: '@lagoon-protocol/v0-computation@0.12.0',
|
|
193
|
+
},
|
|
194
|
+
currentState: {
|
|
195
|
+
totalAssets: vault.state.totalAssets,
|
|
196
|
+
totalAssetsFormatted: formatBigInt(currentTotalAssets, assetDecimals),
|
|
197
|
+
totalSupply: vault.state.totalSupply,
|
|
198
|
+
totalSupplyFormatted: formatBigInt(currentTotalSupply, vaultDecimals),
|
|
199
|
+
pricePerShare: (currentPricePerShare ?? BigInt(0)).toString(),
|
|
200
|
+
pricePerShareFormatted: formatBigInt(currentPricePerShare ?? BigInt(0), assetDecimals),
|
|
201
|
+
managementFee: vault.state.managementFee,
|
|
202
|
+
performanceFee: vault.state.performanceFee,
|
|
203
|
+
highWaterMark: vault.state.highWaterMark,
|
|
204
|
+
},
|
|
205
|
+
simulatedState: {
|
|
206
|
+
totalAssets: simulationResult.totalAssets?.toString() ?? vault.state.totalAssets,
|
|
207
|
+
totalAssetsFormatted: formatBigInt(simulationResult.totalAssets ?? BigInt(vault.state.totalAssets), assetDecimals),
|
|
208
|
+
totalSupply: simulationResult.totalSupply?.toString() ?? vault.state.totalSupply,
|
|
209
|
+
totalSupplyFormatted: formatBigInt(simulationResult.totalSupply ?? BigInt(vault.state.totalSupply), vaultDecimals),
|
|
210
|
+
pricePerShare: (newPricePerShare ?? BigInt(0)).toString(),
|
|
211
|
+
pricePerShareFormatted: formatBigInt(newPricePerShare ?? BigInt(0), assetDecimals),
|
|
212
|
+
feesAccrued: {
|
|
213
|
+
management: simulationResult.managementFees?.inAssets?.toString() ?? '0',
|
|
214
|
+
managementFormatted: formatBigInt(simulationResult.managementFees?.inAssets ?? 0n, assetDecimals),
|
|
215
|
+
performance: simulationResult.performanceFees?.inAssets?.toString() ?? '0',
|
|
216
|
+
performanceFormatted: formatBigInt(simulationResult.performanceFees?.inAssets ?? 0n, assetDecimals),
|
|
217
|
+
total: ((simulationResult.managementFees?.inAssets ?? 0n) +
|
|
218
|
+
(simulationResult.performanceFees?.inAssets ?? 0n)).toString(),
|
|
219
|
+
totalFormatted: formatBigInt((simulationResult.managementFees?.inAssets ?? 0n) +
|
|
220
|
+
(simulationResult.performanceFees?.inAssets ?? 0n), assetDecimals),
|
|
221
|
+
},
|
|
222
|
+
sharePriceImpact: {
|
|
223
|
+
absolute: (priceImpactAbsolute ?? BigInt(0)).toString(),
|
|
224
|
+
absoluteFormatted: formatBigInt(priceImpactAbsolute ?? BigInt(0), assetDecimals),
|
|
225
|
+
percentage: priceImpactPercentage,
|
|
226
|
+
direction: priceImpactAbsolute > 0n
|
|
227
|
+
? 'increase'
|
|
228
|
+
: priceImpactAbsolute < 0n
|
|
229
|
+
? 'decrease'
|
|
230
|
+
: 'unchanged',
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
settlementAnalysis: {
|
|
234
|
+
settleDeposit,
|
|
235
|
+
assetsInSafe: vault.state.safeAssetBalance || '0',
|
|
236
|
+
pendingSiloBalances: {
|
|
237
|
+
assets: vault.state.pendingSiloBalances?.assets || '0',
|
|
238
|
+
shares: vault.state.pendingSiloBalances?.shares || '0',
|
|
239
|
+
},
|
|
240
|
+
pendingSettlement: {
|
|
241
|
+
assets: vault.state.pendingSettlement?.assets || '0',
|
|
242
|
+
shares: vault.state.pendingSettlement?.shares || '0',
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
...(includeAPRCalculations &&
|
|
246
|
+
aprData && {
|
|
247
|
+
aprAnalysis: {
|
|
248
|
+
method: 'Lagoon SDK v0.10.1 (protocol-accurate)',
|
|
249
|
+
dataSource: 'Lagoon GraphQL period summaries',
|
|
250
|
+
...(aprData.thirtyDay && {
|
|
251
|
+
thirtyDay: {
|
|
252
|
+
timestamp: aprData.thirtyDay.timestamp,
|
|
253
|
+
pricePerShare: aprData.thirtyDay.pricePerShare?.toString() ?? '0',
|
|
254
|
+
pricePerShareFormatted: formatBigInt(aprData.thirtyDay.pricePerShare ?? 0n, assetDecimals),
|
|
255
|
+
},
|
|
256
|
+
}),
|
|
257
|
+
...(aprData.inception && {
|
|
258
|
+
inception: {
|
|
259
|
+
timestamp: aprData.inception.timestamp,
|
|
260
|
+
pricePerShare: aprData.inception.pricePerShare?.toString() ?? '0',
|
|
261
|
+
pricePerShareFormatted: formatBigInt(aprData.inception.pricePerShare ?? 0n, assetDecimals),
|
|
262
|
+
},
|
|
263
|
+
}),
|
|
264
|
+
},
|
|
265
|
+
}),
|
|
266
|
+
};
|
|
267
|
+
return {
|
|
268
|
+
content: [
|
|
269
|
+
{
|
|
270
|
+
type: 'text',
|
|
271
|
+
text: safeBigIntStringify(response) + getToolDisclaimer('simulate_vault'),
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
return handleToolError(error, 'simulate_vault');
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=simulate-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate-vault.js","sourceRoot":"","sources":["../../src/tools/simulate-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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 { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
21
|
+
import { GetUserPortfolioInput } from '../utils/validators.js';
|
|
22
|
+
import { ServiceContainer } from '../core/container.js';
|
|
23
|
+
/**
|
|
24
|
+
* Create the executeGetUserPortfolio function with DI container
|
|
25
|
+
*
|
|
26
|
+
* @param container - Service container with dependencies
|
|
27
|
+
* @returns Configured tool executor function
|
|
28
|
+
*/
|
|
29
|
+
export declare function createExecuteGetUserPortfolio(container: ServiceContainer): (input: GetUserPortfolioInput) => Promise<CallToolResult>;
|
|
30
|
+
//# sourceMappingURL=user-portfolio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAM/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAuHxD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC,cAAc,CAAC,CAiF3D"}
|