@stake-dao/reader 0.1.4 → 0.2.1

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 (290) hide show
  1. package/dist/esm/bytecodes/index.js +16 -0
  2. package/dist/esm/bytecodes/index.js.map +1 -0
  3. package/dist/esm/bytecodes/strategies/batches/batchBalancerStrats.js +68 -0
  4. package/dist/esm/bytecodes/strategies/batches/batchBalancerStrats.js.map +1 -0
  5. package/dist/esm/{batches/curveStrats.js → bytecodes/strategies/batches/batchCurveStrats.js} +3 -3
  6. package/dist/esm/bytecodes/strategies/batches/batchCurveStrats.js.map +1 -0
  7. package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.js +61 -0
  8. package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.js.map +1 -0
  9. package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapPositions.js +44 -0
  10. package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapPositions.js.map +1 -0
  11. package/dist/esm/bytecodes/strategies/batches/batchPancakeswapStrats.js +48 -0
  12. package/dist/esm/bytecodes/strategies/batches/batchPancakeswapStrats.js.map +1 -0
  13. package/dist/esm/bytecodes/strategies/batches/batchPendleStrats.js +63 -0
  14. package/dist/esm/bytecodes/strategies/batches/batchPendleStrats.js.map +1 -0
  15. package/dist/esm/bytecodes/strategies/builds/buildBalancerStrats.js +54 -0
  16. package/dist/esm/bytecodes/strategies/builds/buildBalancerStrats.js.map +1 -0
  17. package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.js +64 -0
  18. package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.js.map +1 -0
  19. package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapStrats.js +51 -0
  20. package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapStrats.js.map +1 -0
  21. package/dist/esm/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.js +54 -0
  22. package/dist/esm/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.js.map +1 -0
  23. package/dist/esm/bytecodes/strategies/builds/buildPendleStrats.js +39 -0
  24. package/dist/esm/bytecodes/strategies/builds/buildPendleStrats.js.map +1 -0
  25. package/dist/esm/{batches → bytecodes/strategies/builds}/buildYearnStrats.js +2 -2
  26. package/dist/esm/bytecodes/strategies/builds/buildYearnStrats.js.map +1 -0
  27. package/dist/esm/bytecodes/strategies/fetchYearnGauges.js.map +1 -0
  28. package/dist/esm/bytecodes/strategies/sdtGaugeRewards.js.map +1 -0
  29. package/dist/esm/bytecodes/tokenData.js.map +1 -0
  30. package/dist/esm/{batches → bytecodes}/types.js.map +1 -1
  31. package/dist/esm/index.js +33 -6
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/lockers/utils/endpoints.js +1 -1
  34. package/dist/esm/lockers/utils/endpoints.js.map +1 -1
  35. package/dist/esm/prices.js +39 -3
  36. package/dist/esm/prices.js.map +1 -1
  37. package/dist/esm/strategies/balancer/build.js +4 -11
  38. package/dist/esm/strategies/balancer/build.js.map +1 -1
  39. package/dist/esm/strategies/balancer/fetch.js +190 -0
  40. package/dist/esm/strategies/balancer/fetch.js.map +1 -0
  41. package/dist/esm/strategies/curve/build.js +4 -4
  42. package/dist/esm/strategies/curve/build.js.map +1 -1
  43. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js +0 -1
  44. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js.map +1 -1
  45. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js +3 -2
  46. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js.map +1 -1
  47. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js +3 -2
  48. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js.map +1 -1
  49. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +2 -1
  50. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
  51. package/dist/esm/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.js +2 -1
  52. package/dist/esm/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.js.map +1 -1
  53. package/dist/esm/strategies/curve/fetch/index.js +22 -4
  54. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  55. package/dist/esm/strategies/curve/httpCalls.js +3 -3
  56. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  57. package/dist/esm/strategies/curve/onChainCalls.js +3 -2
  58. package/dist/esm/strategies/curve/onChainCalls.js.map +1 -1
  59. package/dist/esm/strategies/pancakeswap/abis/PancakeSwapMasterchef.json +1575 -0
  60. package/dist/esm/strategies/pancakeswap/build.js +48 -0
  61. package/dist/esm/strategies/pancakeswap/build.js.map +1 -0
  62. package/dist/esm/strategies/pancakeswap/buildErc20.js +63 -0
  63. package/dist/esm/strategies/pancakeswap/buildErc20.js.map +1 -0
  64. package/dist/esm/strategies/pancakeswap/config.js +7 -0
  65. package/dist/esm/strategies/pancakeswap/config.js.map +1 -0
  66. package/dist/esm/strategies/pancakeswap/endpoints.js +10 -0
  67. package/dist/esm/strategies/pancakeswap/endpoints.js.map +1 -0
  68. package/dist/esm/strategies/pancakeswap/fetch/getPancakeApisData.js +24 -0
  69. package/dist/esm/strategies/pancakeswap/fetch/getPancakeApisData.js.map +1 -0
  70. package/dist/esm/strategies/pancakeswap/fetch/getPancakeErc20Vaults.js +134 -0
  71. package/dist/esm/strategies/pancakeswap/fetch/getPancakeErc20Vaults.js.map +1 -0
  72. package/dist/esm/strategies/pancakeswap/fetch/getPancakeNotDeployed.js +102 -0
  73. package/dist/esm/strategies/pancakeswap/fetch/getPancakeNotDeployed.js.map +1 -0
  74. package/dist/esm/strategies/pancakeswap/fetch/getPancakeV3Vaults.js +142 -0
  75. package/dist/esm/strategies/pancakeswap/fetch/getPancakeV3Vaults.js.map +1 -0
  76. package/dist/esm/strategies/pancakeswap/fetch/index.js +25 -0
  77. package/dist/esm/strategies/pancakeswap/fetch/index.js.map +1 -0
  78. package/dist/esm/strategies/pancakeswap/fetch/pancakePositions.js +87 -0
  79. package/dist/esm/strategies/pancakeswap/fetch/pancakePositions.js.map +1 -0
  80. package/dist/esm/strategies/pancakeswap/fetch/pancakeswapMath.js +199 -0
  81. package/dist/esm/strategies/pancakeswap/fetch/pancakeswapMath.js.map +1 -0
  82. package/dist/esm/strategies/pendle/abis/MulticallPendleStratsAbi.json +103 -0
  83. package/dist/esm/strategies/pendle/build.js +70 -0
  84. package/dist/esm/strategies/pendle/build.js.map +1 -0
  85. package/dist/esm/strategies/pendle/fetch.js +267 -0
  86. package/dist/esm/strategies/pendle/fetch.js.map +1 -0
  87. package/dist/esm/strategies/pendle/getPendleApiData.js +15 -0
  88. package/dist/esm/strategies/pendle/getPendleApiData.js.map +1 -0
  89. package/dist/esm/strategies/pendle/pendlePoints.js +71 -0
  90. package/dist/esm/strategies/pendle/pendlePoints.js.map +1 -0
  91. package/dist/esm/strategies/utils/getAprBreakdown.js +9 -9
  92. package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -1
  93. package/dist/esm/strategies/utils/index.js +10 -1
  94. package/dist/esm/strategies/utils/index.js.map +1 -1
  95. package/dist/esm/strategies/yearn/build.js +5 -4
  96. package/dist/esm/strategies/yearn/build.js.map +1 -1
  97. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +3 -2
  98. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -1
  99. package/dist/esm/strategies/yearn/fetch/index.js +1 -1
  100. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -1
  101. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  102. package/dist/esm/utils.js +1 -1
  103. package/dist/esm/utils.js.map +1 -1
  104. package/dist/types/bytecodes/index.d.ts +16 -0
  105. package/dist/types/bytecodes/index.d.ts.map +1 -0
  106. package/dist/types/bytecodes/strategies/batches/batchBalancerStrats.d.ts +4 -0
  107. package/dist/types/bytecodes/strategies/batches/batchBalancerStrats.d.ts.map +1 -0
  108. package/dist/types/bytecodes/strategies/batches/batchCurveStrats.d.ts +4 -0
  109. package/dist/types/bytecodes/strategies/batches/batchCurveStrats.d.ts.map +1 -0
  110. package/dist/types/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.d.ts +4 -0
  111. package/dist/types/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.d.ts.map +1 -0
  112. package/dist/types/bytecodes/strategies/batches/batchPancakeSwapPositions.d.ts +4 -0
  113. package/dist/types/bytecodes/strategies/batches/batchPancakeSwapPositions.d.ts.map +1 -0
  114. package/dist/types/bytecodes/strategies/batches/batchPancakeswapStrats.d.ts +4 -0
  115. package/dist/types/bytecodes/strategies/batches/batchPancakeswapStrats.d.ts.map +1 -0
  116. package/dist/types/bytecodes/strategies/batches/batchPendleStrats.d.ts +4 -0
  117. package/dist/types/bytecodes/strategies/batches/batchPendleStrats.d.ts.map +1 -0
  118. package/dist/types/bytecodes/strategies/builds/buildBalancerStrats.d.ts +4 -0
  119. package/dist/types/bytecodes/strategies/builds/buildBalancerStrats.d.ts.map +1 -0
  120. package/dist/types/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.d.ts +4 -0
  121. package/dist/types/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.d.ts.map +1 -0
  122. package/dist/types/bytecodes/strategies/builds/buildPancakeSwapStrats.d.ts +4 -0
  123. package/dist/types/bytecodes/strategies/builds/buildPancakeSwapStrats.d.ts.map +1 -0
  124. package/dist/types/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.d.ts +4 -0
  125. package/dist/types/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.d.ts.map +1 -0
  126. package/dist/types/bytecodes/strategies/builds/buildPendleStrats.d.ts +4 -0
  127. package/dist/types/bytecodes/strategies/builds/buildPendleStrats.d.ts.map +1 -0
  128. package/dist/types/bytecodes/strategies/builds/buildYearnStrats.d.ts +4 -0
  129. package/dist/types/bytecodes/strategies/builds/buildYearnStrats.d.ts.map +1 -0
  130. package/dist/types/bytecodes/strategies/fetchYearnGauges.d.ts +4 -0
  131. package/dist/types/bytecodes/strategies/fetchYearnGauges.d.ts.map +1 -0
  132. package/dist/types/bytecodes/strategies/sdtGaugeRewards.d.ts +4 -0
  133. package/dist/types/bytecodes/strategies/sdtGaugeRewards.d.ts.map +1 -0
  134. package/dist/types/bytecodes/tokenData.d.ts.map +1 -0
  135. package/dist/types/bytecodes/types.d.ts.map +1 -0
  136. package/dist/types/index.d.ts +15 -6
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/lockers/utils/endpoints.d.ts +1 -1
  139. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -1
  140. package/dist/types/prices.d.ts +8 -1
  141. package/dist/types/prices.d.ts.map +1 -1
  142. package/dist/types/strategies/balancer/build.d.ts +0 -1
  143. package/dist/types/strategies/balancer/build.d.ts.map +1 -1
  144. package/dist/types/strategies/balancer/fetch.d.ts +11 -0
  145. package/dist/types/strategies/balancer/fetch.d.ts.map +1 -0
  146. package/dist/types/strategies/curve/build.d.ts.map +1 -1
  147. package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts.map +1 -1
  148. package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts +1 -1
  149. package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts.map +1 -1
  150. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.d.ts.map +1 -1
  151. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
  152. package/dist/types/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.d.ts.map +1 -1
  153. package/dist/types/strategies/curve/fetch/index.d.ts +15 -2
  154. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  155. package/dist/types/strategies/curve/onChainCalls.d.ts.map +1 -1
  156. package/dist/types/strategies/pancakeswap/build.d.ts +2 -0
  157. package/dist/types/strategies/pancakeswap/build.d.ts.map +1 -0
  158. package/dist/types/strategies/pancakeswap/buildErc20.d.ts +7 -0
  159. package/dist/types/strategies/pancakeswap/buildErc20.d.ts.map +1 -0
  160. package/dist/types/strategies/pancakeswap/config.d.ts +7 -0
  161. package/dist/types/strategies/pancakeswap/config.d.ts.map +1 -0
  162. package/dist/types/strategies/pancakeswap/endpoints.d.ts +8 -0
  163. package/dist/types/strategies/pancakeswap/endpoints.d.ts.map +1 -0
  164. package/dist/types/strategies/pancakeswap/fetch/getPancakeApisData.d.ts +10 -0
  165. package/dist/types/strategies/pancakeswap/fetch/getPancakeApisData.d.ts.map +1 -0
  166. package/dist/types/strategies/pancakeswap/fetch/getPancakeErc20Vaults.d.ts +44 -0
  167. package/dist/types/strategies/pancakeswap/fetch/getPancakeErc20Vaults.d.ts.map +1 -0
  168. package/dist/types/strategies/pancakeswap/fetch/getPancakeNotDeployed.d.ts +3 -0
  169. package/dist/types/strategies/pancakeswap/fetch/getPancakeNotDeployed.d.ts.map +1 -0
  170. package/dist/types/strategies/pancakeswap/fetch/getPancakeV3Vaults.d.ts +7 -0
  171. package/dist/types/strategies/pancakeswap/fetch/getPancakeV3Vaults.d.ts.map +1 -0
  172. package/dist/types/strategies/pancakeswap/fetch/index.d.ts +17 -0
  173. package/dist/types/strategies/pancakeswap/fetch/index.d.ts.map +1 -0
  174. package/dist/types/strategies/pancakeswap/fetch/pancakePositions.d.ts +11 -0
  175. package/dist/types/strategies/pancakeswap/fetch/pancakePositions.d.ts.map +1 -0
  176. package/dist/types/strategies/pancakeswap/fetch/pancakeswapMath.d.ts +33 -0
  177. package/dist/types/strategies/pancakeswap/fetch/pancakeswapMath.d.ts.map +1 -0
  178. package/dist/types/strategies/pendle/build.d.ts +42 -0
  179. package/dist/types/strategies/pendle/build.d.ts.map +1 -0
  180. package/dist/types/strategies/pendle/fetch.d.ts +60 -0
  181. package/dist/types/strategies/pendle/fetch.d.ts.map +1 -0
  182. package/dist/types/strategies/pendle/getPendleApiData.d.ts +3 -0
  183. package/dist/types/strategies/pendle/getPendleApiData.d.ts.map +1 -0
  184. package/dist/types/strategies/pendle/pendlePoints.d.ts +80 -0
  185. package/dist/types/strategies/pendle/pendlePoints.d.ts.map +1 -0
  186. package/dist/types/strategies/types.d.ts +17 -3
  187. package/dist/types/strategies/types.d.ts.map +1 -1
  188. package/dist/types/strategies/utils/getAprBreakdown.d.ts +1 -4
  189. package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -1
  190. package/dist/types/strategies/utils/index.d.ts +2 -0
  191. package/dist/types/strategies/utils/index.d.ts.map +1 -1
  192. package/dist/types/strategies/yearn/build.d.ts.map +1 -1
  193. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -1
  194. package/dist/types/strategies/yearn/fetch/index.d.ts +13 -2
  195. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -1
  196. package/dist/types/utils.d.ts.map +1 -1
  197. package/package.json +3 -2
  198. package/src/bytecodes/index.ts +18 -0
  199. package/src/bytecodes/strategies/batches/batchBalancerStrats.ts +70 -0
  200. package/src/{batches/curveStrats.ts → bytecodes/strategies/batches/batchCurveStrats.ts} +3 -3
  201. package/src/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.ts +67 -0
  202. package/src/bytecodes/strategies/batches/batchPancakeSwapPositions.ts +50 -0
  203. package/src/bytecodes/strategies/batches/batchPancakeswapStrats.ts +54 -0
  204. package/src/bytecodes/strategies/batches/batchPendleStrats.ts +65 -0
  205. package/src/bytecodes/strategies/builds/buildBalancerStrats.ts +56 -0
  206. package/src/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.ts +70 -0
  207. package/src/bytecodes/strategies/builds/buildPancakeSwapStrats.ts +57 -0
  208. package/src/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.ts +60 -0
  209. package/src/bytecodes/strategies/builds/buildPendleStrats.ts +41 -0
  210. package/src/{batches → bytecodes/strategies/builds}/buildYearnStrats.ts +3 -3
  211. package/src/{batches → bytecodes/strategies}/fetchYearnGauges.ts +1 -1
  212. package/src/{batches → bytecodes/strategies}/sdtGaugeRewards.ts +1 -1
  213. package/src/endpoints.ts +2 -0
  214. package/src/index.ts +43 -5
  215. package/src/lockers/utils/endpoints.ts +2 -1
  216. package/src/prices.ts +57 -6
  217. package/src/strategies/balancer/build.ts +66 -0
  218. package/src/strategies/balancer/endpoints.ts +27 -0
  219. package/src/strategies/balancer/fetch.ts +266 -0
  220. package/src/strategies/curve/build.ts +4 -3
  221. package/src/strategies/curve/fetch/curveApiData/bytecode.ts +0 -1
  222. package/src/strategies/curve/fetch/curveApiData/getCurveApiData.ts +4 -3
  223. package/src/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.ts +7 -3
  224. package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +3 -2
  225. package/src/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.ts +3 -2
  226. package/src/strategies/curve/fetch/index.ts +53 -15
  227. package/src/strategies/curve/httpCalls.ts +3 -3
  228. package/src/strategies/curve/onChainCalls.ts +4 -2
  229. package/src/strategies/pancakeswap/build.ts +57 -0
  230. package/src/strategies/pancakeswap/buildErc20.ts +73 -0
  231. package/src/strategies/pancakeswap/config.ts +7 -0
  232. package/src/strategies/pancakeswap/endpoints.ts +12 -0
  233. package/src/strategies/pancakeswap/fetch/getPancakeApisData.ts +32 -0
  234. package/src/strategies/pancakeswap/fetch/getPancakeErc20Vaults.ts +184 -0
  235. package/src/strategies/pancakeswap/fetch/getPancakeNotDeployed.ts +132 -0
  236. package/src/strategies/pancakeswap/fetch/getPancakeV3Vaults.ts +191 -0
  237. package/src/strategies/pancakeswap/fetch/index.ts +50 -0
  238. package/src/strategies/pancakeswap/fetch/pancakePositions.ts +147 -0
  239. package/src/strategies/pancakeswap/fetch/pancakeswapMath.ts +305 -0
  240. package/src/strategies/pendle/build.ts +93 -0
  241. package/src/strategies/pendle/fetch.ts +349 -0
  242. package/src/strategies/pendle/getPendleApiData.ts +20 -0
  243. package/src/strategies/pendle/pendlePoints.ts +71 -0
  244. package/src/strategies/types.ts +20 -3
  245. package/src/strategies/utils/getAprBreakdown.ts +9 -9
  246. package/src/strategies/utils/index.ts +14 -1
  247. package/src/strategies/yearn/build.ts +5 -4
  248. package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +4 -3
  249. package/src/strategies/yearn/fetch/index.ts +22 -11
  250. package/src/utils.ts +3 -3
  251. package/dist/esm/batches/balancerStrats.js +0 -73
  252. package/dist/esm/batches/balancerStrats.js.map +0 -1
  253. package/dist/esm/batches/buildBalancerStrats.js +0 -62
  254. package/dist/esm/batches/buildBalancerStrats.js.map +0 -1
  255. package/dist/esm/batches/buildYearnStrats.js.map +0 -1
  256. package/dist/esm/batches/curveStrats.js.map +0 -1
  257. package/dist/esm/batches/fetchYearnGauges.js.map +0 -1
  258. package/dist/esm/batches/index.js +0 -8
  259. package/dist/esm/batches/index.js.map +0 -1
  260. package/dist/esm/batches/sdtGaugeRewards.js.map +0 -1
  261. package/dist/esm/batches/tokenData.js.map +0 -1
  262. package/dist/esm/strategies/balancer/fetch/index.js +0 -203
  263. package/dist/esm/strategies/balancer/fetch/index.js.map +0 -1
  264. package/dist/types/batches/balancerStrats.d.ts +0 -4
  265. package/dist/types/batches/balancerStrats.d.ts.map +0 -1
  266. package/dist/types/batches/buildBalancerStrats.d.ts +0 -4
  267. package/dist/types/batches/buildBalancerStrats.d.ts.map +0 -1
  268. package/dist/types/batches/buildYearnStrats.d.ts +0 -4
  269. package/dist/types/batches/buildYearnStrats.d.ts.map +0 -1
  270. package/dist/types/batches/curveStrats.d.ts +0 -4
  271. package/dist/types/batches/curveStrats.d.ts.map +0 -1
  272. package/dist/types/batches/fetchYearnGauges.d.ts +0 -4
  273. package/dist/types/batches/fetchYearnGauges.d.ts.map +0 -1
  274. package/dist/types/batches/index.d.ts +0 -8
  275. package/dist/types/batches/index.d.ts.map +0 -1
  276. package/dist/types/batches/sdtGaugeRewards.d.ts +0 -4
  277. package/dist/types/batches/sdtGaugeRewards.d.ts.map +0 -1
  278. package/dist/types/batches/tokenData.d.ts.map +0 -1
  279. package/dist/types/batches/types.d.ts.map +0 -1
  280. package/dist/types/strategies/balancer/fetch/index.d.ts +0 -6
  281. package/dist/types/strategies/balancer/fetch/index.d.ts.map +0 -1
  282. package/src/batches/index.ts +0 -5
  283. /package/dist/esm/{batches → bytecodes/strategies}/fetchYearnGauges.js +0 -0
  284. /package/dist/esm/{batches → bytecodes/strategies}/sdtGaugeRewards.js +0 -0
  285. /package/dist/esm/{batches → bytecodes}/tokenData.js +0 -0
  286. /package/dist/esm/{batches → bytecodes}/types.js +0 -0
  287. /package/dist/types/{batches → bytecodes}/tokenData.d.ts +0 -0
  288. /package/dist/types/{batches → bytecodes}/types.d.ts +0 -0
  289. /package/src/{batches → bytecodes}/tokenData.ts +0 -0
  290. /package/src/{batches → bytecodes}/types.ts +0 -0
