@stake-dao/reader 0.1.0 → 0.1.2

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 (210) hide show
  1. package/dist/esm/batches/buildYearnStrats.js +39 -0
  2. package/dist/esm/batches/buildYearnStrats.js.map +1 -0
  3. package/dist/esm/batches/curveStrats.js +4 -6
  4. package/dist/esm/batches/curveStrats.js.map +1 -1
  5. package/dist/esm/batches/fetchYearnGauges.js +76 -0
  6. package/dist/esm/batches/fetchYearnGauges.js.map +1 -0
  7. package/dist/esm/batches/index.js +2 -0
  8. package/dist/esm/batches/index.js.map +1 -1
  9. package/dist/esm/index.js +2 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/lockers/abis/MulticallLockers.json +591 -0
  12. package/dist/esm/lockers/fetch/index.js +306 -0
  13. package/dist/esm/lockers/fetch/index.js.map +1 -0
  14. package/dist/esm/lockers/utils/cakeLockerAirdrop.js +46 -0
  15. package/dist/esm/lockers/utils/cakeLockerAirdrop.js.map +1 -0
  16. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +20 -0
  17. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -0
  18. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +94 -0
  19. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -0
  20. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js +6 -0
  21. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js.map +1 -0
  22. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +8 -0
  23. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +1 -0
  24. package/dist/esm/lockers/utils/callsForLockers/index.js +29 -0
  25. package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -0
  26. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +38 -0
  27. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -0
  28. package/dist/esm/lockers/utils/callsForLockers/veCalls.js +26 -0
  29. package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -0
  30. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js +14 -0
  31. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js.map +1 -0
  32. package/dist/esm/lockers/utils/endpoints.js +23 -0
  33. package/dist/esm/lockers/utils/endpoints.js.map +1 -0
  34. package/dist/esm/lockers/utils/getBribesRewardsData.js +46 -0
  35. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -0
  36. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +22 -0
  37. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +1 -0
  38. package/dist/esm/lockers/utils/getFees.js +30 -0
  39. package/dist/esm/lockers/utils/getFees.js.map +1 -0
  40. package/dist/esm/lockers/utils/getHttpCalls.js +44 -0
  41. package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -0
  42. package/dist/esm/lockers/utils/getSdtInflationData.js +38 -0
  43. package/dist/esm/lockers/utils/getSdtInflationData.js.map +1 -0
  44. package/dist/esm/lockers/utils/index.js +157 -0
  45. package/dist/esm/lockers/utils/index.js.map +1 -0
  46. package/dist/esm/lockers/utils/substractFees.js +22 -0
  47. package/dist/esm/lockers/utils/substractFees.js.map +1 -0
  48. package/dist/esm/strategies/curve/build.js +10 -7
  49. package/dist/esm/strategies/curve/build.js.map +1 -1
  50. package/dist/esm/strategies/curve/fetch/curveApiData/abi.js +1 -1
  51. package/dist/esm/strategies/curve/fetch/curveApiData/abi.js.map +1 -1
  52. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js +3 -3
  53. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js.map +1 -1
  54. package/dist/esm/strategies/curve/fetch/curveApiData/config.js +1 -1
  55. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js +3 -6
  56. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js.map +1 -1
  57. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +1 -0
  58. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
  59. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js +26 -58
  60. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js.map +1 -1
  61. package/dist/esm/strategies/curve/fetch/index.js +7 -23
  62. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  63. package/dist/esm/strategies/curve/httpCalls.js +8 -24
  64. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  65. package/dist/esm/strategies/utils/abis/MulticallYearnStratsAbi.json +107 -0
  66. package/dist/esm/strategies/{curve/fetch → utils}/getAprBreakdown.js +18 -8
  67. package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -0
  68. package/dist/esm/strategies/utils/index.js +1 -0
  69. package/dist/esm/strategies/utils/index.js.map +1 -1
  70. package/dist/esm/strategies/utils/sdt.js +17 -0
  71. package/dist/esm/strategies/utils/sdt.js.map +1 -1
  72. package/dist/esm/strategies/yearn/build.js +97 -0
  73. package/dist/esm/strategies/yearn/build.js.map +1 -0
  74. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js +28 -0
  75. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js.map +1 -0
  76. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +61 -0
  77. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -0
  78. package/dist/esm/strategies/yearn/fetch/index.js +169 -0
  79. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -0
  80. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  81. package/dist/esm/utils.js +33 -1
  82. package/dist/esm/utils.js.map +1 -1
  83. package/dist/types/batches/buildYearnStrats.d.ts +4 -0
  84. package/dist/types/batches/buildYearnStrats.d.ts.map +1 -0
  85. package/dist/types/batches/curveStrats.d.ts.map +1 -1
  86. package/dist/types/batches/fetchYearnGauges.d.ts +4 -0
  87. package/dist/types/batches/fetchYearnGauges.d.ts.map +1 -0
  88. package/dist/types/batches/index.d.ts +2 -0
  89. package/dist/types/batches/index.d.ts.map +1 -1
  90. package/dist/types/index.d.ts +2 -0
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/types/lockers/fetch/index.d.ts +11 -0
  93. package/dist/types/lockers/fetch/index.d.ts.map +1 -0
  94. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts +8 -0
  95. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts.map +1 -0
  96. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +3 -0
  97. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -0
  98. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +11 -0
  99. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -0
  100. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +6 -0
  101. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +1 -0
  102. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +11 -0
  103. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +1 -0
  104. package/dist/types/lockers/utils/callsForLockers/index.d.ts +3 -0
  105. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -0
  106. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +15 -0
  107. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -0
  108. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +3 -0
  109. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -0
  110. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +11 -0
  111. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +1 -0
  112. package/dist/types/lockers/utils/endpoints.d.ts +3 -0
  113. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -0
  114. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +18 -0
  115. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -0
  116. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +2 -0
  117. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +1 -0
  118. package/dist/types/lockers/utils/getFees.d.ts +4 -0
  119. package/dist/types/lockers/utils/getFees.d.ts.map +1 -0
  120. package/dist/types/lockers/utils/getHttpCalls.d.ts +11 -0
  121. package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -0
  122. package/dist/types/lockers/utils/getSdtInflationData.d.ts +8 -0
  123. package/dist/types/lockers/utils/getSdtInflationData.d.ts.map +1 -0
  124. package/dist/types/lockers/utils/index.d.ts +30 -0
  125. package/dist/types/lockers/utils/index.d.ts.map +1 -0
  126. package/dist/types/lockers/utils/substractFees.d.ts +3 -0
  127. package/dist/types/lockers/utils/substractFees.d.ts.map +1 -0
  128. package/dist/types/strategies/curve/build.d.ts +2 -31
  129. package/dist/types/strategies/curve/build.d.ts.map +1 -1
  130. package/dist/types/strategies/curve/fetch/curveApiData/abi.d.ts.map +1 -1
  131. package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts +1 -1
  132. package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts.map +1 -1
  133. package/dist/types/strategies/curve/fetch/curveApiData/config.d.ts +1 -1
  134. package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts.map +1 -1
  135. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts +1 -0
  136. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
  137. package/dist/types/strategies/curve/fetch/getStratsWithApr.d.ts +0 -4
  138. package/dist/types/strategies/curve/fetch/getStratsWithApr.d.ts.map +1 -1
  139. package/dist/types/strategies/curve/fetch/index.d.ts +2 -7
  140. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  141. package/dist/types/strategies/curve/httpCalls.d.ts +3 -6
  142. package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
  143. package/dist/types/strategies/types.d.ts +49 -6
  144. package/dist/types/strategies/types.d.ts.map +1 -1
  145. package/dist/types/strategies/utils/getAprBreakdown.d.ts +15 -0
  146. package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -0
  147. package/dist/types/strategies/utils/index.d.ts +1 -0
  148. package/dist/types/strategies/utils/index.d.ts.map +1 -1
  149. package/dist/types/strategies/utils/sdt.d.ts +1 -0
  150. package/dist/types/strategies/utils/sdt.d.ts.map +1 -1
  151. package/dist/types/strategies/yearn/build.d.ts +8 -0
  152. package/dist/types/strategies/yearn/build.d.ts.map +1 -0
  153. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts +9 -0
  154. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts.map +1 -0
  155. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts +2 -0
  156. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -0
  157. package/dist/types/strategies/yearn/fetch/index.d.ts +5 -0
  158. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -0
  159. package/dist/types/utils.d.ts +5 -0
  160. package/dist/types/utils.d.ts.map +1 -1
  161. package/package.json +4 -3
  162. package/src/batches/buildYearnStrats.ts +41 -0
  163. package/src/batches/curveStrats.ts +4 -6
  164. package/src/batches/fetchYearnGauges.ts +78 -0
  165. package/src/batches/index.ts +2 -0
  166. package/src/index.ts +2 -0
  167. package/src/lockers/fetch/index.ts +407 -0
  168. package/src/lockers/utils/cakeLockerAirdrop.ts +73 -0
  169. package/src/lockers/utils/callsForLockers/depositorCalls.ts +25 -0
  170. package/src/lockers/utils/callsForLockers/feeCalls.ts +118 -0
  171. package/src/lockers/utils/callsForLockers/gaugeCalls.ts +6 -0
  172. package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +8 -0
  173. package/src/lockers/utils/callsForLockers/index.ts +44 -0
  174. package/src/lockers/utils/callsForLockers/pegCalls.ts +40 -0
  175. package/src/lockers/utils/callsForLockers/veCalls.ts +31 -0
  176. package/src/lockers/utils/callsForLockers/veSdtCalls.ts +15 -0
  177. package/src/lockers/utils/endpoints.ts +24 -0
  178. package/src/lockers/utils/getBribesRewardsData.ts +64 -0
  179. package/src/lockers/utils/getCherriesLeaderBoard.ts +34 -0
  180. package/src/lockers/utils/getFees.ts +34 -0
  181. package/src/lockers/utils/getHttpCalls.ts +55 -0
  182. package/src/lockers/utils/getSdtInflationData.ts +54 -0
  183. package/src/lockers/utils/index.ts +200 -0
  184. package/src/lockers/utils/substractFees.ts +26 -0
  185. package/src/strategies/curve/build.ts +49 -44
  186. package/src/strategies/curve/fetch/curveApiData/abi.ts +1 -1
  187. package/src/strategies/curve/fetch/curveApiData/bytecode.ts +3 -3
  188. package/src/strategies/curve/fetch/curveApiData/config.ts +1 -1
  189. package/src/strategies/curve/fetch/curveApiData/getCurveApiData.ts +2 -2
  190. package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +2 -0
  191. package/src/strategies/curve/fetch/getStratsWithApr.ts +27 -81
  192. package/src/strategies/curve/fetch/index.ts +10 -29
  193. package/src/strategies/curve/httpCalls.ts +8 -24
  194. package/src/strategies/types.ts +52 -6
  195. package/src/strategies/{curve/fetch → utils}/getAprBreakdown.ts +26 -9
  196. package/src/strategies/utils/index.ts +1 -0
  197. package/src/strategies/utils/sdt.ts +24 -0
  198. package/src/strategies/yearn/build.ts +156 -0
  199. package/src/strategies/yearn/fetch/computeYearnApr.ts +47 -0
  200. package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +78 -0
  201. package/src/strategies/yearn/fetch/index.ts +225 -0
  202. package/src/utils.ts +43 -1
  203. package/dist/esm/strategies/curve/fetch/getAprBreakdown.js.map +0 -1
  204. package/dist/esm/strategies/curve/fetch/types.js +0 -2
  205. package/dist/esm/strategies/curve/fetch/types.js.map +0 -1
  206. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts +0 -17
  207. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts.map +0 -1
  208. package/dist/types/strategies/curve/fetch/types.d.ts +0 -11
  209. package/dist/types/strategies/curve/fetch/types.d.ts.map +0 -1
  210. package/src/strategies/curve/fetch/types.ts +0 -11
