@lagoon-protocol/lagoon-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +618 -0
  3. package/dist/cache/index.d.ts +97 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +106 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/config.d.ts +34 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +40 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/cache-adapter.d.ts +73 -0
  12. package/dist/core/cache-adapter.d.ts.map +1 -0
  13. package/dist/core/cache-adapter.js +47 -0
  14. package/dist/core/cache-adapter.js.map +1 -0
  15. package/dist/core/cache-invalidation.d.ts +72 -0
  16. package/dist/core/cache-invalidation.d.ts.map +1 -0
  17. package/dist/core/cache-invalidation.js +114 -0
  18. package/dist/core/cache-invalidation.js.map +1 -0
  19. package/dist/core/container.d.ts +34 -0
  20. package/dist/core/container.d.ts.map +1 -0
  21. package/dist/core/container.js +75 -0
  22. package/dist/core/container.js.map +1 -0
  23. package/dist/graphql/client.d.ts +32 -0
  24. package/dist/graphql/client.d.ts.map +1 -0
  25. package/dist/graphql/client.js +49 -0
  26. package/dist/graphql/client.js.map +1 -0
  27. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
  28. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
  29. package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
  30. package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
  31. package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
  32. package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
  33. package/dist/graphql/fragments/asset-info.fragment.js +36 -0
  34. package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
  35. package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
  36. package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
  37. package/dist/graphql/fragments/chain-info.fragment.js +32 -0
  38. package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
  39. package/dist/graphql/fragments/index.d.ts +15 -0
  40. package/dist/graphql/fragments/index.d.ts.map +1 -0
  41. package/dist/graphql/fragments/index.js +21 -0
  42. package/dist/graphql/fragments/index.js.map +1 -0
  43. package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
  44. package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
  45. package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
  46. package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
  47. package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
  48. package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
  49. package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
  50. package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
  51. package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
  52. package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
  53. package/dist/graphql/fragments/vault-list.fragment.js +51 -0
  54. package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
  55. package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
  56. package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
  57. package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
  58. package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
  59. package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
  60. package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
  61. package/dist/graphql/fragments/vault.fragment.js +119 -0
  62. package/dist/graphql/fragments/vault.fragment.js.map +1 -0
  63. package/dist/graphql/fragments.d.ts +183 -0
  64. package/dist/graphql/fragments.d.ts.map +1 -0
  65. package/dist/graphql/fragments.js +297 -0
  66. package/dist/graphql/fragments.js.map +1 -0
  67. package/dist/graphql/queries/export.queries.d.ts +72 -0
  68. package/dist/graphql/queries/export.queries.d.ts.map +1 -0
  69. package/dist/graphql/queries/export.queries.js +202 -0
  70. package/dist/graphql/queries/export.queries.js.map +1 -0
  71. package/dist/graphql/queries/index.d.ts +15 -0
  72. package/dist/graphql/queries/index.d.ts.map +1 -0
  73. package/dist/graphql/queries/index.js +23 -0
  74. package/dist/graphql/queries/index.js.map +1 -0
  75. package/dist/graphql/queries/performance.queries.d.ts +63 -0
  76. package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
  77. package/dist/graphql/queries/performance.queries.js +133 -0
  78. package/dist/graphql/queries/performance.queries.js.map +1 -0
  79. package/dist/graphql/queries/period-summaries.d.ts +15 -0
  80. package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
  81. package/dist/graphql/queries/period-summaries.js +24 -0
  82. package/dist/graphql/queries/period-summaries.js.map +1 -0
  83. package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
  84. package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
  85. package/dist/graphql/queries/portfolio.queries.js +198 -0
  86. package/dist/graphql/queries/portfolio.queries.js.map +1 -0
  87. package/dist/graphql/queries/prediction.queries.d.ts +38 -0
  88. package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
  89. package/dist/graphql/queries/prediction.queries.js +100 -0
  90. package/dist/graphql/queries/prediction.queries.js.map +1 -0
  91. package/dist/graphql/queries/risk.queries.d.ts +37 -0
  92. package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
  93. package/dist/graphql/queries/risk.queries.js +90 -0
  94. package/dist/graphql/queries/risk.queries.js.map +1 -0
  95. package/dist/graphql/queries/search.queries.d.ts +61 -0
  96. package/dist/graphql/queries/search.queries.d.ts.map +1 -0
  97. package/dist/graphql/queries/search.queries.js +103 -0
  98. package/dist/graphql/queries/search.queries.js.map +1 -0
  99. package/dist/graphql/queries/transaction.queries.d.ts +60 -0
  100. package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
  101. package/dist/graphql/queries/transaction.queries.js +252 -0
  102. package/dist/graphql/queries/transaction.queries.js.map +1 -0
  103. package/dist/graphql/queries/vault.queries.d.ts +54 -0
  104. package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
  105. package/dist/graphql/queries/vault.queries.js +78 -0
  106. package/dist/graphql/queries/vault.queries.js.map +1 -0
  107. package/dist/index.d.ts +12 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +32 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/prompts/competitor-comparison.d.ts +8 -0
  112. package/dist/prompts/competitor-comparison.d.ts.map +1 -0
  113. package/dist/prompts/competitor-comparison.js +432 -0
  114. package/dist/prompts/competitor-comparison.js.map +1 -0
  115. package/dist/prompts/curator-performance.d.ts +8 -0
  116. package/dist/prompts/curator-performance.d.ts.map +1 -0
  117. package/dist/prompts/curator-performance.js +383 -0
  118. package/dist/prompts/curator-performance.js.map +1 -0
  119. package/dist/prompts/financial-analysis.d.ts +8 -0
  120. package/dist/prompts/financial-analysis.d.ts.map +1 -0
  121. package/dist/prompts/financial-analysis.js +480 -0
  122. package/dist/prompts/financial-analysis.js.map +1 -0
  123. package/dist/prompts/index.d.ts +21 -0
  124. package/dist/prompts/index.d.ts.map +1 -0
  125. package/dist/prompts/index.js +50 -0
  126. package/dist/prompts/index.js.map +1 -0
  127. package/dist/prompts/onboarding-first-vault.d.ts +8 -0
  128. package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
  129. package/dist/prompts/onboarding-first-vault.js +317 -0
  130. package/dist/prompts/onboarding-first-vault.js.map +1 -0
  131. package/dist/prompts/portfolio-optimization.d.ts +8 -0
  132. package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
  133. package/dist/prompts/portfolio-optimization.js +412 -0
  134. package/dist/prompts/portfolio-optimization.js.map +1 -0
  135. package/dist/prompts/protocol-overview.d.ts +8 -0
  136. package/dist/prompts/protocol-overview.d.ts.map +1 -0
  137. package/dist/prompts/protocol-overview.js +398 -0
  138. package/dist/prompts/protocol-overview.js.map +1 -0
  139. package/dist/prompts/shared/disclaimers.d.ts +54 -0
  140. package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
  141. package/dist/prompts/shared/disclaimers.js +400 -0
  142. package/dist/prompts/shared/disclaimers.js.map +1 -0
  143. package/dist/resources/glossary.d.ts +8 -0
  144. package/dist/resources/glossary.d.ts.map +1 -0
  145. package/dist/resources/glossary.js +407 -0
  146. package/dist/resources/glossary.js.map +1 -0
  147. package/dist/resources/index.d.ts +18 -0
  148. package/dist/resources/index.d.ts.map +1 -0
  149. package/dist/resources/index.js +29 -0
  150. package/dist/resources/index.js.map +1 -0
  151. package/dist/resources/schema.d.ts +22 -0
  152. package/dist/resources/schema.d.ts.map +1 -0
  153. package/dist/resources/schema.js +67 -0
  154. package/dist/resources/schema.js.map +1 -0
  155. package/dist/schemas/config.schema.d.ts +46 -0
  156. package/dist/schemas/config.schema.d.ts.map +1 -0
  157. package/dist/schemas/config.schema.js +48 -0
  158. package/dist/schemas/config.schema.js.map +1 -0
  159. package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
  160. package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
  161. package/dist/sdk/__tests__/apr-service.test.js +385 -0
  162. package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
  163. package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
  164. package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
  165. package/dist/sdk/__tests__/math-utils.test.js +185 -0
  166. package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
  167. package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
  168. package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
  169. package/dist/sdk/__tests__/simulation-service.test.js +397 -0
  170. package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
  171. package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
  172. package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
  173. package/dist/sdk/__tests__/vault-utils.test.js +189 -0
  174. package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
  175. package/dist/sdk/apr-service.d.ts +101 -0
  176. package/dist/sdk/apr-service.d.ts.map +1 -0
  177. package/dist/sdk/apr-service.js +175 -0
  178. package/dist/sdk/apr-service.js.map +1 -0
  179. package/dist/sdk/math-utils.d.ts +138 -0
  180. package/dist/sdk/math-utils.d.ts.map +1 -0
  181. package/dist/sdk/math-utils.js +218 -0
  182. package/dist/sdk/math-utils.js.map +1 -0
  183. package/dist/sdk/simulation-service.d.ts +106 -0
  184. package/dist/sdk/simulation-service.d.ts.map +1 -0
  185. package/dist/sdk/simulation-service.js +143 -0
  186. package/dist/sdk/simulation-service.js.map +1 -0
  187. package/dist/sdk/vault-utils.d.ts +125 -0
  188. package/dist/sdk/vault-utils.d.ts.map +1 -0
  189. package/dist/sdk/vault-utils.js +165 -0
  190. package/dist/sdk/vault-utils.js.map +1 -0
  191. package/dist/server.d.ts +21 -0
  192. package/dist/server.d.ts.map +1 -0
  193. package/dist/server.js +225 -0
  194. package/dist/server.js.map +1 -0
  195. package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
  196. package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
  197. package/dist/services/analytics/protocol-overview.service.js +182 -0
  198. package/dist/services/analytics/protocol-overview.service.js.map +1 -0
  199. package/dist/services/analytics/risk.service.d.ts +92 -0
  200. package/dist/services/analytics/risk.service.d.ts.map +1 -0
  201. package/dist/services/analytics/risk.service.js +423 -0
  202. package/dist/services/analytics/risk.service.js.map +1 -0
  203. package/dist/services/base.service.d.ts +39 -0
  204. package/dist/services/base.service.d.ts.map +1 -0
  205. package/dist/services/base.service.js +37 -0
  206. package/dist/services/base.service.js.map +1 -0
  207. package/dist/services/index.d.ts +30 -0
  208. package/dist/services/index.d.ts.map +1 -0
  209. package/dist/services/index.js +101 -0
  210. package/dist/services/index.js.map +1 -0
  211. package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
  212. package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
  213. package/dist/tools/__tests__/simulate-vault.test.js +363 -0
  214. package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
  215. package/dist/tools/analyze-risk.d.ts +34 -0
  216. package/dist/tools/analyze-risk.d.ts.map +1 -0
  217. package/dist/tools/analyze-risk.js +100 -0
  218. package/dist/tools/analyze-risk.js.map +1 -0
  219. package/dist/tools/compare-vaults.d.ts +29 -0
  220. package/dist/tools/compare-vaults.d.ts.map +1 -0
  221. package/dist/tools/compare-vaults.js +285 -0
  222. package/dist/tools/compare-vaults.js.map +1 -0
  223. package/dist/tools/export-data.d.ts +34 -0
  224. package/dist/tools/export-data.d.ts.map +1 -0
  225. package/dist/tools/export-data.js +309 -0
  226. package/dist/tools/export-data.js.map +1 -0
  227. package/dist/tools/get-price-history.d.ts +29 -0
  228. package/dist/tools/get-price-history.d.ts.map +1 -0
  229. package/dist/tools/get-price-history.js +236 -0
  230. package/dist/tools/get-price-history.js.map +1 -0
  231. package/dist/tools/get-transactions.d.ts +29 -0
  232. package/dist/tools/get-transactions.d.ts.map +1 -0
  233. package/dist/tools/get-transactions.js +181 -0
  234. package/dist/tools/get-transactions.js.map +1 -0
  235. package/dist/tools/index.d.ts +26 -0
  236. package/dist/tools/index.d.ts.map +1 -0
  237. package/dist/tools/index.js +32 -0
  238. package/dist/tools/index.js.map +1 -0
  239. package/dist/tools/optimize-portfolio.d.ts +37 -0
  240. package/dist/tools/optimize-portfolio.d.ts.map +1 -0
  241. package/dist/tools/optimize-portfolio.js +459 -0
  242. package/dist/tools/optimize-portfolio.js.map +1 -0
  243. package/dist/tools/predict-yield.d.ts +30 -0
  244. package/dist/tools/predict-yield.d.ts.map +1 -0
  245. package/dist/tools/predict-yield.js +248 -0
  246. package/dist/tools/predict-yield.js.map +1 -0
  247. package/dist/tools/query-graphql.d.ts +35 -0
  248. package/dist/tools/query-graphql.d.ts.map +1 -0
  249. package/dist/tools/query-graphql.js +54 -0
  250. package/dist/tools/query-graphql.js.map +1 -0
  251. package/dist/tools/registry.d.ts +42 -0
  252. package/dist/tools/registry.d.ts.map +1 -0
  253. package/dist/tools/registry.js +231 -0
  254. package/dist/tools/registry.js.map +1 -0
  255. package/dist/tools/search-vaults.d.ts +40 -0
  256. package/dist/tools/search-vaults.d.ts.map +1 -0
  257. package/dist/tools/search-vaults.js +184 -0
  258. package/dist/tools/search-vaults.js.map +1 -0
  259. package/dist/tools/simulate-vault.d.ts +80 -0
  260. package/dist/tools/simulate-vault.d.ts.map +1 -0
  261. package/dist/tools/simulate-vault.js +281 -0
  262. package/dist/tools/simulate-vault.js.map +1 -0
  263. package/dist/tools/user-portfolio.d.ts +30 -0
  264. package/dist/tools/user-portfolio.d.ts.map +1 -0
  265. package/dist/tools/user-portfolio.js +142 -0
  266. package/dist/tools/user-portfolio.js.map +1 -0
  267. package/dist/tools/vault-data.d.ts +23 -0
  268. package/dist/tools/vault-data.d.ts.map +1 -0
  269. package/dist/tools/vault-data.js +68 -0
  270. package/dist/tools/vault-data.js.map +1 -0
  271. package/dist/tools/vault-performance.d.ts +30 -0
  272. package/dist/tools/vault-performance.d.ts.map +1 -0
  273. package/dist/tools/vault-performance.js +275 -0
  274. package/dist/tools/vault-performance.js.map +1 -0
  275. package/dist/types/generated.d.ts +1109 -0
  276. package/dist/types/generated.d.ts.map +1 -0
  277. package/dist/types/generated.js +2 -0
  278. package/dist/types/generated.js.map +1 -0
  279. package/dist/types/index.d.ts +46 -0
  280. package/dist/types/index.d.ts.map +1 -0
  281. package/dist/types/index.js +8 -0
  282. package/dist/types/index.js.map +1 -0
  283. package/dist/utils/comparison-metrics.d.ts +120 -0
  284. package/dist/utils/comparison-metrics.d.ts.map +1 -0
  285. package/dist/utils/comparison-metrics.js +215 -0
  286. package/dist/utils/comparison-metrics.js.map +1 -0
  287. package/dist/utils/config-loader.d.ts +17 -0
  288. package/dist/utils/config-loader.d.ts.map +1 -0
  289. package/dist/utils/config-loader.js +45 -0
  290. package/dist/utils/config-loader.js.map +1 -0
  291. package/dist/utils/csv-generator.d.ts +89 -0
  292. package/dist/utils/csv-generator.d.ts.map +1 -0
  293. package/dist/utils/csv-generator.js +97 -0
  294. package/dist/utils/csv-generator.js.map +1 -0
  295. package/dist/utils/disclaimers.d.ts +70 -0
  296. package/dist/utils/disclaimers.d.ts.map +1 -0
  297. package/dist/utils/disclaimers.js +161 -0
  298. package/dist/utils/disclaimers.js.map +1 -0
  299. package/dist/utils/errors.d.ts +66 -0
  300. package/dist/utils/errors.d.ts.map +1 -0
  301. package/dist/utils/errors.js +86 -0
  302. package/dist/utils/errors.js.map +1 -0
  303. package/dist/utils/execute-tool-with-cache.d.ts +97 -0
  304. package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
  305. package/dist/utils/execute-tool-with-cache.js +105 -0
  306. package/dist/utils/execute-tool-with-cache.js.map +1 -0
  307. package/dist/utils/portfolio-optimization.d.ts +100 -0
  308. package/dist/utils/portfolio-optimization.d.ts.map +1 -0
  309. package/dist/utils/portfolio-optimization.js +283 -0
  310. package/dist/utils/portfolio-optimization.js.map +1 -0
  311. package/dist/utils/risk-scoring.d.ts +226 -0
  312. package/dist/utils/risk-scoring.d.ts.map +1 -0
  313. package/dist/utils/risk-scoring.js +523 -0
  314. package/dist/utils/risk-scoring.js.map +1 -0
  315. package/dist/utils/tool-error-handler.d.ts +16 -0
  316. package/dist/utils/tool-error-handler.d.ts.map +1 -0
  317. package/dist/utils/tool-error-handler.js +43 -0
  318. package/dist/utils/tool-error-handler.js.map +1 -0
  319. package/dist/utils/tool-handler.d.ts +33 -0
  320. package/dist/utils/tool-handler.d.ts.map +1 -0
  321. package/dist/utils/tool-handler.js +59 -0
  322. package/dist/utils/tool-handler.js.map +1 -0
  323. package/dist/utils/tool-response.d.ts +16 -0
  324. package/dist/utils/tool-response.d.ts.map +1 -0
  325. package/dist/utils/tool-response.js +25 -0
  326. package/dist/utils/tool-response.js.map +1 -0
  327. package/dist/utils/validators.d.ts +359 -0
  328. package/dist/utils/validators.d.ts.map +1 -0
  329. package/dist/utils/validators.js +233 -0
  330. package/dist/utils/validators.js.map +1 -0
  331. package/dist/utils/yield-prediction.d.ts +69 -0
  332. package/dist/utils/yield-prediction.d.ts.map +1 -0
  333. package/dist/utils/yield-prediction.js +290 -0
  334. package/dist/utils/yield-prediction.js.map +1 -0
  335. package/package.json +83 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * compare_vaults Tool
