@merkl/api 0.19.6 → 0.19.8

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 (311) hide show
  1. package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +4 -3
  2. package/dist/src/eden/index.d.ts +85 -48
  3. package/dist/src/engine/dynamicData/factory.d.ts +3 -0
  4. package/dist/src/engine/dynamicData/factory.js +54 -0
  5. package/dist/src/engine/dynamicData/implementations/Ajna.d.ts +7 -0
  6. package/dist/src/engine/dynamicData/implementations/Ajna.js +101 -0
  7. package/dist/src/engine/dynamicData/implementations/Ambiant.d.ts +7 -0
  8. package/dist/src/engine/dynamicData/implementations/Ambiant.js +227 -0
  9. package/dist/src/engine/dynamicData/implementations/Badger.d.ts +7 -0
  10. package/dist/src/engine/dynamicData/implementations/Badger.js +84 -0
  11. package/dist/src/engine/dynamicData/implementations/Clamm.d.ts +7 -0
  12. package/dist/src/engine/dynamicData/implementations/Clamm.js +970 -0
  13. package/dist/src/engine/dynamicData/implementations/Compound.d.ts +7 -0
  14. package/dist/src/engine/dynamicData/implementations/Compound.js +136 -0
  15. package/dist/src/engine/dynamicData/implementations/Dolomite.d.ts +7 -0
  16. package/dist/src/engine/dynamicData/implementations/Dolomite.js +53 -0
  17. package/dist/src/engine/dynamicData/implementations/EigenLayer.d.ts +7 -0
  18. package/dist/src/engine/dynamicData/implementations/EigenLayer.js +64 -0
  19. package/dist/src/engine/dynamicData/implementations/Encompassing.d.ts +7 -0
  20. package/dist/src/engine/dynamicData/implementations/Encompassing.js +26 -0
  21. package/dist/src/engine/dynamicData/implementations/Erc20.d.ts +6 -0
  22. package/dist/src/engine/dynamicData/implementations/Erc20.js +159 -0
  23. package/dist/src/engine/dynamicData/implementations/Erc20Snapshot.d.ts +7 -0
  24. package/dist/src/engine/dynamicData/implementations/Erc20Snapshot.js +32 -0
  25. package/dist/src/engine/dynamicData/implementations/EventBased.d.ts +7 -0
  26. package/dist/src/engine/dynamicData/implementations/EventBased.js +104 -0
  27. package/dist/src/engine/dynamicData/implementations/Hyperdrive.d.ts +7 -0
  28. package/dist/src/engine/dynamicData/implementations/Hyperdrive.js +96 -0
  29. package/dist/src/engine/dynamicData/implementations/Morpho.d.ts +7 -0
  30. package/dist/src/engine/dynamicData/implementations/Morpho.js +109 -0
  31. package/dist/src/engine/dynamicData/implementations/Radiant.d.ts +7 -0
  32. package/dist/src/engine/dynamicData/implementations/Radiant.js +117 -0
  33. package/dist/src/engine/dynamicData/implementations/Silo.d.ts +9 -0
  34. package/dist/src/engine/dynamicData/implementations/Silo.js +109 -0
  35. package/dist/src/engine/dynamicData/implementations/UniswapV4.d.ts +7 -0
  36. package/dist/src/engine/dynamicData/implementations/UniswapV4.js +249 -0
  37. package/dist/src/engine/dynamicData/implementations/Vest.d.ts +9 -0
  38. package/dist/src/engine/dynamicData/implementations/Vest.js +58 -0
  39. package/dist/src/engine/dynamicData/implementations/default.d.ts +5 -0
  40. package/dist/src/engine/dynamicData/implementations/default.js +5 -0
  41. package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getEulerV2Vaults.js +1 -1
  42. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/GenericProcessor.d.ts +1 -1
  43. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/tokenType.d.ts +2 -1
  44. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/tokenType.js +2 -0
  45. package/dist/src/engine/erc20SubTypeProcessors/implementations/BunniV2Processor.d.ts +45 -0
  46. package/dist/src/engine/erc20SubTypeProcessors/implementations/BunniV2Processor.js +87 -0
  47. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/processorMapping.js +2 -0
  48. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound1.js +2 -0
  49. package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound2.d.ts +1 -1
  50. package/dist/src/{factories → engine}/opportunityMetadata/implementations/Erc20.js +3 -3
  51. package/dist/src/{factories → engine}/opportunityMetadata/implementations/Euler.d.ts +1 -1
  52. package/dist/src/{factories → engine}/opportunityMetadata/implementations/Euler.js +7 -7
  53. package/dist/src/{factories → engine}/opportunityMetadata/implementations/EventBased.d.ts +1 -1
  54. package/dist/src/{factories → engine}/opportunityMetadata/implementations/EventBased.js +2 -2
  55. package/dist/src/{factories → engine}/opportunityMetadata/implementations/Vest.js +1 -1
  56. package/dist/src/index.d.ts +19 -16
  57. package/dist/src/jobs/update-euler-vaults.js +2 -2
  58. package/dist/src/modules/v4/apr/apr.service.d.ts +1 -1
  59. package/dist/src/modules/v4/apr/apr.service.js +4 -4
  60. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +5 -0
  61. package/dist/src/modules/v4/campaign/campaign.model.d.ts +1 -0
  62. package/dist/src/modules/v4/campaign/campaign.model.js +1 -0
  63. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +4 -0
  64. package/dist/src/modules/v4/campaign/campaign.repository.js +2 -1
  65. package/dist/src/modules/v4/campaign/campaign.service.d.ts +0 -8
  66. package/dist/src/modules/v4/campaign/campaign.service.js +0 -13
  67. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +3 -4
  68. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +8 -0
  69. package/dist/src/modules/v4/opportunity/opportunity.converter.js +2 -2
  70. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +2 -0
  71. package/dist/src/modules/v4/opportunity/opportunity.model.js +2 -0
  72. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +1 -1
  73. package/dist/src/modules/v4/opportunity/opportunity.repository.js +14 -10
  74. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +2 -2
  75. package/dist/src/modules/v4/opportunity/opportunity.service.js +5 -5
  76. package/dist/src/modules/v4/router.d.ts +14 -0
  77. package/dist/src/modules/v4/token/token.controller.d.ts +1 -0
  78. package/dist/src/modules/v4/token/token.model.d.ts +1 -0
  79. package/dist/src/modules/v4/token/token.model.js +1 -0
  80. package/dist/src/modules/v4/token/token.service.d.ts +3 -1
  81. package/dist/src/modules/v4/token/token.service.js +18 -0
  82. package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.d.ts +2 -2
  83. package/dist/src/modules/v4/uniswapV4/uniswapV4.service.d.ts +2 -2
  84. package/dist/src/modules/v4/uniswapV4/uniswapV4.service.js +1 -1
  85. package/dist/src/routes/v3/campaigns.d.ts +1 -1
  86. package/dist/src/routes/v3/compoundV2.d.ts +2 -10
  87. package/dist/src/routes/v3/compoundV2.js +1 -1
  88. package/dist/src/routes/v3/dolomite.js +1 -1
  89. package/dist/src/routes/v3/euler.js +1 -1
  90. package/dist/src/routes/v3/router.d.ts +5 -16
  91. package/dist/src/routes/v3/uniswapv4.d.ts +2 -5
  92. package/dist/src/routes/v3/uniswapv4.js +1 -1
  93. package/dist/src/utils/decodeCalls.d.ts +1 -1
  94. package/dist/src/utils/decodeCalls.js +8 -2
  95. package/dist/src/utils/encodeCalls.d.ts +1 -1
  96. package/dist/src/utils/encodeCalls.js +20 -2
  97. package/dist/src/utils/generateCardName.d.ts +1 -1
  98. package/dist/src/utils/generateCardName.js +3 -1
  99. package/dist/src/utils/generateIcons.d.ts +1 -1
  100. package/dist/src/utils/generateIcons.js +1 -1
  101. package/dist/tsconfig.package.tsbuildinfo +1 -1
  102. package/package.json +2 -2
  103. package/dist/src/factories/dynamicData/factory.d.ts +0 -0
  104. package/dist/src/factories/dynamicData/factory.js +0 -10
  105. package/dist/src/libs/campaigns/campaignTypes/AjnaDynamicData.d.ts +0 -5
  106. package/dist/src/libs/campaigns/campaignTypes/AjnaDynamicData.js +0 -111
  107. package/dist/src/libs/campaigns/campaignTypes/AmbientDynamicData.d.ts +0 -3
  108. package/dist/src/libs/campaigns/campaignTypes/AmbientDynamicData.js +0 -243
  109. package/dist/src/libs/campaigns/campaignTypes/BadgerDynamicData.d.ts +0 -5
  110. package/dist/src/libs/campaigns/campaignTypes/BadgerDynamicData.js +0 -93
  111. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.d.ts +0 -3
  112. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +0 -986
  113. package/dist/src/libs/campaigns/campaignTypes/CompoundDynamicData.d.ts +0 -3
  114. package/dist/src/libs/campaigns/campaignTypes/CompoundDynamicData.js +0 -139
  115. package/dist/src/libs/campaigns/campaignTypes/DolomiteDynamicData.d.ts +0 -5
  116. package/dist/src/libs/campaigns/campaignTypes/DolomiteDynamicData.js +0 -60
  117. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.d.ts +0 -4
  118. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +0 -164
  119. package/dist/src/libs/campaigns/campaignTypes/ERC20_SNAPSHOTDynamicData.d.ts +0 -5
  120. package/dist/src/libs/campaigns/campaignTypes/ERC20_SNAPSHOTDynamicData.js +0 -38
  121. package/dist/src/libs/campaigns/campaignTypes/EigenLayerDynamicData.d.ts +0 -3
  122. package/dist/src/libs/campaigns/campaignTypes/EigenLayerDynamicData.js +0 -67
  123. package/dist/src/libs/campaigns/campaignTypes/EncompassingDynamicData.d.ts +0 -5
  124. package/dist/src/libs/campaigns/campaignTypes/EncompassingDynamicData.js +0 -34
  125. package/dist/src/libs/campaigns/campaignTypes/EventBasedDynamicData.d.ts +0 -3
  126. package/dist/src/libs/campaigns/campaignTypes/EventBasedDynamicData.js +0 -114
  127. package/dist/src/libs/campaigns/campaignTypes/HyperdriveDynamicData.d.ts +0 -5
  128. package/dist/src/libs/campaigns/campaignTypes/HyperdriveDynamicData.js +0 -99
  129. package/dist/src/libs/campaigns/campaignTypes/JSON_AIRDROPDynamicData.d.ts +0 -5
  130. package/dist/src/libs/campaigns/campaignTypes/JSON_AIRDROPDynamicData.js +0 -19
  131. package/dist/src/libs/campaigns/campaignTypes/MORPHODynamicData.d.ts +0 -5
  132. package/dist/src/libs/campaigns/campaignTypes/MORPHODynamicData.js +0 -112
  133. package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.d.ts +0 -3
  134. package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.js +0 -122
  135. package/dist/src/libs/campaigns/campaignTypes/SILODynamicData.d.ts +0 -7
  136. package/dist/src/libs/campaigns/campaignTypes/SILODynamicData.js +0 -115
  137. package/dist/src/libs/campaigns/campaignTypes/UniswapV4DynamicData.d.ts +0 -3
  138. package/dist/src/libs/campaigns/campaignTypes/UniswapV4DynamicData.js +0 -265
  139. package/dist/src/libs/campaigns/campaignTypes/VestDynamicData.d.ts +0 -5
  140. package/dist/src/libs/campaigns/campaignTypes/VestDynamicData.js +0 -61
  141. package/dist/src/libs/campaigns/campaignsDynamicData.d.ts +0 -3
  142. package/dist/src/libs/campaigns/campaignsDynamicData.js +0 -131
  143. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchA51Strategies.d.ts +0 -0
  144. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchA51Strategies.js +0 -0
  145. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchAmbientInfo.d.ts +0 -0
  146. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchAmbientInfo.js +0 -0
  147. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchClamInfo.d.ts +0 -0
  148. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchClamInfo.js +0 -0
  149. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchLogs.d.ts +0 -0
  150. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/fetchLogs.js +0 -0
  151. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getCompV2ForksVaults.d.ts +0 -0
  152. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getCompV2ForksVaults.js +0 -0
  153. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getContractCreationBlock.d.ts +0 -0
  154. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getContractCreationBlock.js +0 -0
  155. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getDolomiteMarkets.d.ts +0 -0
  156. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getDolomiteMarkets.js +0 -0
  157. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getEulerV2Vaults.d.ts +0 -0
  158. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getUniswapV4Pools.d.ts +0 -0
  159. /package/dist/src/{libs/campaigns → engine/dynamicData}/utils/getUniswapV4Pools.js +0 -0
  160. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/GenericProcessor.js +0 -0
  161. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/eulerVaultNames.d.ts +0 -0
  162. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/eulerVaultNames.js +0 -0
  163. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/factoryFinder.d.ts +0 -0
  164. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/factoryFinder.js +0 -0
  165. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/getBlacklistedSupply.d.ts +0 -0
  166. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/getBlacklistedSupply.js +0 -0
  167. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/hardcoded.d.ts +0 -0
  168. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/hardcoded.js +0 -0
  169. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/metamorphoTvl.d.ts +0 -0
  170. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/metamorphoTvl.js +0 -0
  171. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/ownerFinder.d.ts +0 -0
  172. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/ownerFinder.js +0 -0
  173. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/spliceTVL.d.ts +0 -0
  174. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/helpers/spliceTVL.js +0 -0
  175. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AaveProcessor.d.ts +0 -0
  176. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AaveProcessor.js +0 -0
  177. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AnglesLiquid.d.ts +0 -0
  178. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AnglesLiquid.js +0 -0
  179. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AssetProcessor.d.ts +0 -0
  180. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AssetProcessor.js +0 -0
  181. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AuraProcessor.d.ts +0 -0
  182. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/AuraProcessor.js +0 -0
  183. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerGaugeProcessor.d.ts +0 -0
  184. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerGaugeProcessor.js +0 -0
  185. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerPoolProcessor.d.ts +0 -0
  186. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerPoolProcessor.js +0 -0
  187. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerV3PoolProcessor.d.ts +0 -0
  188. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BalancerV3PoolProcessor.js +0 -0
  189. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BeefyProcessor.d.ts +0 -0
  190. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/BeefyProcessor.js +0 -0
  191. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/CompoundProcessor.d.ts +0 -0
  192. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/CompoundProcessor.js +0 -0
  193. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/ERC4626Processor.d.ts +0 -0
  194. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/ERC4626Processor.js +0 -0
  195. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EnzymeProcessor.d.ts +0 -0
  196. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EnzymeProcessor.js +0 -0
  197. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EqualizerGaugeProcessor.d.ts +0 -0
  198. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EqualizerGaugeProcessor.js +0 -0
  199. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EulerBorrowProcessor.d.ts +0 -0
  200. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EulerBorrowProcessor.js +0 -0
  201. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EulerLendProcessor.d.ts +0 -0
  202. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/EulerLendProcessor.js +0 -0
  203. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/FluidProcessor.d.ts +0 -0
  204. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/FluidProcessor.js +0 -0
  205. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/FraxProcessor.d.ts +0 -0
  206. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/FraxProcessor.js +0 -0
  207. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/GammaProcessor.d.ts +0 -0
  208. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/GammaProcessor.js +0 -0
  209. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/GearboxProcessor.d.ts +0 -0
  210. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/GearboxProcessor.js +0 -0
  211. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HanjiVaultProcessor.d.ts +0 -0
  212. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HanjiVaultProcessor.js +0 -0
  213. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HoldStationProcessor.d.ts +0 -0
  214. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HoldStationProcessor.js +0 -0
  215. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HourglassProcessor.d.ts +0 -0
  216. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/HourglassProcessor.js +0 -0
  217. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/MaverickBPProcessor.d.ts +0 -0
  218. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/MaverickBPProcessor.js +0 -0
  219. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/MetamorphoProcessor.d.ts +0 -0
  220. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/MetamorphoProcessor.js +0 -0
  221. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/NoLinkVaultProcessor.d.ts +0 -0
  222. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/NoLinkVaultProcessor.js +0 -0
  223. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/PendleProcessor.d.ts +0 -0
  224. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/PendleProcessor.js +0 -0
  225. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/PendleYTProcessor.d.ts +0 -0
  226. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/PendleYTProcessor.js +0 -0
  227. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/RadiantProcessor.d.ts +0 -0
  228. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/RadiantProcessor.js +0 -0
  229. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/RfxProcessor.d.ts +0 -0
  230. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/RfxProcessor.js +0 -0
  231. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/Satlayer.d.ts +0 -0
  232. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/Satlayer.js +0 -0
  233. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpectraProcessor.d.ts +0 -0
  234. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpectraProcessor.js +0 -0
  235. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpectraYTProcessor.d.ts +0 -0
  236. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpectraYTProcessor.js +0 -0
  237. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpliceProcessor.d.ts +0 -0
  238. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SpliceProcessor.js +0 -0
  239. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SturdySiloProcessor.d.ts +0 -0
  240. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/SturdySiloProcessor.js +0 -0
  241. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TempestVaultProcessor.d.ts +0 -0
  242. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TempestVaultProcessor.js +0 -0
  243. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TemplateProcessor.d.ts +0 -0
  244. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TemplateProcessor.js +0 -0
  245. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TorosProcessor.d.ts +0 -0
  246. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/TorosProcessor.js +0 -0
  247. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/UniswapProcessor.d.ts +0 -0
  248. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/UniswapProcessor.js +0 -0
  249. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/VicunaProcessor.d.ts +0 -0
  250. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/VicunaProcessor.js +0 -0
  251. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/WoofiProcessor.d.ts +0 -0
  252. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/WoofiProcessor.js +0 -0
  253. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/ZkSwapThreePoolProcessor.d.ts +0 -0
  254. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/ZkSwapThreePoolProcessor.js +0 -0
  255. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/curveNPoolProcessor.d.ts +0 -0
  256. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/curveNPoolProcessor.js +0 -0
  257. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/curveProcessor.d.ts +0 -0
  258. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/curveProcessor.js +0 -0
  259. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/processorMapping.d.ts +0 -0
  260. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/stakedCurveProcessor.d.ts +0 -0
  261. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/stakedCurveProcessor.js +0 -0
  262. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/xU308Processor.d.ts +0 -0
  263. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/implementations/xU308Processor.js +0 -0
  264. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesPrices.d.ts +0 -0
  265. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesPrices.js +0 -0
  266. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound1.d.ts +0 -0
  267. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound2.js +0 -0
  268. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound3.d.ts +0 -0
  269. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound3.js +0 -0
  270. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound4.d.ts +0 -0
  271. /package/dist/src/{libs/campaigns/campaignTypes/ERC20SubTypes → engine/erc20SubTypeProcessors}/subtypesRound4.js +0 -0
  272. /package/dist/src/{factories → engine}/opportunityMetadata/factory.d.ts +0 -0
  273. /package/dist/src/{factories → engine}/opportunityMetadata/factory.js +0 -0
  274. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ajna.d.ts +0 -0
  275. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ajna.js +0 -0
  276. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ambiant.d.ts +0 -0
  277. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ambiant.js +0 -0
  278. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Badger.d.ts +0 -0
  279. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Badger.js +0 -0
  280. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Clamm.d.ts +0 -0
  281. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Clamm.js +0 -0
  282. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Compound.d.ts +0 -0
  283. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Compound.js +0 -0
  284. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Default.d.ts +0 -0
  285. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Default.js +0 -0
  286. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Dolomite.d.ts +0 -0
  287. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Dolomite.js +0 -0
  288. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/EigenLayer.d.ts +0 -0
  289. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/EigenLayer.js +0 -0
  290. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Encompassing.d.ts +0 -0
  291. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Encompassing.js +0 -0
  292. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Erc20.d.ts +0 -0
  293. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Erc20Snapshot.d.ts +0 -0
  294. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Erc20Snapshot.js +0 -0
  295. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Hyperdrive.d.ts +0 -0
  296. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Hyperdrive.js +0 -0
  297. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Invalid.d.ts +0 -0
  298. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Invalid.js +0 -0
  299. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ion.d.ts +0 -0
  300. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Ion.js +0 -0
  301. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/JsonAirdrop.d.ts +0 -0
  302. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/JsonAirdrop.js +0 -0
  303. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Morpho.d.ts +0 -0
  304. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Morpho.js +0 -0
  305. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Radiant.d.ts +0 -0
  306. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Radiant.js +0 -0
  307. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Silo.d.ts +0 -0
  308. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Silo.js +0 -0
  309. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/UniswapV4.d.ts +0 -0
  310. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/UniswapV4.js +0 -0
  311. /package/dist/src/{factories → engine}/opportunityMetadata/implementations/Vest.d.ts +0 -0
