@lagoon-protocol/lagoon-mcp 0.2.14 → 0.2.16
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 +133 -16
- package/dist/graphql/fragments/composition.fragment.d.ts.map +1 -1
- package/dist/graphql/fragments/composition.fragment.js +7 -13
- 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 +4 -2
- package/dist/graphql/fragments/index.js.map +1 -1
- package/dist/graphql/queries/composition.queries.d.ts +17 -6
- package/dist/graphql/queries/composition.queries.d.ts.map +1 -1
- package/dist/graphql/queries/composition.queries.js +18 -11
- package/dist/graphql/queries/composition.queries.js.map +1 -1
- package/dist/graphql/queries/portfolio.queries.d.ts +10 -5
- package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -1
- package/dist/graphql/queries/portfolio.queries.js +12 -10
- package/dist/graphql/queries/portfolio.queries.js.map +1 -1
- package/dist/graphql/queries/risk.queries.d.ts +1 -1
- package/dist/graphql/queries/risk.queries.d.ts.map +1 -1
- package/dist/graphql/queries/risk.queries.js +4 -6
- package/dist/graphql/queries/risk.queries.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/services/analytics/risk.service.d.ts +3 -13
- package/dist/services/analytics/risk.service.d.ts.map +1 -1
- package/dist/services/analytics/risk.service.js +38 -8
- 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 +62 -15
- package/dist/tools/compare-vaults.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +10 -6
- 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 +71 -18
- package/dist/tools/user-portfolio.js.map +1 -1
- package/dist/tools/vault-composition.d.ts +12 -4
- package/dist/tools/vault-composition.d.ts.map +1 -1
- package/dist/tools/vault-composition.js +153 -49
- package/dist/tools/vault-composition.js.map +1 -1
- package/dist/utils/validators.d.ts +3 -0
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js +4 -0
- package/dist/utils/validators.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,135 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Composition Fragment
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Type definitions for vault composition data from Octav API.
|
|
5
|
+
* The backend returns a JSONObject with chains as keys containing composition data.
|
|
6
|
+
*
|
|
7
|
+
* Note: The vaultComposition endpoint returns JSONObject type, so no GraphQL fragment
|
|
8
|
+
* is needed. The response is a flat object keyed by chain name.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Chain composition data from Octav API
|
|
12
|
+
* Each chain entry contains aggregated position values and metadata
|
|
13
|
+
*/
|
|
14
|
+
export interface ChainComposition {
|
|
15
|
+
/** Display name of the chain (e.g., "Ethereum", "Arbitrum") */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Unique key for the chain (e.g., "ethereum", "arbitrum") */
|
|
18
|
+
key: string;
|
|
19
|
+
/** Chain ID as string (e.g., "1", "42161") */
|
|
20
|
+
chainId: string;
|
|
21
|
+
/** Total USD value of positions on this chain */
|
|
22
|
+
value: string;
|
|
23
|
+
/** Percentile ranking of this chain's value */
|
|
24
|
+
valuePercentile: string;
|
|
25
|
+
/** Total cost basis (may be "N/A") */
|
|
26
|
+
totalCostBasis: string;
|
|
27
|
+
/** Total closed PnL (may be "N/A") */
|
|
28
|
+
totalClosedPnl: string;
|
|
29
|
+
/** Total open PnL (may be "N/A") */
|
|
30
|
+
totalOpenPnl: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Raw vaultComposition response - JSONObject keyed by chain name
|
|
34
|
+
*
|
|
35
|
+
* Example:
|
|
36
|
+
* ```typescript
|
|
37
|
+
* {
|
|
38
|
+
* "ethereum": { name: "Ethereum", key: "ethereum", chainId: "1", value: "6224.80", ... },
|
|
39
|
+
* "arbitrum": { name: "Arbitrum", key: "arbitrum", chainId: "42161", value: "3.99", ... },
|
|
40
|
+
* "linea": { name: "Linea", key: "linea", chainId: "59144", value: "0", ... },
|
|
41
|
+
* // ... 60+ chains
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export type RawVaultComposition = Record<string, ChainComposition>;
|
|
46
|
+
/**
|
|
47
|
+
* Position category within a chain (e.g., LENDING, YIELD, DEPOSIT, SPOT)
|
|
6
48
|
*/
|
|
49
|
+
export interface ProtocolPositionCategory {
|
|
50
|
+
/** Category name (e.g., "Lending", "Yield", "Deposit", "Spot") */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Total USD value in this category */
|
|
53
|
+
totalValue: string;
|
|
54
|
+
}
|
|
7
55
|
/**
|
|
8
|
-
*
|
|
56
|
+
* Chain-level breakdown within a protocol
|
|
57
|
+
*/
|
|
58
|
+
export interface ProtocolChainData {
|
|
59
|
+
/** Chain display name (e.g., "Ethereum") */
|
|
60
|
+
name: string;
|
|
61
|
+
/** Chain key (e.g., "ethereum") */
|
|
62
|
+
key: string;
|
|
63
|
+
/** USD value on this chain */
|
|
64
|
+
value: string;
|
|
65
|
+
/** Total cost basis (may be "N/A") */
|
|
66
|
+
totalCostBasis: string;
|
|
67
|
+
/** Total closed PnL (may be "N/A") */
|
|
68
|
+
totalClosedPnl: string;
|
|
69
|
+
/** Total open PnL (may be "N/A") */
|
|
70
|
+
totalOpenPnl: string;
|
|
71
|
+
/** Position categories on this chain (keyed by category type) */
|
|
72
|
+
protocolPositions: Record<string, ProtocolPositionCategory>;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Protocol-level composition data from Octav API
|
|
76
|
+
* Represents a DeFi protocol like Spark, Morpho, Yield Basis, or "wallet" for idle assets
|
|
77
|
+
*
|
|
78
|
+
* Example protocols: spark, morphoblue, yieldbasis, lagoon, hyperliquid, wallet
|
|
79
|
+
*/
|
|
80
|
+
export interface ProtocolCompositionData {
|
|
81
|
+
/** Protocol display name (e.g., "Spark", "Morpho", "Yield Basis", "Wallet") */
|
|
82
|
+
name: string;
|
|
83
|
+
/** Protocol key/identifier (e.g., "spark", "morphoblue", "wallet") */
|
|
84
|
+
key: string;
|
|
85
|
+
/** Total USD value in this protocol */
|
|
86
|
+
value: string;
|
|
87
|
+
/** Total cost basis (may be "N/A") */
|
|
88
|
+
totalCostBasis: string;
|
|
89
|
+
/** Total closed PnL (may be "N/A") */
|
|
90
|
+
totalClosedPnl: string;
|
|
91
|
+
/** Total open PnL (may be "N/A") */
|
|
92
|
+
totalOpenPnl: string;
|
|
93
|
+
/** Chain-level breakdown within this protocol */
|
|
94
|
+
chains: Record<string, ProtocolChainData>;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Full vaultComposition response structure from Octav API
|
|
98
|
+
*
|
|
99
|
+
* Contains two main sections:
|
|
100
|
+
* - assetByProtocols: Protocol-level breakdown (preferred for analysis)
|
|
101
|
+
* - chains: Chain-level summary (legacy, kept for backward compatibility)
|
|
102
|
+
*
|
|
103
|
+
* Example:
|
|
104
|
+
* ```typescript
|
|
105
|
+
* {
|
|
106
|
+
* address: "0x...",
|
|
107
|
+
* networth: "4970636.89",
|
|
108
|
+
* assetByProtocols: {
|
|
109
|
+
* "spark": { name: "Spark", value: "1324461.98", chains: { ethereum: {...} } },
|
|
110
|
+
* "wallet": { name: "Wallet", value: "6356.97", chains: { ethereum: {...} } },
|
|
111
|
+
* // ... other protocols
|
|
112
|
+
* },
|
|
113
|
+
* chains: {
|
|
114
|
+
* "ethereum": { name: "Ethereum", chainId: "1", value: "4970455.03", ... },
|
|
115
|
+
* // ... other chains
|
|
116
|
+
* }
|
|
117
|
+
* }
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export interface VaultCompositionFullResponse {
|
|
121
|
+
/** Vault/wallet address */
|
|
122
|
+
address: string;
|
|
123
|
+
/** Total portfolio net worth in USD */
|
|
124
|
+
networth: string;
|
|
125
|
+
/** Protocol-level breakdown (PRIMARY - use for diversification analysis) */
|
|
126
|
+
assetByProtocols: Record<string, ProtocolCompositionData>;
|
|
127
|
+
/** Chain-level summary (LEGACY - kept for backward compatibility) */
|
|
128
|
+
chains: Record<string, ChainComposition>;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* @deprecated Use ChainComposition instead - backend API changed
|
|
132
|
+
* Protocol composition within a vault (legacy structure)
|
|
9
133
|
*/
|
|
10
134
|
export interface ProtocolComposition {
|
|
11
135
|
protocol: string;
|
|
@@ -14,7 +138,8 @@ export interface ProtocolComposition {
|
|
|
14
138
|
details?: ProtocolComposition[];
|
|
15
139
|
}
|
|
16
140
|
/**
|
|
17
|
-
*
|
|
141
|
+
* @deprecated Use ChainComposition instead - backend API changed
|
|
142
|
+
* Token/position composition within a vault (legacy structure)
|
|
18
143
|
*/
|
|
19
144
|
export interface TokenComposition {
|
|
20
145
|
symbol: string;
|
|
@@ -26,24 +151,16 @@ export interface TokenComposition {
|
|
|
26
151
|
details?: TokenComposition[];
|
|
27
152
|
}
|
|
28
153
|
/**
|
|
29
|
-
*
|
|
154
|
+
* @deprecated Use RawVaultComposition instead - backend API changed
|
|
155
|
+
* Complete composition data for a vault (legacy structure)
|
|
30
156
|
*/
|
|
31
157
|
export interface CompositionData {
|
|
32
158
|
compositions: ProtocolComposition[];
|
|
33
159
|
tokenCompositions: TokenComposition[];
|
|
34
160
|
}
|
|
35
161
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* Usage:
|
|
39
|
-
* ```graphql
|
|
40
|
-
* query MyQuery {
|
|
41
|
-
* composition(address: "0x...") {
|
|
42
|
-
* ...CompositionFragment
|
|
43
|
-
* }
|
|
44
|
-
* }
|
|
45
|
-
* ${COMPOSITION_FRAGMENT}
|
|
46
|
-
* ```
|
|
162
|
+
* @deprecated No longer used - backend returns JSONObject, not a typed GraphQL response
|
|
163
|
+
* GraphQL fragment for composition data (legacy)
|
|
47
164
|
*/
|
|
48
165
|
export declare const COMPOSITION_FRAGMENT = "\n fragment CompositionFragment on CompositionData {\n compositions {\n protocol\n valueInUsd\n repartition\n details {\n protocol\n valueInUsd\n repartition\n }\n }\n tokenCompositions {\n symbol\n name\n contract\n chainKey\n valueInUsd\n repartition\n details {\n symbol\n name\n contract\n chainKey\n valueInUsd\n repartition\n }\n }\n }\n";
|
|
49
166
|
//# sourceMappingURL=composition.fragment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.fragment.d.ts","sourceRoot":"","sources":["../../../src/graphql/fragments/composition.fragment.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"composition.fragment.d.ts","sourceRoot":"","sources":["../../../src/graphql/fragments/composition.fragment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Composition Fragment
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Type definitions for vault composition data from Octav API.
|
|
5
|
+
* The backend returns a JSONObject with chains as keys containing composition data.
|
|
6
|
+
*
|
|
7
|
+
* Note: The vaultComposition endpoint returns JSONObject type, so no GraphQL fragment
|
|
8
|
+
* is needed. The response is a flat object keyed by chain name.
|
|
6
9
|
*/
|
|
7
10
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* ```graphql
|
|
12
|
-
* query MyQuery {
|
|
13
|
-
* composition(address: "0x...") {
|
|
14
|
-
* ...CompositionFragment
|
|
15
|
-
* }
|
|
16
|
-
* }
|
|
17
|
-
* ${COMPOSITION_FRAGMENT}
|
|
18
|
-
* ```
|
|
11
|
+
* @deprecated No longer used - backend returns JSONObject, not a typed GraphQL response
|
|
12
|
+
* GraphQL fragment for composition data (legacy)
|
|
19
13
|
*/
|
|
20
14
|
export const COMPOSITION_FRAGMENT = `
|
|
21
15
|
fragment CompositionFragment on CompositionData {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.fragment.js","sourceRoot":"","sources":["../../../src/graphql/fragments/composition.fragment.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"composition.fragment.js","sourceRoot":"","sources":["../../../src/graphql/fragments/composition.fragment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4KH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BnC,CAAC"}
|
|
@@ -12,5 +12,5 @@ export { TRANSACTION_BASE_FRAGMENT } from './transaction-base.fragment.js';
|
|
|
12
12
|
export { VAULT_FRAGMENT, type VaultData } from './vault.fragment.js';
|
|
13
13
|
export { VAULT_LIST_FRAGMENT, type VaultListData } from './vault-list.fragment.js';
|
|
14
14
|
export { VAULT_SUMMARY_FRAGMENT, type VaultSummaryData } from './vault-summary.fragment.js';
|
|
15
|
-
export { COMPOSITION_FRAGMENT, type ProtocolComposition, type TokenComposition, type CompositionData, } from './composition.fragment.js';
|
|
15
|
+
export { type ProtocolPositionCategory, type ProtocolChainData, type ProtocolCompositionData, type VaultCompositionFullResponse, type ChainComposition, type RawVaultComposition, COMPOSITION_FRAGMENT, type ProtocolComposition, type TokenComposition, type CompositionData, } from './composition.fragment.js';
|
|
16
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graphql/fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG5F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graphql/fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG5F,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EAEjC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAExB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,2BAA2B,CAAC"}
|
|
@@ -18,6 +18,8 @@ export { TRANSACTION_BASE_FRAGMENT } from './transaction-base.fragment.js';
|
|
|
18
18
|
export { VAULT_FRAGMENT } from './vault.fragment.js';
|
|
19
19
|
export { VAULT_LIST_FRAGMENT } from './vault-list.fragment.js';
|
|
20
20
|
export { VAULT_SUMMARY_FRAGMENT } from './vault-summary.fragment.js';
|
|
21
|
-
// Composition Fragment
|
|
22
|
-
export {
|
|
21
|
+
// Composition Fragment - protocol and chain-based types
|
|
22
|
+
export {
|
|
23
|
+
// Legacy types (deprecated - kept for backward compatibility)
|
|
24
|
+
COMPOSITION_FRAGMENT, } from './composition.fragment.js';
|
|
23
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graphql/fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yBAAyB;AACzB,OAAO,EAAE,sBAAsB,EAAqB,MAAM,6BAA6B,CAAC;AAExF,sBAAsB;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,sBAAsB;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBAAqB;AACrB,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE3F,4BAA4B;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,6BAA6B,CAAC;AAE5F,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graphql/fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yBAAyB;AACzB,OAAO,EAAE,sBAAsB,EAAqB,MAAM,6BAA6B,CAAC;AAExF,sBAAsB;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,sBAAsB;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBAAqB;AACrB,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE3F,4BAA4B;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,6BAA6B,CAAC;AAE5F,wDAAwD;AACxD,OAAO;AASL,8DAA8D;AAC9D,oBAAoB,GAIrB,MAAM,2BAA2B,CAAC"}
|
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Composition Queries
|
|
3
3
|
*
|
|
4
|
-
* GraphQL queries for vault composition data
|
|
5
|
-
*
|
|
4
|
+
* GraphQL queries for vault composition data from Octav API.
|
|
5
|
+
* The backend returns a JSONObject with chains as keys containing composition data.
|
|
6
|
+
*
|
|
7
|
+
* Note: The vaultComposition endpoint returns JSONObject type, so no GraphQL fragment
|
|
8
|
+
* is needed. The response is a flat object keyed by chain name.
|
|
6
9
|
*/
|
|
7
10
|
/**
|
|
8
11
|
* Get vault composition GraphQL query
|
|
9
12
|
*
|
|
10
|
-
* Fetches
|
|
13
|
+
* Fetches cross-chain composition data for a vault from Octav API.
|
|
14
|
+
* Returns a JSONObject with chain keys (ethereum, arbitrum, etc.) containing:
|
|
15
|
+
* - name: Chain display name
|
|
16
|
+
* - key: Chain identifier
|
|
17
|
+
* - chainId: Chain ID as string
|
|
18
|
+
* - value: USD value of positions
|
|
19
|
+
* - valuePercentile: Relative ranking
|
|
20
|
+
* - totalCostBasis, totalClosedPnl, totalOpenPnl: PnL metrics
|
|
21
|
+
*
|
|
11
22
|
* Used by: get_vault_composition tool
|
|
12
23
|
*
|
|
13
24
|
* Usage:
|
|
14
25
|
* ```typescript
|
|
15
|
-
* const data = await graphqlClient.request<{ vaultComposition:
|
|
26
|
+
* const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
|
|
16
27
|
* GET_VAULT_COMPOSITION_QUERY,
|
|
17
|
-
* {
|
|
28
|
+
* { walletAddress: '0x...' }
|
|
18
29
|
* );
|
|
19
30
|
* ```
|
|
20
31
|
*/
|
|
21
|
-
export declare const GET_VAULT_COMPOSITION_QUERY = "\n query GetVaultComposition($
|
|
32
|
+
export declare const GET_VAULT_COMPOSITION_QUERY = "\n query GetVaultComposition($walletAddress: Address!) {\n vaultComposition(walletAddress: $walletAddress)\n }\n";
|
|
22
33
|
//# sourceMappingURL=composition.queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/composition.queries.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"composition.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/composition.queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,2BAA2B,0HAIvC,CAAC"}
|
|
@@ -1,30 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Composition Queries
|
|
3
3
|
*
|
|
4
|
-
* GraphQL queries for vault composition data
|
|
5
|
-
*
|
|
4
|
+
* GraphQL queries for vault composition data from Octav API.
|
|
5
|
+
* The backend returns a JSONObject with chains as keys containing composition data.
|
|
6
|
+
*
|
|
7
|
+
* Note: The vaultComposition endpoint returns JSONObject type, so no GraphQL fragment
|
|
8
|
+
* is needed. The response is a flat object keyed by chain name.
|
|
6
9
|
*/
|
|
7
|
-
import { COMPOSITION_FRAGMENT } from '../fragments/index.js';
|
|
8
10
|
/**
|
|
9
11
|
* Get vault composition GraphQL query
|
|
10
12
|
*
|
|
11
|
-
* Fetches
|
|
13
|
+
* Fetches cross-chain composition data for a vault from Octav API.
|
|
14
|
+
* Returns a JSONObject with chain keys (ethereum, arbitrum, etc.) containing:
|
|
15
|
+
* - name: Chain display name
|
|
16
|
+
* - key: Chain identifier
|
|
17
|
+
* - chainId: Chain ID as string
|
|
18
|
+
* - value: USD value of positions
|
|
19
|
+
* - valuePercentile: Relative ranking
|
|
20
|
+
* - totalCostBasis, totalClosedPnl, totalOpenPnl: PnL metrics
|
|
21
|
+
*
|
|
12
22
|
* Used by: get_vault_composition tool
|
|
13
23
|
*
|
|
14
24
|
* Usage:
|
|
15
25
|
* ```typescript
|
|
16
|
-
* const data = await graphqlClient.request<{ vaultComposition:
|
|
26
|
+
* const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
|
|
17
27
|
* GET_VAULT_COMPOSITION_QUERY,
|
|
18
|
-
* {
|
|
28
|
+
* { walletAddress: '0x...' }
|
|
19
29
|
* );
|
|
20
30
|
* ```
|
|
21
31
|
*/
|
|
22
32
|
export const GET_VAULT_COMPOSITION_QUERY = `
|
|
23
|
-
query GetVaultComposition($
|
|
24
|
-
vaultComposition(
|
|
25
|
-
...CompositionFragment
|
|
26
|
-
}
|
|
33
|
+
query GetVaultComposition($walletAddress: Address!) {
|
|
34
|
+
vaultComposition(walletAddress: $walletAddress)
|
|
27
35
|
}
|
|
28
|
-
${COMPOSITION_FRAGMENT}
|
|
29
36
|
`;
|
|
30
37
|
//# sourceMappingURL=composition.queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/composition.queries.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"composition.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/composition.queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;CAI1C,CAAC"}
|
|
@@ -68,20 +68,25 @@ export declare const SINGLE_VAULT_OPTIMIZATION_QUERY = "\n query SingleVaultOpt
|
|
|
68
68
|
/**
|
|
69
69
|
* GraphQL query for single vault composition data
|
|
70
70
|
*
|
|
71
|
-
* Fetches composition data for a
|
|
72
|
-
*
|
|
71
|
+
* Fetches cross-chain composition data for a vault from Octav API.
|
|
72
|
+
* Returns a JSONObject with chain keys containing composition metrics.
|
|
73
|
+
*
|
|
74
|
+
* Note: Backend API changed - now uses `walletAddress` parameter and returns
|
|
75
|
+
* JSONObject type (no fragment needed). Response contains chains as keys with
|
|
76
|
+
* value, chainId, name, etc.
|
|
73
77
|
*
|
|
74
78
|
* Used by: get_user_portfolio tool (for composition aggregation)
|
|
79
|
+
* compare_vaults tool (for diversification analysis)
|
|
75
80
|
*
|
|
76
81
|
* Usage:
|
|
77
82
|
* ```typescript
|
|
78
|
-
* const data = await graphqlClient.request<
|
|
83
|
+
* const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
|
|
79
84
|
* SINGLE_VAULT_COMPOSITION_QUERY,
|
|
80
|
-
* {
|
|
85
|
+
* { walletAddress: '0x...' }
|
|
81
86
|
* );
|
|
82
87
|
* ```
|
|
83
88
|
*/
|
|
84
|
-
export declare const SINGLE_VAULT_COMPOSITION_QUERY = "\n query SingleVaultComposition($
|
|
89
|
+
export declare const SINGLE_VAULT_COMPOSITION_QUERY = "\n query SingleVaultComposition($walletAddress: Address!) {\n vaultComposition(walletAddress: $walletAddress)\n }\n";
|
|
85
90
|
/**
|
|
86
91
|
* GraphQL query for portfolio optimization data (DEPRECATED)
|
|
87
92
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portfolio.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/portfolio.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"portfolio.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/portfolio.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAqBlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,GAAE,uBAAmC,GAClD,MAAM,CAyBR;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,QAAsC,CAAC;AAE5E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,s+GAmC3C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,8BAA8B,6HAI1C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,0wHAiDxC,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* GraphQL queries for user portfolio operations.
|
|
5
5
|
* Includes user portfolio data and portfolio optimization queries.
|
|
6
6
|
*/
|
|
7
|
-
import { VAULT_FRAGMENT, VAULT_LIST_FRAGMENT, VAULT_SUMMARY_FRAGMENT
|
|
7
|
+
import { VAULT_FRAGMENT, VAULT_LIST_FRAGMENT, VAULT_SUMMARY_FRAGMENT } from '../fragments/index.js';
|
|
8
8
|
/**
|
|
9
9
|
* Get fragment and fragment name based on response format for portfolio queries
|
|
10
10
|
*/
|
|
@@ -139,26 +139,28 @@ export const SINGLE_VAULT_OPTIMIZATION_QUERY = `
|
|
|
139
139
|
/**
|
|
140
140
|
* GraphQL query for single vault composition data
|
|
141
141
|
*
|
|
142
|
-
* Fetches composition data for a
|
|
143
|
-
*
|
|
142
|
+
* Fetches cross-chain composition data for a vault from Octav API.
|
|
143
|
+
* Returns a JSONObject with chain keys containing composition metrics.
|
|
144
|
+
*
|
|
145
|
+
* Note: Backend API changed - now uses `walletAddress` parameter and returns
|
|
146
|
+
* JSONObject type (no fragment needed). Response contains chains as keys with
|
|
147
|
+
* value, chainId, name, etc.
|
|
144
148
|
*
|
|
145
149
|
* Used by: get_user_portfolio tool (for composition aggregation)
|
|
150
|
+
* compare_vaults tool (for diversification analysis)
|
|
146
151
|
*
|
|
147
152
|
* Usage:
|
|
148
153
|
* ```typescript
|
|
149
|
-
* const data = await graphqlClient.request<
|
|
154
|
+
* const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
|
|
150
155
|
* SINGLE_VAULT_COMPOSITION_QUERY,
|
|
151
|
-
* {
|
|
156
|
+
* { walletAddress: '0x...' }
|
|
152
157
|
* );
|
|
153
158
|
* ```
|
|
154
159
|
*/
|
|
155
160
|
export const SINGLE_VAULT_COMPOSITION_QUERY = `
|
|
156
|
-
query SingleVaultComposition($
|
|
157
|
-
vaultComposition(
|
|
158
|
-
...CompositionFragment
|
|
159
|
-
}
|
|
161
|
+
query SingleVaultComposition($walletAddress: Address!) {
|
|
162
|
+
vaultComposition(walletAddress: $walletAddress)
|
|
160
163
|
}
|
|
161
|
-
${COMPOSITION_FRAGMENT}
|
|
162
164
|
`;
|
|
163
165
|
/**
|
|
164
166
|
* GraphQL query for portfolio optimization data (DEPRECATED)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portfolio.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/portfolio.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"portfolio.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/portfolio.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAOpG;;GAEG;AACH,SAAS,qCAAqC,CAAC,cAAuC;IAIpF,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;QAC9E,KAAK,SAAS;YACZ,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC;QACpF,KAAK,MAAM;YACT,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;QACrE;YACE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,2BAA2B,CACzC,iBAA0C,SAAS;IAEnD,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,qCAAqC,CAAC,cAAc,CAAC,CAAC;IAEzF,OAAO;;;;;;;;;mBASU,YAAY;;;;;;;;;;;MAWzB,QAAQ;GACX,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAE5E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkC3C,cAAc;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;CAI7C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDxC,cAAc;CACjB,CAAC"}
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
* );
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
|
-
export declare const RISK_ANALYSIS_QUERY = "\n query RiskAnalysis(\n $vaultAddress: Address!,\n $chainId: Int!,\n $curatorId: String!,\n $where: TransactionFilterInput!,\n $orderBy: TransactionOrderBy!,\n $orderDirection: OrderDirection!\n ) {\n vault: vaultByAddress(address: $vaultAddress, chainId: $chainId) {\n ...VaultFragment\n }\n\n # Get all vaults for concentration risk calculation\n allVaults: vaults(where: { chainId_eq: $chainId, isVisible_eq: true }) {\n items {\n state {\n totalAssetsUsd\n }\n }\n }\n\n # Get curator's other vaults for reputation analysis\n curatorVaults: vaults(where: { chainId_eq: $chainId, curatorIds_contains: $curatorId }) {\n items {\n address\n state {\n totalAssetsUsd\n }\n }\n }\n\n # Get price history for volatility analysis\n priceHistory: transactions(\n where: $where,\n orderBy: $orderBy,\n orderDirection: $orderDirection,\n first: 100\n ) {\n items {\n timestamp\n data {\n ... on TotalAssetsUpdated {\n totalAssets\n totalAssetsUsd\n totalSupply\n }\n }\n }\n }\n\n # Get composition data for
|
|
36
|
+
export declare const RISK_ANALYSIS_QUERY = "\n query RiskAnalysis(\n $vaultAddress: Address!,\n $chainId: Int!,\n $curatorId: String!,\n $where: TransactionFilterInput!,\n $orderBy: TransactionOrderBy!,\n $orderDirection: OrderDirection!\n ) {\n vault: vaultByAddress(address: $vaultAddress, chainId: $chainId) {\n ...VaultFragment\n }\n\n # Get all vaults for concentration risk calculation\n allVaults: vaults(where: { chainId_eq: $chainId, isVisible_eq: true }) {\n items {\n state {\n totalAssetsUsd\n }\n }\n }\n\n # Get curator's other vaults for reputation analysis\n curatorVaults: vaults(where: { chainId_eq: $chainId, curatorIds_contains: $curatorId }) {\n items {\n address\n state {\n totalAssetsUsd\n }\n }\n }\n\n # Get price history for volatility analysis\n priceHistory: transactions(\n where: $where,\n orderBy: $orderBy,\n orderDirection: $orderDirection,\n first: 100\n ) {\n items {\n timestamp\n data {\n ... on TotalAssetsUpdated {\n totalAssets\n totalAssetsUsd\n totalSupply\n }\n }\n }\n }\n\n # Get composition data for cross-chain diversification risk\n # Note: Backend API changed - uses walletAddress and returns JSONObject with chains\n composition: vaultComposition(walletAddress: $vaultAddress)\n }\n \n fragment VaultFragment on Vault {\n address\n symbol\n decimals\n name\n description\n shortDescription\n maxCapacity\n logoUrl\n averageSettlement\n isVisible\n asset {\n ...AssetInfoFragment\n }\n chain {\n ...ChainInfoFragment\n }\n state {\n state\n totalAssets\n totalAssetsUsd\n totalSupply\n pricePerShare\n pricePerShareUsd\n safeAssetBalance\n liveAPR {\n grossApr\n name\n netApr\n description\n }\n roles {\n owner\n valuationManager\n whitelistManager\n safe\n feeReceiver\n }\n managementFee\n performanceFee\n protocolFee\n isWhitelistActivated\n whitelist\n pendingSettlement {\n assets\n assetsUsd\n shares\n }\n inceptionApr {\n ...APRBreakdownFragment\n }\n pendingSiloBalances {\n assets\n shares\n }\n monthlyApr {\n ...APRBreakdownFragment\n }\n newTotalAssets\n highWaterMark\n lastFeeTime\n safeAssetBalanceUsd\n weeklyApr {\n ...APRBreakdownFragment\n }\n yearlyApr {\n ...APRBreakdownFragment\n }\n }\n curators {\n name\n id\n aboutDescription\n logoUrl\n url\n }\n integrator {\n name\n url\n logoUrl\n aboutDescription\n }\n defiIntegrations {\n name\n description\n link\n logoUrl\n type\n }\n }\n \n fragment AssetInfoFragment on Asset {\n id\n name\n symbol\n decimals\n address\n logoUrl\n description\n isVisible\n priceUsd\n chain {\n id\n name\n nativeToken\n logoUrl\n }\n }\n\n \n fragment ChainInfoFragment on Chain {\n id\n name\n nativeToken\n logoUrl\n wrappedNativeToken {\n address\n decimals\n name\n symbol\n }\n factory\n }\n\n \n fragment APRBreakdownFragment on APRs {\n linearNetApr\n linearNetAprWithoutExtraYields\n airdrops {\n name\n apr\n description\n distributionTimestamp\n endTimestamp\n isEstimation\n logoUrl\n multiplier\n ppsIncrease\n startTimestamp\n }\n incentives {\n name\n apr\n aprDescription\n description\n endTimestamp\n incentiveRate {\n incentiveAmount\n referenceToken {\n id\n }\n referenceTokenAmount\n }\n }\n nativeYields {\n name\n apr\n aprDescription\n description\n endTimestamp\n isEstimation\n logoUrl\n multiplier\n startTimestamp\n }\n }\n\n\n";
|
|
37
37
|
//# sourceMappingURL=risk.queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/risk.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"risk.queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries/risk.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,mBAAmB,2mIAwD/B,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* GraphQL queries for vault risk analysis.
|
|
5
5
|
* Includes multi-factor risk scoring with vault, protocol, and market data.
|
|
6
6
|
*/
|
|
7
|
-
import { VAULT_FRAGMENT
|
|
7
|
+
import { VAULT_FRAGMENT } from '../fragments/index.js';
|
|
8
8
|
/**
|
|
9
9
|
* GraphQL query for vault risk analysis data
|
|
10
10
|
*
|
|
@@ -85,12 +85,10 @@ export const RISK_ANALYSIS_QUERY = `
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
# Get composition data for
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
88
|
+
# Get composition data for cross-chain diversification risk
|
|
89
|
+
# Note: Backend API changed - uses walletAddress and returns JSONObject with chains
|
|
90
|
+
composition: vaultComposition(walletAddress: $vaultAddress)
|
|
92
91
|
}
|
|
93
92
|
${VAULT_FRAGMENT}
|
|
94
|
-
${COMPOSITION_FRAGMENT}
|
|
95
93
|
`;
|
|
96
94
|
//# sourceMappingURL=risk.queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/risk.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"risk.queries.js","sourceRoot":"","sources":["../../../src/graphql/queries/risk.queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuD/B,cAAc;CACjB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -34,7 +34,7 @@ import { getPortfolioOptimizationPrompt } from './prompts/portfolio-optimization
|
|
|
34
34
|
export function createServer() {
|
|
35
35
|
const server = new McpServer({
|
|
36
36
|
name: 'lagoon-mcp',
|
|
37
|
-
version: '0.2.
|
|
37
|
+
version: '0.2.16',
|
|
38
38
|
});
|
|
39
39
|
// ==========================================
|
|
40
40
|
// Dependency Injection Container
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* Demonstrates service layer pattern for complex multi-step operations.
|
|
6
6
|
*/
|
|
7
7
|
import { BaseService } from '../base.service.js';
|
|
8
|
-
import { VaultData } from '../../graphql/fragments/index.js';
|
|
8
|
+
import { VaultData, VaultCompositionFullResponse } from '../../graphql/fragments/index.js';
|
|
9
9
|
import { RiskScoreBreakdown } from '../../utils/risk-scoring.js';
|
|
10
10
|
/**
|
|
11
11
|
* Risk analysis input data extracted from GraphQL
|
|
12
|
+
* Uses assetByProtocols from Octav API for protocol-based diversification analysis
|
|
12
13
|
*/
|
|
13
14
|
export interface RiskAnalysisData {
|
|
14
15
|
vault: VaultData;
|
|
@@ -37,18 +38,7 @@ export interface RiskAnalysisData {
|
|
|
37
38
|
};
|
|
38
39
|
}>;
|
|
39
40
|
};
|
|
40
|
-
composition:
|
|
41
|
-
compositions: Array<{
|
|
42
|
-
protocol: string;
|
|
43
|
-
repartition: number;
|
|
44
|
-
valueInUsd: number;
|
|
45
|
-
}>;
|
|
46
|
-
tokenCompositions: Array<{
|
|
47
|
-
symbol: string;
|
|
48
|
-
repartition: number;
|
|
49
|
-
valueInUsd: number;
|
|
50
|
-
}>;
|
|
51
|
-
} | null;
|
|
41
|
+
composition: VaultCompositionFullResponse | null;
|
|
52
42
|
}
|
|
53
43
|
/**
|
|
54
44
|
* Comparative risk context for benchmarking
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.service.d.ts","sourceRoot":"","sources":["../../../src/services/analytics/risk.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"risk.service.d.ts","sourceRoot":"","sources":["../../../src/services/analytics/risk.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,SAAS,EACT,4BAA4B,EAE7B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAe,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE;gBAAE,cAAc,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACnE,aAAa,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE;gBAAE,cAAc,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACxF,YAAY,EAAE;QACZ,KAAK,EAAE,KAAK,CAAC;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,EAAE;gBACJ,WAAW,EAAE,MAAM,CAAC;gBACpB,cAAc,EAAE,MAAM,CAAC;gBACvB,WAAW,EAAE,MAAM,CAAC;aACrB,CAAC;SACH,CAAC,CAAC;KACJ,CAAC;IAEF,WAAW,EAAE,4BAA4B,GAAG,IAAI,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAgB5F;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB;IAuKzD;;;;;;OAMG;IACH,2BAA2B,CACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC,GAC3C,sBAAsB;IAuEzB;;;;;;;OAOG;IACG,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,kBAAkB,GAAE,OAAc,GACjC,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IA0B7C;;OAEG;IACH,mBAAmB,CACjB,SAAS,EAAE,0BAA0B,EACrC,cAAc,GAAE,OAAO,GAAG,SAAS,GAAG,UAAsB,GAC3D,MAAM;CAiNV"}
|
|
@@ -105,15 +105,45 @@ export class RiskService extends BaseService {
|
|
|
105
105
|
maxCapacity,
|
|
106
106
|
};
|
|
107
107
|
// Extract composition data for protocol diversification risk
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
// Uses assetByProtocols from VaultCompositionFullResponse for DeFi protocol analysis
|
|
109
|
+
// "wallet" protocol (idle assets) is excluded from diversification calculation
|
|
110
|
+
let compositionData;
|
|
111
|
+
if (data.composition &&
|
|
112
|
+
data.composition.assetByProtocols &&
|
|
113
|
+
Object.keys(data.composition.assetByProtocols).length > 0) {
|
|
114
|
+
// Filter active protocols (value > 0) and transform to risk format
|
|
115
|
+
const allProtocols = Object.entries(data.composition.assetByProtocols)
|
|
116
|
+
.filter(([, protocol]) => {
|
|
117
|
+
const value = parseFloat(protocol.value);
|
|
118
|
+
return !isNaN(value) && value > 0;
|
|
119
|
+
})
|
|
120
|
+
.map(([key, protocol]) => ({
|
|
121
|
+
key,
|
|
122
|
+
value: parseFloat(protocol.value),
|
|
123
|
+
repartition: 0, // Will calculate after total
|
|
124
|
+
}));
|
|
125
|
+
// Calculate total value (including wallet)
|
|
126
|
+
const totalValue = allProtocols.reduce((sum, p) => sum + p.value, 0);
|
|
127
|
+
// Calculate repartition (percentage) for each protocol
|
|
128
|
+
allProtocols.forEach((p) => {
|
|
129
|
+
p.repartition = totalValue > 0 ? (p.value / totalValue) * 100 : 0;
|
|
130
|
+
});
|
|
131
|
+
// Exclude wallet (idle assets) from diversification analysis
|
|
132
|
+
// Wallet represents undeployed capital, not DeFi protocol concentration
|
|
133
|
+
const defiProtocols = allProtocols.filter((p) => p.key !== 'wallet');
|
|
134
|
+
// Recalculate percentages for DeFi-only (for HHI calculation)
|
|
135
|
+
const defiTotalValue = defiProtocols.reduce((sum, p) => sum + p.value, 0);
|
|
136
|
+
defiProtocols.forEach((p) => {
|
|
137
|
+
p.repartition = defiTotalValue > 0 ? (p.value / defiTotalValue) * 100 : 0;
|
|
138
|
+
});
|
|
139
|
+
// Sort by value descending to get top protocol
|
|
140
|
+
defiProtocols.sort((a, b) => b.value - a.value);
|
|
141
|
+
const topProtocolPercent = defiProtocols[0]?.repartition ?? null;
|
|
142
|
+
compositionData = {
|
|
143
|
+
compositions: defiProtocols.map((p) => ({ repartition: p.repartition })),
|
|
114
144
|
topProtocolPercent,
|
|
115
|
-
}
|
|
116
|
-
|
|
145
|
+
};
|
|
146
|
+
}
|
|
117
147
|
// Perform risk analysis using utility function
|
|
118
148
|
return analyzeRisk({
|
|
119
149
|
tvl: vaultTVL,
|