@@ -0,0 +1,78 @@
1
+ import type { BatchMetaData } from './types.js'
2
+
3
+ const fetchYearnGauges: BatchMetaData = {
4
+ bytecode: {
5
+ 1: '0x608060405234801561001057600080fd5b5060405161140938038061140983398181016040528101906100329190610c95565b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663ed20cb306040518163ffffffff1660e01b8152600401602060405180830381865afa158015610084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100a89190610cd5565b90506100b2610b3e565b83826100be9190610d31565b67ffffffffffffffff8111156100d7576100d6610d65565b5b60405190808252806020026020018201604052801561011057816020015b6100fd610b51565b8152602001906001900390816100f55790505b50816000018190525060008490505b828110156109535760008473ffffffffffffffffffffffffffffffffffffffff16638c64ea4a836040518263ffffffff1660e01b81526004016101629190610da3565b602060405180830381865afa15801561017f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a39190610dbe565b905060008573ffffffffffffffffffffffffffffffffffffffff1663dfe3d284836040518263ffffffff1660e01b81526004016101e09190610dfa565b602060405180830381865afa1580156101fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102219190610dbe565b90506000829050610230610b51565b82816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506102778461098360201b60201c565b816020018190525061028e8361098360201b60201c565b81604001819052508773ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103059190610dbe565b73ffffffffffffffffffffffffffffffffffffffff1663a0d4b907846040518263ffffffff1660e01b815260040161033d9190610dfa565b602060405180830381865afa15801561035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037e9190610cd5565b8160a00181815250508173ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103ef57506040513d601f19601f820116820180604052508101906103ec9190610dbe565b60015b6108665760008273ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104649190610dbe565b90506104758161098360201b60201c565b82608001819052508073ffffffffffffffffffffffffffffffffffffffff1663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156104e557506040513d601f19601f820116820180604052508101906104e29190610dbe565b60015b6106a357600267ffffffffffffffff81111561050457610503610d65565b5b60405190808252806020026020018201604052801561053d57816020015b61052a610baf565b8152602001906001900390816105225790505b5082606001819052506105cf8173ffffffffffffffffffffffffffffffffffffffff1663c661065760006040518263ffffffff1660e01b81526004016105839190610e5a565b602060405180830381865afa1580156105a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c49190610dbe565b61098360201b60201c565b82606001516000815181106105e7576105e6610e75565b5b602002602001018190525061067b8173ffffffffffffffffffffffffffffffffffffffff1663c661065760016040518263ffffffff1660e01b815260040161062f9190610edf565b602060405180830381865afa15801561064c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106709190610dbe565b61098360201b60201c565b826060015160018151811061069357610692610e75565b5b6020026020010181905250610860565b6000819050600267ffffffffffffffff8111156106c3576106c2610d65565b5b6040519080825280602002602001820160405280156106fc57816020015b6106e9610baf565b8152602001906001900390816106e15790505b50846060018190525061078e8173ffffffffffffffffffffffffffffffffffffffff1663c661065760006040518263ffffffff1660e01b81526004016107429190610e5a565b602060405180830381865afa15801561075f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107839190610dbe565b61098360201b60201c565b84606001516000815181106107a6576107a5610e75565b5b602002602001018190525061083a8173ffffffffffffffffffffffffffffffffffffffff1663c661065760016040518263ffffffff1660e01b81526004016107ee9190610edf565b602060405180830381865afa15801561080b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082f9190610dbe565b61098360201b60201c565b846060015160018151811061085257610851610e75565b5b602002602001018190525050505b5061090e565b600167ffffffffffffffff81111561088157610880610d65565b5b6040519080825280602002602001820160405280156108ba57816020015b6108a7610baf565b81526020019060019003908161089f5790505b5082606001819052506108d28161098360201b60201c565b82606001516000815181106108ea576108e9610e75565b5b60200260200101819052506109048161098360201b60201c565b8260800181905250505b8086600001518a876109209190610d31565b8151811061093157610930610e75565b5b602002602001018190525050505050808061094b90610efa565b91505061011f565b5060008160405160200161096791906112a6565b6040516020818303038152906040529050602081018059038082f35b61098b610baf565b60008290508073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109db573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a0491906113bf565b82600001819052508073ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a8091906113bf565b826020018190525082826040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190610cd5565b82606001818152505050919050565b6040518060200160405280606081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001610b81610baf565b8152602001610b8e610baf565b815260200160608152602001610ba2610baf565b8152602001600081525090565b60405180608001604052806060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c2c82610c01565b9050919050565b610c3c81610c21565b8114610c4757600080fd5b50565b600081519050610c5981610c33565b92915050565b6000819050919050565b610c7281610c5f565b8114610c7d57600080fd5b50565b600081519050610c8f81610c69565b92915050565b60008060408385031215610cac57610cab610bf7565b5b6000610cba85828601610c4a565b9250506020610ccb85828601610c80565b9150509250929050565b600060208284031215610ceb57610cea610bf7565b5b6000610cf984828501610c80565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d3c82610c5f565b9150610d4783610c5f565b9250828203905081811115610d5f57610d5e610d02565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d9d81610c5f565b82525050565b6000602082019050610db86000830184610d94565b92915050565b600060208284031215610dd457610dd3610bf7565b5b6000610de284828501610c4a565b91505092915050565b610df481610c21565b82525050565b6000602082019050610e0f6000830184610deb565b92915050565b6000819050919050565b6000819050919050565b6000610e44610e3f610e3a84610e15565b610e1f565b610c5f565b9050919050565b610e5481610e29565b82525050565b6000602082019050610e6f6000830184610e4b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000610ec9610ec4610ebf84610ea4565b610e1f565b610c5f565b9050919050565b610ed981610eae565b82525050565b6000602082019050610ef46000830184610ed0565b92915050565b6000610f0582610c5f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f3757610f36610d02565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f7781610c21565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fb7578082015181840152602081019050610f9c565b60008484015250505050565b6000601f19601f8301169050919050565b6000610fdf82610f7d565b610fe98185610f88565b9350610ff9818560208601610f99565b61100281610fc3565b840191505092915050565b61101681610c5f565b82525050565b600060808301600083015184820360008601526110398282610fd4565b915050602083015184820360208601526110538282610fd4565b91505060408301516110686040860182610f6e565b50606083015161107b606086018261100d565b508091505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006110be838361101c565b905092915050565b6000602082019050919050565b60006110de82611086565b6110e88185611091565b9350836020820285016110fa856110a2565b8060005b85811015611136578484038952815161111785826110b2565b9450611122836110c6565b925060208a019950506001810190506110fe565b50829750879550505050505092915050565b600060c0830160008301516111606000860182610f6e565b5060208301518482036020860152611178828261101c565b91505060408301518482036040860152611192828261101c565b915050606083015184820360608601526111ac82826110d3565b915050608083015184820360808601526111c6828261101c565b91505060a08301516111db60a086018261100d565b508091505092915050565b60006111f28383611148565b905092915050565b6000602082019050919050565b600061121282610f42565b61121c8185610f4d565b93508360208202850161122e85610f5e565b8060005b8581101561126a578484038952815161124b85826111e6565b9450611256836111fa565b925060208a01995050600181019050611232565b50829750879550505050505092915050565b600060208301600083015184820360008601526112998282611207565b9150508091505092915050565b600060208201905081810360008301526112c0818461127c565b905092915050565b600080fd5b600080fd5b6112db82610fc3565b810181811067ffffffffffffffff821117156112fa576112f9610d65565b5b80604052505050565b600061130d610bed565b905061131982826112d2565b919050565b600067ffffffffffffffff82111561133957611338610d65565b5b61134282610fc3565b9050602081019050919050565b600061136261135d8461131e565b611303565b90508281526020810184848401111561137e5761137d6112cd565b5b611389848285610f99565b509392505050565b600082601f8301126113a6576113a56112c8565b5b81516113b684826020860161134f565b91505092915050565b6000602082840312156113d5576113d4610bf7565b5b600082015167ffffffffffffffff8111156113f3576113f2610bfc565b5b6113ff84828501611391565b9150509291505056fe',
6
+ },
7
+ inputType: {
8
+ 1: ['address _yearnGaugeRegistry, uint256 skip'],
9
+ },
10
+ outputTypeHr: {
11
+ 1: [
12
+ 'ReturnData returnData',
13
+ 'struct ReturnData { YearnStrat[] yearnStrats; }',
14
+ 'struct YearnStrat { address gaugeAddress; Erc20Data lpToken; Erc20Data gaugeToken;Erc20Data[] coins; Erc20Data underlyingReward; uint256 gaugeVersion;}',
15
+ 'struct Erc20Data { string name; string symbol; address tokenAddress; uint256 decimals;}',
16
+ ],
17
+ },
18
+ outputType: {
19
+ 1: [
20
+ {
21
+ type: 'tuple',
22
+ name: 'returnData',
23
+ components: [
24
+ {
25
+ type: 'tuple[]',
26
+ name: 'yearnStrats',
27
+ components: [
28
+ { type: 'address', name: 'gaugeAddress' },
29
+ {
30
+ type: 'tuple',
31
+ name: 'lpToken',
32
+ components: [
33
+ { type: 'string', name: 'name' },
34
+ { type: 'string', name: 'symbol' },
35
+ { type: 'address', name: 'tokenAddress' },
36
+ { type: 'uint256', name: 'decimals' },
37
+ ],
38
+ },
39
+ {
40
+ type: 'tuple',
41
+ name: 'gaugeToken',
42
+ components: [
43
+ { type: 'string', name: 'name' },
44
+ { type: 'string', name: 'symbol' },
45
+ { type: 'address', name: 'tokenAddress' },
46
+ { type: 'uint256', name: 'decimals' },
47
+ ],
48
+ },
49
+ {
50
+ type: 'tuple[]',
51
+ name: 'coins',
52
+ components: [
53
+ { type: 'string', name: 'name' },
54
+ { type: 'string', name: 'symbol' },
55
+ { type: 'address', name: 'tokenAddress' },
56
+ { type: 'uint256', name: 'decimals' },
57
+ ],
58
+ },
59
+ {
60
+ type: 'tuple',
61
+ name: 'underlyingReward',
62
+ components: [
63
+ { type: 'string', name: 'name' },
64
+ { type: 'string', name: 'symbol' },
65
+ { type: 'address', name: 'tokenAddress' },
66
+ { type: 'uint256', name: 'decimals' },
67
+ ],
68
+ },
69
+ { type: 'uint256', name: 'gaugeVersion' },
70
+ ],
71
+ },
72
+ ],
73
+ },
74
+ ],
75
+ },
76
+ }
77
+
78
+ export default fetchYearnGauges
@@ -1,3 +1,5 @@
1
1
  export { default as batchTokenData } from './tokenData.js'
