@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,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Analysis Service
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates risk analysis business logic with dependency injection.
|
|
5
|
+
* Demonstrates service layer pattern for complex multi-step operations.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseService } from '../base.service.js';
|
|
8
|
+
import { RISK_ANALYSIS_QUERY } from '../../graphql/queries/index.js';
|
|
9
|
+
import { analyzeRisk } from '../../utils/risk-scoring.js';
|
|
10
|
+
/**
|
|
11
|
+
* Risk analysis service for vault risk assessment
|
|
12
|
+
*/
|
|
13
|
+
export class RiskService extends BaseService {
|
|
14
|
+
/**
|
|
15
|
+
* Fetch risk analysis data from GraphQL
|
|
16
|
+
*/
|
|
17
|
+
async fetchRiskData(vaultAddress, chainId) {
|
|
18
|
+
const data = await this.client.request(RISK_ANALYSIS_QUERY, {
|
|
19
|
+
vaultAddress,
|
|
20
|
+
chainId,
|
|
21
|
+
curatorId: '', // Will be extracted from vault.curators after fetch
|
|
22
|
+
where: {
|
|
23
|
+
vault_in: [vaultAddress],
|
|
24
|
+
type_in: ['TotalAssetsUpdated'],
|
|
25
|
+
},
|
|
26
|
+
orderBy: 'timestamp',
|
|
27
|
+
orderDirection: 'asc',
|
|
28
|
+
});
|
|
29
|
+
return data.vault ? data : null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate risk breakdown from fetched data
|
|
33
|
+
*/
|
|
34
|
+
calculateRisk(data) {
|
|
35
|
+
// Calculate TVL
|
|
36
|
+
const vaultTVL = data.vault.state?.totalAssetsUsd || 0;
|
|
37
|
+
// Calculate total protocol TVL
|
|
38
|
+
const totalProtocolTVL = data.allVaults.items.reduce((sum, v) => sum + (v.state?.totalAssetsUsd || 0), 0);
|
|
39
|
+
// Extract price history and calculate price per share
|
|
40
|
+
const priceHistory = data.priceHistory.items.map((item) => {
|
|
41
|
+
// Calculate price per share from totalAssetsUsd / totalSupply
|
|
42
|
+
const totalSupply = parseFloat(item.data.totalSupply) / 1e18; // Convert from wei
|
|
43
|
+
return totalSupply > 0 ? item.data.totalAssetsUsd / totalSupply : 0;
|
|
44
|
+
});
|
|
45
|
+
// Calculate vault age in days from first transaction
|
|
46
|
+
const now = Math.floor(Date.now() / 1000);
|
|
47
|
+
const firstTransaction = data.priceHistory.items[0];
|
|
48
|
+
const createdAtTimestamp = firstTransaction
|
|
49
|
+
? parseInt(firstTransaction.timestamp, 10)
|
|
50
|
+
: now - 365 * 24 * 60 * 60;
|
|
51
|
+
const ageInDays = Math.floor((now - createdAtTimestamp) / (24 * 60 * 60));
|
|
52
|
+
// Get curator vault count
|
|
53
|
+
const curatorVaultCount = data.curatorVaults.items.length;
|
|
54
|
+
// Calculate curator success rate (vaults with TVL > $10K)
|
|
55
|
+
const successfulVaults = data.curatorVaults.items.filter((v) => (v.state?.totalAssetsUsd || 0) > 10_000).length;
|
|
56
|
+
const curatorSuccessRate = curatorVaultCount > 0 ? successfulVaults / curatorVaultCount : 0.5;
|
|
57
|
+
// Extract curator professional signals
|
|
58
|
+
const curators = data.vault.curators || [];
|
|
59
|
+
const professionalSignals = {
|
|
60
|
+
hasWebsite: curators.some((c) => c.url && c.url.trim() !== ''),
|
|
61
|
+
hasDescription: curators.some((c) => c.aboutDescription && c.aboutDescription.trim() !== ''),
|
|
62
|
+
multipleCurators: curators.length > 1,
|
|
63
|
+
curatorCount: curators.length,
|
|
64
|
+
};
|
|
65
|
+
// Extract fee data
|
|
66
|
+
const managementFee = data.vault.state?.managementFee || 0;
|
|
67
|
+
const performanceFee = data.vault.state?.performanceFee || 0;
|
|
68
|
+
const pricePerShare = BigInt(data.vault.state?.pricePerShare || '0');
|
|
69
|
+
const highWaterMark = BigInt(data.vault.state?.highWaterMark || '0');
|
|
70
|
+
const performanceFeeActive = pricePerShare > highWaterMark;
|
|
71
|
+
// Extract liquidity data
|
|
72
|
+
const safeAssets = data.vault.state?.safeAssetBalanceUsd || 0;
|
|
73
|
+
const pendingRedemptions = data.vault.state?.pendingSettlement?.assetsUsd || 0;
|
|
74
|
+
// Extract APR data for consistency analysis
|
|
75
|
+
const aprData = {
|
|
76
|
+
weeklyApr: data.vault.state?.weeklyApr?.linearNetApr,
|
|
77
|
+
monthlyApr: data.vault.state?.monthlyApr?.linearNetApr,
|
|
78
|
+
yearlyApr: data.vault.state?.yearlyApr?.linearNetApr,
|
|
79
|
+
inceptionApr: data.vault.state?.inceptionApr?.linearNetApr,
|
|
80
|
+
};
|
|
81
|
+
// Extract yield composition data
|
|
82
|
+
const weeklyApr = data.vault.state?.weeklyApr;
|
|
83
|
+
const yieldComposition = weeklyApr
|
|
84
|
+
? {
|
|
85
|
+
totalApr: weeklyApr.linearNetApr || 0,
|
|
86
|
+
nativeYieldsApr: weeklyApr.nativeYields?.reduce((sum, ny) => sum + (ny.apr || 0), 0) || 0,
|
|
87
|
+
airdropsApr: weeklyApr.airdrops?.reduce((sum, ad) => sum + (ad.apr || 0), 0) || 0,
|
|
88
|
+
incentivesApr: weeklyApr.incentives?.reduce((sum, inc) => sum + (inc.apr || 0), 0) || 0,
|
|
89
|
+
}
|
|
90
|
+
: undefined;
|
|
91
|
+
// Extract settlement data
|
|
92
|
+
const averageSettlement = data.vault.averageSettlement || 0;
|
|
93
|
+
const pendingOperationsRatio = safeAssets > 0 ? pendingRedemptions / safeAssets : 0;
|
|
94
|
+
const settlementData = {
|
|
95
|
+
averageSettlementDays: averageSettlement,
|
|
96
|
+
pendingOperationsRatio,
|
|
97
|
+
};
|
|
98
|
+
// Extract integration complexity data
|
|
99
|
+
const integrationCount = data.vault.defiIntegrations?.length || 0;
|
|
100
|
+
// Extract capacity utilization data
|
|
101
|
+
const totalAssets = parseFloat(data.vault.state?.totalAssets || '0');
|
|
102
|
+
const maxCapacity = data.vault.maxCapacity ? parseFloat(data.vault.maxCapacity) : null;
|
|
103
|
+
const capacityData = {
|
|
104
|
+
totalAssets,
|
|
105
|
+
maxCapacity,
|
|
106
|
+
};
|
|
107
|
+
// Perform risk analysis using utility function
|
|
108
|
+
return analyzeRisk({
|
|
109
|
+
tvl: vaultTVL,
|
|
110
|
+
totalProtocolTVL,
|
|
111
|
+
priceHistory,
|
|
112
|
+
ageInDays,
|
|
113
|
+
curatorVaultCount,
|
|
114
|
+
curatorSuccessRate,
|
|
115
|
+
curatorProfessionalSignals: professionalSignals,
|
|
116
|
+
managementFee,
|
|
117
|
+
performanceFee,
|
|
118
|
+
performanceFeeActive,
|
|
119
|
+
safeAssets,
|
|
120
|
+
pendingRedemptions,
|
|
121
|
+
aprData,
|
|
122
|
+
yieldComposition,
|
|
123
|
+
settlementData,
|
|
124
|
+
integrationCount,
|
|
125
|
+
capacityData,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Calculate comparative risk context by benchmarking against all vaults
|
|
130
|
+
*
|
|
131
|
+
* @param vaultRisk - Risk score for the target vault
|
|
132
|
+
* @param allVaultsData - Data for all vaults on the chain
|
|
133
|
+
* @returns Comparative risk context with percentile rankings
|
|
134
|
+
*/
|
|
135
|
+
calculateComparativeContext(vaultRisk, allVaultsData) {
|
|
136
|
+
// Calculate risk scores for all vaults (simplified - using TVL as proxy)
|
|
137
|
+
// In production, this would calculate full risk scores, but that's expensive
|
|
138
|
+
// So we'll use a simplified approach based on TVL tiers as a proxy
|
|
139
|
+
const vaultRisks = allVaultsData.items
|
|
140
|
+
.map((v) => {
|
|
141
|
+
const tvl = v.state?.totalAssetsUsd || 0;
|
|
142
|
+
// Simplified risk estimation based on TVL (inverse relationship)
|
|
143
|
+
if (tvl >= 10_000_000)
|
|
144
|
+
return 0.15;
|
|
145
|
+
if (tvl >= 1_000_000)
|
|
146
|
+
return 0.25;
|
|
147
|
+
if (tvl >= 100_000)
|
|
148
|
+
return 0.45;
|
|
149
|
+
if (tvl >= 10_000)
|
|
150
|
+
return 0.65;
|
|
151
|
+
return 0.85;
|
|
152
|
+
})
|
|
153
|
+
.sort((a, b) => a - b); // Sort ascending (lower risk first)
|
|
154
|
+
if (vaultRisks.length === 0) {
|
|
155
|
+
return {
|
|
156
|
+
percentile: 50,
|
|
157
|
+
betterThanPercent: 50,
|
|
158
|
+
medianRisk: vaultRisk,
|
|
159
|
+
averageRisk: vaultRisk,
|
|
160
|
+
isOutlier: false,
|
|
161
|
+
riskRanking: 'No comparative data available',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Calculate percentile (what % of vaults have lower risk)
|
|
165
|
+
const lowerRiskCount = vaultRisks.filter((r) => r < vaultRisk).length;
|
|
166
|
+
const percentile = (lowerRiskCount / vaultRisks.length) * 100;
|
|
167
|
+
const betterThanPercent = 100 - percentile;
|
|
168
|
+
// Calculate median
|
|
169
|
+
const midIndex = Math.floor(vaultRisks.length / 2);
|
|
170
|
+
const medianRisk = vaultRisks.length % 2 === 0
|
|
171
|
+
? (vaultRisks[midIndex - 1] + vaultRisks[midIndex]) / 2
|
|
172
|
+
: vaultRisks[midIndex];
|
|
173
|
+
// Calculate average
|
|
174
|
+
const averageRisk = vaultRisks.reduce((sum, r) => sum + r, 0) / vaultRisks.length;
|
|
175
|
+
// Check if outlier (top/bottom 5%)
|
|
176
|
+
const isOutlier = percentile < 5 || percentile > 95;
|
|
177
|
+
// Generate ranking description
|
|
178
|
+
let riskRanking;
|
|
179
|
+
if (percentile >= 95) {
|
|
180
|
+
riskRanking = `Exceptionally safe - Top 5% lowest risk`;
|
|
181
|
+
}
|
|
182
|
+
else if (percentile >= 75) {
|
|
183
|
+
riskRanking = `Safer than ${Math.round(betterThanPercent)}% of vaults`;
|
|
184
|
+
}
|
|
185
|
+
else if (percentile >= 50) {
|
|
186
|
+
riskRanking = `Above average safety - Safer than ${Math.round(betterThanPercent)}% of vaults`;
|
|
187
|
+
}
|
|
188
|
+
else if (percentile >= 25) {
|
|
189
|
+
riskRanking = `Below average safety - Riskier than ${Math.round(percentile)}% of vaults`;
|
|
190
|
+
}
|
|
191
|
+
else if (percentile >= 5) {
|
|
192
|
+
riskRanking = `Riskier than ${Math.round(percentile)}% of vaults`;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
riskRanking = `High risk - Bottom 5% (riskier than ${Math.round(percentile)}% of vaults)`;
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
percentile,
|
|
199
|
+
betterThanPercent,
|
|
200
|
+
medianRisk,
|
|
201
|
+
averageRisk,
|
|
202
|
+
isOutlier,
|
|
203
|
+
riskRanking,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Perform complete risk analysis for a vault
|
|
208
|
+
*
|
|
209
|
+
* @param vaultAddress - Vault address to analyze
|
|
210
|
+
* @param chainId - Chain ID of the vault
|
|
211
|
+
* @param includeComparative - Whether to include comparative benchmarking
|
|
212
|
+
* @returns Risk score breakdown or null if vault not found
|
|
213
|
+
*/
|
|
214
|
+
async analyze(vaultAddress, chainId, includeComparative = true) {
|
|
215
|
+
// Fetch data
|
|
216
|
+
const data = await this.fetchRiskData(vaultAddress, chainId);
|
|
217
|
+
if (!data) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
// Calculate risk breakdown
|
|
221
|
+
const riskBreakdown = this.calculateRisk(data);
|
|
222
|
+
// Add comparative context if requested
|
|
223
|
+
if (includeComparative && data.allVaults.items.length > 0) {
|
|
224
|
+
const comparative = this.calculateComparativeContext(riskBreakdown.overallRisk, data.allVaults);
|
|
225
|
+
return {
|
|
226
|
+
...riskBreakdown,
|
|
227
|
+
comparative,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return riskBreakdown;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Format risk breakdown as markdown table
|
|
234
|
+
*/
|
|
235
|
+
formatRiskBreakdown(breakdown, responseFormat = 'summary') {
|
|
236
|
+
const scoreToEmoji = (score) => {
|
|
237
|
+
if (score < 0.3)
|
|
238
|
+
return '🟢';
|
|
239
|
+
if (score < 0.6)
|
|
240
|
+
return '🟡';
|
|
241
|
+
if (score < 0.8)
|
|
242
|
+
return '🟠';
|
|
243
|
+
return '🔴';
|
|
244
|
+
};
|
|
245
|
+
const scoreToPercentage = (score) => {
|
|
246
|
+
return `${(score * 100).toFixed(1)}%`;
|
|
247
|
+
};
|
|
248
|
+
const riskLevelToEmoji = (level) => {
|
|
249
|
+
switch (level) {
|
|
250
|
+
case 'Low':
|
|
251
|
+
return '🟢 Low';
|
|
252
|
+
case 'Medium':
|
|
253
|
+
return '🟡 Medium';
|
|
254
|
+
case 'High':
|
|
255
|
+
return '🟠 High';
|
|
256
|
+
case 'Critical':
|
|
257
|
+
return '🔴 Critical';
|
|
258
|
+
default:
|
|
259
|
+
return level;
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
// Score format: Just the overall risk score (~30 tokens)
|
|
263
|
+
if (responseFormat === 'score') {
|
|
264
|
+
return `# Risk Score: ${scoreToPercentage(breakdown.overallRisk)} | ${riskLevelToEmoji(breakdown.riskLevel)}`;
|
|
265
|
+
}
|
|
266
|
+
// Summary format: Risk score with key metrics (~200 tokens)
|
|
267
|
+
if (responseFormat === 'summary') {
|
|
268
|
+
// Identify top 3 risk factors
|
|
269
|
+
const riskFactors = [
|
|
270
|
+
{ name: 'APR Consistency', score: breakdown.aprConsistencyRisk },
|
|
271
|
+
{ name: 'Volatility', score: breakdown.volatilityRisk },
|
|
272
|
+
{ name: 'TVL', score: breakdown.tvlRisk },
|
|
273
|
+
{ name: 'Concentration', score: breakdown.concentrationRisk },
|
|
274
|
+
{ name: 'Yield Sustainability', score: breakdown.yieldSustainabilityRisk },
|
|
275
|
+
{ name: 'Age', score: breakdown.ageRisk },
|
|
276
|
+
{ name: 'Curator', score: breakdown.curatorRisk },
|
|
277
|
+
{ name: 'Fee', score: breakdown.feeRisk },
|
|
278
|
+
{ name: 'Liquidity', score: breakdown.liquidityRisk },
|
|
279
|
+
{ name: 'Settlement', score: breakdown.settlementRisk },
|
|
280
|
+
{ name: 'Integration Complexity', score: breakdown.integrationComplexityRisk },
|
|
281
|
+
{ name: 'Capacity Utilization', score: breakdown.capacityUtilizationRisk },
|
|
282
|
+
];
|
|
283
|
+
const topRisks = riskFactors.sort((a, b) => b.score - a.score).slice(0, 3);
|
|
284
|
+
let comparativeSection = '';
|
|
285
|
+
if (breakdown.comparative) {
|
|
286
|
+
const { percentile, riskRanking, isOutlier } = breakdown.comparative;
|
|
287
|
+
const outlierIndicator = isOutlier ? ' 🌟' : '';
|
|
288
|
+
comparativeSection = `
|
|
289
|
+
### 📊 Comparative Context${outlierIndicator}
|
|
290
|
+
|
|
291
|
+
**${riskRanking}** (Percentile: ${percentile.toFixed(1)}%)
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
294
|
+
return `
|
|
295
|
+
## Risk Analysis Dashboard
|
|
296
|
+
|
|
297
|
+
**Overall Risk**: ${scoreToPercentage(breakdown.overallRisk)} ${scoreToEmoji(breakdown.overallRisk)} | **Level**: ${riskLevelToEmoji(breakdown.riskLevel)}
|
|
298
|
+
${comparativeSection}
|
|
299
|
+
### 🎯 Top Risk Concerns
|
|
300
|
+
|
|
301
|
+
| Factor | Score | Status |
|
|
302
|
+
|--------|-------|--------|
|
|
303
|
+
| ${topRisks[0].name} | ${scoreToPercentage(topRisks[0].score)} | ${scoreToEmoji(topRisks[0].score)} |
|
|
304
|
+
| ${topRisks[1].name} | ${scoreToPercentage(topRisks[1].score)} | ${scoreToEmoji(topRisks[1].score)} |
|
|
305
|
+
| ${topRisks[2].name} | ${scoreToPercentage(topRisks[2].score)} | ${scoreToEmoji(topRisks[2].score)} |
|
|
306
|
+
|
|
307
|
+
### All Risk Factors
|
|
308
|
+
|
|
309
|
+
| Factor | Score | Status |
|
|
310
|
+
|--------|-------|--------|
|
|
311
|
+
| APR Consistency | ${scoreToPercentage(breakdown.aprConsistencyRisk)} | ${scoreToEmoji(breakdown.aprConsistencyRisk)} |
|
|
312
|
+
| Volatility | ${scoreToPercentage(breakdown.volatilityRisk)} | ${scoreToEmoji(breakdown.volatilityRisk)} |
|
|
313
|
+
| Yield Sustainability | ${scoreToPercentage(breakdown.yieldSustainabilityRisk)} | ${scoreToEmoji(breakdown.yieldSustainabilityRisk)} |
|
|
314
|
+
| TVL | ${scoreToPercentage(breakdown.tvlRisk)} | ${scoreToEmoji(breakdown.tvlRisk)} |
|
|
315
|
+
| Concentration | ${scoreToPercentage(breakdown.concentrationRisk)} | ${scoreToEmoji(breakdown.concentrationRisk)} |
|
|
316
|
+
| Liquidity | ${scoreToPercentage(breakdown.liquidityRisk)} | ${scoreToEmoji(breakdown.liquidityRisk)} |
|
|
317
|
+
| Settlement Time | ${scoreToPercentage(breakdown.settlementRisk)} | ${scoreToEmoji(breakdown.settlementRisk)} |
|
|
318
|
+
| Age | ${scoreToPercentage(breakdown.ageRisk)} | ${scoreToEmoji(breakdown.ageRisk)} |
|
|
319
|
+
| Curator | ${scoreToPercentage(breakdown.curatorRisk)} | ${scoreToEmoji(breakdown.curatorRisk)} |
|
|
320
|
+
| Fees | ${scoreToPercentage(breakdown.feeRisk)} | ${scoreToEmoji(breakdown.feeRisk)} |
|
|
321
|
+
| Integration Complexity | ${scoreToPercentage(breakdown.integrationComplexityRisk)} | ${scoreToEmoji(breakdown.integrationComplexityRisk)} |
|
|
322
|
+
| Capacity Utilization | ${scoreToPercentage(breakdown.capacityUtilizationRisk)} | ${scoreToEmoji(breakdown.capacityUtilizationRisk)} |
|
|
323
|
+
`;
|
|
324
|
+
}
|
|
325
|
+
// Detailed format: Full breakdown with explanations
|
|
326
|
+
let comparativeDetailedSection = '';
|
|
327
|
+
if (breakdown.comparative) {
|
|
328
|
+
const { percentile, betterThanPercent, medianRisk, averageRisk, riskRanking, isOutlier } = breakdown.comparative;
|
|
329
|
+
const outlierNote = isOutlier
|
|
330
|
+
? `
|
|
331
|
+
**Note**: This vault is a statistical outlier (top/bottom 5%)`
|
|
332
|
+
: '';
|
|
333
|
+
comparativeDetailedSection = `
|
|
334
|
+
## 📊 Comparative Risk Benchmarking
|
|
335
|
+
|
|
336
|
+
**Vault Position**: ${riskRanking}
|
|
337
|
+
|
|
338
|
+
| Metric | Value |
|
|
339
|
+
|--------|-------|
|
|
340
|
+
| **Percentile Rank** | ${percentile.toFixed(1)}% ${percentile >= 75 ? '🟢' : percentile >= 50 ? '🟡' : percentile >= 25 ? '🟠' : '🔴'} |
|
|
341
|
+
| **Better Than** | ${betterThanPercent.toFixed(1)}% of vaults |
|
|
342
|
+
| **Chain Median Risk** | ${scoreToPercentage(medianRisk)} |
|
|
343
|
+
| **Chain Average Risk** | ${scoreToPercentage(averageRisk)} |
|
|
344
|
+
| **This Vault Risk** | ${scoreToPercentage(breakdown.overallRisk)} |
|
|
345
|
+
${outlierNote}
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
`;
|
|
350
|
+
}
|
|
351
|
+
return `
|
|
352
|
+
${comparativeDetailedSection}## Risk Analysis Breakdown
|
|
353
|
+
|
|
354
|
+
### Performance & Returns Risk
|
|
355
|
+
| Risk Factor | Score | Level |
|
|
356
|
+
|-------------|-------|-------|
|
|
357
|
+
| **APR Consistency** | ${scoreToPercentage(breakdown.aprConsistencyRisk)} | ${scoreToEmoji(breakdown.aprConsistencyRisk)} |
|
|
358
|
+
| **Volatility** | ${scoreToPercentage(breakdown.volatilityRisk)} | ${scoreToEmoji(breakdown.volatilityRisk)} |
|
|
359
|
+
| **Yield Sustainability** | ${scoreToPercentage(breakdown.yieldSustainabilityRisk)} | ${scoreToEmoji(breakdown.yieldSustainabilityRisk)} |
|
|
360
|
+
|
|
361
|
+
### Market & Liquidity Risk
|
|
362
|
+
| Risk Factor | Score | Level |
|
|
363
|
+
|-------------|-------|-------|
|
|
364
|
+
| **TVL** | ${scoreToPercentage(breakdown.tvlRisk)} | ${scoreToEmoji(breakdown.tvlRisk)} |
|
|
365
|
+
| **Concentration** | ${scoreToPercentage(breakdown.concentrationRisk)} | ${scoreToEmoji(breakdown.concentrationRisk)} |
|
|
366
|
+
| **Liquidity** | ${scoreToPercentage(breakdown.liquidityRisk)} | ${scoreToEmoji(breakdown.liquidityRisk)} |
|
|
367
|
+
|
|
368
|
+
### Operational Risk
|
|
369
|
+
| Risk Factor | Score | Level |
|
|
370
|
+
|-------------|-------|-------|
|
|
371
|
+
| **Settlement Time** | ${scoreToPercentage(breakdown.settlementRisk)} | ${scoreToEmoji(breakdown.settlementRisk)} |
|
|
372
|
+
| **Integration Complexity** | ${scoreToPercentage(breakdown.integrationComplexityRisk)} | ${scoreToEmoji(breakdown.integrationComplexityRisk)} |
|
|
373
|
+
| **Capacity Utilization** | ${scoreToPercentage(breakdown.capacityUtilizationRisk)} | ${scoreToEmoji(breakdown.capacityUtilizationRisk)} |
|
|
374
|
+
|
|
375
|
+
### Qualitative Risk
|
|
376
|
+
| Risk Factor | Score | Level |
|
|
377
|
+
|-------------|-------|-------|
|
|
378
|
+
| **Age** | ${scoreToPercentage(breakdown.ageRisk)} | ${scoreToEmoji(breakdown.ageRisk)} |
|
|
379
|
+
| **Curator** | ${scoreToPercentage(breakdown.curatorRisk)} | ${scoreToEmoji(breakdown.curatorRisk)} |
|
|
380
|
+
| **Fees** | ${scoreToPercentage(breakdown.feeRisk)} | ${scoreToEmoji(breakdown.feeRisk)} |
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Overall Risk Assessment
|
|
385
|
+
|
|
386
|
+
**Risk Score**: ${scoreToPercentage(breakdown.overallRisk)}
|
|
387
|
+
**Risk Level**: ${riskLevelToEmoji(breakdown.riskLevel)}
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
### Risk Factor Explanations
|
|
392
|
+
|
|
393
|
+
#### Performance & Returns
|
|
394
|
+
**APR Consistency**: Measures return stability across time periods. High variation indicates unreliable strategy performance.
|
|
395
|
+
|
|
396
|
+
**Volatility**: Price stability over time. Based on standard deviation of daily returns. High volatility increases uncertainty.
|
|
397
|
+
|
|
398
|
+
**Yield Sustainability**: Composition of APR sources. Native yields are sustainable; temporary airdrops/incentives are not.
|
|
399
|
+
|
|
400
|
+
#### Market & Liquidity
|
|
401
|
+
**TVL**: Measures liquidity risk based on total value locked. Higher TVL indicates more market validation and liquidity.
|
|
402
|
+
|
|
403
|
+
**Concentration**: Vault's share of total protocol TVL. High concentration means protocol-wide risk if vault fails.
|
|
404
|
+
|
|
405
|
+
**Liquidity**: Ability to meet redemption requests. Based on safe asset coverage of pending redemptions.
|
|
406
|
+
|
|
407
|
+
#### Operational
|
|
408
|
+
**Settlement Time**: Average time to process redemptions plus pending operations burden. Longer delays increase exit risk.
|
|
409
|
+
|
|
410
|
+
**Integration Complexity**: Number of DeFi protocol integrations. More integrations = larger attack surface and failure cascades.
|
|
411
|
+
|
|
412
|
+
**Capacity Utilization**: Deposit headroom vs max capacity. Near-capacity vaults may reject deposits; under-utilized signals low demand.
|
|
413
|
+
|
|
414
|
+
#### Qualitative
|
|
415
|
+
**Age**: Vault maturity and battle-testing. Newer vaults lack operational track record and stress-test history.
|
|
416
|
+
|
|
417
|
+
**Curator**: Curator reputation based on experience (vault count), track record, and professional presence.
|
|
418
|
+
|
|
419
|
+
**Fees**: Impact of management and performance fees on returns. Higher fees reduce net investor returns.
|
|
420
|
+
`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=risk.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.service.js","sourceRoot":"","sources":["../../../src/services/analytics/risk.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Service Class
|
|
3
|
+
*
|
|
4
|
+
* Provides common functionality for all domain services.
|
|
5
|
+
* Services encapsulate business logic and interact with the container.
|
|
6
|
+
*/
|
|
7
|
+
import { ServiceContainer } from '../core/container.js';
|
|
8
|
+
import { CacheService } from '../core/cache-adapter.js';
|
|
9
|
+
import { GraphQLClient } from 'graphql-request';
|
|
10
|
+
import { Config } from '../config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Base service interface
|
|
13
|
+
*/
|
|
14
|
+
export interface Service {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly container: ServiceContainer;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Abstract base service class
|
|
20
|
+
* All domain services should extend this class
|
|
21
|
+
*/
|
|
22
|
+
export declare abstract class BaseService implements Service {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly container: ServiceContainer;
|
|
25
|
+
constructor(name: string, container: ServiceContainer);
|
|
26
|
+
/**
|
|
27
|
+
* Access cache service
|
|
28
|
+
*/
|
|
29
|
+
protected get cache(): CacheService;
|
|
30
|
+
/**
|
|
31
|
+
* Access GraphQL client
|
|
32
|
+
*/
|
|
33
|
+
protected get client(): GraphQLClient;
|
|
34
|
+
/**
|
|
35
|
+
* Access configuration
|
|
36
|
+
*/
|
|
37
|
+
protected get config(): Config;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=base.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.service.d.ts","sourceRoot":"","sources":["../../src/services/base.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED;;;GAGG;AACH,8BAAsB,WAAY,YAAW,OAAO;aAEhC,IAAI,EAAE,MAAM;aACZ,SAAS,EAAE,gBAAgB;gBAD3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,gBAAgB;IAG7C;;OAEG;IACH,SAAS,KAAK,KAAK,IAAI,YAAY,CAElC;IAED;;OAEG;IACH,SAAS,KAAK,MAAM,IAAI,aAAa,CAEpC;IAED;;OAEG;IACH,SAAS,KAAK,MAAM,IAAI,MAAM,CAE7B;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Service Class
|
|
3
|
+
*
|
|
4
|
+
* Provides common functionality for all domain services.
|
|
5
|
+
* Services encapsulate business logic and interact with the container.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base service class
|
|
9
|
+
* All domain services should extend this class
|
|
10
|
+
*/
|
|
11
|
+
export class BaseService {
|
|
12
|
+
name;
|
|
13
|
+
container;
|
|
14
|
+
constructor(name, container) {
|
|
15
|
+
this.name = name;
|
|
16
|
+
this.container = container;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Access cache service
|
|
20
|
+
*/
|
|
21
|
+
get cache() {
|
|
22
|
+
return this.container.cache;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Access GraphQL client
|
|
26
|
+
*/
|
|
27
|
+
get client() {
|
|
28
|
+
return this.container.graphqlClient;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Access configuration
|
|
32
|
+
*/
|
|
33
|
+
get config() {
|
|
34
|
+
return this.container.config;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=base.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../src/services/base.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;;GAGG;AACH,MAAM,OAAgB,WAAW;IAEb;IACA;IAFlB,YACkB,IAAY,EACZ,SAA2B;QAD3B,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAAkB;IAC1C,CAAC;IAEJ;;OAEG;IACH,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for all domain services.
|
|
5
|
+
* Services are organized by domain and use dependency injection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Service collection interface
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Create all services with dependency injection
|
|
12
|
+
*
|
|
13
|
+
* Factory function that instantiates all domain services with the provided container.
|
|
14
|
+
* Services are organized by domain for clarity.
|
|
15
|
+
*
|
|
16
|
+
* @param container - Service container with dependencies
|
|
17
|
+
* @returns Complete service collection
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const container = createContainer(graphqlClient, cache, config);
|
|
22
|
+
* const services = createServices(container);
|
|
23
|
+
*
|
|
24
|
+
* // Use services
|
|
25
|
+
* const riskAnalysis = services.analytics.risk.analyze(vault, globalTVL);
|
|
26
|
+
* const simulation = services.vault.simulation.simulate(vault, newAssets);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export { BaseService } from './base.service.js';
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH;;GAEG;AA0BH;;;;;;;;;;;;;;;;;;GAkBG;AAiCH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for all domain services.
|
|
5
|
+
* Services are organized by domain and use dependency injection.
|
|
6
|
+
*/
|
|
7
|
+
// NOTE: Service wrappers temporarily commented out
|
|
8
|
+
// These will be completed during the tool integration phase when we refactor tools
|
|
9
|
+
// to use the DI container pattern. The service layer infrastructure (BaseService,
|
|
10
|
+
// ServiceContainer) is ready, but individual service implementations need to match
|
|
11
|
+
// actual utility function signatures.
|
|
12
|
+
// import { ServiceContainer } from '../core/container.js';
|
|
13
|
+
// Vault services
|
|
14
|
+
// import { SimulationService } from './vault/simulation.service.js';
|
|
15
|
+
// import { APRService } from './vault/apr.service.js';
|
|
16
|
+
// Analytics services
|
|
17
|
+
// import { RiskService } from './analytics/risk.service.js';
|
|
18
|
+
// import { PredictionService } from './analytics/prediction.service.js';
|
|
19
|
+
// import { ComparisonService } from './analytics/comparison.service.js';
|
|
20
|
+
// Portfolio services
|
|
21
|
+
// import { OptimizationService } from './portfolio/optimization.service.js';
|
|
22
|
+
// Export services
|
|
23
|
+
// import { CSVService } from './export/csv.service.js';
|
|
24
|
+
/**
|
|
25
|
+
* Service collection interface
|
|
26
|
+
*/
|
|
27
|
+
// export interface Services {
|
|
28
|
+
// // Vault domain
|
|
29
|
+
// vault: {
|
|
30
|
+
// simulation: SimulationService;
|
|
31
|
+
// apr: APRService;
|
|
32
|
+
// };
|
|
33
|
+
//
|
|
34
|
+
// // Analytics domain
|
|
35
|
+
// analytics: {
|
|
36
|
+
// risk: RiskService;
|
|
37
|
+
// prediction: PredictionService;
|
|
38
|
+
// comparison: ComparisonService;
|
|
39
|
+
// };
|
|
40
|
+
//
|
|
41
|
+
// // Portfolio domain
|
|
42
|
+
// portfolio: {
|
|
43
|
+
// optimization: OptimizationService;
|
|
44
|
+
// };
|
|
45
|
+
//
|
|
46
|
+
// // Export domain
|
|
47
|
+
// export: {
|
|
48
|
+
// csv: CSVService;
|
|
49
|
+
// };
|
|
50
|
+
// }
|
|
51
|
+
/**
|
|
52
|
+
* Create all services with dependency injection
|
|
53
|
+
*
|
|
54
|
+
* Factory function that instantiates all domain services with the provided container.
|
|
55
|
+
* Services are organized by domain for clarity.
|
|
56
|
+
*
|
|
57
|
+
* @param container - Service container with dependencies
|
|
58
|
+
* @returns Complete service collection
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const container = createContainer(graphqlClient, cache, config);
|
|
63
|
+
* const services = createServices(container);
|
|
64
|
+
*
|
|
65
|
+
* // Use services
|
|
66
|
+
* const riskAnalysis = services.analytics.risk.analyze(vault, globalTVL);
|
|
67
|
+
* const simulation = services.vault.simulation.simulate(vault, newAssets);
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
// export function createServices(container: ServiceContainer): Services {
|
|
71
|
+
// return {
|
|
72
|
+
// vault: {
|
|
73
|
+
// simulation: new SimulationService(container),
|
|
74
|
+
// apr: new APRService(container),
|
|
75
|
+
// },
|
|
76
|
+
// analytics: {
|
|
77
|
+
// risk: new RiskService(container),
|
|
78
|
+
// prediction: new PredictionService(container),
|
|
79
|
+
// comparison: new ComparisonService(container),
|
|
80
|
+
// },
|
|
81
|
+
// portfolio: {
|
|
82
|
+
// optimization: new OptimizationService(container),
|
|
83
|
+
// },
|
|
84
|
+
// export: {
|
|
85
|
+
// csv: new CSVService(container),
|
|
86
|
+
// },
|
|
87
|
+
// };
|
|
88
|
+
// }
|
|
89
|
+
// Re-export service classes for direct instantiation
|
|
90
|
+
// export {
|
|
91
|
+
// SimulationService,
|
|
92
|
+
// APRService,
|
|
93
|
+
// RiskService,
|
|
94
|
+
// PredictionService,
|
|
95
|
+
// ComparisonService,
|
|
96
|
+
// OptimizationService,
|
|
97
|
+
// CSVService,
|
|
98
|
+
// };
|
|
99
|
+
// Re-export base service
|
|
100
|
+
export { BaseService } from './base.service.js';
|
|
101
|
+
//# sourceMappingURL=index.js.map
|