@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,97 @@
1
+ /**
2
+ * Execute Tool With Cache Abstraction
3
+ *
4
+ * Generic caching wrapper for tools that follow the pattern:
5
+ * 1. Check cache
6
+ * 2. Execute GraphQL query on cache miss
7
+ * 3. Validate result (optional)
8
+ * 4. Transform result (optional)
9
+ * 5. Cache and return
10
+ *
11
+ * Eliminates code duplication across 10+ tools with caching logic.
12
+ */
13
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
14
+ import { ServiceContainer } from '../core/container.js';
15
+ /**
16
+ * Cache key generator function
17
+ */
18
+ export type CacheKeyGenerator<TInput> = (input: TInput) => string;
19
+ /**
20
+ * GraphQL variables mapper function
21
+ */
22
+ export type VariablesMapper<TInput, TVariables = TInput> = (input: TInput) => TVariables;
23
+ /**
24
+ * Result validator function
25
+ */
26
+ export interface ValidationResult {
27
+ valid: boolean;
28
+ message?: string;
29
+ isError?: boolean;
30
+ }
31
+ export type ResultValidator<TOutput> = (data: TOutput) => ValidationResult;
32
+ /**
33
+ * Result transformer function
34
+ */
35
+ export type ResultTransformer<TOutput, TTransformed = TOutput> = (data: TOutput) => TTransformed;
36
+ /**
37
+ * Configuration for cached tool execution
38
+ */
39
+ export interface CachedToolOptions<TInput, TOutput, TVariables = TInput, TTransformed = TOutput> {
40
+ /** Service container with dependencies */
41
+ container: ServiceContainer;
42
+ /** Cache key generator from input */
43
+ cacheKey: CacheKeyGenerator<TInput>;
44
+ /** Cache TTL in seconds */
45
+ cacheTTL: number;
46
+ /** GraphQL query string */
47
+ query: string;
48
+ /** Map input to GraphQL variables */
49
+ variables: VariablesMapper<TInput, TVariables>;
50
+ /** Validate query result (optional) */
51
+ validateResult?: ResultValidator<TOutput>;
52
+ /** Transform result before caching/returning (optional) */
53
+ transformResult?: ResultTransformer<TOutput, TTransformed>;
54
+ /** Tool name for error reporting */
55
+ toolName: string;
56
+ }
57
+ /**
58
+ * Create a cached tool executor
59
+ *
60
+ * Returns an async function that executes the tool with caching logic.
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const executeGetVaultData = executeToolWithCache<GetVaultDataInput, VaultDataResponse>({
65
+ * container,
66
+ * cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
67
+ * cacheTTL: cacheTTL.vaultData,
68
+ * query: GET_VAULT_DATA_QUERY,
69
+ * variables: (input) => ({ address: input.vaultAddress, chainId: input.chainId }),
70
+ * validateResult: (data) => ({
71
+ * valid: !!data.vaultByAddress,
72
+ * message: data.vaultByAddress ? undefined : 'Vault not found',
73
+ * }),
74
+ * toolName: 'get_vault_data',
75
+ * });
76
+ * ```
77
+ */
78
+ export declare function executeToolWithCache<TInput, TOutput, TVariables = TInput, TTransformed = TOutput>(options: CachedToolOptions<TInput, TOutput, TVariables, TTransformed>): (input: TInput) => Promise<CallToolResult>;
79
+ /**
80
+ * Create a simple cached tool executor without validation or transformation
81
+ *
82
+ * Simplified version for tools that don't need validation or transformation.
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const executeSimpleTool = createSimpleCachedTool({
87
+ * container,
88
+ * cacheKey: (input) => `tool:${input.id}`,
89
+ * cacheTTL: 300,
90
+ * query: SIMPLE_QUERY,
91
+ * variables: (input) => ({ id: input.id }),
92
+ * toolName: 'simple_tool',
93
+ * });
94
+ * ```
95
+ */
96
+ export declare function createSimpleCachedTool<TInput, TOutput, TVariables = TInput>(options: Omit<CachedToolOptions<TInput, TOutput, TVariables, TOutput>, 'validateResult' | 'transformResult'>): (input: TInput) => Promise<CallToolResult>;
97
+ //# sourceMappingURL=execute-tool-with-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-tool-with-cache.d.ts","sourceRoot":"","sources":["../../src/utils/execute-tool-with-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,YAAY,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,YAAY,GAAG,OAAO;IAC7F,0CAA0C;IAC1C,SAAS,EAAE,gBAAgB,CAAC;IAE5B,qCAAqC;IACrC,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEpC,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,qCAAqC;IACrC,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE/C,uCAAuC;IACvC,cAAc,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,2DAA2D;IAC3D,eAAe,CAAC,EAAE,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE3D,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,YAAY,GAAG,OAAO,EAC/F,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GACpE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CA0D5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,EACzE,OAAO,EAAE,IAAI,CACX,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EACvD,gBAAgB,GAAG,iBAAiB,CACrC,GACA,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAM5C"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Execute Tool With Cache Abstraction
3
+ *
4
+ * Generic caching wrapper for tools that follow the pattern:
5
+ * 1. Check cache
6
+ * 2. Execute GraphQL query on cache miss
7
+ * 3. Validate result (optional)
8
+ * 4. Transform result (optional)
9
+ * 5. Cache and return
10
+ *
11
+ * Eliminates code duplication across 10+ tools with caching logic.
12
+ */
13
+ import { handleToolError } from './tool-error-handler.js';
14
+ import { createSuccessResponse } from './tool-response.js';
15
+ /**
16
+ * Create a cached tool executor
17
+ *
18
+ * Returns an async function that executes the tool with caching logic.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const executeGetVaultData = executeToolWithCache<GetVaultDataInput, VaultDataResponse>({
23
+ * container,
24
+ * cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
25
+ * cacheTTL: cacheTTL.vaultData,
26
+ * query: GET_VAULT_DATA_QUERY,
27
+ * variables: (input) => ({ address: input.vaultAddress, chainId: input.chainId }),
28
+ * validateResult: (data) => ({
29
+ * valid: !!data.vaultByAddress,
30
+ * message: data.vaultByAddress ? undefined : 'Vault not found',
31
+ * }),
32
+ * toolName: 'get_vault_data',
33
+ * });
34
+ * ```
35
+ */
36
+ export function executeToolWithCache(options) {
37
+ const { container, cacheKey, cacheTTL, query, variables, validateResult, transformResult, toolName, } = options;
38
+ return async (input) => {
39
+ try {
40
+ // 1. Generate cache key
41
+ const key = cacheKey(input);
42
+ // 2. Check cache
43
+ const cached = container.cache.get(key);
44
+ if (cached) {
45
+ const result = transformResult
46
+ ? transformResult(cached)
47
+ : cached;
48
+ return createSuccessResponse(result);
49
+ }
50
+ // 3. Execute GraphQL query
51
+ const queryVariables = variables(input);
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
53
+ const data = await container.graphqlClient.request(query, queryVariables);
54
+ // 4. Validate result
55
+ if (validateResult) {
56
+ const validation = validateResult(data);
57
+ if (!validation.valid) {
58
+ return {
59
+ content: [
60
+ {
61
+ type: 'text',
62
+ text: validation.message || 'Invalid data returned from query',
63
+ },
64
+ ],
65
+ // Use validator's isError flag, default to false for backward compatibility (no data = not an error)
66
+ isError: validation.isError ?? false,
67
+ };
68
+ }
69
+ }
70
+ // 5. Cache result
71
+ container.cache.set(key, data, cacheTTL);
72
+ // 6. Transform and return
73
+ const result = transformResult ? transformResult(data) : data;
74
+ return createSuccessResponse(result);
75
+ }
76
+ catch (error) {
77
+ return handleToolError(error, toolName);
78
+ }
79
+ };
80
+ }
81
+ /**
82
+ * Create a simple cached tool executor without validation or transformation
83
+ *
84
+ * Simplified version for tools that don't need validation or transformation.
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const executeSimpleTool = createSimpleCachedTool({
89
+ * container,
90
+ * cacheKey: (input) => `tool:${input.id}`,
91
+ * cacheTTL: 300,
92
+ * query: SIMPLE_QUERY,
93
+ * variables: (input) => ({ id: input.id }),
94
+ * toolName: 'simple_tool',
95
+ * });
96
+ * ```
97
+ */
98
+ export function createSimpleCachedTool(options) {
99
+ return executeToolWithCache({
100
+ ...options,
101
+ validateResult: undefined,
102
+ transformResult: undefined,
103
+ });
104
+ }
105
+ //# sourceMappingURL=execute-tool-with-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-tool-with-cache.js","sourceRoot":"","sources":["../../src/utils/execute-tool-with-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAyD3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAqE;IAErE,MAAM,EACJ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,QAAQ,GACT,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,EAAE,KAAa,EAA2B,EAAE;QACtD,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE5B,iBAAiB;YACjB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAU,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,eAAe;oBAC5B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC;oBACzB,CAAC,CAAE,MAAkC,CAAC;gBACxC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,2BAA2B;YAC3B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YACxC,qGAAqG;YACrG,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAU,KAAK,EAAE,cAAqB,CAAC,CAAC;YAE1F,qBAAqB;YACrB,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,kCAAkC;6BAC/D;yBACF;wBACD,qGAAqG;wBACrG,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;qBACrC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAEzC,0BAA0B;YAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAgC,CAAC;YAC3F,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAGC;IAED,OAAO,oBAAoB,CAAuC;QAChE,GAAG,OAAO;QACV,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,SAAS;KAC3B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Portfolio Optimization Utility
3
+ *
4
+ * Portfolio allocation and rebalancing algorithms for optimal vault distribution.
5
+ * Provides risk-adjusted portfolio recommendations and rebalancing guidance.
6
+ */
7
+ import { RiskScoreBreakdown } from './risk-scoring.js';
8
+ /**
9
+ * Portfolio position with current and target allocations
10
+ */
11
+ export interface PortfolioPosition {
12
+ vaultAddress: string;
13
+ vaultName: string;
14
+ chainId: number;
15
+ currentAllocation: number;
16
+ targetAllocation: number;
17
+ currentValueUsd: number;
18
+ targetValueUsd: number;
19
+ rebalanceAmount: number;
20
+ rebalancePercentage: number;
21
+ vault: VaultForOptimization;
22
+ }
23
+ /**
24
+ * Portfolio optimization result
25
+ */
26
+ export interface PortfolioOptimization {
27
+ strategy: 'equal_weight' | 'risk_parity' | 'max_sharpe' | 'min_variance';
28
+ totalValueUsd: number;
29
+ positions: PortfolioPosition[];
30
+ metrics: {
31
+ expectedReturn: number;
32
+ portfolioRisk: number;
33
+ sharpeRatio: number;
34
+ diversificationScore: number;
35
+ };
36
+ rebalanceNeeded: boolean;
37
+ rebalanceThreshold: number;
38
+ recommendations: string[];
39
+ }
40
+ /**
41
+ * Vault data for portfolio optimization
42
+ */
43
+ export interface VaultForOptimization {
44
+ address: string;
45
+ name: string;
46
+ chainId: number;
47
+ currentValueUsd: number;
48
+ expectedApr: number;
49
+ volatility: number;
50
+ riskScore: number;
51
+ riskBreakdown?: RiskScoreBreakdown;
52
+ }
53
+ /**
54
+ * Calculate equal-weight allocation strategy
55
+ * Allocates portfolio equally across all vaults
56
+ */
57
+ export declare function calculateEqualWeight(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
58
+ /**
59
+ * Calculate risk-parity allocation strategy
60
+ * Allocates based on inverse risk (lower risk = higher allocation)
61
+ */
62
+ export declare function calculateRiskParity(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
63
+ /**
64
+ * Calculate maximum Sharpe ratio allocation strategy
65
+ * Allocates to maximize risk-adjusted returns
66
+ */
67
+ export declare function calculateMaxSharpe(vaults: VaultForOptimization[], totalValueUsd: number, riskFreeRate?: number): PortfolioPosition[];
68
+ /**
69
+ * Calculate minimum variance allocation strategy
70
+ * Allocates to minimize portfolio volatility
71
+ */
72
+ export declare function calculateMinVariance(vaults: VaultForOptimization[], totalValueUsd: number): PortfolioPosition[];
73
+ /**
74
+ * Calculate portfolio metrics
75
+ */
76
+ export declare function calculatePortfolioMetrics(positions: PortfolioPosition[], vaults: VaultForOptimization[], riskFreeRate?: number): {
77
+ expectedReturn: number;
78
+ portfolioRisk: number;
79
+ sharpeRatio: number;
80
+ diversificationScore: number;
81
+ };
82
+ /**
83
+ * Check if rebalancing is needed
84
+ */
85
+ export declare function needsRebalancing(positions: PortfolioPosition[], threshold?: number): boolean;
86
+ /**
87
+ * Generate optimization recommendations
88
+ */
89
+ export declare function generateRecommendations(positions: PortfolioPosition[], metrics: PortfolioOptimization['metrics'], strategy: PortfolioOptimization['strategy']): string[];
90
+ /**
91
+ * Optimize portfolio based on strategy
92
+ *
93
+ * @param vaults - Vaults with current positions and metrics
94
+ * @param strategy - Optimization strategy to use
95
+ * @param rebalanceThreshold - Minimum drift percentage to trigger rebalancing (default: 5%)
96
+ * @param riskFreeRate - Risk-free rate for Sharpe ratio calculation (default: 2%)
97
+ * @returns Portfolio optimization result with positions and recommendations
98
+ */
99
+ export declare function optimizePortfolio(vaults: VaultForOptimization[], strategy?: 'equal_weight' | 'risk_parity' | 'max_sharpe' | 'min_variance', rebalanceThreshold?: number, riskFreeRate?: number): PortfolioOptimization;
100
+ //# sourceMappingURL=portfolio-optimization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-optimization.d.ts","sourceRoot":"","sources":["../../src/utils/portfolio-optimization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Portfolio Optimization Utility
3
+ *
4
+ * Portfolio allocation and rebalancing algorithms for optimal vault distribution.
5
+ * Provides risk-adjusted portfolio recommendations and rebalancing guidance.
6
+ */
7
+ /**
8
+ * Calculate equal-weight allocation strategy
9
+ * Allocates portfolio equally across all vaults
10
+ */
11
+ export function calculateEqualWeight(vaults, totalValueUsd) {
12
+ const targetAllocation = 100 / vaults.length;
13
+ return vaults.map((vault) => {
14
+ const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
15
+ const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
16
+ const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
17
+ const rebalancePercentage = (rebalanceAmount / vault.currentValueUsd) * 100;
18
+ return {
19
+ vaultAddress: vault.address,
20
+ vaultName: vault.name,
21
+ chainId: vault.chainId,
22
+ currentAllocation,
23
+ targetAllocation,
24
+ currentValueUsd: vault.currentValueUsd,
25
+ targetValueUsd,
26
+ rebalanceAmount,
27
+ rebalancePercentage,
28
+ vault, // Include full vault data for risk analysis
29
+ };
30
+ });
31
+ }
32
+ /**
33
+ * Calculate risk-parity allocation strategy
34
+ * Allocates based on inverse risk (lower risk = higher allocation)
35
+ */
36
+ export function calculateRiskParity(vaults, totalValueUsd) {
37
+ // Calculate inverse risk scores (lower risk = higher weight)
38
+ const inverseRisks = vaults.map((v) => 1 / (v.riskScore + 0.01)); // Add small epsilon to avoid division by zero
39
+ const totalInverseRisk = inverseRisks.reduce((sum, r) => sum + r, 0);
40
+ return vaults.map((vault, index) => {
41
+ const targetAllocation = (inverseRisks[index] / totalInverseRisk) * 100;
42
+ const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
43
+ const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
44
+ const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
45
+ const rebalancePercentage = (rebalanceAmount / vault.currentValueUsd) * 100;
46
+ return {
47
+ vaultAddress: vault.address,
48
+ vaultName: vault.name,
49
+ chainId: vault.chainId,
50
+ currentAllocation,
51
+ targetAllocation,
52
+ currentValueUsd: vault.currentValueUsd,
53
+ targetValueUsd,
54
+ rebalanceAmount,
55
+ rebalancePercentage,
56
+ vault, // Include full vault data for risk analysis
57
+ };
58
+ });
59
+ }
60
+ /**
61
+ * Calculate maximum Sharpe ratio allocation strategy
62
+ * Allocates to maximize risk-adjusted returns
63
+ */
64
+ export function calculateMaxSharpe(vaults, totalValueUsd, riskFreeRate = 2.0 // Default 2% risk-free rate
65
+ ) {
66
+ // Calculate Sharpe ratios for each vault
67
+ const sharpeRatios = vaults.map((v) => {
68
+ const excessReturn = v.expectedApr - riskFreeRate;
69
+ return excessReturn / (v.volatility + 0.01); // Add epsilon to avoid division by zero
70
+ });
71
+ // Normalize Sharpe ratios to get weights (only positive Sharpe ratios)
72
+ const positiveSharpes = sharpeRatios.map((s) => Math.max(0, s));
73
+ const totalSharpe = positiveSharpes.reduce((sum, s) => sum + s, 0);
74
+ // If all Sharpe ratios are negative or zero, fall back to equal weight
75
+ if (totalSharpe === 0) {
76
+ return calculateEqualWeight(vaults, totalValueUsd);
77
+ }
78
+ return vaults.map((vault, index) => {
79
+ const targetAllocation = (positiveSharpes[index] / totalSharpe) * 100;
80
+ const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
81
+ const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
82
+ const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
83
+ const rebalancePercentage = vault.currentValueUsd > 0 ? (rebalanceAmount / vault.currentValueUsd) * 100 : 0;
84
+ return {
85
+ vaultAddress: vault.address,
86
+ vaultName: vault.name,
87
+ chainId: vault.chainId,
88
+ currentAllocation,
89
+ targetAllocation,
90
+ currentValueUsd: vault.currentValueUsd,
91
+ targetValueUsd,
92
+ rebalanceAmount,
93
+ rebalancePercentage,
94
+ vault, // Include full vault data for risk analysis
95
+ };
96
+ });
97
+ }
98
+ /**
99
+ * Calculate minimum variance allocation strategy
100
+ * Allocates to minimize portfolio volatility
101
+ */
102
+ export function calculateMinVariance(vaults, totalValueUsd) {
103
+ // Allocate based on inverse variance (lower volatility = higher allocation)
104
+ const inverseVariances = vaults.map((v) => 1 / (v.volatility * v.volatility + 0.0001));
105
+ const totalInverseVariance = inverseVariances.reduce((sum, v) => sum + v, 0);
106
+ return vaults.map((vault, index) => {
107
+ const targetAllocation = (inverseVariances[index] / totalInverseVariance) * 100;
108
+ const currentAllocation = (vault.currentValueUsd / totalValueUsd) * 100;
109
+ const targetValueUsd = (targetAllocation / 100) * totalValueUsd;
110
+ const rebalanceAmount = targetValueUsd - vault.currentValueUsd;
111
+ const rebalancePercentage = vault.currentValueUsd > 0 ? (rebalanceAmount / vault.currentValueUsd) * 100 : 0;
112
+ return {
113
+ vaultAddress: vault.address,
114
+ vaultName: vault.name,
115
+ chainId: vault.chainId,
116
+ currentAllocation,
117
+ targetAllocation,
118
+ currentValueUsd: vault.currentValueUsd,
119
+ targetValueUsd,
120
+ rebalanceAmount,
121
+ rebalancePercentage,
122
+ vault, // Include full vault data for risk analysis
123
+ };
124
+ });
125
+ }
126
+ /**
127
+ * Calculate portfolio metrics
128
+ */
129
+ export function calculatePortfolioMetrics(positions, vaults, riskFreeRate = 2.0) {
130
+ // Calculate expected return (weighted average of vault APRs)
131
+ const expectedReturn = vaults.reduce((sum, vault, index) => {
132
+ const weight = positions[index].targetAllocation / 100;
133
+ return sum + vault.expectedApr * weight;
134
+ }, 0);
135
+ // Calculate portfolio risk (simplified - weighted average volatility)
136
+ // Note: This is a simplification; true portfolio variance requires correlation matrix
137
+ const portfolioRisk = vaults.reduce((sum, vault, index) => {
138
+ const weight = positions[index].targetAllocation / 100;
139
+ return sum + vault.volatility * weight;
140
+ }, 0);
141
+ // Calculate Sharpe ratio
142
+ const excessReturn = expectedReturn - riskFreeRate;
143
+ const sharpeRatio = portfolioRisk > 0 ? excessReturn / portfolioRisk : 0;
144
+ // Calculate diversification score (1 - Herfindahl index)
145
+ const herfindahl = positions.reduce((sum, pos) => {
146
+ const weight = pos.targetAllocation / 100;
147
+ return sum + weight * weight;
148
+ }, 0);
149
+ const diversificationScore = 1 - herfindahl;
150
+ return {
151
+ expectedReturn,
152
+ portfolioRisk,
153
+ sharpeRatio,
154
+ diversificationScore,
155
+ };
156
+ }
157
+ /**
158
+ * Check if rebalancing is needed
159
+ */
160
+ export function needsRebalancing(positions, threshold = 5.0) {
161
+ return positions.some((pos) => Math.abs(pos.currentAllocation - pos.targetAllocation) > threshold);
162
+ }
163
+ /**
164
+ * Generate optimization recommendations
165
+ */
166
+ export function generateRecommendations(positions, metrics, strategy) {
167
+ const recommendations = [];
168
+ // Strategy description
169
+ const strategyDescriptions = {
170
+ equal_weight: 'Equal-weight strategy provides maximum diversification across all vaults',
171
+ risk_parity: 'Risk-parity strategy balances risk contribution from each vault',
172
+ max_sharpe: 'Maximum Sharpe ratio strategy optimizes risk-adjusted returns',
173
+ min_variance: 'Minimum variance strategy minimizes portfolio volatility',
174
+ };
175
+ recommendations.push(strategyDescriptions[strategy]);
176
+ // Portfolio metrics insights
177
+ if (metrics.sharpeRatio > 2.0) {
178
+ recommendations.push(`Excellent risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)})`);
179
+ }
180
+ else if (metrics.sharpeRatio > 1.0) {
181
+ recommendations.push(`Good risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)})`);
182
+ }
183
+ else if (metrics.sharpeRatio > 0) {
184
+ recommendations.push(`Moderate risk-adjusted returns (Sharpe ratio: ${metrics.sharpeRatio.toFixed(2)}) - consider higher-yield opportunities`);
185
+ }
186
+ else {
187
+ recommendations.push('Poor risk-adjusted returns - portfolio may not compensate adequately for risk');
188
+ }
189
+ // Diversification insights
190
+ if (metrics.diversificationScore > 0.8) {
191
+ recommendations.push(`Highly diversified portfolio (score: ${(metrics.diversificationScore * 100).toFixed(0)}%)`);
192
+ }
193
+ else if (metrics.diversificationScore > 0.5) {
194
+ recommendations.push(`Moderately diversified (score: ${(metrics.diversificationScore * 100).toFixed(0)}%) - consider adding more vaults`);
195
+ }
196
+ else {
197
+ recommendations.push(`Low diversification (score: ${(metrics.diversificationScore * 100).toFixed(0)}%) - concentrated risk exposure`);
198
+ }
199
+ // Rebalancing recommendations
200
+ const largestDrift = positions.reduce((max, pos) => Math.max(max, Math.abs(pos.currentAllocation - pos.targetAllocation)), 0);
201
+ if (largestDrift > 10) {
202
+ recommendations.push(`Significant drift detected (${largestDrift.toFixed(1)}%) - rebalancing recommended`);
203
+ }
204
+ else if (largestDrift > 5) {
205
+ recommendations.push(`Moderate drift (${largestDrift.toFixed(1)}%) - consider rebalancing`);
206
+ }
207
+ else {
208
+ recommendations.push('Portfolio well-balanced - no immediate rebalancing needed');
209
+ }
210
+ // Position-specific recommendations
211
+ const overweightPositions = positions.filter((pos) => pos.currentAllocation - pos.targetAllocation > 5);
212
+ const underweightPositions = positions.filter((pos) => pos.targetAllocation - pos.currentAllocation > 5);
213
+ if (overweightPositions.length > 0) {
214
+ const names = overweightPositions.map((p) => p.vaultName).join(', ');
215
+ recommendations.push(`Consider reducing positions in: ${names}`);
216
+ }
217
+ if (underweightPositions.length > 0) {
218
+ const names = underweightPositions.map((p) => p.vaultName).join(', ');
219
+ recommendations.push(`Consider increasing positions in: ${names}`);
220
+ }
221
+ return recommendations;
222
+ }
223
+ /**
224
+ * Optimize portfolio based on strategy
225
+ *
226
+ * @param vaults - Vaults with current positions and metrics
227
+ * @param strategy - Optimization strategy to use
228
+ * @param rebalanceThreshold - Minimum drift percentage to trigger rebalancing (default: 5%)
229
+ * @param riskFreeRate - Risk-free rate for Sharpe ratio calculation (default: 2%)
230
+ * @returns Portfolio optimization result with positions and recommendations
231
+ */
232
+ export function optimizePortfolio(vaults, strategy = 'max_sharpe', rebalanceThreshold = 5.0, riskFreeRate = 2.0) {
233
+ if (vaults.length === 0) {
234
+ return {
235
+ strategy,
236
+ totalValueUsd: 0,
237
+ positions: [],
238
+ metrics: {
239
+ expectedReturn: 0,
240
+ portfolioRisk: 0,
241
+ sharpeRatio: 0,
242
+ diversificationScore: 0,
243
+ },
244
+ rebalanceNeeded: false,
245
+ rebalanceThreshold,
246
+ recommendations: ['No vaults in portfolio'],
247
+ };
248
+ }
249
+ // Calculate total portfolio value
250
+ const totalValueUsd = vaults.reduce((sum, v) => sum + v.currentValueUsd, 0);
251
+ // Calculate target allocations based on strategy
252
+ let positions;
253
+ switch (strategy) {
254
+ case 'equal_weight':
255
+ positions = calculateEqualWeight(vaults, totalValueUsd);
256
+ break;
257
+ case 'risk_parity':
258
+ positions = calculateRiskParity(vaults, totalValueUsd);
259
+ break;
260
+ case 'max_sharpe':
261
+ positions = calculateMaxSharpe(vaults, totalValueUsd, riskFreeRate);
262
+ break;
263
+ case 'min_variance':
264
+ positions = calculateMinVariance(vaults, totalValueUsd);
265
+ break;
266
+ }
267
+ // Calculate portfolio metrics
268
+ const metrics = calculatePortfolioMetrics(positions, vaults, riskFreeRate);
269
+ // Check if rebalancing is needed
270
+ const rebalanceNeeded = needsRebalancing(positions, rebalanceThreshold);
271
+ // Generate recommendations
272
+ const recommendations = generateRecommendations(positions, metrics, strategy);
273
+ return {
274
+ strategy,
275
+ totalValueUsd,
276
+ positions,
277
+ metrics,
278
+ rebalanceNeeded,
279
+ rebalanceThreshold,
280
+ recommendations,
281
+ };
282
+ }
283
+ //# sourceMappingURL=portfolio-optimization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-optimization.js","sourceRoot":"","sources":["../../src/utils/portfolio-optimization.ts"],"names":[],"mappings":"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"}