@@ -1,986 +0,0 @@
1
- import { nftPositionByIdsQuery, positionMultipleOwnersQuery } from "@/libs/positions/clamm/thegraph";
2
- import { fetchFarmedPositions } from "@/libs/positions/clamm/thegraph/fetchFarmedPositions";
3
- import { A51Factory__factory, ALM, ALMMapping, AMM, AMMAlgorithm, AMMAlgorithmMapping, BN2Number, DecodeLiquidity, EAprBreakdownType, ERC20Interface, Forwarder, JonesDoubleRewardTracker__factory, Liquidity, NETWORK_LABELS, NitroInterface, PoolInterface, PoolState, PriorityAMM, SqrtPrice, almName, ammName, getAmountsForLiquidity, getTickAtSqrtRatio, isBlacklisted, isWhitelisted, merklSubgraphAMMEndpoints, shortenAddress, spNFTInterface, withTimeout, } from "@sdk";
4
- import axios from "axios";
5
- import { BigNumber, utils } from "ethers";
6
- import request from "graphql-request";
7
- import JSBI from "jsbi";
8
- import moment from "moment";
9
- import { MERKL_ALM_POSITION_FETCHING_TIMEOUT } from "../../../constants";
10
- import { log } from "../../../utils/logger";
11
- import { Pricer } from "../../../utils/pricer";
12
- import { isStrykeCampaign } from "../../../utils/stryke";
13
- import { fetchA51Strategies } from "../utils/fetchA51Strategies";
14
- export async function CLAMMDynamicData(chainId, campaigns) {
15
- const dynamicData = [];
16
- const pricer = await Pricer.load();
17
- const calls = [];
18
- const A51Interface = A51Factory__factory.createInterface();
19
- /** Dedupe pools from campaigns to build pool list */
20
- let poolList = [];
21
- for (const campaign of campaigns ?? []) {
22
- /** Loop through all campaigns to add pools */
23
- if (!poolList?.map(p => p.mainParameter.toLowerCase()).includes(campaign.mainParameter.toLowerCase())) {
24
- if (AMMAlgorithmMapping[campaign.campaignParameters.amm] === undefined) {
25
- console.log("Invalid AMM", campaign.campaignParameters.amm);
26
- continue;
27
- }
28
- poolList.push({
29
- address: campaign.campaignParameters.poolAddress,
30
- mainParameter: campaign.mainParameter, // main parameter containes info of poolAddress + AMM (in case its a priority AMM)
31
- alms: [],
32
- amm: campaign.campaignParameters.amm,
33
- });
34
- }
35
- /** Now we have an entry with campaign.mainParameter in poolList */
36
- const poolIndex = poolList
37
- ?.map(p => p.mainParameter.toLowerCase())
38
- .findIndex(a => a === campaign.mainParameter.toLowerCase());
39
- /** Fill ALMs per pools */
40
- for (const forwarder of campaign.campaignParameters.forwarders
41
- .filter(f => f.forwarderType === Forwarder.CLAMM)
42
- .sort((a, b) => a.priority - b.priority)) {
43
- const alm = {
44
- address: forwarder.sender,
45
- ...(!!forwarder.owner && { owner: forwarder.owner?.toLowerCase() }),
46
- target: forwarder.target.toLowerCase(),
47
- type: forwarder.type,
48
- priority: forwarder.priority,
49
- };
50
- /** If the ALM is not found - add it */
51
- if (poolList[poolIndex].alms.findIndex(a => alm.address === a.address && alm.target === a.target) === -1) {
52
- poolList[poolIndex].alms.push(alm);
53
- }
54
- }
55
- }
56
- poolList = poolList.filter(p => p.amm !== undefined && p.amm !== null);
57
- if (!!poolList) {
58
- // Prepare A51 fetching
59
- const A51Pools = [];
60
- for (const pool of poolList) {
61
- for (const _ of pool.alms.filter(a => a.type === ALM.A51)) {
62
- A51Pools.push(pool.address.toLowerCase());
63
- }
64
- }
65
- let A51Strategies = {};
66
- if (A51Pools.length > 0) {
67
- A51Strategies = await fetchA51Strategies(chainId, [...new Set(A51Pools)]);
68
- }
69
- for (const pool of poolList) {
70
- const poolInterface = PoolInterface[AMMAlgorithmMapping[pool.amm]];
71
- const d = campaigns?.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())[0];
72
- calls.push({
73
- allowFailure: true,
74
- callData: poolInterface.encodeFunctionData(Liquidity[AMMAlgorithmMapping[pool.amm]]),
75
- target: pool.address,
76
- }, {
77
- allowFailure: true,
78
- callData: poolInterface.encodeFunctionData(PoolState[AMMAlgorithmMapping[pool.amm]]),
79
- target: pool.address,
80
- }, {
81
- allowFailure: true,
82
- callData: ERC20Interface.encodeFunctionData("balanceOf", [pool.address]),
83
- target: d.campaignParameters.token0,
84
- }, {
85
- allowFailure: true,
86
- callData: ERC20Interface.encodeFunctionData("balanceOf", [pool.address]),
87
- target: d.campaignParameters.token1,
88
- });
89
- /** Direct ALMs */
90
- for (const alm of pool.alms.filter(a => a.target.toLowerCase() === pool.address.toLowerCase() && a.type !== ALM.A51)) {
91
- let almAddress = alm.address;
92
- if (alm.type === ALM.Beefy) {
93
- almAddress = alm.owner ?? alm.address;
94
- }
95
- calls.push({
96
- allowFailure: true,
97
- callData: ERC20Interface.encodeFunctionData("totalSupply"),
98
- target: alm.address,
99
- });
100
- calls.push({
101
- allowFailure: true,
102
- callData: ERC20Interface.encodeFunctionData("balanceOf", [almAddress]),
103
- target: d.campaignParameters.token0,
104
- });
105
- calls.push({
106
- allowFailure: true,
107
- callData: ERC20Interface.encodeFunctionData("balanceOf", [almAddress]),
108
- target: d.campaignParameters.token1,
109
- });
110
- }
111
- /** Multi-hop ALMs */
112
- for (const alm of pool.alms.filter(a => a.target !== pool.address.toLowerCase())) {
113
- if (alm.type === ALM.spNFT) {
114
- calls.push({
115
- allowFailure: true,
116
- callData: spNFTInterface.encodeFunctionData("getPoolInfo"),
117
- target: alm.address,
118
- });
119
- }
120
- else if (alm.type === ALM.kpNFT) {
121
- calls.push({
122
- allowFailure: true,
123
- callData: spNFTInterface.encodeFunctionData("getPoolInfo"),
124
- target: alm.address,
125
- });
126
- }
127
- else if (alm.type === ALM.Nitro) {
128
- calls.push({
129
- allowFailure: true,
130
- callData: NitroInterface.encodeFunctionData("totalDepositAmount"),
131
- target: alm.address,
132
- });
133
- }
134
- else if ([ALM.ConcentricStaker, ALM.GammaChef].includes(alm.type)) {
135
- calls.push({
136
- allowFailure: true,
137
- callData: ERC20Interface.encodeFunctionData("balanceOf", [alm.address]),
138
- target: alm.target,
139
- });
140
- }
141
- else if (alm.type === ALM.JonesTracker) {
142
- calls.push({
143
- allowFailure: true,
144
- callData: JonesDoubleRewardTracker__factory.createInterface().encodeFunctionData("totalStakedAmount"),
145
- target: alm.address,
146
- });
147
- }
148
- else {
149
- calls.push({
150
- allowFailure: true,
151
- callData: ERC20Interface.encodeFunctionData("totalSupply"),
152
- target: alm.address,
153
- });
154
- }
155
- }
156
- /** A51 Strategies */
157
- for (const w of pool.alms.filter(a => a.type === ALM.A51)) {
158
- const strategies = A51Strategies?.[pool.address.toLowerCase()]?.[w.address] ?? [];
159
- for (const strategy of strategies) {
160
- calls.push({
161
- allowFailure: true,
162
- callData: A51Interface.encodeFunctionData("strategies", [strategy.id]),
163
- target: w.address,
164
- });
165
- }
166
- }
167
- }
168
- /**
169
- * Fetch all ALM vaults positions for the pools.
170
- * @dev Do it in parallel with 1 call / AMM subgraph to save time.
171
- */
172
- const positions = {};
173
- const positionsPromise = Object.keys(AMM)
174
- .filter(amm => !!merklSubgraphAMMEndpoints[chainId][Number.parseInt(amm)])
175
- .map(async (amm) => {
176
- const tgURL = merklSubgraphAMMEndpoints[chainId][Number.parseInt(amm)];
177
- let targetAddressesList = [];
178
- if (!!poolList) {
179
- for (const pool of poolList) {
180
- if (pool.amm === Number.parseInt(amm)) {
181
- /** Add direct alm addresses */
182
- targetAddressesList = targetAddressesList.concat(pool.alms
183
- .filter(a => a.target.toLowerCase() === pool.address.toLowerCase())
184
- ?.map(w => {
185
- return !!w?.owner && Number.parseInt(amm) !== AMM.Stryke
186
- ? w.owner.toLowerCase()
187
- : w.address.toLowerCase();
188
- }) ?? []);
189
- /** Add blacklisted / whitelisted addresses (optional) */
190
- for (const campaign of campaigns.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())) {
191
- const distributionBlacklist = campaign.campaignId === "0x4a805dd97d823dfbc34d138af3d09536ac792b6ad73079573df082c71d4b057c"
192
- ? [...campaign.campaignParameters.blacklist, "0x657e6d2073A99aF61952beb7EE564169616b90C1"]
193
- : campaign.campaignParameters.blacklist;
194
- if (!!distributionBlacklist && distributionBlacklist.length > 0)
195
- targetAddressesList = targetAddressesList.concat(distributionBlacklist.map((address) => address.toLowerCase()));
196
- let distributionWhitelist = campaign.campaignParameters?.whitelist;
197
- if (distributionWhitelist.length === 1 &&
198
- distributionWhitelist[0].toLowerCase() === "0xE4bA6740aF4c666325D49B3112E4758371386aDc".toLowerCase()) {
199
- distributionWhitelist = ["0xe11d346757d052214686bCbC860C94363AfB4a9A"];
200
- }
201
- if (!isStrykeCampaign(pool.amm) && !!distributionWhitelist && distributionWhitelist.length > 0)
202
- targetAddressesList = targetAddressesList.concat(distributionWhitelist.map((address) => address.toLowerCase()));
203
- }
204
- }
205
- }
206
- }
207
- targetAddressesList = targetAddressesList.filter((a, index, self) => self.indexOf(a) === index); // Dedupe
208
- if (targetAddressesList?.length > 0) {
209
- positions[Number.parseInt(amm)] = [];
210
- /** Fetch NFT Wrapper positions */
211
- const farmedPositionsList = await fetchFarmedPositions(chainId, targetAddressesList, Number(amm));
212
- const farmedPositionsById = Object.keys(farmedPositionsList).reduce((acc, curr) => {
213
- for (const pos of farmedPositionsList[curr]) {
214
- acc[pos.id] = pos;
215
- }
216
- return acc;
217
- }, {});
218
- if (Object.keys(farmedPositionsById).length > 0) {
219
- let hasFollowingPage = true;
220
- let skip = 0;
221
- const res = { nft: [] };
222
- while (hasFollowingPage) {
223
- const auxRes = await request(tgURL, nftPositionByIdsQuery, {
224
- ids: Object.keys(farmedPositionsById),
225
- skip,
226
- });
227
- res.nft = res.nft.concat(auxRes.nft ?? []);
228
- if (auxRes.nft.length < 1000) {
229
- hasFollowingPage = false;
230
- }
231
- skip += 1000;
232
- }
233
- if (!!res.nft) {
234
- for (const pos of res.nft) {
235
- positions[Number.parseInt(amm)]?.push({
236
- ...pos,
237
- owner: farmedPositionsById[pos.id].holder,
238
- });
239
- }
240
- }
241
- }
242
- await withTimeout((async () => {
243
- let hasFollowingPage = true;
244
- let skip = 0;
245
- const res = { direct: [], nft: [] };
246
- while (hasFollowingPage) {
247
- const auxRes = await request(tgURL, positionMultipleOwnersQuery, {
248
- owners: targetAddressesList,
249
- skip,
250
- });
251
- res.direct = res.direct.concat(auxRes.direct ?? []);
252
- res.nft = res.nft.concat(auxRes.nft ?? []);
253
- if (auxRes.direct.length < 1000 && auxRes.nft.length < 1000) {
254
- hasFollowingPage = false;
255
- }
256
- skip += 1000;
257
- }
258
- return res;
259
- })().then(res => {
260
- if (!!res.direct) {
261
- for (const pos of res.direct) {
262
- positions[Number.parseInt(amm)]?.push(pos);
263
- }
264
- }
265
- if (!!res.nft) {
266
- for (const pos of res.nft) {
267
- positions[Number.parseInt(amm)]?.push(pos);
268
- }
269
- }
270
- }), MERKL_ALM_POSITION_FETCHING_TIMEOUT).catch(error => {
271
- const service = `Merkl AMM Subgraph for ${NETWORK_LABELS[chainId]} ${AMM[Number.parseInt(amm)]}`;
272
- log.error(service, error, service, tgURL);
273
- });
274
- }
275
- });
276
- return {
277
- cached: false,
278
- call: {
279
- callData: calls,
280
- handler: () => { },
281
- reducer: async (result) => {
282
- // Wait for position fetching before finalizing the data
283
- await Promise.all(positionsPromise);
284
- let i = 0;
285
- if (!!poolList) {
286
- for (const pool of poolList) {
287
- const poolInterface = PoolInterface[AMMAlgorithmMapping[pool.amm]];
288
- // This liquidity call gives the active liquidity on the pool. To get the total liquidity we would need to loop over all positions
289
- let poolTotalLiquidity;
290
- let sqrtPrice;
291
- let poolBalanceToken0;
292
- let poolBalanceToken1;
293
- const d = campaigns?.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())[0];
294
- const decimalsToken0 = d.campaignParameters.decimalsToken0;
295
- const decimalsToken1 = d.campaignParameters.decimalsToken1;
296
- const symbolToken0 = d.campaignParameters.symbolToken0;
297
- const symbolToken1 = d.campaignParameters.symbolToken1;
298
- const prevI = i;
299
- try {
300
- poolTotalLiquidity = BN2Number(poolInterface.decodeFunctionResult(Liquidity[AMMAlgorithmMapping[pool.amm]], result[i++])[DecodeLiquidity[AMMAlgorithmMapping[pool.amm]]]);
301
- sqrtPrice = poolInterface
302
- .decodeFunctionResult(PoolState[AMMAlgorithmMapping[pool.amm]], result[i++])[SqrtPrice[AMMAlgorithmMapping[pool.amm]]].toString();
303
- poolBalanceToken0 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++])[0], decimalsToken0);
304
- poolBalanceToken1 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++])[0], decimalsToken1);
305
- }
306
- catch (e) {
307
- log.warn(`merklDynamic data - failed to decode state of pool ${pool.address} on ${NETWORK_LABELS[chainId]}`);
308
- i = prevI + 4;
309
- continue;
310
- }
311
- const priceToken0 = (await pricer.get({
312
- address: d.campaignParameters.token0,
313
- chainId: chainId,
314
- symbol: symbolToken0,
315
- }));
316
- const priceToken1 = (await pricer.get({
317
- address: d.campaignParameters.token1,
318
- chainId: chainId,
319
- symbol: symbolToken1,
320
- }));
321
- const almDetails = [];
322
- /** Direct ALMs */
323
- for (const w of pool.alms.filter(a => a.target.toLowerCase() === pool.address.toLowerCase() && a.type !== ALM.A51)) {
324
- const prevI = i;
325
- try {
326
- const totalSupply = BN2Number(ERC20Interface.decodeFunctionResult("totalSupply", result[i++])[0]);
327
- const almIdleBalance0 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++])[0], d.campaignParameters.decimalsToken0);
328
- let almBalance0 = almIdleBalance0;
329
- const almIdleBalance1 = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++])[0], d.campaignParameters.decimalsToken1);
330
- let almBalance1 = almIdleBalance1;
331
- let almTotalLiquidity = 0;
332
- let almInRangeLiquidity = 0;
333
- const almPositions = positions?.[pool.amm]?.filter(pos => pos.pool.id === pool.address.toLowerCase() &&
334
- [w.address.toLowerCase(), ...[!!w?.owner && w.owner.toLowerCase()]].includes(pos.owner.toLowerCase()));
335
- const almPositionsWithAPIType = [];
336
- if (!!almPositions) {
337
- for (const position of almPositions) {
338
- const upperTick = Number.parseInt(position.tickUpper);
339
- const lowerTick = Number.parseInt(position.tickLower);
340
- const [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, lowerTick, upperTick, BigNumber.from(position.liquidity));
341
- const balance0 = BN2Number(amount0, decimalsToken0);
342
- const balance1 = BN2Number(amount1, decimalsToken1);
343
- const totalLiquidity = BN2Number(position.liquidity);
344
- const inRangeLiquidity = balance0 > 0 && balance1 > 0 ? (BN2Number(position.liquidity) ?? 0) : 0;
345
- almTotalLiquidity += totalLiquidity;
346
- almInRangeLiquidity += inRangeLiquidity;
347
- almBalance0 += balance0;
348
- almBalance1 += balance1;
349
- almPositionsWithAPIType.push({
350
- balance0,
351
- balance1,
352
- id: position.id,
353
- inRangeLiquidity,
354
- lowerTick,
355
- totalLiquidity,
356
- tvl: priceToken0 * balance0 + priceToken1 * balance1,
357
- upperTick,
358
- });
359
- }
360
- // The wrapper type can exist in the subgraph without being declared in the SDK which can lead to type errors
361
- if (!!ALMMapping[pool.amm] && w.type in ALMMapping[pool.amm]) {
362
- almDetails.push({
363
- almAPR: 0, // filled later on
364
- almAddress: utils.getAddress(w.address),
365
- almBalance0,
366
- almIdleBalance0,
367
- almIdleBalance1,
368
- almBalance1,
369
- almInRangeLiquidity,
370
- almTVL: almBalance0 * priceToken0 + almBalance1 * priceToken1,
371
- almTotalLiquidity,
372
- forwarderType: Forwarder.CLAMM,
373
- label: `${ALMMapping[pool.amm]?.[w.type]} ${w.address}`,
374
- origin: w.type,
375
- positions: almPositionsWithAPIType,
376
- priority: 0,
377
- sender: utils.getAddress(w.address),
378
- target: w.target,
379
- owner: utils.getAddress(w.owner ?? w.address),
380
- totalSupply,
381
- type: w.type,
382
- });
383
- }
384
- }
385
- }
386
- catch (e) {
387
- log.warn(`merklDynamic data - failed to handle direct alm data of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${w.address}`);
388
- i = prevI + 3;
389
- }
390
- }
391
- /** Multi-hop ALMs */
392
- for (const w of pool.alms.filter(a => a.target !== pool.address.toLowerCase())) {
393
- const prevI = i;
394
- try {
395
- let totalSupply;
396
- if (w.type === ALM.spNFT) {
397
- totalSupply = BN2Number(spNFTInterface.decodeFunctionResult("getPoolInfo", result[i++])[5]);
398
- }
399
- else if (w.type === ALM.kpNFT) {
400
- totalSupply = BN2Number(spNFTInterface.decodeFunctionResult("getPoolInfo", result[i++])[5]);
401
- }
402
- else if (w.type === ALM.Nitro) {
403
- totalSupply = BN2Number(NitroInterface.decodeFunctionResult("totalDepositAmount", result[i++])[0]);
404
- }
405
- else if ([ALM.ConcentricStaker, ALM.GammaChef].includes(w.type)) {
406
- totalSupply = BN2Number(ERC20Interface.decodeFunctionResult("balanceOf", result[i++])[0]);
407
- }
408
- else if (w.type === ALM.JonesTracker) {
409
- totalSupply = BN2Number(JonesDoubleRewardTracker__factory.createInterface().decodeFunctionResult("totalStakedAmount", result[i++])[0]);
410
- }
411
- else {
412
- totalSupply = BN2Number(ERC20Interface.decodeFunctionResult("totalSupply", result[i++])[0]);
413
- }
414
- const wrappedALM = almDetails.filter(a => utils.getAddress(a.almAddress) === utils.getAddress(w.target))[0];
415
- if (!!wrappedALM && !!wrappedALM.totalSupply) {
416
- const ratio = totalSupply / wrappedALM.totalSupply;
417
- almDetails.push({
418
- almAPR: 0,
419
- // filled later on
420
- almAddress: w.address,
421
- almIdleBalance0: 0,
422
- almIdleBalance1: 0,
423
- almBalance0: ratio * wrappedALM.almBalance0,
424
- almBalance1: ratio * wrappedALM.almBalance1,
425
- almInRangeLiquidity: ratio * wrappedALM.almInRangeLiquidity,
426
- almTVL: ratio * wrappedALM.almTVL,
427
- almTotalLiquidity: ratio * wrappedALM.almTotalLiquidity,
428
- forwarderType: Forwarder.CLAMM,
429
- label: `${ALMMapping[pool.amm]?.[w.type]} ${w.address}`,
430
- origin: w.type,
431
- positions: wrappedALM.positions.map(pos => {
432
- return {
433
- ...pos,
434
- balance0: ratio * pos.balance0,
435
- balance1: ratio * pos.balance1,
436
- inRangeLiquidity: ratio * pos.inRangeLiquidity,
437
- totalLiquidity: ratio * pos.totalLiquidity,
438
- tvl: ratio * pos.tvl,
439
- };
440
- }),
441
- priority: wrappedALM.priority + 1,
442
- sender: utils.getAddress(w.address),
443
- target: w.target,
444
- owner: w.owner ?? w.address,
445
- totalSupply,
446
- type: w.type,
447
- });
448
- }
449
- else {
450
- log.local(`Target ALM not found (${NETWORK_LABELS[chainId]}). Address: ${w.address}, Target: ${w.target}`);
451
- }
452
- }
453
- catch {
454
- log.warn(`merklDynamic data - failed to handle multi hop alm data of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${w.address}`);
455
- i = prevI + 1;
456
- }
457
- }
458
- /** A51 Strategies */
459
- for (const w of pool.alms.filter(a => a.type === ALM.A51)) {
460
- const prevI = i;
461
- const strategies = A51Strategies?.[pool.address.toLowerCase()]?.[w.address] ?? [];
462
- let j = 0;
463
- for (const strategy of strategies) {
464
- j++;
465
- const almPositionsWithAPIType = [];
466
- let almTotalLiquidity = 0;
467
- let almInRangeLiquidity = 0;
468
- let almBalance0 = 0;
469
- let almBalance1 = 0;
470
- try {
471
- // struct StrategyData {
472
- // StrategyKey key; 0
473
- // address owner; 1
474
- // bytes actions; 2
475
- // bytes actionStatus; 3
476
- // bool isCompound; 4
477
- // bool isPrivate; 5
478
- // uint256 managementFee; 6
479
- // uint256 performanceFee; 7
480
- // Account account; 8
481
- // }
482
- const strategyAccount = A51Interface.decodeFunctionResult("strategies", result[i++])[8];
483
- // struct Account {
484
- // uint256 fee0; 0
485
- // uint256 fee1; 1
486
- // uint256 balance0; 2
487
- // uint256 balance1; 3
488
- // uint256 totalShares; 4
489
- // uint128 uniswapLiquidity;
490
- // uint256 feeGrowthInside0LastX128;
491
- // uint256 feeGrowthInside1LastX128;
492
- // uint256 feeGrowthOutside0LastX128;
493
- // uint256 feeGrowthOutside1LastX128;
494
- // }
495
- const a51Positions = positions?.[pool.amm]?.filter(pos => pos.pool.id === pool.address.toLowerCase() &&
496
- pos.owner === w.address.toLowerCase() &&
497
- pos.tickLower === strategy.tickLower.toString() &&
498
- pos.tickUpper === strategy.tickUpper.toString());
499
- if (!!a51Positions) {
500
- for (const position of a51Positions) {
501
- const upperTick = Number.parseInt(position.tickUpper);
502
- const lowerTick = Number.parseInt(position.tickLower);
503
- const [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, lowerTick, upperTick, BigNumber.from(position.liquidity));
504
- const balance0 = BN2Number(amount0, decimalsToken0);
505
- const balance1 = BN2Number(amount1, decimalsToken1);
506
- const totalLiquidity = BN2Number(position.liquidity);
507
- const inRangeLiquidity = balance0 > 0 && balance1 > 0 ? (BN2Number(position.liquidity) ?? 0) : 0;
508
- almTotalLiquidity += totalLiquidity;
509
- almInRangeLiquidity += inRangeLiquidity;
510
- almBalance0 += balance0;
511
- almBalance1 += balance1;
512
- almPositionsWithAPIType.push({
513
- balance0,
514
- balance1,
515
- id: position.id,
516
- inRangeLiquidity,
517
- lowerTick,
518
- totalLiquidity,
519
- tvl: priceToken0 * balance0 + priceToken1 * balance1,
520
- upperTick,
521
- });
522
- }
523
- }
524
- if (!!ALMMapping[pool.amm] && w.type in ALMMapping[pool.amm]) {
525
- almDetails.push({
526
- almAPR: 0,
527
- // filled later on
528
- almAddress: utils.getAddress(w.address),
529
- almBalance0,
530
- almBalance1,
531
- almIdleBalance0: 0,
532
- almIdleBalance1: 0,
533
- almInRangeLiquidity,
534
- almTVL: almBalance0 * priceToken0 + almBalance1 * priceToken1,
535
- almTotalLiquidity,
536
- forwarderType: Forwarder.CLAMM,
537
- label: `${ALMMapping[pool.amm]?.[w.type]} ${w.address} - ${strategy.id}`,
538
- origin: w.type,
539
- positions: almPositionsWithAPIType,
540
- priority: 0,
541
- sender: w.address,
542
- target: w.target,
543
- owner: w.owner ?? w.address,
544
- totalSupply: strategyAccount[4].toString(),
545
- type: w.type,
546
- });
547
- }
548
- }
549
- catch (e) {
550
- log.warn(`merklDynamic data - failed to handle A51 data of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${w.address}`);
551
- i = prevI + j;
552
- }
553
- }
554
- }
555
- /** Iterate over distributions to compute APRs */
556
- for (const campaign of campaigns.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())) {
557
- const c = campaign;
558
- const amount = BN2Number(c.amount, c.campaignParameters.decimalsRewardToken);
559
- const startTimestamp = BN2Number(c.startTimestamp, 0);
560
- const endTimestamp = BN2Number(c.endTimestamp, 0);
561
- const isLive = moment().unix() > startTimestamp && moment().unix() < endTimestamp;
562
- const totalWeight = BN2Number(c.campaignParameters.weightFees, 4) +
563
- BN2Number(c.campaignParameters.weightToken0, 4) +
564
- BN2Number(c.campaignParameters.weightToken1, 4);
565
- // Proportions in percentage
566
- const propFees = (BN2Number(c.campaignParameters.weightFees, 4) / totalWeight) * 100;
567
- const propToken0 = (BN2Number(c.campaignParameters.weightToken0, 4) / totalWeight) * 100;
568
- const propToken1 = (BN2Number(c.campaignParameters.weightToken1, 4) / totalWeight) * 100;
569
- let distributionMeanAPR = 0;
570
- let blacklistedBalance0 = 0;
571
- let blacklistedBalance1 = 0;
572
- let blacklistedLiquidity = 0;
573
- /**
574
- * @dev In case there is a super amm handling some other amm lp positions,
575
- * we only need to check the positions associated to this super amm subgraph
576
- * in order to compute the APRs.
577
- * Yet, the pool will still be labelled with the main amm
578
- */
579
- const amm = c.campaignParameters.whitelist.length > 0 &&
580
- !!PriorityAMM?.[chainId]?.[c.campaignParameters.whitelist[0]]
581
- ? PriorityAMM[chainId]?.[c.campaignParameters.whitelist[0]]
582
- : pool.amm;
583
- const aprs = {};
584
- const aprBreakdowns = [];
585
- /** Clear alm APRs */
586
- const distributionForwarders = almDetails.map(x => ({ ...x }));
587
- let priceRewardToken = 0;
588
- if (isLive && c.campaignParameters.symbolRewardToken !== "aglaMerkl") {
589
- priceRewardToken = (await pricer.get({
590
- address: c.rewardToken,
591
- chainId: chainId,
592
- symbol: c.campaignParameters.symbolRewardToken,
593
- }));
594
- /**
595
- * Handle whitelisted/blacklisted addresses to compute APR
596
- */
597
- if (c.campaignParameters.whitelist.length > 0) {
598
- blacklistedBalance0 = poolBalanceToken0;
599
- blacklistedBalance1 = poolBalanceToken1;
600
- blacklistedLiquidity = poolTotalLiquidity;
601
- // Get all beefy staker is whitelisted, get a list of all senders
602
- let targetToMatch = "";
603
- for (const alm of almDetails.filter(a => a.type === ALM.BeefyStaker)) {
604
- if (c.campaignParameters.whitelist.includes(alm.sender)) {
605
- targetToMatch = alm.target;
606
- }
607
- }
608
- if (targetToMatch !== "") {
609
- for (const alm of almDetails.filter(a => a.type === ALM.Beefy)) {
610
- if (targetToMatch === alm.sender.toLowerCase()) {
611
- c.campaignParameters.whitelist.push(alm.owner);
612
- }
613
- }
614
- }
615
- positions?.[pool.amm]?.forEach(pos => {
616
- if (pos.pool.id === pool.address.toLowerCase() &&
617
- (isWhitelisted(pos.owner, c.campaignParameters.whitelist) || isStrykeCampaign(pool.amm))) {
618
- let [amount0, amount1] = [BigNumber.from(0), BigNumber.from(0)];
619
- try {
620
- [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, Number.parseInt(pos.tickLower), Number.parseInt(pos.tickUpper), BigNumber.from(pos.liquidity));
621
- }
622
- catch {
623
- log.warn(`merklDynamic data - failed to handle whitelisted positions of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${pos.owner} ${pos.tickLower} ${pos.tickUpper} ${pos.liquidity}`);
624
- }
625
- blacklistedBalance0 -= BN2Number(amount0, decimalsToken0);
626
- blacklistedBalance1 -= BN2Number(amount1, decimalsToken1);
627
- if (c.campaignParameters.isOutOfRangeIncentivized
628
- ? BN2Number(amount0, decimalsToken0) > 0 || BN2Number(amount1, decimalsToken1) > 0
629
- : BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
630
- blacklistedLiquidity -= BN2Number(pos.liquidity);
631
- }
632
- // Handling the case of a ALM of priority 2 being whitelisted
633
- else if (pos.pool.id === pool.address.toLowerCase() &&
634
- almDetails.map(a => a.target.toLowerCase()).includes(pos.owner.toLowerCase()) // If pos owner is an ALM
635
- ) {
636
- // If we're in this branch it means the ALM owning the position is not whitelisted
637
- const almHolding = almDetails.filter(a => a.almAddress.toLowerCase() === pos.owner.toLowerCase())[0];
638
- for (const whitelistedAddress of c.campaignParameters.whitelist) {
639
- const forwarderIndex = distributionForwarders.findIndex(f => utils.getAddress(f.almAddress) === utils.getAddress(whitelistedAddress));
640
- if (forwarderIndex !== -1 &&
641
- almHolding.almAddress.toLowerCase() ===
642
- distributionForwarders[forwarderIndex].target.toLowerCase()) {
643
- // If we are here it means one of the ALM whitelisted is a "child" of the ALM holding the position
644
- const childALM = distributionForwarders[forwarderIndex];
645
- let [amount0, amount1] = [BigNumber.from(0), BigNumber.from(0)];
646
- try {
647
- [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, Number.parseInt(pos.tickLower), Number.parseInt(pos.tickUpper), BigNumber.from(pos.liquidity));
648
- }
649
- catch {
650
- log.warn(`merklDynamic data - failed to handle whitelisted positions of pool ${pool.address} on ${NETWORK_LABELS[chainId]} - ${pos.owner} ${pos.tickLower} ${pos.tickUpper} ${pos.liquidity}`);
651
- }
652
- blacklistedBalance0 -=
653
- (BN2Number(amount0, decimalsToken0) * childALM.almBalance0) / almHolding.almBalance0;
654
- blacklistedBalance1 -=
655
- (BN2Number(amount1, decimalsToken1) * childALM.almBalance1) / almHolding.almBalance1;
656
- if (c.campaignParameters.isOutOfRangeIncentivized
657
- ? BN2Number(amount0, decimalsToken0) > 0 || BN2Number(amount1, decimalsToken1) > 0
658
- : BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
659
- blacklistedLiquidity -=
660
- (BN2Number(pos.liquidity) * childALM.almTotalLiquidity) / almHolding.almTotalLiquidity;
661
- }
662
- }
663
- }
664
- });
665
- }
666
- else if (c.campaignParameters.blacklist.length > 0) {
667
- blacklistedBalance0 = 0;
668
- blacklistedBalance1 = 0;
669
- blacklistedLiquidity = 0;
670
- for (const blacklistedAddress of c.campaignParameters.blacklist) {
671
- const blackAddressPositions = positions?.[amm]?.filter(pos => pos.pool.id === pool.address.toLowerCase() && pos.owner === blacklistedAddress.toLowerCase());
672
- if (!!blackAddressPositions) {
673
- for (const position of blackAddressPositions) {
674
- const [amount0, amount1] = getAmountsForLiquidity(sqrtPrice, Number.parseInt(position.tickLower), Number.parseInt(position.tickUpper), BigNumber.from(position.liquidity));
675
- blacklistedBalance0 += BN2Number(amount0, decimalsToken0);
676
- blacklistedBalance1 += BN2Number(amount1, decimalsToken1);
677
- if (BN2Number(amount0, decimalsToken0) > 0 && BN2Number(amount1, decimalsToken1) > 0)
678
- blacklistedLiquidity += BN2Number(position.liquidity);
679
- }
680
- }
681
- }
682
- }
683
- /** Yearly rewards in $ */
684
- const yearlyToken0Rewards = (propToken0 * priceRewardToken * amount * (365 * 24 * 3_600)) / (endTimestamp - startTimestamp);
685
- const yearlyToken1Rewards = (propToken1 * priceRewardToken * amount * (365 * 24 * 3_600)) / (endTimestamp - startTimestamp);
686
- const yearlyFeeRewards = (propFees * priceRewardToken * amount * (365 * 24 * 3_600)) / (endTimestamp - startTimestamp);
687
- let poolAPRkey = "";
688
- // /**
689
- // * @notice Stryke users receive rewards with respect to their LP positions (they hold through
690
- // * Stryke contracts and the `used liquidity` hold in the Stryke option market contracts
691
- // */
692
- // if (amm === AMM.Stryke || amm === AMM.StrykePCS) {
693
- // try {
694
- // poolBalanceToken0 +=
695
- // BN2Number(
696
- // await Erc20__factory.connect(c.campaignParameters.token0, providers[chainId]).balanceOf(
697
- // DOPEX_OPTION_MARKET[pool.address.toLowerCase()]
698
- // ),
699
- // c.campaignParameters.decimalsToken0
700
- // ) / 2;
701
- // poolBalanceToken1 +=
702
- // BN2Number(
703
- // await Erc20__factory.connect(c.campaignParameters.token1, providers[chainId]).balanceOf(
704
- // DOPEX_OPTION_MARKET[pool.address.toLowerCase()]
705
- // ),
706
- // c.campaignParameters.decimalsToken1
707
- // ) / 2;
708
- // } catch {
709
- // log.error(
710
- // "clamm dynamic data fetching",
711
- // `failed to handle dopex option market - ${pool.address}`
712
- // );
713
- // }
714
- // }
715
- /**
716
- * General APR (@notice potentially with a boost)
717
- */
718
- let poolBalanceToken0WithoutBlacklist = poolBalanceToken0 - (blacklistedBalance0 ?? 0);
719
- poolBalanceToken0WithoutBlacklist = !!poolBalanceToken0WithoutBlacklist
720
- ? poolBalanceToken0WithoutBlacklist
721
- : 0.00001;
722
- let poolBalanceToken1WithoutBlacklist = poolBalanceToken1 - (blacklistedBalance1 ?? 0);
723
- poolBalanceToken1WithoutBlacklist = !!poolBalanceToken1WithoutBlacklist
724
- ? poolBalanceToken1WithoutBlacklist
725
- : 0.00001;
726
- const poolLiquidityWithoutBlacklist = poolTotalLiquidity - (blacklistedLiquidity ?? 0);
727
- const tvl = isStrykeCampaign(amm)
728
- ? (await axios.get(`https://api.stryke.xyz/clamm/stats/tvl/${pool.address}?chainId=${chainId}`)).data
729
- : poolBalanceToken0WithoutBlacklist * priceToken0 + poolBalanceToken1WithoutBlacklist * priceToken1;
730
- distributionMeanAPR = (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) / tvl;
731
- distributionMeanAPR =
732
- !distributionMeanAPR || Number.isNaN(distributionMeanAPR) ? 0 : distributionMeanAPR;
733
- /**
734
- * @dev We cannot include a whitelisted distrib apr into the mean APR
735
- */
736
- if (c.campaignParameters.whitelist.length === 0) {
737
- poolAPRkey = "Average APR (rewards / pool TVL)";
738
- if (!aprs[poolAPRkey])
739
- aprs[poolAPRkey] = 0;
740
- aprs[poolAPRkey] += distributionMeanAPR;
741
- // @Hugo wip: new way to structure aprBreakdowns
742
- aprBreakdowns.push({
743
- address: pool.address,
744
- value: distributionMeanAPR,
745
- type: EAprBreakdownType.AVERAGE,
746
- label: "Average APR (rewards / pool TVL)",
747
- });
748
- // APR per token
749
- poolAPRkey = `APR for holding ${c.campaignParameters.symbolToken0} in pool`;
750
- if (!aprs[poolAPRkey])
751
- aprs[poolAPRkey] = 0;
752
- aprs[poolAPRkey] += yearlyToken0Rewards / (poolBalanceToken0WithoutBlacklist * priceToken0);
753
- // @Hugo wip: new way to structure aprBreakdowns
754
- aprBreakdowns.push({
755
- address: pool.address,
756
- value: yearlyToken0Rewards / (poolBalanceToken0WithoutBlacklist * priceToken0),
757
- type: EAprBreakdownType.TOKEN1,
758
- label: c.campaignParameters.symbolToken0,
759
- });
760
- poolAPRkey = `APR for holding ${c.campaignParameters.symbolToken1} in pool`;
761
- if (!aprs[poolAPRkey])
762
- aprs[poolAPRkey] = 0;
763
- aprs[poolAPRkey] += yearlyToken1Rewards / (poolBalanceToken1WithoutBlacklist * priceToken1);
764
- // @Hugo wip: new way to structure aprBreakdowns
765
- aprBreakdowns.push({
766
- address: pool.address,
767
- value: yearlyToken1Rewards / (poolBalanceToken1WithoutBlacklist * priceToken1),
768
- type: EAprBreakdownType.TOKEN2,
769
- label: c.campaignParameters.symbolToken1,
770
- });
771
- }
772
- else {
773
- for (const whitelistedAddress of c.campaignParameters.whitelist) {
774
- const forwarderIndex = distributionForwarders.findIndex(f => utils.getAddress(f.almAddress) === utils.getAddress(whitelistedAddress));
775
- const poolAPRkey = `Whitelisted campaign on ${ammName(amm)} via address ${shortenAddress(c.campaignParameters.whitelist[0])} Average APR`;
776
- if (!aprs[poolAPRkey])
777
- aprs[poolAPRkey] = 0;
778
- // Account for idle liquidity
779
- if (forwarderIndex > -1) {
780
- // @Hugo wip: new way to structure aprBreakdowns
781
- const breakdownWl = {
782
- address: c.campaignParameters.whitelist[0],
783
- value: 0,
784
- type: EAprBreakdownType.WHITELIST,
785
- label: ammName(amm),
786
- };
787
- if (distributionForwarders[forwarderIndex].priority === 2) {
788
- distributionMeanAPR =
789
- (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) /
790
- (tvl +
791
- distributionForwarders[forwarderIndex].almBalance0 * priceToken0 +
792
- distributionForwarders[forwarderIndex].almBalance1 * priceToken1);
793
- }
794
- else {
795
- distributionMeanAPR =
796
- (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) /
797
- (tvl +
798
- distributionForwarders[forwarderIndex].almIdleBalance0 * priceToken0 +
799
- distributionForwarders[forwarderIndex].almIdleBalance1 * priceToken1);
800
- }
801
- distributionMeanAPR =
802
- !distributionMeanAPR || Number.isNaN(distributionMeanAPR) ? 0 : distributionMeanAPR;
803
- // @Hugo wip: new way to structure aprBreakdowns
804
- breakdownWl.value = distributionMeanAPR;
805
- aprBreakdowns.push(breakdownWl);
806
- }
807
- }
808
- aprs[poolAPRkey] += distributionMeanAPR;
809
- }
810
- /**
811
- * ALM APRs
812
- * @notice given a campaign
813
- * */
814
- distributionForwarders.forEach((alm, index) => {
815
- const targetForwarder = distributionForwarders.filter(f => f.almAddress.toLowerCase() === alm.target.toLowerCase())?.[0];
816
- // @Hugo wip: new way to structure aprBreakdowns
817
- const aprsBreakdown = getForwarderAprbreakDown(distributionForwarders, alm, c, pool, yearlyToken0Rewards, yearlyToken1Rewards, yearlyFeeRewards, poolBalanceToken0WithoutBlacklist, poolBalanceToken1WithoutBlacklist, poolLiquidityWithoutBlacklist, tvl, distributionMeanAPR, index, chainId, amm);
818
- // @Hugo wip: new way to structure aprBreakdowns
819
- aprsBreakdown && aprBreakdowns.push(aprsBreakdown);
820
- const isALMWhitelisted = c.campaignParameters.whitelist.length > 0
821
- ? isStrykeCampaign(pool.amm)
822
- ? true
823
- : isWhitelisted(alm.sender, c.campaignParameters.whitelist) ||
824
- isWhitelisted(alm.almAddress, c.campaignParameters.whitelist) ||
825
- isWhitelisted(!!alm?.owner ? alm.owner : "", c.campaignParameters.whitelist) ||
826
- isWhitelisted(!!alm?.target ? alm.target : "", c.campaignParameters.whitelist) ||
827
- (!!targetForwarder?.owner &&
828
- isWhitelisted(targetForwarder?.owner, c.campaignParameters.whitelist))
829
- : true;
830
- const isBlacklistedByCampaign = isBlacklisted(alm.sender, c.campaignParameters.blacklist) ||
831
- isBlacklisted(alm.almAddress, c.campaignParameters.blacklist) ||
832
- (!!alm?.target && isBlacklisted(alm?.target, c.campaignParameters.blacklist)) ||
833
- !isALMWhitelisted;
834
- if (!isBlacklistedByCampaign && !!alm.almTVL && alm.almTVL > 0) {
835
- try {
836
- poolAPRkey = `${almName(alm.origin)} ${alm.almAddress}`;
837
- if (!aprs[poolAPRkey])
838
- aprs[poolAPRkey] = 0;
839
- // Token 0 APR
840
- const almToken0APR = (yearlyToken0Rewards * (alm?.almBalance0 ?? 0 - alm?.almIdleBalance0 ?? 0)) /
841
- poolBalanceToken0WithoutBlacklist /
842
- alm.almTVL;
843
- aprs[poolAPRkey] += almToken0APR;
844
- // Token 1 APR
845
- const almToken1APR = (yearlyToken1Rewards * (alm?.almBalance1 ?? 0 - alm?.almIdleBalance1 ?? 0)) /
846
- poolBalanceToken1WithoutBlacklist /
847
- alm.almTVL;
848
- ((alm.almBalance1 / (alm?.almBalance1 ?? 0 + alm?.almIdleBalance1 ?? 0)) *
849
- alm.almBalance1 *
850
- yearlyToken1Rewards) /
851
- poolBalanceToken1WithoutBlacklist /
852
- alm.almTVL;
853
- aprs[poolAPRkey] += almToken1APR;
854
- // Fee APR
855
- const almFeeAPR = (yearlyFeeRewards * (alm?.almInRangeLiquidity ?? 0)) /
856
- poolLiquidityWithoutBlacklist /
857
- alm.almTVL;
858
- aprs[poolAPRkey] += almFeeAPR;
859
- if (isStrykeCampaign(amm)) {
860
- // computation is less precise here as we don't have the details of balances
861
- aprs[poolAPRkey] = (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) / tvl;
862
- }
863
- /** Fix to tackle discrepancies in the APRs when there is a whitelist */
864
- if ((c.campaignParameters.whitelist?.length === 1 &&
865
- (isWhitelisted(alm.sender, c.campaignParameters.whitelist) ||
866
- isWhitelisted(alm.almAddress, c.campaignParameters.whitelist) ||
867
- isWhitelisted(!!alm?.target ? alm.target : "", c.campaignParameters.whitelist) ||
868
- isWhitelisted(!!alm?.owner ? alm.owner : "", c.campaignParameters.whitelist))) ||
869
- (!!targetForwarder?.owner &&
870
- isWhitelisted(targetForwarder?.owner, c.campaignParameters.whitelist))) {
871
- if (aprs[poolAPRkey] < distributionMeanAPR || !aprs[poolAPRkey] || aprs[poolAPRkey] > 1e12) {
872
- aprs[poolAPRkey] = distributionMeanAPR;
873
- }
874
- }
875
- distributionForwarders[index].almAPR = aprs[poolAPRkey];
876
- }
877
- catch (e) {
878
- log.error("CLAMMDynamicData", `failed to compute ALM APR for ${alm.almAddress} (sender ${alm.sender}) on ${NETWORK_LABELS[chainId]}: ${e}`);
879
- }
880
- }
881
- });
882
- }
883
- dynamicData.push({
884
- ...campaign,
885
- amm: pool.amm,
886
- ammAlgo: AMMAlgorithmMapping[pool.amm],
887
- ammAlgoName: AMMAlgorithm[AMMAlgorithmMapping[pool.amm]],
888
- ammName: AMM[pool.amm],
889
- apr: distributionMeanAPR,
890
- aprs,
891
- aprBreakdowns,
892
- blacklistedBalance0,
893
- blacklistedBalance1,
894
- blacklistedLiquidity,
895
- forwarders: distributionForwarders,
896
- isLive,
897
- isMock: c.campaignParameters.symbolRewardToken === "aglaMerkl",
898
- poolBalanceToken0,
899
- poolBalanceToken1,
900
- poolTotalLiquidity,
901
- symbolToken0,
902
- symbolToken1,
903
- tick: getTickAtSqrtRatio(JSBI.BigInt(sqrtPrice)),
904
- priceRewardToken: priceRewardToken,
905
- tvl: isStrykeCampaign(pool.amm)
906
- ? (await axios.get(`https://api.stryke.xyz/clamm/stats/tvl/${pool.address}?chainId=${chainId}`)).data
907
- : poolBalanceToken0 * priceToken0 + poolBalanceToken1 * priceToken1,
908
- });
909
- }
910
- }
911
- }
912
- return dynamicData;
913
- },
914
- },
915
- };
916
- }
917
- // Fallback in case something fails
918
- return {
919
- cached: false,
920
- call: {
921
- callData: [],
922
- handler: () => { },
923
- reducer: async (_result) => {
924
- return campaigns;
925
- },
926
- },
927
- };
928
- }
929
- function getForwarderAprbreakDown(distributionForwarders, alm, campaign, pool, yearlyToken0Rewards, yearlyToken1Rewards, yearlyFeeRewards, poolBalanceToken0WithoutBlacklist, poolBalanceToken1WithoutBlacklist, poolLiquidityWithoutBlacklist, tvl, distributionMeanAPR, index, chainId, amm) {
930
- if (!distributionForwarders)
931
- return null;
932
- let aprBreakdowns = null;
933
- const targetForwarder = distributionForwarders.filter(f => f.almAddress.toLowerCase() === alm.target.toLowerCase())?.[0];
934
- const isALMWhitelisted = campaign.campaignParameters.whitelist.length > 0
935
- ? isStrykeCampaign(pool.amm)
936
- ? true
937
- : isWhitelisted(alm.sender, campaign.campaignParameters.whitelist) ||
938
- isWhitelisted(alm.almAddress, campaign.campaignParameters.whitelist) ||
939
- isWhitelisted(!!alm?.owner ? alm.owner : "", campaign.campaignParameters.whitelist) ||
940
- isWhitelisted(!!alm?.target ? alm.target : "", campaign.campaignParameters.whitelist) ||
941
- (!!targetForwarder?.owner && isWhitelisted(targetForwarder?.owner, campaign.campaignParameters.whitelist))
942
- : true;
943
- const isBlacklistedByCampaign = isBlacklisted(alm.sender, campaign.campaignParameters.blacklist) ||
944
- isBlacklisted(alm.almAddress, campaign.campaignParameters.blacklist) ||
945
- (!!alm?.target && isBlacklisted(alm?.target, campaign.campaignParameters.blacklist)) ||
946
- !isALMWhitelisted;
947
- if (!isBlacklistedByCampaign && !!alm.almTVL && alm.almTVL > 0) {
948
- try {
949
- // Token 0 APR
950
- const almToken0APR = (yearlyToken0Rewards * (alm?.almBalance0 ?? 0 - alm?.almIdleBalance0 ?? 0)) /
951
- poolBalanceToken0WithoutBlacklist /
952
- alm.almTVL;
953
- // Token 1 APR
954
- const almToken1APR = (yearlyToken1Rewards * (alm?.almBalance1 ?? 0 - alm?.almIdleBalance1 ?? 0)) /
955
- poolBalanceToken1WithoutBlacklist /
956
- alm.almTVL;
957
- // Fee APR
958
- const almFeeAPR = (yearlyFeeRewards * (alm?.almInRangeLiquidity ?? 0)) / poolLiquidityWithoutBlacklist / alm.almTVL;
959
- let aprValue = almToken0APR + almToken1APR + almFeeAPR;
960
- // computation is less precise here as we don't have the details of balances
961
- if (isStrykeCampaign(amm))
962
- aprValue = (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) / tvl;
963
- /** Fix to tackle discrepancies in the APRs when there is a whitelist */
964
- if ((campaign.campaignParameters.whitelist?.length === 1 &&
965
- (isWhitelisted(alm.sender, campaign.campaignParameters.whitelist) ||
966
- isWhitelisted(alm.almAddress, campaign.campaignParameters.whitelist) ||
967
- isWhitelisted(!!alm?.target ? alm.target : "", campaign.campaignParameters.whitelist) ||
968
- isWhitelisted(!!alm?.owner ? alm.owner : "", campaign.campaignParameters.whitelist))) ||
969
- (!!targetForwarder?.owner && isWhitelisted(targetForwarder?.owner, campaign.campaignParameters.whitelist))) {
970
- if (aprValue < distributionMeanAPR || !aprValue || aprValue > 1e12)
971
- aprValue = distributionMeanAPR;
972
- }
973
- aprBreakdowns = {
974
- address: pool.address,
975
- value: aprValue,
976
- type: EAprBreakdownType.FORWARDER,
977
- label: almName(alm.origin),
978
- };
979
- distributionForwarders[index].almAPR = aprValue; // @Hugo wip: new way to structure aprBreakdowns + check this
980
- }
981
- catch (e) {
982
- log.error("CLAMMDynamicData", `failed to compute ALM APR for ${alm.almAddress} (sender ${alm.sender}) on ${NETWORK_LABELS[chainId]}: ${e}`);
983
- }
984
- }
985
- return aprBreakdowns;
986
- }