@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.
Files changed (44) hide show
  1. package/dist/graphql/fragments/composition.fragment.d.ts +133 -16
  2. package/dist/graphql/fragments/composition.fragment.d.ts.map +1 -1
  3. package/dist/graphql/fragments/composition.fragment.js +7 -13
  4. package/dist/graphql/fragments/composition.fragment.js.map +1 -1
  5. package/dist/graphql/fragments/index.d.ts +1 -1
  6. package/dist/graphql/fragments/index.d.ts.map +1 -1
  7. package/dist/graphql/fragments/index.js +4 -2
  8. package/dist/graphql/fragments/index.js.map +1 -1
  9. package/dist/graphql/queries/composition.queries.d.ts +17 -6
  10. package/dist/graphql/queries/composition.queries.d.ts.map +1 -1
  11. package/dist/graphql/queries/composition.queries.js +18 -11
  12. package/dist/graphql/queries/composition.queries.js.map +1 -1
  13. package/dist/graphql/queries/portfolio.queries.d.ts +10 -5
  14. package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -1
  15. package/dist/graphql/queries/portfolio.queries.js +12 -10
  16. package/dist/graphql/queries/portfolio.queries.js.map +1 -1
  17. package/dist/graphql/queries/risk.queries.d.ts +1 -1
  18. package/dist/graphql/queries/risk.queries.d.ts.map +1 -1
  19. package/dist/graphql/queries/risk.queries.js +4 -6
  20. package/dist/graphql/queries/risk.queries.js.map +1 -1
  21. package/dist/server.js +1 -1
  22. package/dist/services/analytics/risk.service.d.ts +3 -13
  23. package/dist/services/analytics/risk.service.d.ts.map +1 -1
  24. package/dist/services/analytics/risk.service.js +38 -8
  25. package/dist/services/analytics/risk.service.js.map +1 -1
  26. package/dist/tools/compare-vaults.d.ts.map +1 -1
  27. package/dist/tools/compare-vaults.js +62 -15
  28. package/dist/tools/compare-vaults.js.map +1 -1
  29. package/dist/tools/registry.d.ts.map +1 -1
  30. package/dist/tools/registry.js +10 -6
  31. package/dist/tools/registry.js.map +1 -1
  32. package/dist/tools/user-portfolio.d.ts +1 -0
  33. package/dist/tools/user-portfolio.d.ts.map +1 -1
  34. package/dist/tools/user-portfolio.js +71 -18
  35. package/dist/tools/user-portfolio.js.map +1 -1
  36. package/dist/tools/vault-composition.d.ts +12 -4
  37. package/dist/tools/vault-composition.d.ts.map +1 -1
  38. package/dist/tools/vault-composition.js +153 -49
  39. package/dist/tools/vault-composition.js.map +1 -1
  40. package/dist/utils/validators.d.ts +3 -0
  41. package/dist/utils/validators.d.ts.map +1 -1
  42. package/dist/utils/validators.js +4 -0
  43. package/dist/utils/validators.js.map +1 -1
  44. package/package.json +1 -1
@@ -1,11 +1,135 @@
1
1
  /**
2
2
  * Composition Fragment
3
3
  *
4
- * GraphQL fragment for vault composition data including protocol and token breakdowns.
5
- * Uses the composition field added by the CompositionModule in the backend.
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
- * Protocol composition within a vault
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
- * Token/position composition within a vault
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
- * Complete composition data for a vault
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
- * GraphQL fragment for composition data
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;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,0eA6BhC,CAAC"}
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
- * GraphQL fragment for vault composition data including protocol and token breakdowns.
5
- * Uses the composition field added by the CompositionModule in the backend.
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
- * GraphQL fragment for composition data
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;;;;;GAKG;AAiCH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BnC,CAAC"}
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,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,2BAA2B,CAAC"}
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 { COMPOSITION_FRAGMENT, } from './composition.fragment.js';
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,uBAAuB;AACvB,OAAO,EACL,oBAAoB,GAIrB,MAAM,2BAA2B,CAAC"}
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 (protocol and token breakdowns).
5
- * Uses the composition field from the backend CompositionModule.
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 protocol and token composition breakdown for a vault.
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: CompositionData | null }>(
26
+ * const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
16
27
  * GET_VAULT_COMPOSITION_QUERY,
17
- * { vaultAddress: '0x...' }
28
+ * { walletAddress: '0x...' }
18
29
  * );
19
30
  * ```
20
31
  */