@@ -0,0 +1,57 @@
1
+ import { decodeAbiParameters, encodeAbiParameters, parseAbiParameters, zeroAddress } from 'viem'
2
+
3
+ import { contracts, tokenWithId } from '@stake-dao/constants'
4
+ import { range } from 'lodash-es'
5
+ import { buildPancakeSwapStrats } from '../../bytecodes/index.js'
6
+ import { batchJsonRpc, rpcCall } from '../../utils.js'
7
+ import { concatBytecode } from '../utils/index.js'
8
+ import { PCS_POOLS_CHUNK_SIZE } from './config.js'
9
+
10
+ export const buildPancakeSwapStrategies = async (rpc: string, chainId: number) => {
11
+ const cake = tokenWithId('cake', chainId)!
12
+ const cakeReward = { name: cake.name, symbol: cake.symbol, address: cake.address, decimals: cake.decimals }
13
+
14
+ const nPoolsRequest = await rpcCall(rpc, [{ to: contracts.pancakeMasterchef![chainId]!, data: '0x081e3eda' }]) // poolLength()
15
+ const nPools = Number(decodeAbiParameters([{ type: 'uint256', name: 'n_gauges' }], nPoolsRequest[0].result))
16
+
17
+ const poolsCalls = range(0, nPools, PCS_POOLS_CHUNK_SIZE).map((skip) => {
18
+ const inputParams = [
19
+ contracts.pancakeMasterchef![chainId]!,
20
+ skip,
21
+ skip + PCS_POOLS_CHUNK_SIZE > nPools ? nPools : skip + PCS_POOLS_CHUNK_SIZE,
22
+ ]
23
+
24
+ const inputData = encodeAbiParameters(
25
+ parseAbiParameters(buildPancakeSwapStrats.inputType![chainId]!) as any,
26
+ inputParams,
27
+ )
28
+ return concatBytecode(buildPancakeSwapStrats.bytecode[chainId]!, inputData)
29
+ })
30
+
31
+ const pools = await batchJsonRpc({
32
+ rpc,
33
+ calls: poolsCalls,
34
+ outputTypeAbi: buildPancakeSwapStrats.outputTypeHr![chainId]!,
35
+ callsKey: `strategies/pancakeswap/build.ts: buildPancakeSwapStrategies/pools - chainId ${chainId} - rpc ${rpc}`,
36
+ })
37
+
38
+ return pools
39
+ .filter((d) => d.pool !== zeroAddress)
40
+ .map((data) => {
41
+ return {
42
+ key: `${chainId}-${data.id}`,
43
+ poolId: Number(data.id),
44
+ protocol: 'pancakeswap',
45
+ chainId,
46
+ pool: data.pool,
47
+ fee: data.fee,
48
+ coins: data.coins.map((c) => ({
49
+ name: c._name,
50
+ symbol: c._symbol,
51
+ address: c._address,
52
+ decimals: Number(c._decimals),
53
+ })),
54
+ rewards: [cakeReward],
55
+ }
56
+ })
57
+ }
@@ -0,0 +1,73 @@
1
+ import { chunk } from 'lodash-es'
2
+ import { encodeAbiParameters, parseAbiParameters } from 'viem'
3
+ import { buildPancakeSwapErc20Strats } from '../../bytecodes/index.js'
4
+ import { batchJsonRpc } from '../../utils.js'
5
+ import { bytes32ToString, concatBytecode } from '../utils/index.js'
6
+ import { BROKEN_VAULT, PCS_POOLS_ERC20_CHUNK_SIZE } from './config.js'
7
+
8
+ interface VaultAndLp {
9
+ vault: string
10
+ lpToken: string
11
+ }
12
+
13
+ export const buildPancakeSwapErc20Strategies = async (stratsList: VaultAndLp[], rpc: string, chainId: number) => {
14
+ const inputArgsChunks = chunk(stratsList, PCS_POOLS_ERC20_CHUNK_SIZE)
15
+ const poolsCalls = inputArgsChunks.map((poolsArgs) => {
16
+ const inputData = encodeAbiParameters(parseAbiParameters(buildPancakeSwapErc20Strats.inputType[chainId]!) as any, [
17
+ poolsArgs,
18
+ ])
19
+ return concatBytecode(buildPancakeSwapErc20Strats.bytecode[chainId]!, inputData)
20
+ })
21
+
22
+ const pools = await batchJsonRpc({
23
+ rpc,
24
+ calls: poolsCalls,
25
+ outputTypeAbi: buildPancakeSwapErc20Strats.outputTypeHr[chainId],
26
+ callsKey: `strategies/pancakeswap/buildErc20.ts: buildPancakeSwapErc20Strategies/pools - chainId ${chainId} - rpc ${rpc}`,
27
+ })
28
+
29
+ return pools
30
+ .map((data) => {
31
+ const coins = data.coins.map((c) => ({
32
+ name: bytes32ToString(c._name),
33
+ symbol: bytes32ToString(c._symbol),
34
+ address: c._address,
35
+ decimals: Number(c._decimals),
36
+ }))
37
+
38
+ const lpName = bytes32ToString(data.lpToken._name)
39
+ const isStable = lpName.includes('StableSwap')
40
+ const isMetapool = coins.some((c) => c.name.includes(' LPs'))
41
+ const lpSymbol = `${coins.map((c) => c.symbol).join('-')} ${isStable ? 'Stable LP' : 'LP'}`
42
+
43
+ if (!BROKEN_VAULT[chainId].includes(data.vault)) {
44
+ return {
45
+ key: `${data.manager.toLowerCase()}-${coins.map((c) => c.symbol.toLowerCase()).join('-')}`,
46
+ protocol: 'pancakeswap',
47
+ chainId,
48
+ isMetapool,
49
+ isStable,
50
+ manager: data.manager,
51
+ pool: data.pool,
52
+ gaugeAddress: data.gauge,
53
+ vault: data.vault,
54
+ lpToken: {
55
+ name: lpName,
56
+ symbol: lpSymbol,
57
+ address: data.lpToken._address,
58
+ decimals: Number(data.lpToken._decimals),
59
+ },
60
+ coins,
61
+ rewards: data.rewards.map((r) => ({
62
+ name: r._name,
63
+ symbol: r._symbol,
64
+ address: r._address,
65
+ decimals: Number(r._decimals),
66
+ })),
67
+ }
68
+ }
69
+
70
+ return undefined
71
+ })
72
+ .filter(Boolean)
73
+ }
@@ -0,0 +1,7 @@
1
+ export const PCS_POOLS_CHUNK_SIZE = 30
2
+ export const PCS_POOLS_ERC20_CHUNK_SIZE = 10
3
+ export const PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE = 10
4
+
5
+ export const BROKEN_VAULT = {
6
+ 56: ['0xBf94E99cAF355BdEb3Fbb172449EC6E933E7B3Ec'],
7
+ }
@@ -0,0 +1,12 @@
1
+ export const CHAINS_DENOMINATOR = {
2
+ 1: 'ethereum',
3
+ 56: 'bsc',
4
+ 42161: 'arbitrum',
5
+ }
6
+
7
+ export const PANCAKESWAP_FEE_URL = (version: string, chainId: number) => {
8
+ return `https://explorer-api.pancakeswap.com/cached/pools/apr/${version}/${CHAINS_DENOMINATOR[chainId]}/farms-lp`
9
+ }
10
+
11
+ export const MANAGER_FEES_ENDPOINT =
12
+ 'https://raw.githubusercontent.com/stake-dao/votemarket-data/main/tvls/pancakeManagersFees.json'
@@ -0,0 +1,32 @@
1
+ import { bsc } from 'viem/chains'
2
+ import { MANAGER_FEES_ENDPOINT, PANCAKESWAP_FEE_URL } from '../endpoints.js'
3
+
4
+ interface PancakeManagerFees {
5
+ [lp: string]: { token0: string; token1: string }
6
+ }
7
+
8
+ export const getPancakeSwapManagerFeesAPR = async (chainId: number): Promise<PancakeManagerFees> => {
9
+ if (chainId !== bsc.id) return {}
10
+
11
+ const data = await (await fetch(MANAGER_FEES_ENDPOINT)).json()
12
+ const res: PancakeManagerFees = {}
13
+
14
+ for (const d of data) {
15
+ res[d.lpAddress.toLowerCase()] = {
16
+ token0: d.token0,
17
+ token1: d.token1,
18
+ }
19
+ }
20
+
21
+ return res
22
+ }
23
+
24
+ export const getPancakeSwapFeesAPR = async (chainId: number) => {
25
+ const [v2TradingFees, stableTradingFees, v3TradingFees] = await Promise.all([
26
+ (await fetch(PANCAKESWAP_FEE_URL('v2', chainId))).json(),
27
+ (await fetch(PANCAKESWAP_FEE_URL('stable', chainId))).json(),
28
+ (await fetch(PANCAKESWAP_FEE_URL('v3', chainId))).json(),
29
+ ])
30
+
31
+ return { ...v2TradingFees, ...stableTradingFees, ...v3TradingFees }
32
+ }
@@ -0,0 +1,184 @@
1
+ import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem'
2
+
3
+ import { batchPancakeSwapErc20Strats } from '../../../bytecodes/index.js'
4
+
5
+ import { buildPancakeSwapErc20Strategies } from '../buildErc20.js'
6
+
7
+ import { ONE_YEAR, STRAT_FEES, contracts, pancakeswapErc20Strats, tokenWithId } from '@stake-dao/constants'
8
+ import { concatBytecode, decodeNewFactoryEvent } from '../../../index.js'
9
+ import { type Price, mergePrices } from '../../../prices.js'
10
+ import { batchJsonRpc, equalTlc } from '../../../utils.js'
11
+ import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
12
+
13
+ export const getPancakeErc20Vaults = async (
14
+ rpc: string,
15
+ chainId: number,
16
+ basePrices: Price[],
17
+ feesApr: any,
18
+ managerFees: any,
19
+ events: any,
20
+ ) => {
21
+ const oldVaultsAndLp = pancakeswapErc20Strats.strats[chainId]!
22
+ const newVaultsAndLp = decodeNewFactoryEvent(events).map((e) => ({ vault: e.vault, lpToken: e.lpToken }))
23
+ const vaultsAndLp = oldVaultsAndLp.concat(newVaultsAndLp)
24
+
25
+ const poolsErc20: any[] =
26
+ vaultsAndLp.length > 0
27
+ ? await buildPancakeSwapErc20Strategies(oldVaultsAndLp.concat(newVaultsAndLp), rpc, chainId)
28
+ : []
29
+
30
+ if (poolsErc20.length > 0) {
31
+ const poolsErc20Info = poolsErc20.map((p) => ({ lp: p.lpToken.address, wrapper: p.gaugeAddress, vault: p.vault }))
32
+
33
+ const pricesToFetch = poolsErc20
34
+ .flatMap((p) =>
35
+ p.coins.map((c) => {
36
+ const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c.address))?.usdPrice || 0
37
+ return coinPrice === 0 ? { address: c.address, symbol: c.symbol } : undefined
38
+ }),
39
+ )
40
+ .filter(Boolean)
41
+ const prices = await mergePrices(basePrices, pricesToFetch, chainId)
42
+
43
+ const cake = tokenWithId('cake', chainId)!
44
+ const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
45
+
46
+ const poolsErc20InputData = encodeAbiParameters(
47
+ parseAbiParameters(batchPancakeSwapErc20Strats.inputType[chainId]!) as any,
48
+ [contracts.cakeLocker![chainId], poolsErc20Info],
49
+ )
50
+ const poolsErc20Calls = concatBytecode(batchPancakeSwapErc20Strats.bytecode[chainId]!, poolsErc20InputData)
51
+ const decodedPromiseErc20 = await batchJsonRpc({
52
+ rpc,
53
+ calls: [poolsErc20Calls],
54
+ outputTypeAbi: batchPancakeSwapErc20Strats.outputTypeHr[chainId],
55
+ callsKey: `strategies/pancakeswap/fetch/getPancakeErc20Vaults.ts: getPancakeErc20Vaults - chainId ${chainId} - rpc ${rpc}`,
56
+ })
57
+
58
+ const parsedStratsErc20 = poolsErc20.map((strat, index) => {
59
+ const stratParsedData = decodedPromiseErc20[0].stratsData[index]
60
+
61
+ const token0PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[0]!.address))?.usdPrice || 0
62
+ const token1PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[1]!.address))?.usdPrice || 0
63
+
64
+ const lpPriceInUsd =
65
+ Number(formatUnits(stratParsedData.token0PerShare, strat.coins[0].decimals)) * token0PriceInUsd +
66
+ Number(formatUnits(stratParsedData.token1PerShare, strat.coins[1].decimals)) * token1PriceInUsd
67
+
68
+ const totalSupply = formatUnits(stratParsedData.sharesDeposited, 18)
69
+ const tvl = lpPriceInUsd * Number(totalSupply)
70
+ const tvlTotal = lpPriceInUsd * Number(formatUnits(stratParsedData.sharesTotalSupply, 18))
71
+
72
+ let tradingApy = Number(feesApr[strat.lpToken.address.toLowerCase()]?.apr7d || 0)
73
+ if (!tradingApy && managerFees[strat.pool.toLowerCase()]) {
74
+ const feesData = managerFees[strat.pool.toLowerCase()]
75
+ tradingApy = feesData
76
+ ? ((Number(formatUnits(feesData.token0, strat.coins[0].decimals)) * token0PriceInUsd +
77
+ Number(formatUnits(feesData.token1, strat.coins[1].decimals)) * token1PriceInUsd) /
78
+ tvlTotal) *
79
+ 365 *
80
+ 100
81
+ : 0
82
+ }
83
+
84
+ const boost =
85
+ Number(formatUnits(stratParsedData.boost, 0)) / Number(formatUnits(stratParsedData.boostPrecision, 0)) ||
86
+ (strat.manager === 'pancakeswap' ? 2.5 : 3) // Pancake max boost is 2.5, managers farm is 3
87
+
88
+ const rewardPerYear = cakePriceUsd * Number(formatUnits(stratParsedData.rewardPerSecond, 18)) * ONE_YEAR
89
+ const farmApr =
90
+ tvl > 0
91
+ ? ((rewardPerYear *
92
+ (Number(formatUnits(stratParsedData.boostedSharesDeposited, 0)) /
93
+ Number(formatUnits(stratParsedData.boostedSharesTotalSupply, 0)))) /
94
+ tvl) *
95
+ ((100 - STRAT_FEES + 0.5) / 100)
96
+ : (rewardPerYear / tvlTotal) * boost
97
+
98
+ const rewardsData = stratParsedData.sdRewardsData.map((r: any, index: number) => {
99
+ const rewardToken = strat.rewards[index]
100
+ const rewardPrice = prices.find((p: any) => equalTlc(p.symbol, rewardToken.symbol))
101
+
102
+ const periodFinish = Number(formatUnits(r.period_finish, 0))
103
+ const streaming = periodFinish > Math.floor(Date.now() / 1000)
104
+
105
+ const rewardApr =
106
+ streaming && rewardPrice && tvl > 0
107
+ ? (Number(formatUnits(r.rate * BigInt(ONE_YEAR), 18)) * rewardPrice.usdPrice) /
108
+ tvl /
109
+ (equalTlc(rewardToken.symbol, 'SDT') ? 2.5 : 1)
110
+ : 0
111
+
112
+ return {
113
+ token: rewardToken,
114
+ price: rewardPrice ? rewardPrice.usdPrice : 0,
115
+ apr: rewardApr * 100,
116
+ streaming,
117
+ periodFinish,
118
+ rate: formatUnits(r.rate, 0),
119
+ lastUpdate: formatUnits(r.last_update, 0),
120
+ claimablePendingRewards:
121
+ rewardToken.symbol === 'CAKE' ? formatUnits(stratParsedData.claimablePendingRewards, 0) : '0',
122
+ }
123
+ })
124
+
125
+ const apr = getAprBreakdown(
126
+ { ...strat, minApr: (farmApr / boost) * 100, tradingApy },
127
+ rewardsData,
128
+ boost,
129
+ undefined,
130
+ )
131
+
132
+ const name = strat.coins.reduce((res: string, current) => `${res}/${current.symbol}`, '').slice(1)
133
+ const subname =
134
+ strat.manager === 'pancakeswap' ? (strat.lpToken.symbol.includes('Stable LP') ? 'Stable' : 'v2') : strat.manager
135
+ const version =
136
+ strat.manager === 'pancakeswap'
137
+ ? strat.lpToken.symbol.includes('Stable LP')
138
+ ? 'stable'
139
+ : '2'
140
+ : strat.manager.toLowerCase()
141
+
142
+ const sdGauge = {
143
+ address: strat.sdGauge,
144
+ totalSupply: formatUnits(stratParsedData.sharesDeposited, 0),
145
+ relativeWeight: '0',
146
+ weight: '0',
147
+ futureWeight: '0',
148
+ workingSupply: '0',
149
+ }
150
+
151
+ return {
152
+ key: strat.key,
153
+ name,
154
+ subname,
155
+ protocol: strat.protocol,
156
+ version,
157
+ chainId: strat.chainId,
158
+ isMetapool: strat.isMetapool,
159
+ isStable: strat.isStable,
160
+ vault: strat.vault,
161
+ lpToken: strat.lpToken,
162
+ gaugeAddress: strat.gaugeAddress,
163
+ pool: strat.pool,
164
+ manager: strat.manager,
165
+ coins: strat.coins,
166
+ sdGauge,
167
+ lpPriceInUsd,
168
+ tvl,
169
+ apr: { ...apr, boost },
170
+ rewards: rewardsData,
171
+ // Base APR data
172
+ tradingApy,
173
+ minApr: (farmApr / boost) * 100,
174
+ maxApr: (farmApr / boost) * (strat.manager === 'pancakeswap' ? 2.5 : 3) * 100,
175
+ // Raw data
176
+ totalSupply: formatUnits(stratParsedData.sharesDeposited, 0),
177
+ }
178
+ })
179
+
180
+ return parsedStratsErc20
181
+ }
182
+
183
+ return []
184
+ }
@@ -0,0 +1,132 @@
1
+ import { ONE_YEAR, STRAT_FEES, contracts, tokenWithId } from '@stake-dao/constants'
2
+ import { decodeAbiParameters, encodeAbiParameters, formatUnits, parseAbiParameters, zeroAddress } from 'viem'
3
+
4
+ import { range } from 'lodash-es'
5
+ import { buildPancakeswapNotDeployedErc20Strats } from '../../../bytecodes/index.js'
6
+ import { bytes32ToString, concatBytecode } from '../../../index.js'
7
+ import { type Price, mergePrices } from '../../../prices.js'
8
+ import { batchJsonRpc, equalTlc, rpcCall } from '../../../utils.js'
9
+ import { PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE } from '../config.js'
10
+
11
+ export const getPancakeNotDeployed = async (
12
+ rpc: string,
13
+ chainId: number,
14
+ basePrices: Price[],
15
+ feesApr: any,
16
+ managerFees: any,
17
+ deployedLp: string[],
18
+ ) => {
19
+ const poolLengthRequest = await rpcCall(rpc, [{ to: contracts.pancakeFarmBooster![chainId]!, data: '0x081e3eda' }]) // poolLength()
20
+ const poolLength =
21
+ Number(decodeAbiParameters([{ type: 'uint256', name: 'n_gauges' }], poolLengthRequest[0].result)) + 1
22
+
23
+ const notDeployedCalls = range(1, poolLength, PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE).map((skip) => {
24
+ const inputParams = [
25
+ contracts.pancakeFarmBooster![chainId],
26
+ skip,
27
+ skip + PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE > poolLength ? poolLength : skip + PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE,
28
+ ]
29
+
30
+ const inputData = encodeAbiParameters(
31
+ parseAbiParameters(buildPancakeswapNotDeployedErc20Strats.inputType[chainId]!) as any,
32
+ inputParams,
33
+ )
34
+ return concatBytecode(buildPancakeswapNotDeployedErc20Strats.bytecode[chainId]!, inputData)
35
+ })
36
+
37
+ const notDeployedData = await batchJsonRpc({
38
+ rpc,
39
+ calls: notDeployedCalls,
40
+ outputTypeAbi: buildPancakeswapNotDeployedErc20Strats.outputTypeHr[chainId],
41
+ callsKey: `strategies/pancakeswap/fetch/getPancakeNotDeployed.ts: notDeployedData - chainId ${chainId} - rpc ${rpc}`,
42
+ })
43
+
44
+ const pricesToFetch = notDeployedData
45
+ .flatMap((d) => {
46
+ if (d.lpToken._address === zeroAddress || deployedLp.includes(d.lpToken._address)) return undefined
47
+
48
+ return d.coins.map((c) => {
49
+ const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c._address))?.usdPrice || 0
50
+ return coinPrice === 0 ? { address: c._address, symbol: bytes32ToString(c._symbol) } : undefined
51
+ })
52
+ })
53
+ .filter(Boolean)
54
+ const prices = await mergePrices(basePrices, pricesToFetch, chainId)
55
+
56
+ const cake = tokenWithId('cake', chainId)!
57
+ const cakeReward = { name: cake.name, symbol: cake.symbol, address: cake.address, decimals: cake.decimals }
58
+ const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
59
+
60
+ // TODO type
61
+ const notDeployed: any[] = notDeployedData
62
+ .map((d) => {
63
+ if (d.lpToken._address === zeroAddress || deployedLp.includes(d.lpToken._address)) return undefined
64
+
65
+ const coins = d.coins.map((c) => ({
66
+ name: bytes32ToString(c._name),
67
+ symbol: bytes32ToString(c._symbol),
68
+ address: c._address,
69
+ decimals: Number(c._decimals),
70
+ }))
71
+
72
+ const lpName = bytes32ToString(d.lpToken._name)
73
+ const isStable = lpName.includes('StableSwap')
74
+ const isMetapool = coins.some((c) => c.name.includes(' LPs'))
75
+ const lpSymbol = `${coins.map((c) => c.symbol).join('-')} ${isStable ? 'Stable LP' : 'LP'}`
76
+
77
+ const lpToken = {
78
+ name: lpName,
79
+ symbol: lpSymbol,
80
+ address: d.lpToken._address,
81
+ decimals: Number(d.lpToken._decimals),
82
+ }
83
+
84
+ const token0PriceInUsd = prices.find((p) => equalTlc(p.address, coins[0]!.address))?.usdPrice || 0
85
+ const token1PriceInUsd = prices.find((p) => equalTlc(p.address, coins[1]!.address))?.usdPrice || 0
86
+
87
+ const lpPriceInUsd =
88
+ Number(formatUnits(d.token0PerShare, coins[0].decimals)) * token0PriceInUsd +
89
+ Number(formatUnits(d.token1PerShare, coins[1].decimals)) * token1PriceInUsd
90
+
91
+ const tvl = lpPriceInUsd * Number(formatUnits(d.sharesTotalSupply, 18))
92
+
93
+ let tradingApy = Number(feesApr[lpToken.address.toLowerCase()]?.apr7d || 0)
94
+ if (!tradingApy && managerFees[d.pool.toLowerCase()]) {
95
+ const feesData = managerFees[d.pool.toLowerCase()]
96
+ tradingApy = feesData
97
+ ? ((Number(formatUnits(feesData.token0, coins[0].decimals)) * token0PriceInUsd +
98
+ Number(formatUnits(feesData.token1, coins[1].decimals)) * token1PriceInUsd) /
99
+ tvl) *
100
+ 365 *
101
+ 100
102
+ : 0
103
+ }
104
+
105
+ const boost = d.manager === 'pancakeswap' ? 2.5 : 3 // Pancake max boost is 2.5, managers farm is 3
106
+
107
+ const rewardPerYear = cakePriceUsd * Number(formatUnits(d.rewardPerSecond, 18)) * ONE_YEAR
108
+ const stakedTvl = lpPriceInUsd * Number(formatUnits(d.stakedInGauge, 18))
109
+
110
+ const minApr = (rewardPerYear / (stakedTvl > 0 ? stakedTvl : tvl)) * ((100 - STRAT_FEES + 0.5) / 100)
111
+ const maxApr = minApr * boost
112
+
113
+ return {
114
+ key: `${d.manager.toLowerCase()}-${coins.map((c) => c.symbol.toLowerCase()).join('-')}`,
115
+ protocol: 'pancakeswap',
116
+ chainId,
117
+ isMetapool,
118
+ isStable,
119
+ manager: d.manager,
120
+ pool: d.pool,
121
+ gaugeAddress: d.gagaugeAddressuge,
122
+ lpToken,
123
+ coins,
124
+ minApr,
125
+ maxApr,
126
+ rewards: [cakeReward],
127
+ }
128
+ })
129
+ .filter(Boolean)
130
+
131
+ return notDeployed
132
+ }
@@ -0,0 +1,191 @@
1
+ import { chunk } from 'lodash-es'
2
+ import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem'
3
+
4
+ import { batchPancakeSwapPositions, batchPancakeSwapStrats } from '../../../bytecodes/index.js'
5
+
6
+ import { getFarmApr } from './pancakeswapMath.js'
7
+
8
+ import { STRAT_FEES, contracts, tokenWithId } from '@stake-dao/constants'
9
+ import { buildPancakeSwapStrategies, concatBytecode } from '../../../index.js'
10
+ import { type Price, mergePrices } from '../../../prices.js'
11
+ import { batchJsonRpc, equalTlc } from '../../../utils.js'
12
+ import type { PancakeSwapGlobalData } from '../../types.js'
13
+ import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
14
+ import { computePositionData } from './pancakePositions.js'
15
+
16
+ // NOTE: Need to include mainnet SDT price and sdCAKE in prices args
17
+ export const getPancakeV3Vaults = async (
18
+ rpc: string,
19
+ chainId: number,
20
+ basePrices: Price[],
21
+ feesApr: any,
22
+ stakedTVLS: any,
23
+ ) => {
24
+ const pools = await buildPancakeSwapStrategies(rpc, chainId)
25
+ const poolInfos = pools.map((p) => ({ pid: p.poolId, pool: p.pool }))
26
+
27
+ const poolInfosInputArgsChunks = chunk(poolInfos, 20)
28
+ const poolInfosCalls = poolInfosInputArgsChunks.map((inputArgs) => {
29
+ const inputData = encodeAbiParameters(parseAbiParameters(batchPancakeSwapStrats.inputType[chainId]!) as any, [
30
+ contracts.pancakeMasterchef![chainId],
31
+ inputArgs,
32
+ ])
33
+ return concatBytecode(batchPancakeSwapStrats.bytecode[chainId]!, inputData)
34
+ })
35
+
36
+ const decodedPromise = await batchJsonRpc({
37
+ rpc,
38
+ calls: poolInfosCalls,
39
+ outputTypeAbi: batchPancakeSwapStrats.outputTypeHr[chainId]!,
40
+ callsKey: `strategies/pancakeswap/fetch/getPancakeV3Vaults.ts: getPancakeV3Vaults - chainId ${chainId} - rpc ${rpc}`,
41
+ })
42
+
43
+ const positionsInputData = encodeAbiParameters(
44
+ parseAbiParameters(batchPancakeSwapPositions.inputType[chainId]!) as any,
45
+ [contracts.pancakeMasterchef![chainId], contracts.cakeStrategy![chainId], contracts.cakeLocker![chainId]],
46
+ )
47
+ const positionsCalls = concatBytecode(batchPancakeSwapPositions.bytecode[chainId]!, positionsInputData)
48
+
49
+ const positionsData = await batchJsonRpc({
50
+ rpc,
51
+ calls: [positionsCalls],
52
+ outputTypeAbi: batchPancakeSwapPositions.outputTypeHr[chainId]!,
53
+ callsKey: `strategies/pancakeswap/fetch/getPancakeV3Vaults.ts: positionsData - chainId ${chainId} - rpc ${rpc}`,
54
+ })
55
+
56
+ const pricesToFetch = pools
57
+ .flatMap((p) =>
58
+ p.coins.map((c) => {
59
+ const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c.address))?.usdPrice || 0
60
+ return coinPrice === 0 ? { address: c.address, symbol: c.symbol } : undefined
61
+ }),
62
+ )
63
+ .filter(Boolean)
64
+ const prices = await mergePrices(basePrices, pricesToFetch, chainId)
65
+
66
+ const cake = tokenWithId('cake', chainId)!
67
+ const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
68
+
69
+ const global: PancakeSwapGlobalData = {
70
+ totalAllocPoint: '0',
71
+ inflationRate: '0',
72
+ fees: {
73
+ veSdt: 0,
74
+ perf: 0,
75
+ accumulator: 0,
76
+ claimer: 0,
77
+ },
78
+ }
79
+
80
+ // TODO stratsData type
81
+ let stratsData: any[] = []
82
+
83
+ decodedPromise.forEach((d, index) => {
84
+ if (index === 0) {
85
+ global.totalAllocPoint = formatUnits(d.totalAllocPoint, 0)
86
+ global.inflationRate = formatUnits(d.inflationRate, 30)
87
+ }
88
+
89
+ for (const stratData of d.pancakeSwapStratsData) {
90
+ const stratParsedData = {
91
+ poolId: Number(stratData.id),
92
+ allocPoint: Number(stratData.allocPoint),
93
+ tick: stratData.tick,
94
+ sqrtPriceX96: stratData.sqrtPriceX96.toString(),
95
+ totalLiquidity: stratData.totalLiquidity.toString(),
96
+ totalBoostLiquidity: stratData.totalBoostLiquidity.toString(),
97
+ poolLiquidity: stratData.poolLiquidity.toString(),
98
+ }
99
+
100
+ const strat = pools.find((p) => p.poolId === stratParsedData.poolId)
101
+
102
+ const token0PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[0]!.address))?.usdPrice || 0
103
+ const token1PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[1]!.address))?.usdPrice || 0
104
+
105
+ let tvl = 0
106
+ let boost = 2
107
+ const poolPositionData = positionsData.filter((p) => Number(p.pid) === strat.poolId)
108
+ const fees24H = ((feesApr[strat.pool.toLowerCase()]?.volumeUSD24h || 0) * strat.fee) / 10000
109
+
110
+ const positions = poolPositionData.map((p) => {
111
+ const computedPositionData = computePositionData(
112
+ strat,
113
+ p,
114
+ stratParsedData,
115
+ fees24H,
116
+ prices,
117
+ token0PriceInUsd,
118
+ token1PriceInUsd,
119
+ global.totalAllocPoint,
120
+ global.inflationRate,
121
+ )
122
+
123
+ tvl += computedPositionData.tvlToAdd
124
+ boost = computedPositionData.boost
125
+
126
+ return computedPositionData.positionData
127
+ })
128
+
129
+ const protocolTvlData = stakedTVLS[strat.pool]
130
+ const protocolTvl = protocolTvlData
131
+ ? Number(protocolTvlData.token0) * token0PriceInUsd + Number(protocolTvlData.token1) * token1PriceInUsd
132
+ : 0
133
+
134
+ const farmApr =
135
+ getFarmApr({
136
+ tvlUsd: protocolTvl,
137
+ cakePriceUsd,
138
+ cakePerSecond: Number(global.inflationRate),
139
+ poolWeight: stratParsedData.allocPoint / Number(global.totalAllocPoint),
140
+ }) *
141
+ ((100 - STRAT_FEES + 0.5) / 100) // +0.5 because no harvest fee on v3 pools
142
+
143
+ const rewards = [
144
+ {
145
+ token: strat.rewards[0],
146
+ apr: farmApr * boost,
147
+ price: cakePriceUsd,
148
+ streaming: true,
149
+ periodFinish: 0,
150
+ rate: '0',
151
+ lastUpdate: '0',
152
+ claimablePendingRewards: '0',
153
+ },
154
+ ]
155
+
156
+ const tradingApy = Number(feesApr[strat.pool.toLowerCase()]?.apr7d || 0)
157
+ const apr = getAprBreakdown({ ...strat, tradingApy }, rewards, boost, undefined)
158
+
159
+ const parsedData = {
160
+ key: strat.key,
161
+ name: strat.coins.reduce((res: string, current) => `${res}/${current.symbol}`, '').slice(1),
162
+ subname: 'v3',
163
+ protocol: strat.protocol,
164
+ version: '3',
165
+ chainId: strat.chainId,
166
+ pool: strat.pool,
167
+ fee: strat.fee,
168
+ coins: strat.coins,
169
+ coinsPrice: [token0PriceInUsd, token1PriceInUsd],
170
+ tvl,
171
+ apr: { ...apr, boost },
172
+ rewards,
173
+ // Positions
174
+ positions,
175
+ // Base APR data
176
+ tradingApy,
177
+ gaugesProjectedApr: strat.gaugesProjectedApr,
178
+ minApr: farmApr,
179
+ maxApr: farmApr * 2,
180
+ // Raw data
181
+ tick: Number(stratParsedData.tick),
182
+ sqrtPriceX96: stratParsedData.sqrtPriceX96.toString(),
183
+ allocPoint: stratParsedData.allocPoint,
184
+ }
185
+
186
+ stratsData = stratsData.concat(parsedData)
187
+ }
188
+ })
189
+
190
+ return { global, stratsData }
191
+ }