2
2
  export { default as batchSdtGaugeRewards } from './sdtGaugeRewards.js'
3
3
  export { default as batchCurveStrats } from './curveStrats.js'
4
+ export { default as buildYearnStrats } from './buildYearnStrats.js'
5
+ export { default as fetchYearnGauges } from './fetchYearnGauges.js'
package/src/index.ts CHANGED
@@ -4,4 +4,6 @@ export { getGaugesWeights } from './strategies/curve/fetch/curveApiData/getGauge
4
4
  export { getGaugesFromRegistry } from './strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js'
5
5
  export { getPricesFromLlama, getPricesFromGeckoTerminal } from './prices.js'
6
6
  export { fetchSdt } from './sdt/sdt.js'
7
+ export { fetchLockers } from './lockers/fetch/index.js'
8
+ export { fetchYearn } from './strategies/yearn/fetch/index.js'
7
9
  export * from './strategies/utils/index.js'
@@ -0,0 +1,407 @@
1
+ import { formatUnits, parseAbi, parseUnits, zeroAddress } from 'viem'
2
+ import { mainnet } from 'viem/chains'
3
+
4
+ import { ONE_YEAR, lockers, tokenWithId } from '@stake-dao/constants'
5
+ import { delegationWithId } from '@stake-dao/constants'
6
+ import { OneEther, Zero } from '../../index.js'
7
+ import { type Price } from '../../prices.js'
8
+ import { type Call, multicall } from '../../utils.js'
9
+ import { lockedAmountCallSideChain } from '../utils/index.js'
10
+
11
+ import { type MultiChainCall, multichainMulticall } from '../../utils.js'
12
+ import lockersMulticallAbi from '../abis/MulticallLockers.json'
13
+ import { getCherriesLeaderBoard } from '../utils/getCherriesLeaderBoard.js'
14
+
15
+ import { extractFees, feeCalls } from '../utils/callsForLockers/feeCalls.js'
16
+ import callsForLockers from '../utils/callsForLockers/index.js'
17
+ import getBribesRewardsData from '../utils/getBribesRewardsData.js'
18
+ import getFees from '../utils/getFees.js'
19
+ import getHttpCalls from '../utils/getHttpCalls.js'
20
+ import getSdtInflationData from '../utils/getSdtInflationData.js'
21
+ import substractFees from '../utils/substractFees.js'
22
+
23
+ const callsForRewards = (gauge: string, rewards: any[]) =>
24
+ rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] }))
25
+
26
+ const callsForLockersSideChains = (lockerId: any, sideChains: any[]) => {
27
+ return sideChains.reduce((acc, value) => {
28
+ return acc.concat([
29
+ lockedAmountCallSideChain(lockerId, value.veToken, value.locker, value.chainId),
30
+ { address: value.veToken, name: 'balanceOf', params: [value.locker], chainId: value.chainId },
31
+ { address: value.veToken, name: 'totalSupply', chainId: value.chainId },
32
+ ])
33
+ }, [])
34
+ }
35
+
36
+ export const fetchLockers = async (provider: any, chainId: number, prices: Price[]) => {
37
+ const chainLockers = lockers.filter((l) => l.chainId === chainId)
38
+
39
+ const httpCalls = await getHttpCalls(chainId)
40
+
41
+ const lockersCalls: Call[] = []
42
+ const lockersRewardsCalls: Call[] = []
43
+ const lockersFeeCalls: Call[] = []
44
+ const lockersSideChainsCalls: MultiChainCall[] = []
45
+
46
+ for (const locker of chainLockers) {
47
+ lockersCalls.push(
48
+ ...callsForLockers(
49
+ locker.id,
50
+ locker.token!.address,
51
+ locker.sdToken!.address,
52
+ locker.extensions.veToken,
53
+ locker.extensions.depositor,
54
+ locker.extensions.gaugeController,
55
+ locker.extensions.gauge,
56
+ locker.extensions.locker,
57
+ locker.extensions.pool,
58
+ locker.pegCalculator,
59
+ locker.extensions.secondaryMarket,
60
+ locker.extensions.voteBooster,
61
+ ),
62
+ )
63
+ lockersRewardsCalls.push(...callsForRewards(locker.extensions.gauge, locker.rewards))
64
+ if (locker.extensions.sideChains) {
65
+ lockersSideChainsCalls.push(...callsForLockersSideChains(locker.id, locker.extensions.sideChains))
66
+ }
67
+
68
+ // Add fee calls into another array
69
+ // We will concat it with #lockersRewardsCalls to do only one multicall, the concat will push all fee calls at the end
70
+ lockersFeeCalls.push(...feeCalls(locker.id, locker.extensions.accumulator))
71
+ }
72
+
73
+ const [rawLockersData, rawLockersSideChainData] = (
74
+ await Promise.allSettled([
75
+ multicall(provider, lockersCalls.concat(lockersFeeCalls), lockersMulticallAbi),
76
+ multichainMulticall(lockersSideChainsCalls, lockersMulticallAbi),
77
+ ])
78
+ ).map((result) => (result.status === 'fulfilled' ? result.value : result.reason))
79
+
80
+ const lockersFees = extractFees(chainLockers, rawLockersData)
81
+
82
+ const [sdtInflationData, rawLockersRewardsData]: any = await Promise.all([
83
+ getSdtInflationData(provider),
84
+ multicall(
85
+ provider,
86
+ lockersRewardsCalls,
87
+ parseAbi([
88
+ 'function reward_data(address) external view returns (address,address,uint256,uint256,uint256,uint256)',
89
+ ]),
90
+ ),
91
+ ])
92
+
93
+ const lockerData = chainLockers.map(async (locker) => {
94
+ const lockerCallsLength = callsForLockers(
95
+ locker.id,
96
+ locker.token!.address,
97
+ locker.sdToken!.address,
98
+ locker.extensions.veToken,
99
+ locker.extensions.depositor,
100
+ locker.extensions.gaugeController,
101
+ locker.extensions.gauge,
102
+ locker.extensions.locker,
103
+ locker.extensions.pool,
104
+ locker.pegCalculator,
105
+ locker.extensions.secondaryMarket,
106
+ locker.extensions.voteBooster,
107
+ ).length
108
+ const chunkedRawLockersData = rawLockersData.splice(0, lockerCallsLength)
109
+
110
+ let gaugeRelativeWeight = '0'
111
+ let gaugeTotalWeight = '0'
112
+ let gaugeWeight = '0'
113
+ let nextEffectiveTimestamp = '0'
114
+
115
+ let airdropGraph: any = undefined
116
+ if (locker.id === 'cake') {
117
+ airdropGraph = await getCherriesLeaderBoard()
118
+ }
119
+
120
+ const lockerFee = lockersFees.find((l) => l.lockerId === locker.id)
121
+ const fees = getFees(locker, lockerFee)
122
+
123
+ const tokenLocked = formatUnits(chunkedRawLockersData[0].result[0], 0)
124
+ const veBalanceOfLockerBN = chunkedRawLockersData[1].result
125
+ const veBalanceOfLocker = formatUnits(veBalanceOfLockerBN, locker.token!.decimals)
126
+ const totalTokenLocked = formatUnits(chunkedRawLockersData[2].result, 0)
127
+ const veTotalSupplyBN = chunkedRawLockersData[3].result
128
+ const veTotalSupply = formatUnits(veTotalSupplyBN, locker.token!.decimals)
129
+ const lockIncentive = formatUnits(chunkedRawLockersData[4].result, 0)
130
+ const incentiveAmountInToken = formatUnits(chunkedRawLockersData[5].result, 0)
131
+ if (chainId === mainnet.id) {
132
+ gaugeRelativeWeight = formatUnits(chunkedRawLockersData[6].result, 0)
133
+ gaugeTotalWeight = formatUnits(chunkedRawLockersData[7].result, 0)
134
+ gaugeWeight = formatUnits(chunkedRawLockersData[8].result, 0)
135
+ nextEffectiveTimestamp = formatUnits(chunkedRawLockersData[9].result, 0)
136
+ }
137
+
138
+ const totalSupplyStakedStr =
139
+ locker.extensions.gauge !== zeroAddress ? formatUnits(chunkedRawLockersData[10].result, 0) : '0'
140
+ const totalSupplyStaked =
141
+ locker.extensions.gauge !== zeroAddress
142
+ ? formatUnits(chunkedRawLockersData[10].result, locker.token!.decimals)
143
+ : '0'
144
+
145
+ const gaugeWorkingSupplyStr =
146
+ locker.chainId === mainnet.id && locker.extensions.gauge !== zeroAddress
147
+ ? formatUnits(chunkedRawLockersData[11].result, 0)
148
+ : '0'
149
+ const gaugeWorkingSupply =
150
+ locker.chainId === mainnet.id && locker.extensions.gauge !== zeroAddress
151
+ ? formatUnits(chunkedRawLockersData[11].result, locker.token!.decimals)
152
+ : '0'
153
+ const amountTokenNotLock = formatUnits(chunkedRawLockersData[12].result, 0)
154
+ const veSdtTotalSupply = chainId === mainnet.id ? chunkedRawLockersData[13].result : '0'
155
+
156
+ const voteBoosterBalance = locker.extensions.voteBooster
157
+ ? {
158
+ token: formatUnits(chunkedRawLockersData[14].result, locker.token!.decimals),
159
+ sdToken: formatUnits(chunkedRawLockersData[15].result, locker.sdToken!.decimals),
160
+ staked:
161
+ locker.extensions.gauge !== zeroAddress
162
+ ? formatUnits(chunkedRawLockersData[16].result, locker.sdToken!.decimals)
163
+ : '0',
164
+ working:
165
+ locker.chainId === mainnet.id && locker.extensions.gauge !== zeroAddress
166
+ ? formatUnits(chunkedRawLockersData[17].result, locker.sdToken!.decimals)
167
+ : '0',
168
+ }
169
+ : undefined
170
+
171
+ const voteBoosterBoost = locker.extensions.voteBooster
172
+ ? Number(voteBoosterBalance!.working) > 0 && Number(voteBoosterBalance!.staked) > 0
173
+ ? Number(voteBoosterBalance!.working) / (Number(voteBoosterBalance!.staked) * 0.4)
174
+ : 1
175
+ : undefined
176
+
177
+ const voteBooster = locker.extensions.voteBooster
178
+ ? { balance: voteBoosterBalance, boost: voteBoosterBoost }
179
+ : undefined
180
+
181
+ const rawPeg =
182
+ locker.extensions.pool !== zeroAddress
183
+ ? chunkedRawLockersData[locker.extensions.voteBooster ? 18 : 14].result
184
+ : undefined
185
+ const veTokenRate =
186
+ locker.id === 'mav' ? formatUnits(chunkedRawLockersData[15].result[0], locker.token!.decimals) : '4'
187
+
188
+ const futureWeight =
189
+ BigInt(gaugeTotalWeight) > Zero ? (BigInt(gaugeWeight) * OneEther * OneEther) / BigInt(gaugeTotalWeight) : Zero
190
+
191
+ const sideChains = locker.extensions.sideChains?.map((sideChain) => {
192
+ const tokenLocked = rawLockersSideChainData[sideChain.chainId].shift().result
193
+ return {
194
+ ...sideChain,
195
+ tokenLocked: formatUnits(locker.id === 'mav' ? tokenLocked[0] : tokenLocked, 0),
196
+ veBalanceOfLocker: formatUnits(rawLockersSideChainData[sideChain.chainId].shift().result, 0),
197
+ veTotalSupply: formatUnits(rawLockersSideChainData[sideChain.chainId].shift().result, locker.token!.decimals),
198
+ }
199
+ })
200
+
201
+ let parsedPeg = rawPeg
202
+ switch (locker.id) {
203
+ case 'bal': {
204
+ parsedPeg = rawPeg[1] * BigInt(-1)
205
+ break
206
+ }
207
+ case 'cake': {
208
+ parsedPeg = rawPeg[0]
209
+ break
210
+ }
211
+ }
212
+ const peg =
213
+ rawPeg && parsedPeg ? formatUnits(parsedPeg / parseUnits(locker.pegCalculator.basedOn.toString(), 0), 18) : '-'
214
+
215
+ const tokenPrice = prices.find((p) => p.address === locker.token!.address)
216
+ const tokenPriceInUsd = tokenPrice ? tokenPrice.usdPrice : 0
217
+ const sdTokenPriceInUsd = peg !== '-' ? tokenPriceInUsd * Number(peg) : tokenPriceInUsd
218
+
219
+ const tvl = totalSupplyStaked ? Number(totalSupplyStaked) * sdTokenPriceInUsd : undefined
220
+
221
+ // Rewards APR
222
+ const rewardsData = locker.rewards.map((r) => {
223
+ const rawData = rawLockersRewardsData.shift().result
224
+ const rewardPrice = prices.find((p) => p.address === r.address)?.usdPrice || 0
225
+
226
+ const periodFinish = rawData ? rawData[2] : Zero
227
+ const isFinished = Math.floor(Date.now() / 1000) > Number(periodFinish)
228
+
229
+ const rate = rawData ? rawData[3] : Zero
230
+ const oneYearRate = rate * BigInt(ONE_YEAR)
231
+ const oneYearRewardInUsd = parseUnits(`${rewardPrice}`, locker.token!.decimals) * oneYearRate
232
+
233
+ let maxApr = 0
234
+ switch (locker.id) {
235
+ case 'mav': {
236
+ const MAV_AIRDROP = 10_000_000
237
+ const veMavBalanceOfLocker =
238
+ Number(veBalanceOfLocker) + sideChains?.reduce((acc, value) => acc + Number(value.veBalanceOfLocker), 0)
239
+ const veMavTotalSupply =
240
+ Number(veTotalSupply) + sideChains?.reduce((acc, value) => acc + Number(value.veTotalSupply), 0)
241
+
242
+ const mavAirdropStakeDaoShare = MAV_AIRDROP * (veMavBalanceOfLocker / veMavTotalSupply)
243
+ const airdropPerSdMav = mavAirdropStakeDaoShare / (veMavBalanceOfLocker / Number(veTokenRate))
244
+
245
+ maxApr = airdropPerSdMav
246
+ break
247
+ }
248
+ default: {
249
+ if (isFinished) {
250
+ maxApr = 0
251
+ } else {
252
+ maxApr =
253
+ rewardPrice && (tvl || 0) > 0
254
+ ? ((Number(formatUnits(oneYearRate, r.decimals)) * rewardPrice) / tvl!) * 100
255
+ : 0
256
+ }
257
+ break
258
+ }
259
+ }
260
+
261
+ // Remove fees from APR
262
+ maxApr = substractFees(locker.id, maxApr, lockerFee)
263
+ if (r.id === 'sdt' && locker.id !== 'cake') {
264
+ maxApr = isFinished ? 0 : maxApr
265
+ }
266
+ const minApr = maxApr / (locker.id !== 'cake' && r.address === tokenWithId('sdt')!.address ? 2.5 : 1)
267
+
268
+ let futureMinApr = minApr
269
+ let futureMaxApr = maxApr
270
+
271
+ if (r.id === 'sdt' && locker.id !== 'cake') {
272
+ const futureRate = (sdtInflationData.lockersSdtPerSecond * futureWeight) / OneEther
273
+ const futureOneYearRate = futureRate * BigInt(ONE_YEAR)
274
+ const futureOneYearRewardInUsd = rewardPrice * Number(formatUnits(futureOneYearRate, locker.token!.decimals))
275
+
276
+ futureMaxApr = rewardPrice && (tvl || 0) > 0 ? (futureOneYearRewardInUsd / tvl!) * 100 : 0
277
+ futureMinApr = futureMaxApr / 2.5
278
+ }
279
+
280
+ return {
281
+ token: r.address,
282
+ distributor: rawData ? rawData[1] : zeroAddress,
283
+ periodFinish: formatUnits(periodFinish, 0),
284
+ rate: formatUnits(rate, 0),
285
+ oneYearRate: formatUnits(oneYearRate, 0),
286
+ oneYearRewardInUsd: formatUnits(oneYearRewardInUsd, 0),
287
+ lastUpdate: rawData ? Number(formatUnits(rawData[4], 0)) : 0,
288
+ integral: rawData ? formatUnits(rawData[5], 0) : '0',
289
+ minApr: minApr,
290
+ maxApr: maxApr,
291
+ futureMinApr,
292
+ futureMaxApr,
293
+ rewardPrice,
294
+ isFinished,
295
+ isAirdrop: r.isAirdrop,
296
+ }
297
+ })
298
+
299
+ let bribeMinApr = 0
300
+ let bribeMaxApr = 0
301
+ let bribeRewards: any = undefined
302
+
303
+ if (chainId === mainnet.id) {
304
+ const data = getBribesRewardsData(
305
+ locker,
306
+ httpCalls?.bribesData,
307
+ veSdtTotalSupply,
308
+ totalSupplyStaked,
309
+ veBalanceOfLocker,
310
+ gaugeWorkingSupply,
311
+ )
312
+
313
+ bribeMinApr = data.bribeMinApr
314
+ bribeMaxApr = data.bribeMaxApr
315
+ bribeRewards = data.bribeRewards
316
+ } else if (locker.id === 'cake') {
317
+ const apr =
318
+ (httpCalls?.bribesData?.[delegationWithId('cake')!] || 0) *
319
+ (Number.parseFloat(veBalanceOfLocker) / Number.parseFloat(totalSupplyStaked))
320
+ bribeMinApr = apr
321
+ bribeMaxApr = apr
322
+ bribeRewards = {
323
+ bribeMinApr: apr,
324
+ bribeMaxApr: apr,
325
+ bribeAverageApr: apr,
326
+ average: apr,
327
+ minBoost: 0,
328
+ maxBoost: 0,
329
+ hideBoostTab: true,
330
+ token: 'sdcake',
331
+ }
332
+ }
333
+
334
+ // Total APR
335
+ const minRewardsAprs = rewardsData.reduce((x, y) => x + y.minApr, 0) + bribeMinApr
336
+ const maxRewardsAprs = rewardsData.reduce((x, y) => x + y.maxApr, 0) + bribeMaxApr
337
+
338
+ // Streaming status
339
+ const streaming = rewardsData.some((r) => !r.isFinished)
340
+ const alternativeYields = JSON.parse(JSON.stringify(locker.alternativeYields || {})) // parse and stringify to avoid extensible issue
341
+ if (httpCalls?.cvgAprs?.[locker.extensions.gauge]) {
342
+ alternativeYields.convergenceSdToken = {
343
+ label: locker.sdToken!.symbol,
344
+ platform: 'Convergence',
345
+ href: 'https://app.cvg.finance/',
346
+ apr: httpCalls.cvgAprs[locker.extensions.gauge].totalApr,
347
+ }
348
+ }
349
+
350
+ if (httpCalls?.cvgAprs?.[locker.extensions.strategyGauge!]) {
351
+ alternativeYields[`convergence${locker.sdToken!.symbol}Pool`] = {
352
+ label: `${locker.sdToken!.symbol}/${locker.token!.symbol}`,
353
+ platform: 'Convergence',
354
+ href: 'https://app.cvg.finance/',
355
+ apr: httpCalls.cvgAprs[locker.extensions.strategyGauge!].totalApr,
356
+ }
357
+ }
358
+
359
+ return {
360
+ ...locker,
361
+ fees,
362
+ tokenLocked: tokenLocked,
363
+ veBalanceOfLocker: formatUnits(veBalanceOfLockerBN, 0),
364
+ totalTokenLocked: totalTokenLocked,
365
+ veTotalSupply: formatUnits(veTotalSupplyBN, 0),
366
+ lockIncentive: lockIncentive,
367
+ incentiveAmountInToken: incentiveAmountInToken,
368
+ gaugeRelativeWeight: gaugeRelativeWeight,
369
+ gaugeTotalWeight: gaugeTotalWeight,
370
+ gaugeWeight: gaugeWeight,
371
+ futureWeight: formatUnits(futureWeight, 16),
372
+ gaugeWorkingSupply: gaugeWorkingSupplyStr,
373
+ nextEffectiveTimestamp: nextEffectiveTimestamp,
374
+ totalSupplyStaked: totalSupplyStakedStr,
375
+ amountTokenNotLock: amountTokenNotLock,
376
+ rewardsData,
377
+ bribeRewards,
378
+ apr: [minRewardsAprs, maxRewardsAprs],
379
+ streaming,
380
+ veTokenRate,
381
+ tvl,
382
+ peg,
383
+ tokenPriceInUsd,
384
+ sdTokenPriceInUsd,
385
+ voteBooster,
386
+ alternativeYields,
387
+ extensions: {
388
+ ...locker.extensions,
389
+ sideChains,
390
+ ...(locker.id === 'cake' ? { airdropGraph } : {}),
391
+ },
392
+ }
393
+ })
394
+
395
+ return {
396
+ parsed: (await Promise.allSettled(lockerData)).map((r) => (r.status === 'fulfilled' ? r.value : r.reason)),
397
+ sdt:
398
+ chainId === mainnet.id
399
+ ? {
400
+ lockersSdtPerBlock: formatUnits(sdtInflationData.lockersSdtPerBlock, 18),
401
+ lockersSdtPerSecond: formatUnits(sdtInflationData.lockersSdtPerSecond, 18),
402
+ stratsSdtPerBlock: formatUnits(sdtInflationData.stratsSdtPerBlock, 18),
403
+ stratsSdtPerSecond: formatUnits(sdtInflationData.stratsSdtPerSecond, 18),
404
+ }
405
+ : undefined,
406
+ }
407
+ }
@@ -0,0 +1,73 @@
1
+ import { Zero } from '../../index.js'
2
+
3
+ const THREE_M_MULTIPLIER = BigInt(10)
4
+ const TEN_M_MULTIPLIER = BigInt(8)
5
+ const TWENTY_FIVE_M_MULTIPLIER = BigInt(5)
6
+ const FIFTY_M_MULTIPLIER = BigInt(3)
7
+
8
+ export const computeRatePoints = (
9
+ rate: bigint,
10
+ timestampStart: bigint,
11
+ timestampEnd: bigint,
12
+ global: {
13
+ threeMTimestamp: bigint
14
+ tenMTimestamp: bigint
15
+ twentyFiveMTimestamp: bigint
16
+ fiftyMTimestamp: bigint
17
+ },
18
+ basePoints: bigint = Zero,
19
+ ): bigint => {
20
+ if (global.fiftyMTimestamp > Zero && timestampStart >= global.fiftyMTimestamp) {
21
+ return basePoints + rate * (timestampEnd - timestampStart)
22
+ }
23
+ if (global.twentyFiveMTimestamp > Zero && timestampStart >= global.twentyFiveMTimestamp) {
24
+ if (global.fiftyMTimestamp > Zero && timestampEnd >= global.fiftyMTimestamp) {
25
+ const checkpointPoints = basePoints + FIFTY_M_MULTIPLIER * rate * (global.fiftyMTimestamp - timestampStart)
26
+ return computeRatePoints(rate, global.fiftyMTimestamp, timestampEnd, global, checkpointPoints)
27
+ }
28
+ return basePoints + FIFTY_M_MULTIPLIER * rate * (timestampEnd - timestampStart)
29
+ }
30
+ if (global.tenMTimestamp > Zero && timestampStart >= global.tenMTimestamp) {
31
+ if (global.twentyFiveMTimestamp > Zero && timestampEnd >= global.twentyFiveMTimestamp) {
32
+ const checkpointPoints =
33
+ basePoints + TWENTY_FIVE_M_MULTIPLIER * rate * (global.twentyFiveMTimestamp - timestampStart)
34
+ return computeRatePoints(rate, global.twentyFiveMTimestamp, timestampEnd, global, checkpointPoints)
35
+ }
36
+ return basePoints + TWENTY_FIVE_M_MULTIPLIER * rate * (timestampEnd - timestampStart)
37
+ }
38
+ if (global.threeMTimestamp > Zero && timestampStart >= global.threeMTimestamp) {
39
+ if (global.tenMTimestamp > Zero && timestampEnd >= global.tenMTimestamp) {
40
+ const checkpointPoints = basePoints + TEN_M_MULTIPLIER * rate * (global.tenMTimestamp - timestampStart)
41
+ return computeRatePoints(rate, global.tenMTimestamp, timestampEnd, global, checkpointPoints)
42
+ }
43
+ return basePoints + TEN_M_MULTIPLIER * rate * (timestampEnd - timestampStart)
44
+ }
45
+ if (global.threeMTimestamp > Zero && timestampEnd >= global.threeMTimestamp) {
46
+ const checkpointPoints = basePoints + THREE_M_MULTIPLIER * rate * (global.threeMTimestamp - timestampStart)
47
+ return computeRatePoints(rate, global.threeMTimestamp, timestampEnd, global, checkpointPoints)
48
+ }
49
+ return basePoints + THREE_M_MULTIPLIER * rate * (timestampEnd - timestampStart)
50
+ }
51
+
52
+ export const getUpdatedPointsAmount = (
53
+ userRate: bigint,
54
+ userLastUpdate: number,
55
+ userLastPoints: bigint,
56
+ airdropGraph: any,
57
+ timestamp?: number,
58
+ ) => {
59
+ const now = timestamp ? timestamp : Math.floor(Date.now() / 1000)
60
+
61
+ return computeRatePoints(
62
+ userRate,
63
+ BigInt(userLastUpdate),
64
+ BigInt(now),
65
+ {
66
+ threeMTimestamp: BigInt(airdropGraph.threeMTimestamp),
67
+ tenMTimestamp: BigInt(airdropGraph.tenMTimestamp),
68
+ twentyFiveMTimestamp: BigInt(airdropGraph.twentyFiveMTimestamp),
69
+ fiftyMTimestamp: BigInt(airdropGraph.fiftyMTimestamp),
70
+ },
71
+ userLastPoints,
72
+ )
73
+ }
@@ -0,0 +1,25 @@
1
+ import { lockerWithId } from '@stake-dao/constants'
2
+
3
+ const depositorCalls = (depositor: string, locker: string) => {
4
+ const calls: any[] = []
5
+
6
+ if (
7
+ [
8
+ lockerWithId('crv')!.extensions.locker,
9
+ lockerWithId('mav')!.extensions.locker,
10
+ lockerWithId('cake', 56)!.extensions.locker,
11
+ lockerWithId('fxn')!.extensions.locker,
12
+ lockerWithId('yfi')!.extensions.locker,
13
+ ].includes(locker)
14
+ ) {
15
+ calls.push({ address: depositor, name: 'lockIncentivePercent' })
16
+ } else {
17
+ calls.push({ address: depositor, name: 'lockIncentive' })
18
+ }
19
+
20
+ calls.push({ address: depositor, name: 'incentiveToken' })
21
+
22
+ return calls
23
+ }
24
+
25
+ export default depositorCalls