3
+ *
4
+ * Side-by-side comparison of multiple vaults with normalized metrics and rankings.
5
+ * Supports comparing 2-10 vaults simultaneously.
6
+ *
7
+ * Use cases:
8
+ * - Evaluate investment opportunities across similar vaults
9
+ * - Identify best/worst performers in a category
10
+ * - Risk-adjusted return analysis
11
+ * - Performance: ~300 tokens per vault
12
+ *
13
+ * Cache strategy:
14
+ * - 15-minute TTL for comparison results
15
+ * - Cache key: compare:{sorted_addresses}:{chainId}
16
+ * - Cache hit rate target: 70-80%
17
+ * - Cache tags: [CacheTag.VAULT, CacheTag.ANALYTICS] for invalidation
18
+ */
19
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
20
+ import { COMPARE_VAULTS_QUERY } from '../graphql/queries/index.js';
21
+ import { normalizeAndRankVaults, generateComparisonSummary, formatComparisonTable, } from '../utils/comparison-metrics.js';
22
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
23
+ import { CacheTag } from '../core/cache-invalidation.js';
24
+ import { cacheKeys, cacheTTL } from '../cache/index.js';
25
+ import { createSuccessResponse } from '../utils/tool-response.js';
26
+ import { analyzeRisk } from '../utils/risk-scoring.js';
27
+ /**
28
+ * Convert VaultData to VaultComparisonData for metrics calculation
29
+ * Now includes 12-factor risk analysis
30
+ */
31
+ function convertToComparisonData(vault, chainId, allVaults) {
32
+ // Extract APR from nested state structure with proper null checking
33
+ // Use weekly or monthly linearNetApr as the primary APR metric
34
+ const weeklyApr = vault.state?.weeklyApr?.linearNetApr;
35
+ const monthlyApr = vault.state?.monthlyApr?.linearNetApr;
36
+ const apr = typeof weeklyApr === 'number' ? weeklyApr : typeof monthlyApr === 'number' ? monthlyApr : 0;
37
+ const tvl = vault.state?.totalAssetsUsd;
38
+ // Calculate risk score using existing risk analysis utility
39
+ let riskBreakdown;
40
+ try {
41
+ // Extract data for risk calculation
42
+ const vaultTVL = typeof tvl === 'number' ? tvl : 0;
43
+ const totalProtocolTVL = allVaults.reduce((sum, v) => sum + (v.state?.totalAssetsUsd || 0), 0);
44
+ // Age in days - default to 180 days (6 months) as we don't have creation timestamp
45
+ // This is a reasonable middle-ground assumption for risk calculation
46
+ const ageInDays = 180;
47
+ // Curator data (simplified - vault count = 1 for now, as we don't have curator history here)
48
+ const curatorVaultCount = vault.curators?.length || 1;
49
+ const curators = vault.curators || [];
50
+ const professionalSignals = {
51
+ hasWebsite: curators.some((c) => c.url && c.url.trim() !== ''),
52
+ hasDescription: curators.some((c) => c.aboutDescription && c.aboutDescription.trim() !== ''),
53
+ multipleCurators: curators.length > 1,
54
+ curatorCount: curators.length,
55
+ };
56
+ // Fee data
57
+ const managementFee = vault.state?.managementFee || 0;
58
+ const performanceFee = vault.state?.performanceFee || 0;
59
+ const pricePerShare = BigInt(vault.state?.pricePerShare || '0');
60
+ const highWaterMark = BigInt(vault.state?.highWaterMark || '0');
61
+ const performanceFeeActive = pricePerShare > highWaterMark;
62
+ // Liquidity data
63
+ const safeAssets = vault.state?.safeAssetBalanceUsd || 0;
64
+ const pendingRedemptions = vault.state?.pendingSettlement?.assetsUsd || 0;
65
+ // APR consistency data
66
+ const aprData = {
67
+ weeklyApr: vault.state?.weeklyApr?.linearNetApr,
68
+ monthlyApr: vault.state?.monthlyApr?.linearNetApr,
69
+ yearlyApr: vault.state?.yearlyApr?.linearNetApr,
70
+ inceptionApr: vault.state?.inceptionApr?.linearNetApr,
71
+ };
72
+ // Yield composition
73
+ const weeklyAprData = vault.state?.weeklyApr;
74
+ const yieldComposition = weeklyAprData
75
+ ? {
76
+ totalApr: weeklyAprData.linearNetApr || 0,
77
+ nativeYieldsApr: weeklyAprData.nativeYields?.reduce((sum, ny) => sum + (ny.apr || 0), 0) || 0,
78
+ airdropsApr: weeklyAprData.airdrops?.reduce((sum, ad) => sum + (ad.apr || 0), 0) || 0,
79
+ incentivesApr: weeklyAprData.incentives?.reduce((sum, inc) => sum + (inc.apr || 0), 0) || 0,
80
+ }
81
+ : undefined;
82
+ // Settlement data
83
+ const averageSettlement = vault.averageSettlement || 0;
84
+ const pendingOperationsRatio = safeAssets > 0 ? pendingRedemptions / safeAssets : 0;
85
+ const settlementData = {
86
+ averageSettlementDays: averageSettlement,
87
+ pendingOperationsRatio,
88
+ };
89
+ // Integration complexity
90
+ const integrationCount = vault.defiIntegrations?.length || 0;
91
+ // Capacity utilization
92
+ const totalAssets = parseFloat(vault.state?.totalAssets || '0');
93
+ const maxCapacity = vault.maxCapacity ? parseFloat(vault.maxCapacity) : null;
94
+ const capacityData = {
95
+ totalAssets,
96
+ maxCapacity,
97
+ };
98
+ // Price history (empty for now - would need separate query)
99
+ const priceHistory = [];
100
+ // Calculate risk
101
+ riskBreakdown = analyzeRisk({
102
+ tvl: vaultTVL,
103
+ totalProtocolTVL,
104
+ priceHistory,
105
+ ageInDays,
106
+ curatorVaultCount,
107
+ curatorSuccessRate: 0.5, // Default without historical data
108
+ curatorProfessionalSignals: professionalSignals,
109
+ managementFee,
110
+ performanceFee,
111
+ performanceFeeActive,
112
+ safeAssets,
113
+ pendingRedemptions,
114
+ aprData,
115
+ yieldComposition,
116
+ settlementData,
117
+ integrationCount,
118
+ capacityData,
119
+ });
120
+ }
121
+ catch (error) {
122
+ console.error(`Failed to calculate risk for vault ${vault.address}:`, error);
123
+ riskBreakdown = undefined;
124
+ }
125
+ return {
126
+ address: vault.address,
127
+ name: vault.name || 'Unknown Vault',
128
+ symbol: vault.symbol || 'N/A',
129
+ chainId: chainId,
130
+ tvl: typeof tvl === 'number' ? tvl : 0,
131
+ apr: apr,
132
+ totalShares: vault.state?.totalSupply,
133
+ totalAssets: vault.state?.totalAssets,
134
+ riskScore: riskBreakdown?.overallRisk,
135
+ riskLevel: riskBreakdown?.riskLevel,
136
+ riskBreakdown,
137
+ };
138
+ }
139
+ /**
140
+ * Build markdown output from comparison data
141
+ */
142
+ function buildComparisonMarkdown(summary, table, chainId, cached = false) {
143
+ const hasRiskData = summary.averageRisk !== undefined && summary.safestVault && summary.riskiestVault;
144
+ let markdown = cached
145
+ ? `# Vault Comparison Results (Cached)\n\n`
146
+ : `# Vault Comparison Results\n\n`;
147
+ markdown += `**Chain ID**: ${chainId}\n`;
148
+ markdown += `**Vaults Analyzed**: ${summary.totalVaults}\n\n`;
149
+ markdown += `## Summary Statistics\n\n`;
150
+ markdown += `- **Average TVL**: $${(summary.averageTvl / 1000000).toFixed(2)}M\n`;
151
+ markdown += `- **Average APR**: ${(summary.averageApr * 100).toFixed(2)}%\n`;
152
+ if (hasRiskData) {
153
+ markdown += `- **Average Risk**: ${(summary.averageRisk * 100).toFixed(1)}%\n`;
154
+ }
155
+ markdown += `\n### Best Performer\n`;
156
+ markdown += `- **Vault**: ${summary.bestPerformer.name}\n`;
157
+ markdown += `- **APR**: ${(summary.bestPerformer.apr * 100).toFixed(2)}%\n\n`;
158
+ markdown += `### Worst Performer\n`;
159
+ markdown += `- **Vault**: ${summary.worstPerformer.name}\n`;
160
+ markdown += `- **APR**: ${(summary.worstPerformer.apr * 100).toFixed(2)}%\n\n`;
161
+ markdown += `### Highest TVL\n`;
162
+ markdown += `- **Vault**: ${summary.highestTvl.name}\n`;
163
+ markdown += `- **TVL**: $${(summary.highestTvl.tvl / 1000000).toFixed(2)}M\n\n`;
164
+ markdown += `### Lowest TVL\n`;
165
+ markdown += `- **Vault**: ${summary.lowestTvl.name}\n`;
166
+ markdown += `- **TVL**: $${(summary.lowestTvl.tvl / 1000000).toFixed(2)}M\n\n`;
167
+ if (hasRiskData) {
168
+ markdown += `### Safest Vault\n`;
169
+ markdown += `- **Vault**: ${summary.safestVault.name}\n`;
170
+ markdown += `- **Risk Score**: ${(summary.safestVault.riskScore * 100).toFixed(1)}% (${summary.safestVault.riskLevel})\n\n`;
171
+ markdown += `### Riskiest Vault\n`;
172
+ markdown += `- **Vault**: ${summary.riskiestVault.name}\n`;
173
+ markdown += `- **Risk Score**: ${(summary.riskiestVault.riskScore * 100).toFixed(1)}% (${summary.riskiestVault.riskLevel})\n\n`;
174
+ }
175
+ markdown += `## Detailed Comparison\n\n`;
176
+ markdown += `${table}\n\n`;
177
+ markdown += `**Legend**:\n`;
178
+ markdown += `- **Rank**: Overall ranking based on weighted score`;
179
+ if (hasRiskData) {
180
+ markdown += ` (40% APR, 30% TVL, 30% Safety)\n`;
181
+ }
182
+ else {
183
+ markdown += ` (60% APR, 40% TVL)\n`;
184
+ }
185
+ markdown += `- **Score**: Overall performance score (0-100)\n`;
186
+ markdown += `- **TVL Δ**: Delta from average TVL (%)\n`;
187
+ markdown += `- **APR Δ**: Delta from average APR (%)\n`;
188
+ if (hasRiskData) {
189
+ markdown += `- **Risk**: 12-factor risk score (🟢 Low, 🟡 Medium, 🟠 High, 🔴 Critical)\n`;
190
+ markdown += `- **Risk Δ**: Delta from average risk (%)\n`;
191
+ }
192
+ return markdown;
193
+ }
194
+ /**
195
+ * Transform raw GraphQL response into comparison markdown output
196
+ * Uses closure to capture input values
197
+ */
198
+ function createTransformComparisonData(input) {
199
+ return (data) => {
200
+ // Convert to comparison data
201
+ const comparisonData = data.vaults.items.map((vault) => convertToComparisonData(vault, input.chainId, data.vaults.items));
202
+ // Normalize and rank vaults
203
+ const normalizedVaults = normalizeAndRankVaults(comparisonData);
204
+ // Generate summary statistics
205
+ const summary = generateComparisonSummary(comparisonData);
206
+ // Format as markdown table
207
+ const table = formatComparisonTable(normalizedVaults);
208
+ // Build output markdown
209
+ const markdown = buildComparisonMarkdown(summary, table, input.chainId, false);
210
+ return { markdown };
211
+ };
212
+ }
213
+ /**
214
+ * Create the executeCompareVaults function with DI container
215
+ *
216
+ * @param container - Service container with dependencies
217
+ * @returns Configured tool executor function
218
+ */
219
+ export function createExecuteCompareVaults(container) {
220
+ return async (input) => {
221
+ // NEW: Cache cascade pattern - check fragment cache for ALL vaults
222
+ const cachedVaults = [];
223
+ let allCached = true;
224
+ for (const address of input.vaultAddresses) {
225
+ const vaultCacheKey = cacheKeys.vaultData(address, input.chainId);
226
+ const cachedVault = container.cache.get(vaultCacheKey);
227
+ if (cachedVault) {
228
+ cachedVaults.push(cachedVault);
229
+ }
230
+ else {
231
+ allCached = false;
232
+ break; // If any vault is missing, we need to query all
233
+ }
234
+ }
235
+ // If ALL vaults are cached, return immediately without GraphQL query
236
+ if (allCached && cachedVaults.length === input.vaultAddresses.length) {
237
+ const comparisonData = cachedVaults.map((vault) => convertToComparisonData(vault, input.chainId, cachedVaults));
238
+ const normalizedVaults = normalizeAndRankVaults(comparisonData);
239
+ const summary = generateComparisonSummary(comparisonData);
240
+ const table = formatComparisonTable(normalizedVaults);
241
+ const markdown = buildComparisonMarkdown(summary, table, input.chainId, true);
242
+ return createSuccessResponse({ markdown });
243
+ }
244
+ // Not all vaults cached - execute normal GraphQL query for all vaults
245
+ const executor = executeToolWithCache({
246
+ container,
247
+ cacheKey: (input) => cacheKeys.compareVaults(input.vaultAddresses, input.chainId),
248
+ cacheTTL: cacheTTL.comparison,
249
+ query: COMPARE_VAULTS_QUERY,
250
+ variables: (input) => ({
251
+ addresses: input.vaultAddresses,
252
+ chainId: input.chainId,
253
+ }),
254
+ validateResult: (data) => ({
255
+ valid: !!(data.vaults?.items && data.vaults.items.length > 0),
256
+ message: data.vaults?.items && data.vaults.items.length > 0
257
+ ? undefined
258
+ : `No vaults found for the provided addresses on chain ${input.chainId}`,
259
+ }),
260
+ transformResult: createTransformComparisonData(input),
261
+ toolName: 'compare_vaults',
262
+ });
263
+ // Register cache tags for invalidation
264
+ const cacheKey = cacheKeys.compareVaults(input.vaultAddresses, input.chainId);
265
+ container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT, CacheTag.ANALYTICS]);
266
+ // Execute GraphQL query for all vaults
267
+ const result = await executor(input);
268
+ // Transform JSON output to markdown text format with legal disclaimer
269
+ if (!result.isError && result.content[0]?.type === 'text') {
270
+ try {
271
+ const output = JSON.parse(result.content[0].text);
272
+ result.content[0].text = output.markdown + getToolDisclaimer('compare_vaults');
273
+ // NEW: Cache each vault individually for future reuse
274
+ // This enables vault_data and other tools to reuse these vaults
275
+ // Note: The raw vault data needs to be extracted before transformation
276
+ // For now, we rely on the comparison cache itself
277
+ }
278
+ catch (error) {
279
+ console.error('Failed to parse comparison output:', error);
280
+ }
281
+ }
282
+ return result;
283
+ };
284
+ }
285
+ //# sourceMappingURL=compare-vaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-vaults.js","sourceRoot":"","sources":["../../src/tools/compare-vaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * export_data Tool
3
+ *
4
+ * Export vault data, transactions, price history, or performance metrics in CSV or JSON format.
5
+ * Supports multiple data types and formats for integration with external tools and analysis.
6
+ *
7
+ * Use cases:
8
+ * - Export vault data for spreadsheet analysis
9
+ * - Generate transaction reports for accounting
10
+ * - Export price history for charting tools
11
+ * - Create performance datasets for custom analytics
12
+ * - Performance: ~200-400 tokens per export depending on data size
13
+ *
14
+ * Cache strategy:
15
+ * - No caching (exports are generated on-demand with latest data)
16
+ *
17
+ * WHY NO CACHING?
18
+ * This tool is intentionally non-cached because:
19
+ * 1. Export format/data type varies per request (CSV/JSON, vaults/transactions/etc)
20
+ * 2. Exports need fresh data (no staleness tolerance)
21
+ * 3. Large dataset exports would waste cache memory
22
+ * 4. One-time use exports (unlikely to be re-requested with same parameters)
23
+ */
24
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
25
+ import { ExportDataInput } from '../utils/validators.js';
26
+ import { ServiceContainer } from '../core/container.js';
27
+ /**
28
+ * Create the executeExportData function with DI container
29
+ *
30
+ * @param container - Service container with dependencies
31
+ * @returns Configured tool executor function
32
+ */
33
+ export declare function createExecuteExportData(container: ServiceContainer): (input: ExportDataInput) => Promise<CallToolResult>;
34
+ //# sourceMappingURL=export-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-data.d.ts","sourceRoot":"","sources":["../../src/tools/export-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAqBzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA0BxD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAoCrD"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * export_data Tool
3
+ *
4
+ * Export vault data, transactions, price history, or performance metrics in CSV or JSON format.
5
+ * Supports multiple data types and formats for integration with external tools and analysis.
6
+ *
7
+ * Use cases:
8
+ * - Export vault data for spreadsheet analysis
9
+ * - Generate transaction reports for accounting
10
+ * - Export price history for charting tools
11
+ * - Create performance datasets for custom analytics
12
+ * - Performance: ~200-400 tokens per export depending on data size
13
+ *
14
+ * Cache strategy:
15
+ * - No caching (exports are generated on-demand with latest data)
16
+ *
17
+ * WHY NO CACHING?
18
+ * This tool is intentionally non-cached because:
19
+ * 1. Export format/data type varies per request (CSV/JSON, vaults/transactions/etc)
20
+ * 2. Exports need fresh data (no staleness tolerance)
21
+ * 3. Large dataset exports would waste cache memory
22
+ * 4. One-time use exports (unlikely to be re-requested with same parameters)
23
+ */
24
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
25
+ import { handleToolError } from '../utils/tool-error-handler.js';
26
+ import { calculatePricePerShare } from '../sdk/vault-utils.js';
27
+ import { EXPORT_VAULTS_QUERY, EXPORT_TRANSACTIONS_QUERY, EXPORT_PRICE_HISTORY_QUERY, EXPORT_PERFORMANCE_QUERY, } from '../graphql/queries/index.js';
28
+ import { generateVaultCSV, generateTransactionCSV, generatePriceHistoryCSV, generatePerformanceCSV, } from '../utils/csv-generator.js';
29
+ /**
30
+ * Convert VaultData to CSV format
31
+ */
32
+ function convertVaultToCSV(vault, chainId) {
33
+ const weeklyApr = vault.state?.weeklyApr?.linearNetApr;
34
+ const monthlyApr = vault.state?.monthlyApr?.linearNetApr;
35
+ const apr = typeof weeklyApr === 'number' ? weeklyApr : typeof monthlyApr === 'number' ? monthlyApr : 0;
36
+ return {
37
+ address: vault.address,
38
+ name: vault.name || 'Unknown',
39
+ symbol: vault.symbol || 'N/A',
40
+ chainId,
41
+ tvl: vault.state?.totalAssetsUsd || 0,
42
+ apr,
43
+ pricePerShare: vault.state?.pricePerShareUsd || 0,
44
+ totalAssets: vault.state?.totalAssets || '0',
45
+ totalShares: vault.state?.totalSupply || '0',
46
+ assetSymbol: vault.asset?.symbol || 'N/A',
47
+ assetAddress: vault.asset?.address || '0x0',
48
+ };
49
+ }
50
+ /**
51
+ * Create the executeExportData function with DI container
52
+ *
53
+ * @param container - Service container with dependencies
54
+ * @returns Configured tool executor function
55
+ */
56
+ export function createExecuteExportData(container) {
57
+ return async (input) => {
58
+ try {
59
+ // Validate input
60
+ // Input already validated by createToolHandler
61
+ // Route to appropriate export handler
62
+ switch (input.dataType) {
63
+ case 'vaults':
64
+ return await exportVaults(container, input);
65
+ case 'transactions':
66
+ return await exportTransactions(container, input);
67
+ case 'price_history':
68
+ return await exportPriceHistory(container, input);
69
+ case 'performance':
70
+ return await exportPerformance(container, input);
71
+ default:
72
+ // Exhaustiveness check - all data types should be handled above
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: `Unknown data type: ${String(input.dataType)}`,
78
+ },
79
+ ],
80
+ isError: true,
81
+ };
82
+ }
83
+ }
84
+ catch (error) {
85
+ return handleToolError(error, 'export_data');
86
+ }
87
+ };
88
+ }
89
+ /**
90
+ * Export vault data
91
+ */
92
+ async function exportVaults(container, input) {
93
+ const data = await container.graphqlClient.request(EXPORT_VAULTS_QUERY, {
94
+ addresses: input.vaultAddresses,
95
+ chainId: input.chainId,
96
+ });
97
+ if (!data.vaults || !data.vaults.items || data.vaults.items.length === 0) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: `No vaults found for the provided addresses on chain ${input.chainId}`,
103
+ },
104
+ ],
105
+ isError: false,
106
+ };
107
+ }
108
+ const csvData = data.vaults.items.map((vault) => convertVaultToCSV(vault, input.chainId));
109
+ if (input.format === 'csv') {
110
+ const csv = generateVaultCSV(csvData);
111
+ return {
112
+ content: [
113
+ {
114
+ type: 'text',
115
+ text: `# Vault Data Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Vaults${getToolDisclaimer('export_data')}`,
116
+ },
117
+ ],
118
+ isError: false,
119
+ };
120
+ }
121
+ else {
122
+ // JSON format
123
+ return {
124
+ content: [
125
+ {
126
+ type: 'text',
127
+ text: `# Vault Data Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Vaults${getToolDisclaimer('export_data')}`,
128
+ },
129
+ ],
130
+ isError: false,
131
+ };
132
+ }
133
+ }
134
+ /**
135
+ * Export transaction data
136
+ */
137
+ async function exportTransactions(container, input) {
138
+ const data = await container.graphqlClient.request(EXPORT_TRANSACTIONS_QUERY, {
139
+ vault_in: input.vaultAddresses,
140
+ chainId: input.chainId,
141
+ first: 1000,
142
+ });
143
+ if (!data.transactions || data.transactions.items.length === 0) {
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: `No transactions found for the provided vault addresses on chain ${input.chainId}`,
149
+ },
150
+ ],
151
+ isError: false,
152
+ };
153
+ }
154
+ const csvData = data.transactions.items.map((tx) => {
155
+ const txData = tx.data;
156
+ return {
157
+ id: tx.id,
158
+ type: tx.type,
159
+ timestamp: new Date(parseInt(tx.timestamp, 10) * 1000).toISOString(),
160
+ blockNumber: tx.blockNumber,
161
+ vaultAddress: tx.vault.address,
162
+ userAddress: txData.user,
163
+ amount: txData.assets,
164
+ shares: txData.shares,
165
+ assets: txData.assets,
166
+ };
167
+ });
168
+ const disclaimer = getToolDisclaimer('export_data');
169
+ if (input.format === 'csv') {
170
+ const csv = generateTransactionCSV(csvData);
171
+ return {
172
+ content: [
173
+ {
174
+ type: 'text',
175
+ text: `# Transaction Data Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Transactions${disclaimer}`,
176
+ },
177
+ ],
178
+ isError: false,
179
+ };
180
+ }
181
+ else {
182
+ return {
183
+ content: [
184
+ {
185
+ type: 'text',
186
+ text: `# Transaction Data Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Transactions${disclaimer}`,
187
+ },
188
+ ],
189
+ isError: false,
190
+ };
191
+ }
192
+ }
193
+ /**
194
+ * Export price history data
195
+ */
196
+ async function exportPriceHistory(container, input) {
197
+ const data = await container.graphqlClient.request(EXPORT_PRICE_HISTORY_QUERY, {
198
+ vault_in: input.vaultAddresses,
199
+ first: 1000,
200
+ });
201
+ if (!data.transactions || data.transactions.items.length === 0) {
202
+ return {
203
+ content: [
204
+ {
205
+ type: 'text',
206
+ text: `No price history found for the provided vault addresses`,
207
+ },
208
+ ],
209
+ isError: false,
210
+ };
211
+ }
212
+ // Aggregate by day for OHLCV
213
+ const dayBuckets = new Map();
214
+ for (const tx of data.transactions.items) {
215
+ const date = new Date(parseInt(tx.timestamp, 10) * 1000).toISOString().split('T')[0];
216
+ if (!dayBuckets.has(date)) {
217
+ dayBuckets.set(date, []);
218
+ }
219
+ // Calculate price per share using Lagoon SDK
220
+ const vaultDecimals = tx.data.vault.decimals ?? 18;
221
+ const assetDecimals = tx.data.vault.asset.decimals;
222
+ const pricePerShareBigInt = calculatePricePerShare(BigInt(tx.data.totalAssets), BigInt(tx.data.totalSupply), vaultDecimals, assetDecimals);
223
+ // Convert to number for OHLCV export (in asset decimals)
224
+ const pricePerShare = Number(pricePerShareBigInt) / 10 ** assetDecimals;
225
+ dayBuckets.get(date).push(pricePerShare);
226
+ }
227
+ const csvData = Array.from(dayBuckets.entries())
228
+ .sort((a, b) => a[0].localeCompare(b[0]))
229
+ .map(([date, prices]) => ({
230
+ date,
231
+ open: prices[0],
232
+ high: Math.max(...prices),
233
+ low: Math.min(...prices),
234
+ close: prices[prices.length - 1],
235
+ volume: prices.length,
236
+ }));
237
+ if (input.format === 'csv') {
238
+ const csv = generatePriceHistoryCSV(csvData);
239
+ return {
240
+ content: [
241
+ {
242
+ type: 'text',
243
+ text: `# Price History Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Price History (OHLCV)`,
244
+ },
245
+ ],
246
+ isError: false,
247
+ };
248
+ }
249
+ else {
250
+ return {
251
+ content: [
252
+ {
253
+ type: 'text',
254
+ text: `# Price History Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Price History (OHLCV)`,
255
+ },
256
+ ],
257
+ isError: false,
258
+ };
259
+ }
260
+ }
261
+ /**
262
+ * Export performance metrics
263
+ */
264
+ async function exportPerformance(container, input) {
265
+ const data = await container.graphqlClient.request(EXPORT_PERFORMANCE_QUERY, {
266
+ vault_in: input.vaultAddresses,
267
+ first: 1000,
268
+ });
269
+ if (!data.transactions || data.transactions.items.length === 0) {
270
+ return {
271
+ content: [
272
+ {
273
+ type: 'text',
274
+ text: `No performance data found for the provided vault addresses`,
275
+ },
276
+ ],
277
+ isError: false,
278
+ };
279
+ }
280
+ const csvData = data.transactions.items.map((tx) => ({
281
+ timestamp: new Date(parseInt(tx.timestamp, 10) * 1000).toISOString(),
282
+ totalAssetsUsd: tx.data.totalAssetsUsd,
283
+ blockNumber: tx.blockNumber,
284
+ }));
285
+ if (input.format === 'csv') {
286
+ const csv = generatePerformanceCSV(csvData);
287
+ return {
288
+ content: [
289
+ {
290
+ type: 'text',
291
+ text: `# Performance Metrics Export (CSV)\n\n\`\`\`csv\n${csv}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: CSV\n**Data Type**: Performance Metrics`,
292
+ },
293
+ ],
294
+ isError: false,
295
+ };
296
+ }
297
+ else {
298
+ return {
299
+ content: [
300
+ {
301
+ type: 'text',
302
+ text: `# Performance Metrics Export (JSON)\n\n\`\`\`json\n${JSON.stringify(csvData, null, 2)}\n\`\`\`\n\n**Records**: ${csvData.length}\n**Format**: JSON\n**Data Type**: Performance Metrics`,
303
+ },
304
+ ],
305
+ isError: false,
306
+ };
307
+ }
308
+ }
309
+ //# sourceMappingURL=export-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-data.js","sourceRoot":"","sources":["../../src/tools/export-data.ts"],"names":[],"mappings":"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"}