@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,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute Tool With Cache Abstraction
|
|
3
|
+
*
|
|
4
|
+
* Generic caching wrapper for tools that follow the pattern:
|
|
5
|
+
* 1. Check cache
|
|
6
|
+
* 2. Execute GraphQL query on cache miss
|
|
7
|
+
* 3. Validate result (optional)
|
|
8
|
+
* 4. Transform result (optional)
|
|
9
|
+
* 5. Cache and return
|
|
10
|
+
*
|
|
11
|
+
* Eliminates code duplication across 10+ tools with caching logic.
|
|
12
|
+
*/
|
|
13
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
14
|
+
import { ServiceContainer } from '../core/container.js';
|
|
15
|
+
/**
|
|
16
|
+
* Cache key generator function
|
|
17
|
+
*/
|
|
18
|
+
export type CacheKeyGenerator<TInput> = (input: TInput) => string;
|
|
19
|
+
/**
|
|
20
|
+
* GraphQL variables mapper function
|
|
21
|
+
*/
|
|
22
|
+
export type VariablesMapper<TInput, TVariables = TInput> = (input: TInput) => TVariables;
|
|
23
|
+
/**
|
|
24
|
+
* Result validator function
|
|
25
|
+
*/
|
|
26
|
+
export interface ValidationResult {
|
|
27
|
+
valid: boolean;
|
|
28
|
+
message?: string;
|
|
29
|
+
isError?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export type ResultValidator<TOutput> = (data: TOutput) => ValidationResult;
|
|
32
|
+
/**
|
|
33
|
+
* Result transformer function
|
|
34
|
+
*/
|
|
35
|
+
export type ResultTransformer<TOutput, TTransformed = TOutput> = (data: TOutput) => TTransformed;
|
|
36
|
+
/**
|
|
37
|
+
* Configuration for cached tool execution
|
|
38
|
+
*/
|
|
39
|
+
export interface CachedToolOptions<TInput, TOutput, TVariables = TInput, TTransformed = TOutput> {
|
|
40
|
+
/** Service container with dependencies */
|
|
41
|
+
container: ServiceContainer;
|
|
42
|
+
/** Cache key generator from input */
|
|
43
|
+
cacheKey: CacheKeyGenerator<TInput>;
|
|
44
|
+
/** Cache TTL in seconds */
|
|
45
|
+
cacheTTL: number;
|
|
46
|
+
/** GraphQL query string */
|
|
47
|
+
query: string;
|
|
48
|
+
/** Map input to GraphQL variables */
|
|
49
|
+
variables: VariablesMapper<TInput, TVariables>;
|
|
50
|
+
/** Validate query result (optional) */
|
|
51
|
+
validateResult?: ResultValidator<TOutput>;
|
|
52
|
+
/** Transform result before caching/returning (optional) */
|
|
53
|
+
transformResult?: ResultTransformer<TOutput, TTransformed>;
|
|
54
|
+
/** Tool name for error reporting */
|
|
55
|
+
toolName: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a cached tool executor
|
|
59
|
+
*
|
|
60
|
+
* Returns an async function that executes the tool with caching logic.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const executeGetVaultData = executeToolWithCache<GetVaultDataInput, VaultDataResponse>({
|
|
65
|
+
* container,
|
|
66
|
+
* cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
|
|
67
|
+
* cacheTTL: cacheTTL.vaultData,
|
|
68
|
+
* query: GET_VAULT_DATA_QUERY,
|
|
69
|
+
* variables: (input) => ({ address: input.vaultAddress, chainId: input.chainId }),
|
|
70
|
+
* validateResult: (data) => ({
|
|
71
|
+
* valid: !!data.vaultByAddress,
|
|
72
|
+
* message: data.vaultByAddress ? undefined : 'Vault not found',
|
|
73
|
+
* }),
|
|
74
|
+
* toolName: 'get_vault_data',
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function executeToolWithCache<TInput, TOutput, TVariables = TInput, TTransformed = TOutput>(options: CachedToolOptions<TInput, TOutput, TVariables, TTransformed>): (input: TInput) => Promise<CallToolResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Create a simple cached tool executor without validation or transformation
|
|
81
|
+
*
|
|
82
|
+
* Simplified version for tools that don't need validation or transformation.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const executeSimpleTool = createSimpleCachedTool({
|
|
87
|
+
* container,
|
|
88
|
+
* cacheKey: (input) => `tool:${input.id}`,
|
|
89
|
+
* cacheTTL: 300,
|
|
90
|
+
* query: SIMPLE_QUERY,
|
|
91
|
+
* variables: (input) => ({ id: input.id }),
|
|
92
|
+
* toolName: 'simple_tool',
|
|
93
|
+
* });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function createSimpleCachedTool<TInput, TOutput, TVariables = TInput>(options: Omit<CachedToolOptions<TInput, TOutput, TVariables, TOutput>, 'validateResult' | 'transformResult'>): (input: TInput) => Promise<CallToolResult>;
|
|
97
|
+
//# sourceMappingURL=execute-tool-with-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-with-cache.d.ts","sourceRoot":"","sources":["../../src/utils/execute-tool-with-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,YAAY,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,YAAY,GAAG,OAAO;IAC7F,0CAA0C;IAC1C,SAAS,EAAE,gBAAgB,CAAC;IAE5B,qCAAqC;IACrC,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEpC,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,qCAAqC;IACrC,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE/C,uCAAuC;IACvC,cAAc,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,2DAA2D;IAC3D,eAAe,CAAC,EAAE,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE3D,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,YAAY,GAAG,OAAO,EAC/F,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GACpE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CA0D5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EACzE,OAAO,EAAE,IAAI,CACX,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EACvD,gBAAgB,GAAG,iBAAiB,CACrC,GACA,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAM5C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute Tool With Cache Abstraction
|
|
3
|
+
*
|
|
4
|
+
* Generic caching wrapper for tools that follow the pattern:
|
|
5
|
+
* 1. Check cache
|
|
6
|
+
* 2. Execute GraphQL query on cache miss
|
|
7
|
+
* 3. Validate result (optional)
|
|
8
|
+
* 4. Transform result (optional)
|
|
9
|
+
* 5. Cache and return
|
|
10
|
+
*
|
|
11
|
+
* Eliminates code duplication across 10+ tools with caching logic.
|
|
12
|
+
*/
|
|
13
|
+
import { handleToolError } from './tool-error-handler.js';
|
|
14
|
+
import { createSuccessResponse } from './tool-response.js';
|
|
15
|
+
/**
|
|
16
|
+
* Create a cached tool executor
|
|
17
|
+
*
|
|
18
|
+
* Returns an async function that executes the tool with caching logic.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const executeGetVaultData = executeToolWithCache<GetVaultDataInput, VaultDataResponse>({
|
|
23
|
+
* container,
|
|
24
|
+
* cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
|
|
25
|
+
* cacheTTL: cacheTTL.vaultData,
|
|
26
|
+
* query: GET_VAULT_DATA_QUERY,
|
|
27
|
+
* variables: (input) => ({ address: input.vaultAddress, chainId: input.chainId }),
|
|
28
|
+
* validateResult: (data) => ({
|
|
29
|
+
* valid: !!data.vaultByAddress,
|
|
30
|
+
* message: data.vaultByAddress ? undefined : 'Vault not found',
|
|
31
|
+
* }),
|
|
32
|
+
* toolName: 'get_vault_data',
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function executeToolWithCache(options) {
|
|
37
|
+
const { container, cacheKey, cacheTTL, query, variables, validateResult, transformResult, toolName, } = options;
|
|
38
|
+
return async (input) => {
|
|
39
|
+
try {
|
|
40
|
+
// 1. Generate cache key
|
|
41
|
+
const key = cacheKey(input);
|
|
42
|
+
// 2. Check cache
|
|
43
|
+
const cached = container.cache.get(key);
|
|
44
|
+
if (cached) {
|
|
45
|
+
const result = transformResult
|
|
46
|
+
? transformResult(cached)
|
|
47
|
+
: cached;
|
|
48
|
+
return createSuccessResponse(result);
|
|
49
|
+
}
|
|
50
|
+
// 3. Execute GraphQL query
|
|
51
|
+
const queryVariables = variables(input);
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
|
|
53
|
+
const data = await container.graphqlClient.request(query, queryVariables);
|
|
54
|
+
// 4. Validate result
|
|
55
|
+
if (validateResult) {
|
|
56
|
+
const validation = validateResult(data);
|
|
57
|
+
if (!validation.valid) {
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
text: validation.message || 'Invalid data returned from query',
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
// Use validator's isError flag, default to false for backward compatibility (no data = not an error)
|
|
66
|
+
isError: validation.isError ?? false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 5. Cache result
|
|
71
|
+
container.cache.set(key, data, cacheTTL);
|
|
72
|
+
// 6. Transform and return
|
|
73
|
+
const result = transformResult ? transformResult(data) : data;
|
|
74
|
+
return createSuccessResponse(result);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return handleToolError(error, toolName);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a simple cached tool executor without validation or transformation
|
|
83
|
+
*
|
|
84
|
+
* Simplified version for tools that don't need validation or transformation.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const executeSimpleTool = createSimpleCachedTool({
|
|
89
|
+
* container,
|
|
90
|
+
* cacheKey: (input) => `tool:${input.id}`,
|
|
91
|
+
* cacheTTL: 300,
|
|
92
|
+
* query: SIMPLE_QUERY,
|
|
93
|
+
* variables: (input) => ({ id: input.id }),
|
|
94
|
+
* toolName: 'simple_tool',
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function createSimpleCachedTool(options) {
|
|
99
|
+
return executeToolWithCache({
|
|
100
|
+
...options,
|
|
101
|
+
validateResult: undefined,
|
|
102
|
+
transformResult: undefined,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=execute-tool-with-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-with-cache.js","sourceRoot":"","sources":["../../src/utils/execute-tool-with-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAyD3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAqE;IAErE,MAAM,EACJ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,QAAQ,GACT,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,EAAE,KAAa,EAA2B,EAAE;QACtD,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE5B,iBAAiB;YACjB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAU,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,eAAe;oBAC5B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC;oBACzB,CAAC,CAAE,MAAkC,CAAC;gBACxC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,2BAA2B;YAC3B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YACxC,qGAAqG;YACrG,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAU,KAAK,EAAE,cAAqB,CAAC,CAAC;YAE1F,qBAAqB;YACrB,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,kCAAkC;6BAC/D;yBACF;wBACD,qGAAqG;wBACrG,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;qBACrC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAEzC,0BAA0B;YAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAgC,CAAC;YAC3F,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAGC;IAED,OAAO,oBAAoB,CAAuC;QAChE,GAAG,OAAO;QACV,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,SAAS;KAC3B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portfolio Optimization Utility
|
|
3
|
+
*
|
|
4
|
+
* Portfolio allocation and rebalancing algorithms for optimal vault distribution.
|
|
5
|
+
* Provides risk-adjusted portfolio recommendations and rebalancing guidance.
|
|
6
|
+
*/
|
|
7
|
+
import { RiskScoreBreakdown } from './risk-scoring.js';
|
|
8
|
+
/**
|
|
9
|
+
* Portfolio position with current and target allocations
|
|
10
|
+
*/
|
|
11
|
+
export interface PortfolioPosition {
|
|
12
|
+
vaultAddress: string;
|
|
13
|
+
vaultName: string;
|
|
14
|
+
chainId: number;
|
|
15
|
+
currentAllocation: number;
|
|
16
|
+
targetAllocation: number;
|
|
17
|
+
currentValueUsd: number;
|
|
18
|
+
targetValueUsd: number;
|
|
19
|
+
rebalanceAmount: number;
|
|
20
|
+
rebalancePercentage: number;
|
|
21
|
+
vault: VaultForOptimization;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Portfolio optimization result
|
|
25
|
+
*/
|
|
26
|
+
export interface PortfolioOptimization {
|
|
27
|
+
strategy: 'equal_weight' | 'risk_parity' | 'max_sharpe' | 'min_variance';
|
|
28
|
+
totalValueUsd: number;
|
|
29
|
+
positions: PortfolioPosition[];
|
|
30
|
+
metrics: {
|
|
31
|
+
expectedReturn: number;
|
|
32
|
+
portfolioRisk: number;
|
|
33
|
+
sharpeRatio: number;
|
|
34
|
+
diversificationScore: number;
|
|
35
|
+
};
|
|
36
|
+
rebalanceNeeded: boolean;
|
|
37
|
+
rebalanceThreshold: number;
|
|
38
|
+
recommendations: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Vault data for portfolio optimization
|
|
42
|
+
*/
|
|
43
|
+
export interface VaultForOptimization {
|
|
44
|
+
address: string;
|
|
45
|
+
name: string;
|
|
46
|
+
chainId: number;
|
|
47
|
+
currentValueUsd: number;
|
|
48
|
+
expectedApr: number;
|
|
49
|
+
volatility: number;
|
|
50
|
+
riskScore: number;
|
|
51
|
+
riskBreakdown?: RiskScoreBreakdown;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate equal-weight allocation strategy
|
|
55
|
+
* Allocates portfolio equally across all vaults
|
|
56
|
+
*/
|
|
57
|
+
export declare function calculateEqualWeight(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
|
|
58
|
+
/**
|
|
59
|
+
* Calculate risk-parity allocation strategy
|
|
60
|
+
* Allocates based on inverse risk (lower risk = higher allocation)
|
|
61
|
+
*/
|
|
62
|
+
export declare function calculateRiskParity(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
|
|
63
|
+
/**
|
|
64
|
+
* Calculate maximum Sharpe ratio allocation strategy
|
|
65
|
+
* Allocates to maximize risk-adjusted returns
|
|
66
|
+
*/
|
|
67
|
+
export declare function calculateMaxSharpe(vaults: VaultForOptimization[], totalValueUsd: number, riskFreeRate?: number): PortfolioPosition[];
|
|
68
|
+
/**
|
|
69
|
+
* Calculate minimum variance allocation strategy
|
|
70
|
+
* Allocates to minimize portfolio volatility
|
|
71
|
+
*/
|
|
72
|
+
export declare function calculateMinVariance(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
|
|
73
|
+
/**
|
|
74
|
+
* Calculate portfolio metrics
|
|
75
|
+
*/
|
|
76
|
+
export declare function calculatePortfolioMetrics(positions: PortfolioPosition[], vaults: VaultForOptimization[], riskFreeRate?: number): {
|
|
77
|
+
expectedReturn: number;
|
|
78
|
+
portfolioRisk: number;
|
|
79
|
+
sharpeRatio: number;
|
|
80
|
+
diversificationScore: number;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Check if rebalancing is needed
|
|
84
|
+
*/
|
|
85
|
+
export declare function needsRebalancing(positions: PortfolioPosition[], threshold?: number): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Generate optimization recommendations
|
|
88
|
+
*/
|
|
89
|
+
export declare function generateRecommendations(positions: PortfolioPosition[], metrics: PortfolioOptimization['metrics'], strategy: PortfolioOptimization['strategy']): string[];
|
|
90
|
+
/**
|
|
91
|
+
* Optimize portfolio based on strategy
|
|
92
|
+
*
|
|
93
|
+
* @param vaults - Vaults with current positions and metrics
|
|
94
|
+
* @param strategy - Optimization strategy to use
|
|
95
|
+
* @param rebalanceThreshold - Minimum drift percentage to trigger rebalancing (default: 5%)
|
|
96
|
+
* @param riskFreeRate - Risk-free rate for Sharpe ratio calculation (default: 2%)
|
|
97
|
+
* @returns Portfolio optimization result with positions and recommendations
|
|
98
|
+
*/
|
|
99
|
+
export declare function optimizePortfolio(vaults: VaultForOptimization[], strategy?: 'equal_weight' | 'risk_parity' | 'max_sharpe' | 'min_variance', rebalanceThreshold?: number, riskFreeRate?: number): PortfolioOptimization;
|
|
100
|
+
//# sourceMappingURL=portfolio-optimization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-optimization.d.ts","sourceRoot":"","sources":["../../src/utils/portfolio-optimization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portfolio Optimization Utility
|
|
3
|
+
*
|
|
4
|
+
* Portfolio allocation and rebalancing algorithms for optimal vault distribution.
|
|
5
|
+
* Provides risk-adjusted portfolio recommendations and rebalancing guidance.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculate equal-weight allocation strategy
|
|
9
|
+
* Allocates portfolio equally across all vaults
|
|
10
|
+
*/
|
|
11
|
+
export function calculateEqualWeight(vaults, totalValueUsd) {
|
|
12
|
+
const targetAllocation = 100 / vaults.length;
|
|
13
|
+
return vaults.map((vault) => {
|
|
14
|
+
const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
|
|
15
|
+
const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
|
|
16
|
+
const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
|
|
17
|
+
const rebalancePercentage = (rebalanceAmount / vault.currentValueUsd) * 100;
|
|
18
|
+
return {
|
|
19
|
+
vaultAddress: vault.address,
|
|
20
|
+
vaultName: vault.name,
|
|
21
|
+
chainId: vault.chainId,
|
|
22
|
+
currentAllocation,
|
|
23
|
+
targetAllocation,
|
|
24
|
+
currentValueUsd: vault.currentValueUsd,
|
|
25
|
+
targetValueUsd,
|
|
26
|
+
rebalanceAmount,
|
|
27
|
+
rebalancePercentage,
|
|
28
|
+
vault, // Include full vault data for risk analysis
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Calculate risk-parity allocation strategy
|
|
34
|
+
* Allocates based on inverse risk (lower risk = higher allocation)
|
|
35
|
+
*/
|
|
36
|
+
export function calculateRiskParity(vaults, totalValueUsd) {
|
|
37
|
+
// Calculate inverse risk scores (lower risk = higher weight)
|
|
38
|
+
const inverseRisks = vaults.map((v) => 1 / (v.riskScore + 0.01)); // Add small epsilon to avoid division by zero
|
|
39
|
+
const totalInverseRisk = inverseRisks.reduce((sum, r) => sum + r, 0);
|
|
40
|
+
return vaults.map((vault, index) => {
|
|
41
|
+
const targetAllocation = (inverseRisks[index] / totalInverseRisk) * 100;
|
|
42
|
+
const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
|
|
43
|
+
const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
|
|
44
|
+
const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
|
|
45
|
+
const rebalancePercentage = (rebalanceAmount / vault.currentValueUsd) * 100;
|
|
46
|
+
return {
|
|
47
|
+
vaultAddress: vault.address,
|
|
48
|
+
vaultName: vault.name,
|
|
49
|
+
chainId: vault.chainId,
|
|
50
|
+
currentAllocation,
|
|
51
|
+
targetAllocation,
|
|
52
|
+
currentValueUsd: vault.currentValueUsd,
|
|
53
|
+
targetValueUsd,
|
|
54
|
+
rebalanceAmount,
|
|
55
|
+
rebalancePercentage,
|
|
56
|
+
vault, // Include full vault data for risk analysis
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Calculate maximum Sharpe ratio allocation strategy
|
|
62
|
+
* Allocates to maximize risk-adjusted returns
|
|
63
|
+
*/
|
|
64
|
+
export function calculateMaxSharpe(vaults, totalValueUsd, riskFreeRate = 2.0 // Default 2% risk-free rate
|
|
65
|
+
) {
|
|
66
|
+
// Calculate Sharpe ratios for each vault
|
|
67
|
+
const sharpeRatios = vaults.map((v) => {
|
|
68
|
+
const excessReturn = v.expectedApr - riskFreeRate;
|
|
69
|
+
return excessReturn / (v.volatility + 0.01); // Add epsilon to avoid division by zero
|
|
70
|
+
});
|
|
71
|
+
// Normalize Sharpe ratios to get weights (only positive Sharpe ratios)
|
|
72
|
+
const positiveSharpes = sharpeRatios.map((s) => Math.max(0, s));
|
|
73
|
+
const totalSharpe = positiveSharpes.reduce((sum, s) => sum + s, 0);
|
|
74
|
+
// If all Sharpe ratios are negative or zero, fall back to equal weight
|
|
75
|
+
if (totalSharpe === 0) {
|
|
76
|
+
return calculateEqualWeight(vaults, totalValueUsd);
|
|
77
|
+
}
|
|
78
|
+
return vaults.map((vault, index) => {
|
|
79
|
+
const targetAllocation = (positiveSharpes[index] / totalSharpe) * 100;
|
|
80
|
+
const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
|
|
81
|
+
const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
|
|
82
|
+
const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
|
|
83
|
+
const rebalancePercentage = vault.currentValueUsd > 0 ? (rebalanceAmount / vault.currentValueUsd) * 100 : 0;
|
|
84
|
+
return {
|
|
85
|
+
vaultAddress: vault.address,
|
|
86
|
+
vaultName: vault.name,
|
|
87
|
+
chainId: vault.chainId,
|
|
88
|
+
currentAllocation,
|
|
89
|
+
targetAllocation,
|
|
90
|
+
currentValueUsd: vault.currentValueUsd,
|
|
91
|
+
targetValueUsd,
|
|
92
|
+
rebalanceAmount,
|
|
93
|
+
rebalancePercentage,
|
|
94
|
+
vault, // Include full vault data for risk analysis
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Calculate minimum variance allocation strategy
|
|
100
|
+
* Allocates to minimize portfolio volatility
|
|
101
|
+
*/
|
|
102
|
+
export function calculateMinVariance(vaults, totalValueUsd) {
|
|
103
|
+
// Allocate based on inverse variance (lower volatility = higher allocation)
|
|
104
|
+
const inverseVariances = vaults.map((v) => 1 / (v.volatility * v.volatility + 0.0001));
|
|
105
|
+
const totalInverseVariance = inverseVariances.reduce((sum, v) => sum + v, 0);
|
|
106
|
+
return vaults.map((vault, index) => {
|
|
107
|
+
const targetAllocation = (inverseVariances[index] / totalInverseVariance) * 100;
|
|
108
|
+
const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
|
|
109
|
+
const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
|
|
110
|
+
const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
|
|
111
|
+
const rebalancePercentage = vault.currentValueUsd > 0 ? (rebalanceAmount / vault.currentValueUsd) * 100 : 0;
|
|
112
|
+
return {
|
|
113
|
+
vaultAddress: vault.address,
|
|
114
|
+
vaultName: vault.name,
|
|
115
|
+
chainId: vault.chainId,
|
|
116
|
+
currentAllocation,
|
|
117
|
+
targetAllocation,
|
|
118
|
+
currentValueUsd: vault.currentValueUsd,
|
|
119
|
+
targetValueUsd,
|
|
120
|
+
rebalanceAmount,
|
|
121
|
+
rebalancePercentage,
|
|
122
|
+
vault, // Include full vault data for risk analysis
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Calculate portfolio metrics
|
|
128
|
+
*/
|
|
129
|
+
export function calculatePortfolioMetrics(positions, vaults, riskFreeRate = 2.0) {
|
|
130
|
+
// Calculate expected return (weighted average of vault APRs)
|
|
131
|
+
const expectedReturn = vaults.reduce((sum, vault, index) => {
|
|
132
|
+
const weight = positions[index].targetAllocation / 100;
|
|
133
|
+
return sum + vault.expectedApr * weight;
|
|
134
|
+
}, 0);
|
|
135
|
+
// Calculate portfolio risk (simplified - weighted average volatility)
|
|
136
|
+
// Note: This is a simplification; true portfolio variance requires correlation matrix
|
|
137
|
+
const portfolioRisk = vaults.reduce((sum, vault, index) => {
|
|
138
|
+
const weight = positions[index].targetAllocation / 100;
|
|
139
|
+
return sum + vault.volatility * weight;
|
|
140
|
+
}, 0);
|
|
141
|
+
// Calculate Sharpe ratio
|
|
142
|
+
const excessReturn = expectedReturn - riskFreeRate;
|
|
143
|
+
const sharpeRatio = portfolioRisk > 0 ? excessReturn / portfolioRisk : 0;
|
|
144
|
+
// Calculate diversification score (1 - Herfindahl index)
|
|
145
|
+
const herfindahl = positions.reduce((sum, pos) => {
|
|
146
|
+
const weight = pos.targetAllocation / 100;
|
|
147
|
+
return sum + weight * weight;
|
|
148
|
+
}, 0);
|
|
149
|
+
const diversificationScore = 1 - herfindahl;
|
|
150
|
+
return {
|
|
151
|
+
expectedReturn,
|
|
152
|
+
portfolioRisk,
|
|
153
|
+
sharpeRatio,
|
|
154
|
+
diversificationScore,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Check if rebalancing is needed
|
|
159
|
+
*/
|
|
160
|
+
export function needsRebalancing(positions, threshold = 5.0) {
|
|
161
|
+
return positions.some((pos) => Math.abs(pos.currentAllocation - pos.targetAllocation) > threshold);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate optimization recommendations
|
|
165
|
+
*/
|
|
166
|
+
export function generateRecommendations(positions, metrics, strategy) {
|
|
167
|
+
const recommendations = [];
|
|
168
|
+
// Strategy description
|
|
169
|
+
const strategyDescriptions = {
|
|
170
|
+
equal_weight: 'Equal-weight strategy provides maximum diversification across all vaults',
|
|
171
|
+
risk_parity: 'Risk-parity strategy balances risk contribution from each vault',
|
|
172
|
+
max_sharpe: 'Maximum Sharpe ratio strategy optimizes risk-adjusted returns',
|
|
173
|
+
min_variance: 'Minimum variance strategy minimizes portfolio volatility',
|
|
174
|
+
};
|
|
175
|
+
recommendations.push(strategyDescriptions[strategy]);
|
|
176
|
+
// Portfolio metrics insights
|
|
177
|
+
if (metrics.sharpeRatio > 2.0) {
|
|
178
|
+
recommendations.push(`Excellent risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)})`);
|
|
179
|
+
}
|
|
180
|
+
else if (metrics.sharpeRatio > 1.0) {
|
|
181
|
+
recommendations.push(`Good risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)})`);
|
|
182
|
+
}
|
|
183
|
+
else if (metrics.sharpeRatio > 0) {
|
|
184
|
+
recommendations.push(`Moderate risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)}) - consider higher-yield opportunities`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
recommendations.push('Poor risk-adjusted returns - portfolio may not compensate adequately for risk');
|
|
188
|
+
}
|
|
189
|
+
// Diversification insights
|
|
190
|
+
if (metrics.diversificationScore > 0.8) {
|
|
191
|
+
recommendations.push(`Highly diversified portfolio (score: ${(metrics.diversificationScore * 100).toFixed(0)}%)`);
|
|
192
|
+
}
|
|
193
|
+
else if (metrics.diversificationScore > 0.5) {
|
|
194
|
+
recommendations.push(`Moderately diversified (score: ${(metrics.diversificationScore * 100).toFixed(0)}%) - consider adding more vaults`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
recommendations.push(`Low diversification (score: ${(metrics.diversificationScore * 100).toFixed(0)}%) - concentrated risk exposure`);
|
|
198
|
+
}
|
|
199
|
+
// Rebalancing recommendations
|
|
200
|
+
const largestDrift = positions.reduce((max, pos) => Math.max(max, Math.abs(pos.currentAllocation - pos.targetAllocation)), 0);
|
|
201
|
+
if (largestDrift > 10) {
|
|
202
|
+
recommendations.push(`Significant drift detected (${largestDrift.toFixed(1)}%) - rebalancing recommended`);
|
|
203
|
+
}
|
|
204
|
+
else if (largestDrift > 5) {
|
|
205
|
+
recommendations.push(`Moderate drift (${largestDrift.toFixed(1)}%) - consider rebalancing`);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
recommendations.push('Portfolio well-balanced - no immediate rebalancing needed');
|
|
209
|
+
}
|
|
210
|
+
// Position-specific recommendations
|
|
211
|
+
const overweightPositions = positions.filter((pos) => pos.currentAllocation - pos.targetAllocation > 5);
|
|
212
|
+
const underweightPositions = positions.filter((pos) => pos.targetAllocation - pos.currentAllocation > 5);
|
|
213
|
+
if (overweightPositions.length > 0) {
|
|
214
|
+
const names = overweightPositions.map((p) => p.vaultName).join(', ');
|
|
215
|
+
recommendations.push(`Consider reducing positions in: ${names}`);
|
|
216
|
+
}
|
|
217
|
+
if (underweightPositions.length > 0) {
|
|
218
|
+
const names = underweightPositions.map((p) => p.vaultName).join(', ');
|
|
219
|
+
recommendations.push(`Consider increasing positions in: ${names}`);
|
|
220
|
+
}
|
|
221
|
+
return recommendations;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Optimize portfolio based on strategy
|
|
225
|
+
*
|
|
226
|
+
* @param vaults - Vaults with current positions and metrics
|
|
227
|
+
* @param strategy - Optimization strategy to use
|
|
228
|
+
* @param rebalanceThreshold - Minimum drift percentage to trigger rebalancing (default: 5%)
|
|
229
|
+
* @param riskFreeRate - Risk-free rate for Sharpe ratio calculation (default: 2%)
|
|
230
|
+
* @returns Portfolio optimization result with positions and recommendations
|
|
231
|
+
*/
|
|
232
|
+
export function optimizePortfolio(vaults, strategy = 'max_sharpe', rebalanceThreshold = 5.0, riskFreeRate = 2.0) {
|
|
233
|
+
if (vaults.length === 0) {
|
|
234
|
+
return {
|
|
235
|
+
strategy,
|
|
236
|
+
totalValueUsd: 0,
|
|
237
|
+
positions: [],
|
|
238
|
+
metrics: {
|
|
239
|
+
expectedReturn: 0,
|
|
240
|
+
portfolioRisk: 0,
|
|
241
|
+
sharpeRatio: 0,
|
|
242
|
+
diversificationScore: 0,
|
|
243
|
+
},
|
|
244
|
+
rebalanceNeeded: false,
|
|
245
|
+
rebalanceThreshold,
|
|
246
|
+
recommendations: ['No vaults in portfolio'],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Calculate total portfolio value
|
|
250
|
+
const totalValueUsd = vaults.reduce((sum, v) => sum + v.currentValueUsd, 0);
|
|
251
|
+
// Calculate target allocations based on strategy
|
|
252
|
+
let positions;
|
|
253
|
+
switch (strategy) {
|
|
254
|
+
case 'equal_weight':
|
|
255
|
+
positions = calculateEqualWeight(vaults, totalValueUsd);
|
|
256
|
+
break;
|
|
257
|
+
case 'risk_parity':
|
|
258
|
+
positions = calculateRiskParity(vaults, totalValueUsd);
|
|
259
|
+
break;
|
|
260
|
+
case 'max_sharpe':
|
|
261
|
+
positions = calculateMaxSharpe(vaults, totalValueUsd, riskFreeRate);
|
|
262
|
+
break;
|
|
263
|
+
case 'min_variance':
|
|
264
|
+
positions = calculateMinVariance(vaults, totalValueUsd);
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
// Calculate portfolio metrics
|
|
268
|
+
const metrics = calculatePortfolioMetrics(positions, vaults, riskFreeRate);
|
|
269
|
+
// Check if rebalancing is needed
|
|
270
|
+
const rebalanceNeeded = needsRebalancing(positions, rebalanceThreshold);
|
|
271
|
+
// Generate recommendations
|
|
272
|
+
const recommendations = generateRecommendations(positions, metrics, strategy);
|
|
273
|
+
return {
|
|
274
|
+
strategy,
|
|
275
|
+
totalValueUsd,
|
|
276
|
+
positions,
|
|
277
|
+
metrics,
|
|
278
|
+
rebalanceNeeded,
|
|
279
|
+
rebalanceThreshold,
|
|
280
|
+
recommendations,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=portfolio-optimization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-optimization.js","sourceRoot":"","sources":["../../src/utils/portfolio-optimization.ts"],"names":[],"mappings":"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"}
|