@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,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Scoring Utility
|
|
3
|
+
*
|
|
4
|
+
* Multi-factor risk analysis algorithms for vault assessment.
|
|
5
|
+
* Provides comprehensive risk scoring across multiple dimensions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Risk thresholds for scoring
|
|
9
|
+
*/
|
|
10
|
+
export const RISK_THRESHOLDS = {
|
|
11
|
+
// TVL thresholds (USD)
|
|
12
|
+
TVL_VERY_HIGH: 10_000_000, // >$10M = very low risk
|
|
13
|
+
TVL_HIGH: 1_000_000, // >$1M = low risk
|
|
14
|
+
TVL_MEDIUM: 100_000, // >$100K = medium risk
|
|
15
|
+
TVL_LOW: 10_000, // >$10K = high risk
|
|
16
|
+
// Below $10K = critical risk
|
|
17
|
+
// Concentration thresholds (percentage of total assets)
|
|
18
|
+
CONCENTRATION_LOW: 0.1, // <10% = low risk
|
|
19
|
+
CONCENTRATION_MEDIUM: 0.25, // <25% = medium risk
|
|
20
|
+
CONCENTRATION_HIGH: 0.5, // <50% = high risk
|
|
21
|
+
// >50% = critical risk
|
|
22
|
+
// Volatility thresholds (standard deviation of daily returns)
|
|
23
|
+
VOLATILITY_LOW: 0.02, // <2% = low risk
|
|
24
|
+
VOLATILITY_MEDIUM: 0.05, // <5% = medium risk
|
|
25
|
+
VOLATILITY_HIGH: 0.1, // <10% = high risk
|
|
26
|
+
// >10% = critical risk
|
|
27
|
+
// Age thresholds (days)
|
|
28
|
+
AGE_MATURE: 365, // >1 year = low risk
|
|
29
|
+
AGE_ESTABLISHED: 90, // >3 months = medium risk
|
|
30
|
+
AGE_NEW: 30, // >1 month = high risk
|
|
31
|
+
// <1 month = critical risk
|
|
32
|
+
// Overall risk score thresholds
|
|
33
|
+
OVERALL_LOW: 0.3,
|
|
34
|
+
OVERALL_MEDIUM: 0.6,
|
|
35
|
+
OVERALL_HIGH: 0.8,
|
|
36
|
+
// >0.8 = critical
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Calculate TVL-based risk score
|
|
40
|
+
* Higher TVL = lower risk (more liquidity and market validation)
|
|
41
|
+
*
|
|
42
|
+
* @param tvl - Total value locked in USD
|
|
43
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
44
|
+
*/
|
|
45
|
+
export function calculateTVLRisk(tvl) {
|
|
46
|
+
if (tvl >= RISK_THRESHOLDS.TVL_VERY_HIGH) {
|
|
47
|
+
return 0.1; // Very low risk
|
|
48
|
+
}
|
|
49
|
+
else if (tvl >= RISK_THRESHOLDS.TVL_HIGH) {
|
|
50
|
+
return 0.2; // Low risk
|
|
51
|
+
}
|
|
52
|
+
else if (tvl >= RISK_THRESHOLDS.TVL_MEDIUM) {
|
|
53
|
+
return 0.5; // Medium risk
|
|
54
|
+
}
|
|
55
|
+
else if (tvl >= RISK_THRESHOLDS.TVL_LOW) {
|
|
56
|
+
return 0.8; // High risk
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return 1.0; // Critical risk
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate concentration risk score
|
|
64
|
+
* Measures vault's share of total protocol TVL
|
|
65
|
+
*
|
|
66
|
+
* @param vaultTVL - Vault's TVL in USD
|
|
67
|
+
* @param totalProtocolTVL - Total protocol TVL in USD
|
|
68
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
69
|
+
*/
|
|
70
|
+
export function calculateConcentrationRisk(vaultTVL, totalProtocolTVL) {
|
|
71
|
+
if (totalProtocolTVL === 0) {
|
|
72
|
+
return 0.5; // Medium risk if no protocol data
|
|
73
|
+
}
|
|
74
|
+
const concentration = vaultTVL / totalProtocolTVL;
|
|
75
|
+
if (concentration < RISK_THRESHOLDS.CONCENTRATION_LOW) {
|
|
76
|
+
return 0.1; // Low concentration = low risk
|
|
77
|
+
}
|
|
78
|
+
else if (concentration < RISK_THRESHOLDS.CONCENTRATION_MEDIUM) {
|
|
79
|
+
return 0.4; // Medium concentration
|
|
80
|
+
}
|
|
81
|
+
else if (concentration < RISK_THRESHOLDS.CONCENTRATION_HIGH) {
|
|
82
|
+
return 0.7; // High concentration
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return 1.0; // Critical concentration risk
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Calculate volatility risk score
|
|
90
|
+
* Based on price volatility over time
|
|
91
|
+
*
|
|
92
|
+
* @param pricePoints - Array of price per share values over time
|
|
93
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
94
|
+
*/
|
|
95
|
+
export function calculateVolatilityRisk(pricePoints) {
|
|
96
|
+
if (pricePoints.length < 2) {
|
|
97
|
+
return 0.5; // Medium risk if insufficient data
|
|
98
|
+
}
|
|
99
|
+
// Calculate daily returns
|
|
100
|
+
const returns = [];
|
|
101
|
+
for (let i = 1; i < pricePoints.length; i++) {
|
|
102
|
+
if (pricePoints[i - 1] !== 0) {
|
|
103
|
+
const dailyReturn = (pricePoints[i] - pricePoints[i - 1]) / pricePoints[i - 1];
|
|
104
|
+
returns.push(dailyReturn);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (returns.length === 0) {
|
|
108
|
+
return 0.5; // Medium risk if no valid returns
|
|
109
|
+
}
|
|
110
|
+
// Calculate standard deviation
|
|
111
|
+
const mean = returns.reduce((sum, r) => sum + r, 0) / returns.length;
|
|
112
|
+
const variance = returns.reduce((sum, r) => sum + Math.pow(r - mean, 2), 0) / returns.length;
|
|
113
|
+
const stdDev = Math.sqrt(variance);
|
|
114
|
+
// Map standard deviation to risk score
|
|
115
|
+
if (stdDev < RISK_THRESHOLDS.VOLATILITY_LOW) {
|
|
116
|
+
return 0.1; // Low volatility = low risk
|
|
117
|
+
}
|
|
118
|
+
else if (stdDev < RISK_THRESHOLDS.VOLATILITY_MEDIUM) {
|
|
119
|
+
return 0.4; // Medium volatility
|
|
120
|
+
}
|
|
121
|
+
else if (stdDev < RISK_THRESHOLDS.VOLATILITY_HIGH) {
|
|
122
|
+
return 0.7; // High volatility
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
return 1.0; // Critical volatility risk
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Calculate age-based risk score
|
|
130
|
+
* Newer vaults are riskier (less battle-tested)
|
|
131
|
+
*
|
|
132
|
+
* @param ageInDays - Vault age in days
|
|
133
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
134
|
+
*/
|
|
135
|
+
export function calculateAgeRisk(ageInDays) {
|
|
136
|
+
if (ageInDays >= RISK_THRESHOLDS.AGE_MATURE) {
|
|
137
|
+
return 0.1; // Mature vault = low risk
|
|
138
|
+
}
|
|
139
|
+
else if (ageInDays >= RISK_THRESHOLDS.AGE_ESTABLISHED) {
|
|
140
|
+
return 0.4; // Established vault = medium-low risk
|
|
141
|
+
}
|
|
142
|
+
else if (ageInDays >= RISK_THRESHOLDS.AGE_NEW) {
|
|
143
|
+
return 0.7; // New vault = high risk
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return 1.0; // Very new vault = critical risk
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Calculate curator reputation risk score
|
|
151
|
+
* Based on curator's track record, professional signals, and vault management
|
|
152
|
+
*
|
|
153
|
+
* @param curatorVaultCount - Number of vaults managed by curator
|
|
154
|
+
* @param curatorSuccessRate - Success rate (0-1) of curator's vaults
|
|
155
|
+
* @param professionalSignals - Professional indicators: website, description, multiple curators
|
|
156
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
157
|
+
*/
|
|
158
|
+
export function calculateCuratorRisk(curatorVaultCount, curatorSuccessRate = 0.5, professionalSignals) {
|
|
159
|
+
// Base risk on experience (vault count)
|
|
160
|
+
let experienceRisk;
|
|
161
|
+
if (curatorVaultCount >= 10) {
|
|
162
|
+
experienceRisk = 0.1; // Highly experienced
|
|
163
|
+
}
|
|
164
|
+
else if (curatorVaultCount >= 5) {
|
|
165
|
+
experienceRisk = 0.3; // Moderately experienced
|
|
166
|
+
}
|
|
167
|
+
else if (curatorVaultCount >= 2) {
|
|
168
|
+
experienceRisk = 0.6; // Limited experience
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
experienceRisk = 0.9; // New curator
|
|
172
|
+
}
|
|
173
|
+
// Adjust based on success rate
|
|
174
|
+
const successRateAdjustment = (1 - curatorSuccessRate) * 0.5; // Max 0.5 adjustment
|
|
175
|
+
// Apply professional signals if available
|
|
176
|
+
let professionalAdjustment = 0;
|
|
177
|
+
if (professionalSignals) {
|
|
178
|
+
// Website presence indicates professionalism (-0.1)
|
|
179
|
+
if (professionalSignals.hasWebsite) {
|
|
180
|
+
professionalAdjustment -= 0.1;
|
|
181
|
+
}
|
|
182
|
+
// Description quality indicates transparency (-0.1)
|
|
183
|
+
if (professionalSignals.hasDescription) {
|
|
184
|
+
professionalAdjustment -= 0.1;
|
|
185
|
+
}
|
|
186
|
+
// Multiple curators reduce centralization risk (-0.15)
|
|
187
|
+
if (professionalSignals.multipleCurators) {
|
|
188
|
+
professionalAdjustment -= 0.15;
|
|
189
|
+
}
|
|
190
|
+
// Additional curator count bonus (max -0.1 for 5+ curators)
|
|
191
|
+
if (professionalSignals.curatorCount > 1) {
|
|
192
|
+
const curatorCountBonus = Math.min(0.1, (professionalSignals.curatorCount - 1) * 0.025);
|
|
193
|
+
professionalAdjustment -= curatorCountBonus;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return Math.max(0, Math.min(1, experienceRisk + successRateAdjustment + professionalAdjustment));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Calculate fee risk score
|
|
200
|
+
* Based on management fees and performance fee impact
|
|
201
|
+
*
|
|
202
|
+
* @param managementFee - Annual management fee percentage (e.g., 2 for 2%)
|
|
203
|
+
* @param performanceFee - Performance fee percentage (e.g., 20 for 20%)
|
|
204
|
+
* @param performanceFeeActive - Whether performance fee is currently active (above HWM)
|
|
205
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
206
|
+
*/
|
|
207
|
+
export function calculateFeeRisk(managementFee, performanceFee, performanceFeeActive) {
|
|
208
|
+
// Calculate total fee drag (worst case scenario)
|
|
209
|
+
const annualFeeDrag = managementFee + (performanceFeeActive ? performanceFee * 0.1 : 0);
|
|
210
|
+
// Score based on total fee impact
|
|
211
|
+
if (annualFeeDrag < 1) {
|
|
212
|
+
return 0.1; // Very low fees = low risk
|
|
213
|
+
}
|
|
214
|
+
else if (annualFeeDrag < 2) {
|
|
215
|
+
return 0.3; // Low fees
|
|
216
|
+
}
|
|
217
|
+
else if (annualFeeDrag < 3) {
|
|
218
|
+
return 0.5; // Moderate fees
|
|
219
|
+
}
|
|
220
|
+
else if (annualFeeDrag < 5) {
|
|
221
|
+
return 0.7; // High fees
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
return 1.0; // Very high fees = critical risk
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Calculate liquidity risk score
|
|
229
|
+
* Based on safe assets vs pending redemptions coverage
|
|
230
|
+
*
|
|
231
|
+
* @param safeAssets - Assets available for immediate redemptions (USD)
|
|
232
|
+
* @param pendingRedemptions - Outstanding redemption requests (USD)
|
|
233
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
234
|
+
*/
|
|
235
|
+
export function calculateLiquidityRisk(safeAssets, pendingRedemptions) {
|
|
236
|
+
// If no pending redemptions, liquidity risk is low
|
|
237
|
+
if (pendingRedemptions === 0) {
|
|
238
|
+
return 0.1; // No redemption pressure = low risk
|
|
239
|
+
}
|
|
240
|
+
// Calculate coverage ratio
|
|
241
|
+
const coverageRatio = safeAssets / pendingRedemptions;
|
|
242
|
+
// Score based on coverage
|
|
243
|
+
if (coverageRatio >= 2.0) {
|
|
244
|
+
return 0.1; // 200%+ coverage = very low risk
|
|
245
|
+
}
|
|
246
|
+
else if (coverageRatio >= 1.5) {
|
|
247
|
+
return 0.3; // 150%+ coverage = low risk
|
|
248
|
+
}
|
|
249
|
+
else if (coverageRatio >= 1.0) {
|
|
250
|
+
return 0.5; // 100%+ coverage = medium risk
|
|
251
|
+
}
|
|
252
|
+
else if (coverageRatio >= 0.5) {
|
|
253
|
+
return 0.7; // 50%+ coverage = high risk
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
return 1.0; // <50% coverage = critical risk
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Calculate APR consistency risk score
|
|
261
|
+
* Analyzes volatility of returns across different time periods
|
|
262
|
+
*
|
|
263
|
+
* @param aprData - APR values across different time periods
|
|
264
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
265
|
+
*/
|
|
266
|
+
export function calculateAPRConsistencyRisk(aprData) {
|
|
267
|
+
const aprs = [
|
|
268
|
+
aprData.weeklyApr,
|
|
269
|
+
aprData.monthlyApr,
|
|
270
|
+
aprData.yearlyApr,
|
|
271
|
+
aprData.inceptionApr,
|
|
272
|
+
].filter((apr) => typeof apr === 'number' && apr >= 0);
|
|
273
|
+
if (aprs.length < 2) {
|
|
274
|
+
return 0.5; // Insufficient data = medium risk
|
|
275
|
+
}
|
|
276
|
+
// Calculate coefficient of variation (CV = stdDev / mean)
|
|
277
|
+
const mean = aprs.reduce((sum, apr) => sum + apr, 0) / aprs.length;
|
|
278
|
+
if (mean === 0) {
|
|
279
|
+
return 0.5; // No returns = medium risk
|
|
280
|
+
}
|
|
281
|
+
const variance = aprs.reduce((sum, apr) => sum + Math.pow(apr - mean, 2), 0) / aprs.length;
|
|
282
|
+
const stdDev = Math.sqrt(variance);
|
|
283
|
+
const coefficientOfVariation = stdDev / Math.abs(mean);
|
|
284
|
+
// Score based on consistency (lower CV = lower risk)
|
|
285
|
+
if (coefficientOfVariation < 0.1) {
|
|
286
|
+
return 0.1; // Very consistent (<10% variation) = low risk
|
|
287
|
+
}
|
|
288
|
+
else if (coefficientOfVariation < 0.25) {
|
|
289
|
+
return 0.3; // Moderately consistent (<25% variation)
|
|
290
|
+
}
|
|
291
|
+
else if (coefficientOfVariation < 0.5) {
|
|
292
|
+
return 0.6; // Inconsistent (<50% variation)
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
return 1.0; // Highly volatile (>50% variation) = high risk
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Calculate yield sustainability risk score
|
|
300
|
+
* Assesses composition of APR sources (native vs temporary incentives)
|
|
301
|
+
*
|
|
302
|
+
* @param yieldComposition - Breakdown of yield sources
|
|
303
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
304
|
+
*/
|
|
305
|
+
export function calculateYieldSustainabilityRisk(yieldComposition) {
|
|
306
|
+
const { totalApr, nativeYieldsApr } = yieldComposition;
|
|
307
|
+
if (totalApr === 0) {
|
|
308
|
+
return 0.5; // No yield data = medium risk
|
|
309
|
+
}
|
|
310
|
+
const sustainableRatio = nativeYieldsApr / totalApr;
|
|
311
|
+
// Score based on sustainability (higher native yield = lower risk)
|
|
312
|
+
if (sustainableRatio > 0.8) {
|
|
313
|
+
return 0.1; // >80% native yields = sustainable
|
|
314
|
+
}
|
|
315
|
+
else if (sustainableRatio > 0.5) {
|
|
316
|
+
return 0.4; // >50% native yields = balanced
|
|
317
|
+
}
|
|
318
|
+
else if (sustainableRatio > 0.2) {
|
|
319
|
+
return 0.7; // >20% native yields = heavy on incentives
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
return 1.0; // <20% native yields = almost entirely temporary
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Calculate settlement time risk score
|
|
327
|
+
* Quantifies redemption delay and operational efficiency
|
|
328
|
+
*
|
|
329
|
+
* @param settlementData - Settlement time and pending operations data
|
|
330
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
331
|
+
*/
|
|
332
|
+
export function calculateSettlementRisk(settlementData) {
|
|
333
|
+
const { averageSettlementDays, pendingOperationsRatio } = settlementData;
|
|
334
|
+
// Score based on settlement time (faster = lower risk)
|
|
335
|
+
let timeScore = 0;
|
|
336
|
+
if (averageSettlementDays < 1) {
|
|
337
|
+
timeScore = 0.1; // Same day settlement
|
|
338
|
+
}
|
|
339
|
+
else if (averageSettlementDays < 3) {
|
|
340
|
+
timeScore = 0.3; // 1-3 days
|
|
341
|
+
}
|
|
342
|
+
else if (averageSettlementDays < 7) {
|
|
343
|
+
timeScore = 0.6; // 3-7 days
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
timeScore = 0.9; // >1 week
|
|
347
|
+
}
|
|
348
|
+
// Score based on pending operations (lower = lower risk)
|
|
349
|
+
let pendingScore = 0;
|
|
350
|
+
if (pendingOperationsRatio < 0.1) {
|
|
351
|
+
pendingScore = 0.1; // <10% pending
|
|
352
|
+
}
|
|
353
|
+
else if (pendingOperationsRatio < 0.3) {
|
|
354
|
+
pendingScore = 0.4; // <30% pending
|
|
355
|
+
}
|
|
356
|
+
else if (pendingOperationsRatio < 0.5) {
|
|
357
|
+
pendingScore = 0.7; // <50% pending
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
pendingScore = 1.0; // >50% pending = operational bottleneck
|
|
361
|
+
}
|
|
362
|
+
return (timeScore + pendingScore) / 2;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Calculate integration complexity risk score
|
|
366
|
+
* Assesses smart contract attack surface based on number of integrations
|
|
367
|
+
*
|
|
368
|
+
* @param integrationCount - Number of DeFi protocol integrations
|
|
369
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
370
|
+
*/
|
|
371
|
+
export function calculateIntegrationComplexityRisk(integrationCount) {
|
|
372
|
+
if (integrationCount === 0) {
|
|
373
|
+
return 0.3; // No integrations = simpler but limited
|
|
374
|
+
}
|
|
375
|
+
else if (integrationCount === 1) {
|
|
376
|
+
return 0.1; // Single integration = focused strategy, low complexity
|
|
377
|
+
}
|
|
378
|
+
else if (integrationCount <= 3) {
|
|
379
|
+
return 0.4; // Moderate complexity
|
|
380
|
+
}
|
|
381
|
+
else if (integrationCount <= 5) {
|
|
382
|
+
return 0.7; // High complexity
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
return 1.0; // Very high complexity = large attack surface
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Calculate capacity utilization risk score
|
|
390
|
+
* Assesses deposit headroom and demand signals
|
|
391
|
+
*
|
|
392
|
+
* @param utilizationData - Capacity and utilization data
|
|
393
|
+
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
394
|
+
*/
|
|
395
|
+
export function calculateCapacityUtilizationRisk(utilizationData) {
|
|
396
|
+
const { totalAssets, maxCapacity } = utilizationData;
|
|
397
|
+
if (!maxCapacity || maxCapacity === 0) {
|
|
398
|
+
return 0.2; // No capacity limit = flexible (low risk)
|
|
399
|
+
}
|
|
400
|
+
const utilizationRatio = totalAssets / maxCapacity;
|
|
401
|
+
if (utilizationRatio < 0.3) {
|
|
402
|
+
return 0.6; // Under-utilized (<30%) = demand concern
|
|
403
|
+
}
|
|
404
|
+
else if (utilizationRatio < 0.7) {
|
|
405
|
+
return 0.2; // Healthy utilization (30-70%)
|
|
406
|
+
}
|
|
407
|
+
else if (utilizationRatio < 0.9) {
|
|
408
|
+
return 0.4; // Getting full (70-90%)
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
return 0.8; // Near capacity (>90%) = deposit risk
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Calculate overall risk score with weighted factors
|
|
416
|
+
*
|
|
417
|
+
* @param breakdown - Individual risk factor scores
|
|
418
|
+
* @returns Overall risk score 0-1 and risk level
|
|
419
|
+
*/
|
|
420
|
+
export function calculateOverallRisk(breakdown) {
|
|
421
|
+
// Weighted average of 12 risk factors (updated distribution)
|
|
422
|
+
const weights = {
|
|
423
|
+
tvl: 0.1,
|
|
424
|
+
concentration: 0.1,
|
|
425
|
+
volatility: 0.15,
|
|
426
|
+
age: 0.1,
|
|
427
|
+
curator: 0.1,
|
|
428
|
+
fee: 0.1,
|
|
429
|
+
liquidity: 0.1,
|
|
430
|
+
aprConsistency: 0.15, // NEW - Performance predictability
|
|
431
|
+
yieldSustainability: 0.05, // NEW - APR quality
|
|
432
|
+
settlement: 0.05, // NEW - Operational efficiency (combined with liquidity)
|
|
433
|
+
integrationComplexity: 0.05, // NEW - Technical risk
|
|
434
|
+
capacityUtilization: 0.05, // NEW - Operational signal
|
|
435
|
+
};
|
|
436
|
+
const overallRisk = breakdown.tvlRisk * weights.tvl +
|
|
437
|
+
breakdown.concentrationRisk * weights.concentration +
|
|
438
|
+
breakdown.volatilityRisk * weights.volatility +
|
|
439
|
+
breakdown.ageRisk * weights.age +
|
|
440
|
+
breakdown.curatorRisk * weights.curator +
|
|
441
|
+
breakdown.feeRisk * weights.fee +
|
|
442
|
+
breakdown.liquidityRisk * weights.liquidity +
|
|
443
|
+
breakdown.aprConsistencyRisk * weights.aprConsistency +
|
|
444
|
+
breakdown.yieldSustainabilityRisk * weights.yieldSustainability +
|
|
445
|
+
breakdown.settlementRisk * weights.settlement +
|
|
446
|
+
breakdown.integrationComplexityRisk * weights.integrationComplexity +
|
|
447
|
+
breakdown.capacityUtilizationRisk * weights.capacityUtilization;
|
|
448
|
+
// Determine risk level
|
|
449
|
+
let riskLevel;
|
|
450
|
+
if (overallRisk < RISK_THRESHOLDS.OVERALL_LOW) {
|
|
451
|
+
riskLevel = 'Low';
|
|
452
|
+
}
|
|
453
|
+
else if (overallRisk < RISK_THRESHOLDS.OVERALL_MEDIUM) {
|
|
454
|
+
riskLevel = 'Medium';
|
|
455
|
+
}
|
|
456
|
+
else if (overallRisk < RISK_THRESHOLDS.OVERALL_HIGH) {
|
|
457
|
+
riskLevel = 'High';
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
riskLevel = 'Critical';
|
|
461
|
+
}
|
|
462
|
+
return { overallRisk, riskLevel };
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Generate comprehensive risk analysis
|
|
466
|
+
*
|
|
467
|
+
* @param params - Risk analysis parameters
|
|
468
|
+
* @returns Complete risk score breakdown
|
|
469
|
+
*/
|
|
470
|
+
export function analyzeRisk(params) {
|
|
471
|
+
const tvlRisk = calculateTVLRisk(params.tvl);
|
|
472
|
+
const concentrationRisk = calculateConcentrationRisk(params.tvl, params.totalProtocolTVL);
|
|
473
|
+
const volatilityRisk = calculateVolatilityRisk(params.priceHistory);
|
|
474
|
+
const ageRisk = calculateAgeRisk(params.ageInDays);
|
|
475
|
+
const curatorRisk = calculateCuratorRisk(params.curatorVaultCount, params.curatorSuccessRate, params.curatorProfessionalSignals);
|
|
476
|
+
const feeRisk = calculateFeeRisk(params.managementFee, params.performanceFee, params.performanceFeeActive);
|
|
477
|
+
const liquidityRisk = calculateLiquidityRisk(params.safeAssets, params.pendingRedemptions);
|
|
478
|
+
// Calculate new risk factors (with defaults if data not provided)
|
|
479
|
+
const aprConsistencyRisk = params.aprData ? calculateAPRConsistencyRisk(params.aprData) : 0.5; // Default to medium risk if no data
|
|
480
|
+
const yieldSustainabilityRisk = params.yieldComposition
|
|
481
|
+
? calculateYieldSustainabilityRisk(params.yieldComposition)
|
|
482
|
+
: 0.5; // Default to medium risk if no data
|
|
483
|
+
const settlementRisk = params.settlementData
|
|
484
|
+
? calculateSettlementRisk(params.settlementData)
|
|
485
|
+
: 0.5; // Default to medium risk if no data
|
|
486
|
+
const integrationComplexityRisk = params.integrationCount !== undefined
|
|
487
|
+
? calculateIntegrationComplexityRisk(params.integrationCount)
|
|
488
|
+
: 0.5; // Default to medium risk if no data
|
|
489
|
+
const capacityUtilizationRisk = params.capacityData
|
|
490
|
+
? calculateCapacityUtilizationRisk(params.capacityData)
|
|
491
|
+
: 0.2; // Default to low risk (no capacity limit)
|
|
492
|
+
const { overallRisk, riskLevel } = calculateOverallRisk({
|
|
493
|
+
tvlRisk,
|
|
494
|
+
concentrationRisk,
|
|
495
|
+
volatilityRisk,
|
|
496
|
+
ageRisk,
|
|
497
|
+
curatorRisk,
|
|
498
|
+
feeRisk,
|
|
499
|
+
liquidityRisk,
|
|
500
|
+
aprConsistencyRisk,
|
|
501
|
+
yieldSustainabilityRisk,
|
|
502
|
+
settlementRisk,
|
|
503
|
+
integrationComplexityRisk,
|
|
504
|
+
capacityUtilizationRisk,
|
|
505
|
+
});
|
|
506
|
+
return {
|
|
507
|
+
tvlRisk,
|
|
508
|
+
concentrationRisk,
|
|
509
|
+
volatilityRisk,
|
|
510
|
+
ageRisk,
|
|
511
|
+
curatorRisk,
|
|
512
|
+
feeRisk,
|
|
513
|
+
liquidityRisk,
|
|
514
|
+
aprConsistencyRisk,
|
|
515
|
+
yieldSustainabilityRisk,
|
|
516
|
+
settlementRisk,
|
|
517
|
+
integrationComplexityRisk,
|
|
518
|
+
capacityUtilizationRisk,
|
|
519
|
+
overallRisk,
|
|
520
|
+
riskLevel,
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=risk-scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-scoring.js","sourceRoot":"","sources":["../../src/utils/risk-scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Error Handler for MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Centralized error handling logic for all MCP tools.
|
|
5
|
+
* Handles validation errors, GraphQL errors, and generic errors.
|
|
6
|
+
*/
|
|
7
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Handle errors consistently across all MCP tools
|
|
10
|
+
*
|
|
11
|
+
* @param error - The error to handle
|
|
12
|
+
* @param toolName - The name of the tool where the error occurred
|
|
13
|
+
* @returns Standardized error response
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleToolError(error: unknown, toolName: string): CallToolResult;
|
|
16
|
+
//# sourceMappingURL=tool-error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/tool-error-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIpE;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CA8BhF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Error Handler for MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Centralized error handling logic for all MCP tools.
|
|
5
|
+
* Handles validation errors, GraphQL errors, and generic errors.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { ValidationError, errorResponse, logError } from './errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Handle errors consistently across all MCP tools
|
|
11
|
+
*
|
|
12
|
+
* @param error - The error to handle
|
|
13
|
+
* @param toolName - The name of the tool where the error occurred
|
|
14
|
+
* @returns Standardized error response
|
|
15
|
+
*/
|
|
16
|
+
export function handleToolError(error, toolName) {
|
|
17
|
+
// Handle Zod validation errors
|
|
18
|
+
if (error instanceof z.ZodError) {
|
|
19
|
+
const validationError = new ValidationError(`Input validation failed: ${error.errors.map((e) => e.message).join(', ')}`);
|
|
20
|
+
logError(validationError, toolName);
|
|
21
|
+
return errorResponse(validationError);
|
|
22
|
+
}
|
|
23
|
+
// Handle GraphQL errors
|
|
24
|
+
if (error && typeof error === 'object' && 'response' in error) {
|
|
25
|
+
const gqlError = error;
|
|
26
|
+
if (gqlError.response?.errors) {
|
|
27
|
+
logError(error, toolName);
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: `GraphQL Error: ${JSON.stringify(gqlError.response.errors, null, 2)}`,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
isError: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Handle all other errors
|
|
40
|
+
logError(error, toolName);
|
|
41
|
+
return errorResponse(error);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=tool-error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-handler.js","sourceRoot":"","sources":["../../src/utils/tool-error-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAgB;IAC9D,+BAA+B;IAC/B,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,IAAI,eAAe,CACzC,4BAA4B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5E,CAAC;QACF,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,aAAa,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAA8C,CAAC;QAChE,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;qBAC5E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-Safe Tool Handler Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides type-safe wrappers for MCP tool handlers to eliminate
|
|
5
|
+
* unsafe type assertions (as never) throughout the codebase.
|
|
6
|
+
*/
|
|
7
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import { ZodSchema } from 'zod';
|
|
9
|
+
/**
|
|
10
|
+
* Creates a type-safe tool handler that validates input against a schema
|
|
11
|
+
*
|
|
12
|
+
* @param handler - The tool handler function with proper typing
|
|
13
|
+
* @param schema - Zod schema for runtime validation (handles schemas with defaults)
|
|
14
|
+
* @returns A wrapper function that safely handles unknown arguments
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const safeHandler = createToolHandler(
|
|
18
|
+
* executeQueryGraphQL,
|
|
19
|
+
* queryGraphQLInputSchema
|
|
20
|
+
* );
|
|
21
|
+
* await safeHandler(unknownArgs);
|
|
22
|
+
*/
|
|
23
|
+
export declare function createToolHandler<TOutput, TInput = TOutput>(handler: (input: TOutput) => Promise<CallToolResult>, schema: ZodSchema<TOutput, any, TInput>): (args: unknown) => Promise<CallToolResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Type-safe wrapper for tool handlers that don't need explicit validation
|
|
26
|
+
*
|
|
27
|
+
* @param handler - The tool handler function
|
|
28
|
+
* @returns A wrapper function that safely casts unknown arguments
|
|
29
|
+
*
|
|
30
|
+
* Note: Use createToolHandler with schema validation instead when possible
|
|
31
|
+
*/
|
|
32
|
+
export declare function wrapToolHandler<T>(handler: (input: T) => Promise<CallToolResult>): (args: unknown) => Promise<CallToolResult>;
|
|
33
|
+
//# sourceMappingURL=tool-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-handler.d.ts","sourceRoot":"","sources":["../../src/utils/tool-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EACzD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,EAEpD,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GACtC,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAsB5C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,GAC7C,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,cAAc,CAAC,CAI5C"}
|