21
- export declare const GET_VAULT_COMPOSITION_QUERY = "\n query GetVaultComposition($vaultAddress: Address!) {\n vaultComposition(vaultAddress: $vaultAddress) {\n ...CompositionFragment\n }\n }\n \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\n";
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;;;;;GAKG;AAIH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,uoBAOvC,CAAC"}
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 (protocol and token breakdowns).
5
- * Uses the composition field from the backend CompositionModule.
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 protocol and token composition breakdown for a vault.
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: CompositionData | null }>(
26
+ * const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
17
27
  * GET_VAULT_COMPOSITION_QUERY,
18
- * { vaultAddress: '0x...' }
28
+ * { walletAddress: '0x...' }
19
29
  * );
20
30
  * ```
21
31
  */
22
32
  export const GET_VAULT_COMPOSITION_QUERY = `
23
- query GetVaultComposition($vaultAddress: Address!) {
24
- vaultComposition(vaultAddress: $vaultAddress) {
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;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;IAMvC,oBAAoB;CACvB,CAAC"}
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 single vault, used in parallel
72
- * to aggregate portfolio-wide composition metrics.
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<SingleVaultCompositionResponse>(
83
+ * const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
79
84
  * SINGLE_VAULT_COMPOSITION_QUERY,
80
- * { vaultAddress: '0x...' }
85
+ * { walletAddress: '0x...' }
81
86
  * );
82
87
  * ```
83
88
  */
84
- export declare const SINGLE_VAULT_COMPOSITION_QUERY = "\n query SingleVaultComposition($vaultAddress: Address!) {\n vaultComposition(vaultAddress: $vaultAddress) {\n ...CompositionFragment\n }\n }\n \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\n";
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;AASH;;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;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,8BAA8B,0oBAO1C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,0wHAiDxC,CAAC"}
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, COMPOSITION_FRAGMENT, } from '../fragments/index.js';
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 single vault, used in parallel
143
- * to aggregate portfolio-wide composition metrics.
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<SingleVaultCompositionResponse>(
154
+ * const data = await graphqlClient.request<{ vaultComposition: RawVaultComposition | null }>(
150
155
  * SINGLE_VAULT_COMPOSITION_QUERY,
151
- * { vaultAddress: '0x...' }
156
+ * { walletAddress: '0x...' }
152
157
  * );
153
158
  * ```
154
159
  */
155
160
  export const SINGLE_VAULT_COMPOSITION_QUERY = `
156
- query SingleVaultComposition($vaultAddress: Address!) {
157
- vaultComposition(vaultAddress: $vaultAddress) {
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,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAO/B;;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;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;IAM1C,oBAAoB;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDxC,cAAc;CACjB,CAAC"}
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 protocol diversification risk\n composition: vaultComposition(vaultAddress: $vaultAddress) {\n ...CompositionFragment\n }\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 \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\n";
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,8hJA0D/B,CAAC"}
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, COMPOSITION_FRAGMENT } from '../fragments/index.js';
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 protocol diversification risk
89
- composition: vaultComposition(vaultAddress: $vaultAddress) {
90
- ...CompositionFragment
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,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwD/B,cAAc;IACd,oBAAoB;CACvB,CAAC"}
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.14',
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,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAe,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAE9E;;GAEG;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;IACF,WAAW,EAAE;QACX,YAAY,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnF,iBAAiB,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACvF,GAAG,IAAI,CAAC;CACV;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;IA8HzD;;;;;;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"}
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
- const compositions = data.composition?.compositions;
109
- const topProtocol = compositions?.[0];
110
- const topProtocolPercent = topProtocol?.repartition ?? null;
111
- const compositionData = compositions
112
- ? {
113
- compositions: compositions.map((c) => ({ repartition: c.repartition })),
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
- : undefined;
145
+ };
146
+ }
117
147
  // Perform risk analysis using utility function
118
148
  return analyzeRisk({
119
149
  tvl: vaultTVL,