@lagoon-protocol/lagoon-mcp 0.2.15 → 0.2.17
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/dist/graphql/fragments/composition.fragment.d.ts +84 -0
- package/dist/graphql/fragments/composition.fragment.d.ts.map +1 -1
- package/dist/graphql/fragments/composition.fragment.js.map +1 -1
- package/dist/graphql/fragments/index.d.ts +1 -1
- package/dist/graphql/fragments/index.d.ts.map +1 -1
- package/dist/graphql/fragments/index.js +1 -1
- package/dist/graphql/fragments/index.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/services/analytics/risk.service.d.ts +3 -3
- package/dist/services/analytics/risk.service.d.ts.map +1 -1
- package/dist/services/analytics/risk.service.js +40 -20
- package/dist/services/analytics/risk.service.js.map +1 -1
- package/dist/tools/compare-vaults.d.ts.map +1 -1
- package/dist/tools/compare-vaults.js +48 -23
- package/dist/tools/compare-vaults.js.map +1 -1
- package/dist/tools/registry.js +7 -7
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/user-portfolio.d.ts +1 -0
- package/dist/tools/user-portfolio.d.ts.map +1 -1
- package/dist/tools/user-portfolio.js +62 -47
- package/dist/tools/user-portfolio.js.map +1 -1
- package/dist/tools/vault-composition.d.ts +8 -7
- package/dist/tools/vault-composition.d.ts.map +1 -1
- package/dist/tools/vault-composition.js +87 -43
- package/dist/tools/vault-composition.js.map +1 -1
- package/dist/utils/risk-scoring.d.ts.map +1 -1
- package/dist/utils/risk-scoring.js +10 -6
- package/dist/utils/risk-scoring.js.map +1 -1
- package/dist/utils/validators.d.ts +3 -3
- package/dist/utils/validators.js +2 -2
- package/dist/utils/validators.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* - Multi-chain portfolio analysis
|
|
9
9
|
* - User position tracking across all supported chains
|
|
10
10
|
* - Portfolio value aggregation
|
|
11
|
+
* - Protocol diversification analysis across vaults
|
|
11
12
|
* - Performance: ~500-1000 tokens per user (depending on position count)
|
|
12
13
|
*
|
|
13
14
|
* Cache strategy:
|
|
@@ -23,55 +24,56 @@ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
|
|
|
23
24
|
import { CacheTag } from '../core/cache-invalidation.js';
|
|
24
25
|
import { cacheKeys, cacheTTL, generateCacheKey } from '../cache/index.js';
|
|
25
26
|
/**
|
|
26
|
-
* Transform raw composition data to processed
|
|
27
|
+
* Transform raw composition data to processed protocol summaries
|
|
28
|
+
* Uses assetByProtocols field for protocol-level breakdown
|
|
27
29
|
*/
|
|
28
|
-
function
|
|
29
|
-
if (!raw || Object.keys(raw).length === 0) {
|
|
30
|
+
function transformRawCompositionToProtocols(raw) {
|
|
31
|
+
if (!raw || !raw.assetByProtocols || Object.keys(raw.assetByProtocols).length === 0) {
|
|
30
32
|
return [];
|
|
31
33
|
}
|
|
32
|
-
// Filter and transform to
|
|
33
|
-
const
|
|
34
|
-
.filter(([,
|
|
35
|
-
const value = parseFloat(
|
|
34
|
+
// Filter and transform to protocol summaries
|
|
35
|
+
const protocols = Object.entries(raw.assetByProtocols)
|
|
36
|
+
.filter(([, protocol]) => {
|
|
37
|
+
const value = parseFloat(protocol.value);
|
|
36
38
|
return !isNaN(value) && value > 0;
|
|
37
39
|
})
|
|
38
|
-
.map(([key,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
valueUsd: parseFloat(chain.value),
|
|
40
|
+
.map(([key, protocol]) => ({
|
|
41
|
+
protocolKey: key,
|
|
42
|
+
protocolName: protocol.name,
|
|
43
|
+
valueUsd: parseFloat(protocol.value),
|
|
43
44
|
percentage: 0, // Calculate after total
|
|
44
45
|
}));
|
|
45
46
|
// Calculate percentages
|
|
46
|
-
const totalValue =
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const totalValue = protocols.reduce((sum, p) => sum + p.valueUsd, 0);
|
|
48
|
+
protocols.forEach((p) => {
|
|
49
|
+
p.percentage = totalValue > 0 ? (p.valueUsd / totalValue) * 100 : 0;
|
|
49
50
|
});
|
|
50
51
|
// Sort by value descending
|
|
51
|
-
|
|
52
|
-
return
|
|
52
|
+
protocols.sort((a, b) => b.valueUsd - a.valueUsd);
|
|
53
|
+
return protocols;
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
56
|
* Aggregate composition data across all portfolio positions
|
|
56
57
|
*
|
|
57
|
-
* Calculates portfolio-wide
|
|
58
|
+
* Calculates portfolio-wide protocol exposure weighted by position size,
|
|
58
59
|
* portfolio-level HHI, and detects accidental concentration across vaults.
|
|
59
60
|
*
|
|
60
|
-
*
|
|
61
|
+
* Uses assetByProtocols from Octav API for protocol-based diversification analysis.
|
|
62
|
+
* "wallet" protocol (idle assets) is excluded from HHI but tracked as idleAssetsPercent.
|
|
61
63
|
*
|
|
62
64
|
* @param vaultCompositions - Array of vault compositions with position values
|
|
63
65
|
* @param totalPortfolioValue - Total portfolio value in USD
|
|
64
66
|
* @returns Portfolio composition summary with diversification metrics
|
|
65
67
|
*/
|
|
66
68
|
function aggregatePortfolioComposition(vaultCompositions, totalPortfolioValue) {
|
|
67
|
-
// Track
|
|
68
|
-
const
|
|
69
|
+
// Track protocol exposure across all vaults
|
|
70
|
+
const protocolExposureMap = new Map();
|
|
69
71
|
// Aggregate weighted exposure from each vault
|
|
70
72
|
for (const entry of vaultCompositions) {
|
|
71
|
-
for (const
|
|
72
|
-
// Weight the
|
|
73
|
-
const weightedExposure = (
|
|
74
|
-
const existing =
|
|
73
|
+
for (const protocol of entry.protocols) {
|
|
74
|
+
// Weight the protocol exposure by position size
|
|
75
|
+
const weightedExposure = (protocol.percentage / 100) * entry.positionValueUsd;
|
|
76
|
+
const existing = protocolExposureMap.get(protocol.protocolKey);
|
|
75
77
|
if (existing) {
|
|
76
78
|
existing.valueUsd += weightedExposure;
|
|
77
79
|
if (!existing.vaultAddresses.includes(entry.vaultAddress)) {
|
|
@@ -79,9 +81,8 @@ function aggregatePortfolioComposition(vaultCompositions, totalPortfolioValue) {
|
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
else {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
chainId: chain.chainId,
|
|
84
|
+
protocolExposureMap.set(protocol.protocolKey, {
|
|
85
|
+
protocolName: protocol.protocolName,
|
|
85
86
|
valueUsd: weightedExposure,
|
|
86
87
|
vaultAddresses: [entry.vaultAddress],
|
|
87
88
|
});
|
|
@@ -89,28 +90,41 @@ function aggregatePortfolioComposition(vaultCompositions, totalPortfolioValue) {
|
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
// Convert to array and calculate repartition percentages
|
|
92
|
-
const
|
|
93
|
-
.map(([
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
chainId: data.chainId,
|
|
93
|
+
const allExposures = Array.from(protocolExposureMap.entries())
|
|
94
|
+
.map(([protocolKey, data]) => ({
|
|
95
|
+
protocolKey,
|
|
96
|
+
protocolName: data.protocolName,
|
|
97
97
|
valueUsd: data.valueUsd,
|
|
98
98
|
repartition: totalPortfolioValue > 0 ? (data.valueUsd / totalPortfolioValue) * 100 : 0,
|
|
99
99
|
vaultCount: data.vaultAddresses.length,
|
|
100
100
|
}))
|
|
101
101
|
.sort((a, b) => b.repartition - a.repartition);
|
|
102
|
-
//
|
|
103
|
-
const
|
|
102
|
+
// Separate wallet (idle assets) from DeFi protocols for HHI calculation
|
|
103
|
+
const walletExposure = allExposures.find((e) => e.protocolKey === 'wallet');
|
|
104
|
+
const defiExposures = allExposures.filter((e) => e.protocolKey !== 'wallet');
|
|
105
|
+
// Recalculate percentages for DeFi-only (for HHI)
|
|
106
|
+
const defiTotalValue = defiExposures.reduce((sum, e) => sum + e.valueUsd, 0);
|
|
107
|
+
const defiExposuresForHHI = defiExposures.map((e) => ({
|
|
108
|
+
...e,
|
|
109
|
+
repartition: defiTotalValue > 0 ? (e.valueUsd / defiTotalValue) * 100 : 0,
|
|
110
|
+
}));
|
|
111
|
+
// Calculate portfolio-level HHI (excluding wallet)
|
|
112
|
+
const portfolioHHI = defiExposuresForHHI.reduce((sum, e) => sum + Math.pow(e.repartition / 100, 2), 0);
|
|
104
113
|
// Determine diversification level
|
|
105
114
|
const diversificationLevel = portfolioHHI < 0.15 ? 'High' : portfolioHHI < 0.25 ? 'Medium' : 'Low';
|
|
106
|
-
//
|
|
115
|
+
// Calculate idle assets percentage
|
|
116
|
+
const idleAssetsPercent = walletExposure?.repartition || 0;
|
|
117
|
+
// Detect accidental concentration (same protocol in 3+ vaults with >20% total exposure)
|
|
107
118
|
const accidentalConcentration = [];
|
|
108
|
-
for (const [
|
|
119
|
+
for (const [protocolKey, data] of protocolExposureMap.entries()) {
|
|
120
|
+
// Skip wallet for concentration warnings
|
|
121
|
+
if (protocolKey === 'wallet')
|
|
122
|
+
continue;
|
|
109
123
|
const totalExposure = totalPortfolioValue > 0 ? (data.valueUsd / totalPortfolioValue) * 100 : 0;
|
|
110
124
|
if (data.vaultAddresses.length >= 3 && totalExposure >= 20) {
|
|
111
125
|
accidentalConcentration.push({
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
protocolKey,
|
|
127
|
+
protocolName: data.protocolName,
|
|
114
128
|
vaultCount: data.vaultAddresses.length,
|
|
115
129
|
totalExposure,
|
|
116
130
|
vaultAddresses: data.vaultAddresses,
|
|
@@ -118,11 +132,12 @@ function aggregatePortfolioComposition(vaultCompositions, totalPortfolioValue) {
|
|
|
118
132
|
}
|
|
119
133
|
}
|
|
120
134
|
return {
|
|
121
|
-
|
|
122
|
-
portfolioHHI,
|
|
135
|
+
protocolExposure: allExposures.slice(0, 10), // Top 10 protocols (including wallet for transparency)
|
|
136
|
+
portfolioHHI: parseFloat(portfolioHHI.toFixed(4)),
|
|
123
137
|
diversificationLevel,
|
|
124
|
-
|
|
125
|
-
|
|
138
|
+
topProtocol: defiExposures[0]?.protocolName || null, // Top DeFi protocol (not wallet)
|
|
139
|
+
topProtocolPercent: defiExposures[0]?.repartition || null,
|
|
140
|
+
idleAssetsPercent: parseFloat(idleAssetsPercent.toFixed(2)),
|
|
126
141
|
accidentalConcentration,
|
|
127
142
|
};
|
|
128
143
|
}
|
|
@@ -240,16 +255,16 @@ export function createExecuteGetUserPortfolio(container) {
|
|
|
240
255
|
});
|
|
241
256
|
// Fetch composition data for each vault in parallel
|
|
242
257
|
// This enables portfolio-wide diversification analysis
|
|
243
|
-
// Note: Backend API
|
|
258
|
+
// Note: Backend API returns full response with assetByProtocols
|
|
244
259
|
const compositionPromises = positions.map(async (position) => {
|
|
245
260
|
try {
|
|
246
261
|
const compResponse = await container.graphqlClient.request(SINGLE_VAULT_COMPOSITION_QUERY, { walletAddress: position.vaultAddress });
|
|
247
|
-
const
|
|
248
|
-
if (
|
|
262
|
+
const protocols = transformRawCompositionToProtocols(compResponse.vaultComposition);
|
|
263
|
+
if (protocols.length > 0) {
|
|
249
264
|
return {
|
|
250
265
|
vaultAddress: position.vaultAddress,
|
|
251
266
|
positionValueUsd: parseFloat(position.sharesUsd || '0'),
|
|
252
|
-
|
|
267
|
+
protocols,
|
|
253
268
|
};
|
|
254
269
|
}
|
|
255
270
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-portfolio.js","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"user-portfolio.js","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* get_vault_composition Tool
|
|
3
3
|
*
|
|
4
|
-
* Fetch vault
|
|
4
|
+
* Fetch vault protocol composition data from Octav API with diversification analysis.
|
|
5
5
|
* Data is sourced from the backend's vaultComposition endpoint which aggregates
|
|
6
|
-
* positions across
|
|
6
|
+
* positions across DeFi protocols (Spark, Morpho, Yield Basis, etc.).
|
|
7
7
|
*
|
|
8
8
|
* Use cases:
|
|
9
|
-
* - Understanding vault
|
|
9
|
+
* - Understanding vault DeFi protocol exposure
|
|
10
10
|
* - Analyzing diversification levels via HHI score
|
|
11
|
-
* - Identifying concentration risks across
|
|
11
|
+
* - Identifying concentration risks across protocols
|
|
12
|
+
* - Tracking idle assets (wallet protocol)
|
|
12
13
|
* - Portfolio composition visualization
|
|
13
14
|
*
|
|
14
15
|
* Response formats (for token optimization):
|
|
15
|
-
* - summary: Totals + top
|
|
16
|
-
* -
|
|
17
|
-
* - full: All
|
|
16
|
+
* - summary: Totals + top protocols + analysis (~100 tokens)
|
|
17
|
+
* - protocols: Non-zero protocols only + analysis (~200-500 tokens)
|
|
18
|
+
* - full: All protocol data including raw response (~1000+ tokens)
|
|
18
19
|
*
|
|
19
20
|
* Cache strategy:
|
|
20
21
|
* - 15-minute TTL aligned with vault data freshness
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-composition.d.ts","sourceRoot":"","sources":["../../src/tools/vault-composition.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vault-composition.d.ts","sourceRoot":"","sources":["../../src/tools/vault-composition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAQlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiSxD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,cAAc,CAAC,CAgE9D"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* get_vault_composition Tool
|
|
3
3
|
*
|
|
4
|
-
* Fetch vault
|
|
4
|
+
* Fetch vault protocol composition data from Octav API with diversification analysis.
|
|
5
5
|
* Data is sourced from the backend's vaultComposition endpoint which aggregates
|
|
6
|
-
* positions across
|
|
6
|
+
* positions across DeFi protocols (Spark, Morpho, Yield Basis, etc.).
|
|
7
7
|
*
|
|
8
8
|
* Use cases:
|
|
9
|
-
* - Understanding vault
|
|
9
|
+
* - Understanding vault DeFi protocol exposure
|
|
10
10
|
* - Analyzing diversification levels via HHI score
|
|
11
|
-
* - Identifying concentration risks across
|
|
11
|
+
* - Identifying concentration risks across protocols
|
|
12
|
+
* - Tracking idle assets (wallet protocol)
|
|
12
13
|
* - Portfolio composition visualization
|
|
13
14
|
*
|
|
14
15
|
* Response formats (for token optimization):
|
|
15
|
-
* - summary: Totals + top
|
|
16
|
-
* -
|
|
17
|
-
* - full: All
|
|
16
|
+
* - summary: Totals + top protocols + analysis (~100 tokens)
|
|
17
|
+
* - protocols: Non-zero protocols only + analysis (~200-500 tokens)
|
|
18
|
+
* - full: All protocol data including raw response (~1000+ tokens)
|
|
18
19
|
*
|
|
19
20
|
* Cache strategy:
|
|
20
21
|
* - 15-minute TTL aligned with vault data freshness
|
|
@@ -36,14 +37,17 @@ import { createSuccessResponse } from '../utils/tool-response.js';
|
|
|
36
37
|
* - 0.15 - 0.25: Moderate concentration
|
|
37
38
|
* - > 0.25: High concentration
|
|
38
39
|
*
|
|
39
|
-
*
|
|
40
|
+
* Note: "wallet" protocol (idle assets) is EXCLUDED from HHI calculation
|
|
41
|
+
* as it represents undeployed capital, not DeFi protocol concentration.
|
|
42
|
+
*
|
|
43
|
+
* @param protocols - Array of protocol summaries with percentage values (excluding wallet)
|
|
40
44
|
* @returns HHI score between 0 and 1
|
|
41
45
|
*/
|
|
42
|
-
function calculateHHI(
|
|
43
|
-
if (
|
|
46
|
+
function calculateHHI(protocols) {
|
|
47
|
+
if (protocols.length === 0)
|
|
44
48
|
return 0;
|
|
45
49
|
// HHI = sum of squared market shares (percentage/100 to get decimal)
|
|
46
|
-
return
|
|
50
|
+
return protocols.reduce((sum, p) => sum + Math.pow(p.percentage / 100, 2), 0);
|
|
47
51
|
}
|
|
48
52
|
/**
|
|
49
53
|
* Get diversification level label based on HHI score
|
|
@@ -56,60 +60,99 @@ function getDiversificationLevel(hhi) {
|
|
|
56
60
|
return 'Low';
|
|
57
61
|
}
|
|
58
62
|
/**
|
|
59
|
-
*
|
|
63
|
+
* Extract position types from a protocol's chain data
|
|
60
64
|
*
|
|
61
|
-
* @param
|
|
65
|
+
* @param protocol - Protocol composition data
|
|
66
|
+
* @returns Array of unique position type names (e.g., ["LENDING", "YIELD"])
|
|
67
|
+
*/
|
|
68
|
+
function extractPositionTypes(protocol) {
|
|
69
|
+
const positionTypes = new Set();
|
|
70
|
+
for (const chainData of Object.values(protocol.chains)) {
|
|
71
|
+
if (chainData.protocolPositions) {
|
|
72
|
+
for (const positionKey of Object.keys(chainData.protocolPositions)) {
|
|
73
|
+
positionTypes.add(positionKey);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return Array.from(positionTypes);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Transform raw Octav API response into structured protocol composition data
|
|
81
|
+
*
|
|
82
|
+
* @param raw - Raw VaultCompositionFullResponse with assetByProtocols
|
|
62
83
|
* @param vaultAddress - Vault address for reference
|
|
63
|
-
* @returns Full composition data with analysis
|
|
84
|
+
* @returns Full composition data with protocol-based analysis
|
|
64
85
|
*/
|
|
65
86
|
function transformRawComposition(raw, vaultAddress) {
|
|
66
87
|
// Handle null/empty response
|
|
67
|
-
if (!raw || Object.keys(raw).length === 0) {
|
|
88
|
+
if (!raw || !raw.assetByProtocols || Object.keys(raw.assetByProtocols).length === 0) {
|
|
68
89
|
return {
|
|
69
90
|
vaultAddress,
|
|
70
|
-
|
|
71
|
-
chains:
|
|
91
|
+
networth: '0',
|
|
92
|
+
rawData: raw || { address: vaultAddress, networth: '0', assetByProtocols: {}, chains: {} },
|
|
93
|
+
protocols: [],
|
|
72
94
|
analysis: {
|
|
73
95
|
totalValueUsd: 0,
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
activeProtocolCount: 0,
|
|
97
|
+
topProtocol: null,
|
|
76
98
|
hhi: 0,
|
|
77
99
|
diversificationLevel: 'High',
|
|
100
|
+
idleAssetsPercent: 0,
|
|
78
101
|
},
|
|
79
102
|
};
|
|
80
103
|
}
|
|
81
|
-
// 1. Filter out
|
|
82
|
-
const
|
|
83
|
-
.filter(([,
|
|
84
|
-
const value = parseFloat(
|
|
104
|
+
// 1. Filter out protocols with value "0" or empty and transform to ProtocolSummary
|
|
105
|
+
const allProtocols = Object.entries(raw.assetByProtocols)
|
|
106
|
+
.filter(([, protocol]) => {
|
|
107
|
+
const value = parseFloat(protocol.value);
|
|
85
108
|
return !isNaN(value) && value > 0;
|
|
86
109
|
})
|
|
87
|
-
.map(([key,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
valueUsd: parseFloat(chain.value),
|
|
110
|
+
.map(([key, protocol]) => ({
|
|
111
|
+
protocolKey: key,
|
|
112
|
+
protocolName: protocol.name,
|
|
113
|
+
valueUsd: parseFloat(protocol.value),
|
|
92
114
|
percentage: 0, // Calculate after total
|
|
115
|
+
positionTypes: extractPositionTypes(protocol),
|
|
116
|
+
chainCount: Object.keys(protocol.chains).length,
|
|
93
117
|
}));
|
|
94
|
-
// 2. Calculate total
|
|
95
|
-
const totalValueUsd =
|
|
96
|
-
|
|
97
|
-
|
|
118
|
+
// 2. Calculate total value (including wallet)
|
|
119
|
+
const totalValueUsd = allProtocols.reduce((sum, p) => sum + p.valueUsd, 0);
|
|
120
|
+
// 3. Calculate percentages for all protocols
|
|
121
|
+
allProtocols.forEach((p) => {
|
|
122
|
+
p.percentage = totalValueUsd > 0 ? (p.valueUsd / totalValueUsd) * 100 : 0;
|
|
98
123
|
});
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
const
|
|
124
|
+
// 4. Sort by value descending
|
|
125
|
+
allProtocols.sort((a, b) => b.valueUsd - a.valueUsd);
|
|
126
|
+
// 5. Separate wallet (idle assets) from DeFi protocols for HHI calculation
|
|
127
|
+
const walletProtocol = allProtocols.find((p) => p.protocolKey === 'wallet');
|
|
128
|
+
const defiProtocols = allProtocols.filter((p) => p.protocolKey !== 'wallet');
|
|
129
|
+
// 6. Recalculate percentages for DeFi protocols only (for HHI)
|
|
130
|
+
const defiTotalValue = defiProtocols.reduce((sum, p) => sum + p.valueUsd, 0);
|
|
131
|
+
const defiProtocolsForHHI = defiProtocols.map((p) => ({
|
|
132
|
+
...p,
|
|
133
|
+
// Recalculate percentage based on DeFi-only total for HHI
|
|
134
|
+
percentage: defiTotalValue > 0 ? (p.valueUsd / defiTotalValue) * 100 : 0,
|
|
135
|
+
}));
|
|
136
|
+
// 7. Calculate HHI (excluding wallet)
|
|
137
|
+
const hhi = calculateHHI(defiProtocolsForHHI);
|
|
138
|
+
// 8. Calculate idle assets percentage
|
|
139
|
+
const idleAssetsPercent = walletProtocol
|
|
140
|
+
? totalValueUsd > 0
|
|
141
|
+
? (walletProtocol.valueUsd / totalValueUsd) * 100
|
|
142
|
+
: 0
|
|
143
|
+
: 0;
|
|
103
144
|
return {
|
|
104
145
|
vaultAddress,
|
|
146
|
+
networth: raw.networth || totalValueUsd.toFixed(2),
|
|
105
147
|
rawData: raw,
|
|
106
|
-
|
|
148
|
+
protocols: allProtocols, // Include all protocols (wallet included for transparency)
|
|
107
149
|
analysis: {
|
|
108
150
|
totalValueUsd: parseFloat(totalValueUsd.toFixed(2)),
|
|
109
|
-
|
|
110
|
-
|
|
151
|
+
activeProtocolCount: defiProtocols.length, // DeFi protocols only
|
|
152
|
+
topProtocol: defiProtocols[0] || null, // Top DeFi protocol (not wallet)
|
|
111
153
|
hhi: parseFloat(hhi.toFixed(4)),
|
|
112
154
|
diversificationLevel: getDiversificationLevel(hhi),
|
|
155
|
+
idleAssetsPercent: parseFloat(idleAssetsPercent.toFixed(2)),
|
|
113
156
|
},
|
|
114
157
|
};
|
|
115
158
|
}
|
|
@@ -126,20 +169,21 @@ function filterByFormat(data, format) {
|
|
|
126
169
|
return {
|
|
127
170
|
vaultAddress: data.vaultAddress,
|
|
128
171
|
analysis: data.analysis,
|
|
129
|
-
|
|
172
|
+
topProtocols: data.protocols.slice(0, 5), // Top 5 protocols for summary
|
|
130
173
|
};
|
|
131
|
-
case '
|
|
174
|
+
case 'protocols':
|
|
132
175
|
return {
|
|
133
176
|
vaultAddress: data.vaultAddress,
|
|
134
|
-
|
|
177
|
+
protocols: data.protocols, // Only non-zero protocols (already filtered)
|
|
135
178
|
analysis: data.analysis,
|
|
136
179
|
};
|
|
137
180
|
case 'full':
|
|
138
181
|
default:
|
|
139
182
|
return {
|
|
140
183
|
vaultAddress: data.vaultAddress,
|
|
184
|
+
networth: data.networth,
|
|
141
185
|
rawData: data.rawData,
|
|
142
|
-
|
|
186
|
+
protocols: data.protocols,
|
|
143
187
|
analysis: data.analysis,
|
|
144
188
|
};
|
|
145
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-composition.js","sourceRoot":"","sources":["../../src/tools/vault-composition.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vault-composition.js","sourceRoot":"","sources":["../../src/tools/vault-composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-scoring.d.ts","sourceRoot":"","sources":["../../src/utils/risk-scoring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB,EAAE,MAAM,CAAC;IAClC,uBAAuB,EAAE,MAAM,CAAC;IAChC,2BAA2B,EAAE,MAAM,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACnD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;CA+B3B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAgB7F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"risk-scoring.d.ts","sourceRoot":"","sources":["../../src/utils/risk-scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,14 +93,18 @@ export function calculateConcentrationRisk(vaultTVL, totalProtocolTVL) {
|
|
|
93
93
|
* @returns Risk score 0-1 (0 = lowest risk, 1 = highest risk)
|
|
94
94
|
*/
|
|
95
95
|
export function calculateVolatilityRisk(pricePoints) {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
// Filter out zero/invalid price points that would cause artificial volatility
|
|
97
|
+
const validPrices = pricePoints.filter((p) => p > 0 && isFinite(p));
|
|
98
|
+
if (validPrices.length < 2) {
|
|
99
|
+
return 0.5; // Medium risk if insufficient valid data
|
|
98
100
|
}
|
|
99
|
-
// Calculate
|
|
101
|
+
// Calculate returns between consecutive valid price points
|
|
100
102
|
const returns = [];
|
|
101
|
-
for (let i = 1; i <
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
for (let i = 1; i < validPrices.length; i++) {
|
|
104
|
+
const dailyReturn = (validPrices[i] - validPrices[i - 1]) / validPrices[i - 1];
|
|
105
|
+
// Skip extremely unrealistic returns (>100% in a single period indicates data issues)
|
|
106
|
+
// This filters out cases where price goes from X to 0 and back
|
|
107
|
+
if (Math.abs(dailyReturn) <= 1.0) {
|
|
104
108
|
returns.push(dailyReturn);
|
|
105
109
|
}
|
|
106
110
|
}
|