@merkl/api 0.10.129 → 0.10.131

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 (361) hide show
  1. package/dist/database/api/.generated/default.js +1 -0
  2. package/dist/database/api/.generated/edge.js +609 -0
  3. package/dist/database/api/.generated/index-browser.js +586 -0
  4. package/dist/database/api/.generated/index.js +638 -0
  5. package/dist/database/api/.generated/runtime/edge-esm.js +31 -0
  6. package/dist/database/api/.generated/runtime/edge.js +31 -0
  7. package/dist/database/api/.generated/runtime/index-browser.js +13 -0
  8. package/dist/database/api/.generated/runtime/library.js +143 -0
  9. package/dist/database/api/.generated/runtime/react-native.js +80 -0
  10. package/dist/database/api/.generated/runtime/wasm.js +32 -0
  11. package/dist/database/api/.generated/wasm.js +586 -0
  12. package/dist/database/api/seeder/resources/protocol.js +341 -0
  13. package/dist/database/engine/.generated/default.js +1 -0
  14. package/dist/database/engine/.generated/edge.js +438 -0
  15. package/dist/database/engine/.generated/index-browser.js +415 -0
  16. package/dist/database/engine/.generated/index.js +467 -0
  17. package/dist/database/engine/.generated/runtime/edge-esm.js +31 -0
  18. package/dist/database/engine/.generated/runtime/edge.js +31 -0
  19. package/dist/database/engine/.generated/runtime/index-browser.js +13 -0
  20. package/dist/database/engine/.generated/runtime/library.js +143 -0
  21. package/dist/database/engine/.generated/runtime/react-native.js +80 -0
  22. package/dist/database/engine/.generated/runtime/wasm.js +32 -0
  23. package/dist/database/engine/.generated/wasm.js +415 -0
  24. package/dist/src/backgroundJobs/index.js +44 -0
  25. package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +160 -0
  26. package/dist/src/backgroundJobs/jobs/health.js +15 -0
  27. package/dist/src/backgroundJobs/jobs/opportunityUpdater.js +63 -0
  28. package/dist/src/backgroundJobs/jobs/priceUpdater.js +16 -0
  29. package/dist/src/backgroundJobs/jobs/sync.js +33 -0
  30. package/dist/src/cache/declaration.js +146 -0
  31. package/dist/src/cache/index.js +152 -0
  32. package/dist/src/cache/redis.js +49 -0
  33. package/dist/src/constants.js +119 -0
  34. package/dist/src/entities/campaign.js +134 -0
  35. package/dist/src/entities/opportunity.js +549 -0
  36. package/dist/src/errors/BadRequest.error.js +7 -0
  37. package/dist/src/errors/Conflict.error.js +7 -0
  38. package/dist/src/errors/HttpError.js +11 -0
  39. package/dist/src/errors/NotFound.error.js +7 -0
  40. package/dist/src/errors/Opportunity.error.js +11 -0
  41. package/dist/src/errors/Unauthorized.error.js +7 -0
  42. package/dist/src/errors/index.js +5 -0
  43. package/dist/src/guards/BackOffice.guard.js +10 -0
  44. package/dist/src/guards/Engine.guard.js +10 -0
  45. package/dist/src/guards/TokenAuth.guard.js +10 -0
  46. package/dist/src/hooks/checkQueryAddressValidity.js +7 -0
  47. package/dist/src/hooks/checkQueryChainIdValidity.js +7 -0
  48. package/dist/src/index.js +79 -0
  49. package/dist/src/internal/controllers/endingCampaigns.js +41 -0
  50. package/dist/src/internal/controllers/unclaimed.js +36 -0
  51. package/dist/src/internal/index.js +30 -0
  52. package/dist/src/libs/campaigns/campaignTypes/AjnaDynamicData.js +111 -0
  53. package/dist/src/libs/campaigns/campaignTypes/BadgerDynamicData.js +93 -0
  54. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +942 -0
  55. package/dist/src/libs/campaigns/campaignTypes/CompoundDynamicData.js +90 -0
  56. package/dist/src/libs/campaigns/campaignTypes/DolomiteDynamicData.js +60 -0
  57. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +162 -0
  58. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +159 -0
  59. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/eulerVaultNames.js +13 -0
  60. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/factoryFinder.js +29 -0
  61. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/getBlacklistedSupply.js +22 -0
  62. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/metamorphoTvl.js +35 -0
  63. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/spliceTVL.js +21 -0
  64. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +106 -0
  65. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AaveProcessor.js +26 -0
  66. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AssetProcessor.js +47 -0
  67. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.js +103 -0
  68. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerGaugeProcessor.js +83 -0
  69. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerPoolProcessor.js +99 -0
  70. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BeefyProcessor.js +51 -0
  71. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/CompoundProcessor.js +36 -0
  72. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EnzymeProcessor.js +51 -0
  73. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerBorrowProcessor.js +46 -0
  74. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerLendProcessor.js +47 -0
  75. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FluidProcessor.js +36 -0
  76. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FraxProcessor.js +41 -0
  77. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GearboxProcessor.js +44 -0
  78. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GenericProcessor.js +239 -0
  79. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/MetamorphoProcessor.js +43 -0
  80. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.js +31 -0
  81. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RadiantProcessor.js +58 -0
  82. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RfxProcessor.js +64 -0
  83. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SpliceProcessor.js +35 -0
  84. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SturdySiloProcessor.js +37 -0
  85. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TemplateProcessor.js +40 -0
  86. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TorosProcessor.js +33 -0
  87. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/UniswapProcessor.js +48 -0
  88. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/WoofiProcessor.js +40 -0
  89. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/curveProcessor.js +68 -0
  90. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +77 -0
  91. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPrices.js +583 -0
  92. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPricesRefactoFinal.js +24 -0
  93. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.js +1209 -0
  94. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +194 -0
  95. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2.js +645 -0
  96. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2RefactoFinal.js +22 -0
  97. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3.js +392 -0
  98. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3RefactoFinal.js +22 -0
  99. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4.js +323 -0
  100. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4RefactoFinal.js +22 -0
  101. package/dist/src/libs/campaigns/campaignTypes/ERC20_SNAPSHOTDynamicData.js +38 -0
  102. package/dist/src/libs/campaigns/campaignTypes/EulerDynamicData.js +165 -0
  103. package/dist/src/libs/campaigns/campaignTypes/JSON_AIRDROPDynamicData.js +19 -0
  104. package/dist/src/libs/campaigns/campaignTypes/MORPHODynamicData.js +120 -0
  105. package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.js +112 -0
  106. package/dist/src/libs/campaigns/campaignTypes/SILODynamicData.js +113 -0
  107. package/dist/src/libs/campaigns/campaignsDynamicData.js +83 -0
  108. package/dist/src/libs/campaigns/campaignsDynamicDataRefacto.js +78 -0
  109. package/dist/src/libs/campaigns/getCampaigns.js +18 -0
  110. package/dist/src/libs/campaigns/utils/fetchA51Strategies.js +44 -0
  111. package/dist/src/libs/campaigns/utils/fetchClamInfo.js +27 -0
  112. package/dist/src/libs/campaigns/utils/fetchLogs.js +91 -0
  113. package/dist/src/libs/campaigns/utils/getCompV2ForksVaults.js +122 -0
  114. package/dist/src/libs/campaigns/utils/getContractCreationBlock.js +44 -0
  115. package/dist/src/libs/campaigns/utils/getDolomiteMarkets.js +50 -0
  116. package/dist/src/libs/campaigns/utils/getEulerV2Vaults.js +87 -0
  117. package/dist/src/libs/campaigns/utils/getLastEligibilityRatio.js +56 -0
  118. package/dist/src/libs/computeFee.js +34 -0
  119. package/dist/src/libs/custom/twtParticipants.js +54 -0
  120. package/dist/src/libs/deprecated-merklv3/index.js +184 -0
  121. package/dist/src/libs/getTokensList.js +37 -0
  122. package/dist/src/libs/merklChainData.js +129 -0
  123. package/dist/src/libs/parse/marketsWithCache.js +8 -0
  124. package/dist/src/libs/positions/ajna/index.js +107 -0
  125. package/dist/src/libs/positions/badger/index.js +79 -0
  126. package/dist/src/libs/positions/clamm/index.js +419 -0
  127. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.js +35 -0
  128. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.js +35 -0
  129. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.js +44 -0
  130. package/dist/src/libs/positions/clamm/thegraph/index.js +162 -0
  131. package/dist/src/libs/positions/compound/index.js +93 -0
  132. package/dist/src/libs/positions/dolomite/index.js +49 -0
  133. package/dist/src/libs/positions/erc20/index.js +55 -0
  134. package/dist/src/libs/positions/euler/index.js +57 -0
  135. package/dist/src/libs/positions/index.js +48 -0
  136. package/dist/src/libs/positions/morpho/index.js +177 -0
  137. package/dist/src/libs/positions/prepareFetch.js +339 -0
  138. package/dist/src/libs/positions/silo/index.js +67 -0
  139. package/dist/src/libs/positions/types.js +1 -0
  140. package/dist/src/libs/reports/campaignReport.js +37 -0
  141. package/dist/src/libs/reports/mainParameterRewards.js +48 -0
  142. package/dist/src/libs/rewards/userRewards.js +154 -0
  143. package/dist/src/libs/staticCampaigns.js +10 -0
  144. package/dist/src/libs/tokens/balances.js +126 -0
  145. package/dist/src/libs/tokens/tokenInfo.js +22 -0
  146. package/dist/src/modules/v4/accounting/accounting.controller.js +66 -0
  147. package/dist/src/modules/v4/accounting/accounting.model.js +32 -0
  148. package/dist/src/modules/v4/accounting/accounting.repository.js +100 -0
  149. package/dist/src/modules/v4/accounting/accounting.service.js +78 -0
  150. package/dist/src/modules/v4/accounting/index.js +3 -0
  151. package/dist/src/modules/v4/apr/apr.controller.js +1 -0
  152. package/dist/src/modules/v4/apr/apr.model.js +1 -0
  153. package/dist/src/modules/v4/apr/apr.repository.js +1 -0
  154. package/dist/src/modules/v4/apr/apr.service.js +40 -0
  155. package/dist/src/modules/v4/apr/index.js +2 -0
  156. package/dist/src/modules/v4/blacklist/blacklist.controller.js +45 -0
  157. package/dist/src/modules/v4/blacklist/blacklist.model.js +13 -0
  158. package/dist/src/modules/v4/blacklist/blacklist.repository.js +56 -0
  159. package/dist/src/modules/v4/blacklist/blacklist.service.js +24 -0
  160. package/dist/src/modules/v4/blacklist/index.js +3 -0
  161. package/dist/src/modules/v4/cache/cache.model.js +14 -0
  162. package/dist/src/modules/v4/cache/cache.repository.js +10 -0
  163. package/dist/src/modules/v4/cache/cache.service.js +44 -0
  164. package/dist/src/modules/v4/cache/index.js +1 -0
  165. package/dist/src/modules/v4/campaign/campaign.controller.js +56 -0
  166. package/dist/src/modules/v4/campaign/campaign.model.js +54 -0
  167. package/dist/src/modules/v4/campaign/campaign.repository.js +346 -0
  168. package/dist/src/modules/v4/campaign/campaign.service.js +203 -0
  169. package/dist/src/modules/v4/campaign/index.js +3 -0
  170. package/dist/src/modules/v4/chain/chain.controller.js +40 -0
  171. package/dist/src/modules/v4/chain/chain.model.js +17 -0
  172. package/dist/src/modules/v4/chain/chain.repository.js +64 -0
  173. package/dist/src/modules/v4/chain/chain.service.js +42 -0
  174. package/dist/src/modules/v4/chain/index.js +3 -0
  175. package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +19 -0
  176. package/dist/src/modules/v4/dynamicData/dynamicData.model.js +6 -0
  177. package/dist/src/modules/v4/dynamicData/dynamicData.repository.js +1 -0
  178. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +49 -0
  179. package/dist/src/modules/v4/dynamicData/index.js +3 -0
  180. package/dist/src/modules/v4/enso/enso.model.js +108 -0
  181. package/dist/src/modules/v4/enso/enso.service.js +46 -0
  182. package/dist/src/modules/v4/explorer/explorer.model.js +2 -0
  183. package/dist/src/modules/v4/explorer/explorer.repository.js +23 -0
  184. package/dist/src/modules/v4/explorer/explorer.service.js +24 -0
  185. package/dist/src/modules/v4/explorer/index.js +1 -0
  186. package/dist/src/modules/v4/index.js +4 -0
  187. package/dist/src/modules/v4/merklRoot/index.js +3 -0
  188. package/dist/src/modules/v4/merklRoot/merklRoot.controller.js +19 -0
  189. package/dist/src/modules/v4/merklRoot/merklRoot.model.js +6 -0
  190. package/dist/src/modules/v4/merklRoot/merklRoot.repository.js +31 -0
  191. package/dist/src/modules/v4/merklRoot/merklRoot.service.js +38 -0
  192. package/dist/src/modules/v4/opportunity/index.js +3 -0
  193. package/dist/src/modules/v4/opportunity/opportunity.controller.js +69 -0
  194. package/dist/src/modules/v4/opportunity/opportunity.model.js +36 -0
  195. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +14 -0
  196. package/dist/src/modules/v4/opportunity/opportunity.repository.js +217 -0
  197. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +0 -15
  198. package/dist/src/modules/v4/opportunity/opportunity.service.js +180 -0
  199. package/dist/src/modules/v4/opportunity/subservices/getAjnaMetadata.service.js +50 -0
  200. package/dist/src/modules/v4/opportunity/subservices/getBadgerMetadata.service.js +23 -0
  201. package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +33 -0
  202. package/dist/src/modules/v4/opportunity/subservices/getCompoundMetadata.service.js +18 -0
  203. package/dist/src/modules/v4/opportunity/subservices/getDolomiteMetadata.service.js +15 -0
  204. package/dist/src/modules/v4/opportunity/subservices/getErc20Metadata.service.js +63 -0
  205. package/dist/src/modules/v4/opportunity/subservices/getErc20SnapshotMetadata.service.js +8 -0
  206. package/dist/src/modules/v4/opportunity/subservices/getEulerMetadata.service.js +30 -0
  207. package/dist/src/modules/v4/opportunity/subservices/getJsonAirDropMetadata.service.js +36 -0
  208. package/dist/src/modules/v4/opportunity/subservices/getMorphoMetadata.service.js +19 -0
  209. package/dist/src/modules/v4/opportunity/subservices/getRadiantMetadata.service.js +9 -0
  210. package/dist/src/modules/v4/opportunity/subservices/getSiloMetadata.service.js +13 -0
  211. package/dist/src/modules/v4/opportunity/transform-id.pipe.js +6 -0
  212. package/dist/src/modules/v4/opportunity/validate-id.pipe.js +12 -0
  213. package/dist/src/modules/v4/participate/participate.controller.js +66 -0
  214. package/dist/src/modules/v4/participate/participate.model.js +24 -0
  215. package/dist/src/modules/v4/participate/participate.service.js +33 -0
  216. package/dist/src/modules/v4/price/index.js +3 -0
  217. package/dist/src/modules/v4/price/price.controller.js +62 -0
  218. package/dist/src/modules/v4/price/price.model.js +12 -0
  219. package/dist/src/modules/v4/price/price.repository.js +18 -0
  220. package/dist/src/modules/v4/price/price.service.js +44 -0
  221. package/dist/src/modules/v4/prisma/index.js +1 -0
  222. package/dist/src/modules/v4/protocol/index.js +3 -0
  223. package/dist/src/modules/v4/protocol/protocol.controller.js +23 -0
  224. package/dist/src/modules/v4/protocol/protocol.model.js +68 -0
  225. package/dist/src/modules/v4/protocol/protocol.repository.js +37 -0
  226. package/dist/src/modules/v4/protocol/protocol.service.js +77 -0
  227. package/dist/src/modules/v4/reward/index.js +3 -0
  228. package/dist/src/modules/v4/reward/reward.controller.js +52 -0
  229. package/dist/src/modules/v4/reward/reward.model.js +104 -0
  230. package/dist/src/modules/v4/reward/reward.repository.js +237 -0
  231. package/dist/src/modules/v4/reward/reward.service.js +283 -0
  232. package/dist/src/modules/v4/reward/rewardConvertor.service.js +136 -0
  233. package/dist/src/modules/v4/router.js +57 -0
  234. package/dist/src/modules/v4/status/index.js +3 -0
  235. package/dist/src/modules/v4/status/status.controller.js +48 -0
  236. package/dist/src/modules/v4/status/status.model.js +24 -0
  237. package/dist/src/modules/v4/status/status.repository.js +88 -0
  238. package/dist/src/modules/v4/status/status.service.js +60 -0
  239. package/dist/src/modules/v4/token/index.js +3 -0
  240. package/dist/src/modules/v4/token/token.controller.js +32 -0
  241. package/dist/src/modules/v4/token/token.model.js +23 -0
  242. package/dist/src/modules/v4/token/token.repository.js +128 -0
  243. package/dist/src/modules/v4/token/token.service.js +268 -0
  244. package/dist/src/modules/v4/tvl/index.js +2 -0
  245. package/dist/src/modules/v4/tvl/tvl.controller.js +1 -0
  246. package/dist/src/modules/v4/tvl/tvl.model.js +1 -0
  247. package/dist/src/modules/v4/tvl/tvl.repository.js +1 -0
  248. package/dist/src/modules/v4/tvl/tvl.service.js +49 -0
  249. package/dist/src/modules/v4/uniswapV4/index.js +4 -0
  250. package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.js +11 -0
  251. package/dist/src/modules/v4/uniswapV4/uniswapV4.model.js +17 -0
  252. package/dist/src/modules/v4/uniswapV4/uniswapV4.repository.js +2 -0
  253. package/dist/src/modules/v4/uniswapV4/uniswapV4.service.js +73 -0
  254. package/dist/src/modules/v4/user/index.js +3 -0
  255. package/dist/src/modules/v4/user/user.controller.js +69 -0
  256. package/dist/src/modules/v4/user/user.model.js +18 -0
  257. package/dist/src/modules/v4/user/user.repository.js +38 -0
  258. package/dist/src/modules/v4/user/user.service.js +50 -0
  259. package/dist/src/plugins/error-handling.plugin.js +28 -0
  260. package/dist/src/plugins/logger.plugin.js +22 -0
  261. package/dist/src/routes/v1/allowances.js +115 -0
  262. package/dist/src/routes/v1/balances.js +25 -0
  263. package/dist/src/routes/v1/prices.js +11 -0
  264. package/dist/src/routes/v1/tokens.js +17 -0
  265. package/dist/src/routes/v2/merkl.js +13 -0
  266. package/dist/src/routes/v3/ERC20Campaigns.js +63 -0
  267. package/dist/src/routes/v3/app.js +18 -0
  268. package/dist/src/routes/v3/blacklist.js +18 -0
  269. package/dist/src/routes/v3/campaign/delay.js +78 -0
  270. package/dist/src/routes/v3/campaignClaims.js +24 -0
  271. package/dist/src/routes/v3/campaignReport.js +22 -0
  272. package/dist/src/routes/v3/campaignUnclaimed.js +28 -0
  273. package/dist/src/routes/v3/campaigns.js +101 -0
  274. package/dist/src/routes/v3/campaignsForMainParameter.js +19 -0
  275. package/dist/src/routes/v3/campaignsInfo.js +54 -0
  276. package/dist/src/routes/v3/campaignsRewardsReport.js +47 -0
  277. package/dist/src/routes/v3/claims.js +45 -0
  278. package/dist/src/routes/v3/compoundV2.js +9 -0
  279. package/dist/src/routes/v3/createCampaign.js +66 -0
  280. package/dist/src/routes/v3/dolomite.js +9 -0
  281. package/dist/src/routes/v3/euler.js +9 -0
  282. package/dist/src/routes/v3/exports/campaigns.js +28 -0
  283. package/dist/src/routes/v3/fetch.js +27 -0
  284. package/dist/src/routes/v3/health.js +13 -0
  285. package/dist/src/routes/v3/lostyield.js +98 -0
  286. package/dist/src/routes/v3/merkl.js +119 -0
  287. package/dist/src/routes/v3/morphoMarkets.js +27 -0
  288. package/dist/src/routes/v3/morphoVaults.js +22 -0
  289. package/dist/src/routes/v3/multiChainPositions.js +69 -0
  290. package/dist/src/routes/v3/opportunity.js +63 -0
  291. package/dist/src/routes/v3/overview.js +73 -0
  292. package/dist/src/routes/v3/parse.js +23 -0
  293. package/dist/src/routes/v3/payload.js +40 -0
  294. package/dist/src/routes/v3/poolInfo.js +88 -0
  295. package/dist/src/routes/v3/positions.js +62 -0
  296. package/dist/src/routes/v3/radiant.js +26 -0
  297. package/dist/src/routes/v3/recipients.js +20 -0
  298. package/dist/src/routes/v3/rewards.js +33 -0
  299. package/dist/src/routes/v3/rewardsReport.js +51 -0
  300. package/dist/src/routes/v3/rootForTimestamp.js +47 -0
  301. package/dist/src/routes/v3/silo.js +20 -0
  302. package/dist/src/routes/v3/token.js +24 -0
  303. package/dist/src/routes/v3/tokenUnclaimed.js +24 -0
  304. package/dist/src/routes/v3/twt/participants.js +11 -0
  305. package/dist/src/routes/v3/updates.js +47 -0
  306. package/dist/src/routes/v3/userRewards.js +59 -0
  307. package/dist/src/types/index.js +6 -0
  308. package/dist/src/types/parameters/Action.js +11 -0
  309. package/dist/src/types/parameters/Chain.js +13 -0
  310. package/dist/src/types/parameters/ChainCampaignId.js +13 -0
  311. package/dist/src/types/parameters/MainParameter.js +19 -0
  312. package/dist/src/types/parameters/OpportunityId.js +14 -0
  313. package/dist/src/types/parameters/Timestamp.js +16 -0
  314. package/dist/src/types/parameters/Type.js +15 -0
  315. package/dist/src/types/parameters/index.js +17 -0
  316. package/dist/src/types/returnTypes.js +1 -0
  317. package/dist/src/types/utils.js +1 -0
  318. package/dist/src/utils/addString.js +6 -0
  319. package/dist/src/utils/bigintToString.js +20 -0
  320. package/dist/src/utils/crypto.js +4 -0
  321. package/dist/src/utils/decodeCalls.js +170 -0
  322. package/dist/src/utils/encodeCalls.js +240 -0
  323. package/dist/src/utils/error.js +90 -0
  324. package/dist/src/utils/execute.js +41 -0
  325. package/dist/src/utils/generateCardName.js +89 -0
  326. package/dist/src/utils/generic.js +117 -0
  327. package/dist/src/utils/hashArray.js +4 -0
  328. package/dist/src/utils/lastBlockBefore.js +78 -0
  329. package/dist/src/utils/logger.js +52 -0
  330. package/dist/src/utils/pricer.js +180 -0
  331. package/dist/src/utils/prices/chainlinkRead.js +8 -0
  332. package/dist/src/utils/prices/curveVirtualPrice.js +7 -0
  333. package/dist/src/utils/prices/getDQUICK.js +8 -0
  334. package/dist/src/utils/prices/priceFetcherFactory.js +29 -0
  335. package/dist/src/utils/prices/priceService.js +328 -0
  336. package/dist/src/utils/prices/services/coinGeckoService.js +53 -0
  337. package/dist/src/utils/prices/services/defillamaService.js +53 -0
  338. package/dist/src/utils/prices/services/dexScreenerService.js +62 -0
  339. package/dist/src/utils/prices/services/erc4626Service.js +30 -0
  340. package/dist/src/utils/prices/services/getERC4626.js +11 -0
  341. package/dist/src/utils/prices/services/indexCoopService.js +55 -0
  342. package/dist/src/utils/prices/services/priceFetcher.js +1 -0
  343. package/dist/src/utils/prices/uniV2Price.js +40 -0
  344. package/dist/src/utils/prisma.js +12 -0
  345. package/dist/src/utils/providers.js +30 -0
  346. package/dist/src/utils/queries/activeCampaigns.js +22 -0
  347. package/dist/src/utils/queries/allCampaigns.js +51 -0
  348. package/dist/src/utils/queries/campaignsForMainParameter.js +23 -0
  349. package/dist/src/utils/queries/claimsOverTime.js +111 -0
  350. package/dist/src/utils/queries/endingCampaigns.js +21 -0
  351. package/dist/src/utils/queries/futureCampaigns.js +19 -0
  352. package/dist/src/utils/queries/mainParameterCampaigns.js +11 -0
  353. package/dist/src/utils/queries/rewardsAmount.js +106 -0
  354. package/dist/src/utils/queries/unclaimed.js +81 -0
  355. package/dist/src/utils/rateLimit.js +13 -0
  356. package/dist/src/utils/stryke.js +4 -0
  357. package/dist/src/utils/throw.js +27 -0
  358. package/dist/src/utils/validation.js +20 -0
  359. package/dist/tsconfig.package.tsbuildinfo +1 -1
  360. package/package.json +2 -2
  361. package/dist/package.json +0 -91
@@ -0,0 +1,415 @@
1
+
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+
4
+ const {
5
+ Decimal,
6
+ objectEnumValues,
7
+ makeStrictEnum,
8
+ Public,
9
+ getRuntime,
10
+ skip
11
+ } = require('./runtime/index-browser.js')
12
+
13
+
14
+ const Prisma = {}
15
+
16
+ exports.Prisma = Prisma
17
+ exports.$Enums = {}
18
+
19
+ /**
20
+ * Prisma Client JS version: 6.0.1
21
+ * Query Engine version: 5dbef10bdbfb579e07d35cc85fb1518d357cb99e
22
+ */
23
+ Prisma.prismaVersion = {
24
+ client: "6.0.1",
25
+ engine: "5dbef10bdbfb579e07d35cc85fb1518d357cb99e"
26
+ }
27
+
28
+ Prisma.PrismaClientKnownRequestError = () => {
29
+ const runtimeName = getRuntime().prettyName;
30
+ throw new Error(`PrismaClientKnownRequestError is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
31
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
32
+ )};
33
+ Prisma.PrismaClientUnknownRequestError = () => {
34
+ const runtimeName = getRuntime().prettyName;
35
+ throw new Error(`PrismaClientUnknownRequestError is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
36
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
37
+ )}
38
+ Prisma.PrismaClientRustPanicError = () => {
39
+ const runtimeName = getRuntime().prettyName;
40
+ throw new Error(`PrismaClientRustPanicError is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
41
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
42
+ )}
43
+ Prisma.PrismaClientInitializationError = () => {
44
+ const runtimeName = getRuntime().prettyName;
45
+ throw new Error(`PrismaClientInitializationError is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
46
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
47
+ )}
48
+ Prisma.PrismaClientValidationError = () => {
49
+ const runtimeName = getRuntime().prettyName;
50
+ throw new Error(`PrismaClientValidationError is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
51
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
52
+ )}
53
+ Prisma.Decimal = Decimal
54
+
55
+ /**
56
+ * Re-export of sql-template-tag
57
+ */
58
+ Prisma.sql = () => {
59
+ const runtimeName = getRuntime().prettyName;
60
+ throw new Error(`sqltag is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
61
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
62
+ )}
63
+ Prisma.empty = () => {
64
+ const runtimeName = getRuntime().prettyName;
65
+ throw new Error(`empty is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
66
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
67
+ )}
68
+ Prisma.join = () => {
69
+ const runtimeName = getRuntime().prettyName;
70
+ throw new Error(`join is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
71
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
72
+ )}
73
+ Prisma.raw = () => {
74
+ const runtimeName = getRuntime().prettyName;
75
+ throw new Error(`raw is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
76
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
77
+ )}
78
+ Prisma.validator = Public.validator
79
+
80
+ /**
81
+ * Extensions
82
+ */
83
+ Prisma.getExtensionContext = () => {
84
+ const runtimeName = getRuntime().prettyName;
85
+ throw new Error(`Extensions.getExtensionContext is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
86
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
87
+ )}
88
+ Prisma.defineExtension = () => {
89
+ const runtimeName = getRuntime().prettyName;
90
+ throw new Error(`Extensions.defineExtension is unable to run in this browser environment, or has been bundled for the browser (running in ${runtimeName}).
91
+ In case this error is unexpected for you, please report it in https://pris.ly/prisma-prisma-bug-report`,
92
+ )}
93
+
94
+ /**
95
+ * Shorthand utilities for JSON filtering
96
+ */
97
+ Prisma.DbNull = objectEnumValues.instances.DbNull
98
+ Prisma.JsonNull = objectEnumValues.instances.JsonNull
99
+ Prisma.AnyNull = objectEnumValues.instances.AnyNull
100
+
101
+ Prisma.NullTypes = {
102
+ DbNull: objectEnumValues.classes.DbNull,
103
+ JsonNull: objectEnumValues.classes.JsonNull,
104
+ AnyNull: objectEnumValues.classes.AnyNull
105
+ }
106
+
107
+
108
+
109
+ /**
110
+ * Enums
111
+ */
112
+
113
+ exports.Prisma.TransactionIsolationLevel = makeStrictEnum({
114
+ ReadUncommitted: 'ReadUncommitted',
115
+ ReadCommitted: 'ReadCommitted',
116
+ RepeatableRead: 'RepeatableRead',
117
+ Serializable: 'Serializable'
118
+ });
119
+
120
+ exports.Prisma.TempLeavesScalarFieldEnum = {
121
+ chainId: 'chainId',
122
+ campaignId: 'campaignId',
123
+ recipient: 'recipient',
124
+ reason: 'reason',
125
+ rewardToken: 'rewardToken',
126
+ amount: 'amount',
127
+ auxiliaryData1: 'auxiliaryData1',
128
+ auxiliaryData2: 'auxiliaryData2',
129
+ lastProcessedTimestamp: 'lastProcessedTimestamp'
130
+ };
131
+
132
+ exports.Prisma.RelationLoadStrategy = {
133
+ query: 'query',
134
+ join: 'join'
135
+ };
136
+
137
+ exports.Prisma.LeavesScalarFieldEnum = {
138
+ chainId: 'chainId',
139
+ root: 'root',
140
+ campaignId: 'campaignId',
141
+ recipient: 'recipient',
142
+ reason: 'reason',
143
+ rewardToken: 'rewardToken',
144
+ amount: 'amount',
145
+ auxiliaryData1: 'auxiliaryData1',
146
+ auxiliaryData2: 'auxiliaryData2',
147
+ lastProcessedTimestamp: 'lastProcessedTimestamp'
148
+ };
149
+
150
+ exports.Prisma.ProofsScalarFieldEnum = {
151
+ chainId: 'chainId',
152
+ root: 'root',
153
+ recipient: 'recipient',
154
+ rewardToken: 'rewardToken',
155
+ proof: 'proof'
156
+ };
157
+
158
+ exports.Prisma.MerklRootsScalarFieldEnum = {
159
+ chainId: 'chainId',
160
+ epoch: 'epoch',
161
+ timestamp: 'timestamp',
162
+ root: 'root'
163
+ };
164
+
165
+ exports.Prisma.CampaignsScalarFieldEnum = {
166
+ chainId: 'chainId',
167
+ computeChainId: 'computeChainId',
168
+ index: 'index',
169
+ campaignId: 'campaignId',
170
+ creator: 'creator',
171
+ campaignType: 'campaignType',
172
+ campaignSubType: 'campaignSubType',
173
+ rewardToken: 'rewardToken',
174
+ amount: 'amount',
175
+ startTimestamp: 'startTimestamp',
176
+ endTimestamp: 'endTimestamp',
177
+ mainParameter: 'mainParameter',
178
+ campaignParameters: 'campaignParameters'
179
+ };
180
+
181
+ exports.Prisma.CampaignsToProcessScalarFieldEnum = {
182
+ chainId: 'chainId',
183
+ computeChainId: 'computeChainId',
184
+ index: 'index',
185
+ campaignId: 'campaignId',
186
+ creator: 'creator',
187
+ campaignType: 'campaignType',
188
+ campaignSubType: 'campaignSubType',
189
+ rewardToken: 'rewardToken',
190
+ amount: 'amount',
191
+ startTimestamp: 'startTimestamp',
192
+ endTimestamp: 'endTimestamp',
193
+ mainParameter: 'mainParameter',
194
+ campaignParameters: 'campaignParameters',
195
+ lastProcessedTimestamp: 'lastProcessedTimestamp',
196
+ processUntilTimestamp: 'processUntilTimestamp',
197
+ jobIndex: 'jobIndex'
198
+ };
199
+
200
+ exports.Prisma.ClaimsScalarFieldEnum = {
201
+ chainId: 'chainId',
202
+ recipient: 'recipient',
203
+ campaignId: 'campaignId',
204
+ rewardToken: 'rewardToken',
205
+ reason: 'reason',
206
+ root: 'root',
207
+ claimed: 'claimed',
208
+ timestamp: 'timestamp'
209
+ };
210
+
211
+ exports.Prisma.ClaimsOverTimeScalarFieldEnum = {
212
+ chainId: 'chainId',
213
+ recipient: 'recipient',
214
+ campaignId: 'campaignId',
215
+ rewardToken: 'rewardToken',
216
+ reason: 'reason',
217
+ root: 'root',
218
+ claimed: 'claimed',
219
+ timestamp: 'timestamp'
220
+ };
221
+
222
+ exports.Prisma.ALMsScalarFieldEnum = {
223
+ chainId: 'chainId',
224
+ campaignId: 'campaignId',
225
+ name: 'name',
226
+ type: 'type',
227
+ address: 'address',
228
+ target: 'target',
229
+ owner: 'owner',
230
+ underlyingPool: 'underlyingPool'
231
+ };
232
+
233
+ exports.Prisma.ERC20HoldersScalarFieldEnum = {
234
+ chainId: 'chainId',
235
+ token: 'token',
236
+ holders: 'holders',
237
+ blockNumber: 'blockNumber'
238
+ };
239
+
240
+ exports.Prisma.TokensScalarFieldEnum = {
241
+ chainId: 'chainId',
242
+ address: 'address',
243
+ symbol: 'symbol',
244
+ decimals: 'decimals'
245
+ };
246
+
247
+ exports.Prisma.StateSaveScalarFieldEnum = {
248
+ id: 'id',
249
+ blockNumber: 'blockNumber',
250
+ state: 'state'
251
+ };
252
+
253
+ exports.Prisma.CampaignCreatorsScalarFieldEnum = {
254
+ address: 'address',
255
+ tags: 'tags'
256
+ };
257
+
258
+ exports.Prisma.SortOrder = {
259
+ asc: 'asc',
260
+ desc: 'desc'
261
+ };
262
+
263
+ exports.Prisma.JsonNullValueInput = {
264
+ JsonNull: Prisma.JsonNull
265
+ };
266
+
267
+ exports.Prisma.QueryMode = {
268
+ default: 'default',
269
+ insensitive: 'insensitive'
270
+ };
271
+
272
+ exports.Prisma.TempLeavesOrderByRelevanceFieldEnum = {
273
+ campaignId: 'campaignId',
274
+ recipient: 'recipient',
275
+ reason: 'reason',
276
+ rewardToken: 'rewardToken',
277
+ amount: 'amount'
278
+ };
279
+
280
+ exports.Prisma.LeavesOrderByRelevanceFieldEnum = {
281
+ root: 'root',
282
+ campaignId: 'campaignId',
283
+ recipient: 'recipient',
284
+ reason: 'reason',
285
+ rewardToken: 'rewardToken',
286
+ amount: 'amount'
287
+ };
288
+
289
+ exports.Prisma.ProofsOrderByRelevanceFieldEnum = {
290
+ root: 'root',
291
+ recipient: 'recipient',
292
+ rewardToken: 'rewardToken',
293
+ proof: 'proof'
294
+ };
295
+
296
+ exports.Prisma.MerklRootsOrderByRelevanceFieldEnum = {
297
+ root: 'root'
298
+ };
299
+
300
+ exports.Prisma.JsonNullValueFilter = {
301
+ DbNull: Prisma.DbNull,
302
+ JsonNull: Prisma.JsonNull,
303
+ AnyNull: Prisma.AnyNull
304
+ };
305
+
306
+ exports.Prisma.CampaignsOrderByRelevanceFieldEnum = {
307
+ campaignId: 'campaignId',
308
+ creator: 'creator',
309
+ rewardToken: 'rewardToken',
310
+ amount: 'amount',
311
+ mainParameter: 'mainParameter'
312
+ };
313
+
314
+ exports.Prisma.CampaignsToProcessOrderByRelevanceFieldEnum = {
315
+ campaignId: 'campaignId',
316
+ creator: 'creator',
317
+ rewardToken: 'rewardToken',
318
+ amount: 'amount',
319
+ mainParameter: 'mainParameter'
320
+ };
321
+
322
+ exports.Prisma.ClaimsOrderByRelevanceFieldEnum = {
323
+ recipient: 'recipient',
324
+ campaignId: 'campaignId',
325
+ rewardToken: 'rewardToken',
326
+ reason: 'reason',
327
+ root: 'root',
328
+ claimed: 'claimed'
329
+ };
330
+
331
+ exports.Prisma.ClaimsOverTimeOrderByRelevanceFieldEnum = {
332
+ recipient: 'recipient',
333
+ campaignId: 'campaignId',
334
+ rewardToken: 'rewardToken',
335
+ reason: 'reason',
336
+ root: 'root',
337
+ claimed: 'claimed'
338
+ };
339
+
340
+ exports.Prisma.ALMsOrderByRelevanceFieldEnum = {
341
+ campaignId: 'campaignId',
342
+ name: 'name',
343
+ type: 'type',
344
+ address: 'address',
345
+ target: 'target',
346
+ owner: 'owner',
347
+ underlyingPool: 'underlyingPool'
348
+ };
349
+
350
+ exports.Prisma.ERC20HoldersOrderByRelevanceFieldEnum = {
351
+ token: 'token',
352
+ holders: 'holders'
353
+ };
354
+
355
+ exports.Prisma.TokensOrderByRelevanceFieldEnum = {
356
+ address: 'address',
357
+ symbol: 'symbol'
358
+ };
359
+
360
+ exports.Prisma.StateSaveOrderByRelevanceFieldEnum = {
361
+ id: 'id'
362
+ };
363
+
364
+ exports.Prisma.CampaignCreatorsOrderByRelevanceFieldEnum = {
365
+ address: 'address',
366
+ tags: 'tags'
367
+ };
368
+
369
+
370
+ exports.Prisma.ModelName = {
371
+ TempLeaves: 'TempLeaves',
372
+ Leaves: 'Leaves',
373
+ Proofs: 'Proofs',
374
+ MerklRoots: 'MerklRoots',
375
+ Campaigns: 'Campaigns',
376
+ CampaignsToProcess: 'CampaignsToProcess',
377
+ Claims: 'Claims',
378
+ ClaimsOverTime: 'ClaimsOverTime',
379
+ ALMs: 'ALMs',
380
+ ERC20Holders: 'ERC20Holders',
381
+ Tokens: 'Tokens',
382
+ StateSave: 'StateSave',
383
+ CampaignCreators: 'CampaignCreators'
384
+ };
385
+
386
+ /**
387
+ * This is a stub Prisma Client that will error at runtime if called.
388
+ */
389
+ class PrismaClient {
390
+ constructor() {
391
+ return new Proxy(this, {
392
+ get(target, prop) {
393
+ let message
394
+ const runtime = getRuntime()
395
+ if (runtime.isEdge) {
396
+ message = `PrismaClient is not configured to run in ${runtime.prettyName}. In order to run Prisma Client on edge runtime, either:
397
+ - Use Prisma Accelerate: https://pris.ly/d/accelerate
398
+ - Use Driver Adapters: https://pris.ly/d/driver-adapters
399
+ `;
400
+ } else {
401
+ message = 'PrismaClient is unable to run in this browser environment, or has been bundled for the browser (running in `' + runtime.prettyName + '`).'
402
+ }
403
+
404
+ message += `
405
+ If this is unexpected, please open an issue: https://pris.ly/prisma-prisma-bug-report`
406
+
407
+ throw new Error(message)
408
+ }
409
+ })
410
+ }
411
+ }
412
+
413
+ exports.PrismaClient = PrismaClient
414
+
415
+ Object.assign(exports, Prisma)
@@ -0,0 +1,44 @@
1
+ import { redisClient } from "../cache/redis";
2
+ import { log } from "../utils/logger";
3
+ import { engineDbClient } from "../utils/prisma";
4
+ import { swagger } from "@elysiajs/swagger";
5
+ import axios from "axios";
6
+ import { Elysia } from "elysia";
7
+ import { campaignsCacheUpdater } from "./jobs/campaignsCacheUpdater";
8
+ import { healthCheck } from "./jobs/health";
9
+ import { opportunityUpdater } from "./jobs/opportunityUpdater";
10
+ import { priceUpdater } from "./jobs/priceUpdater";
11
+ import { sync } from "./jobs/sync";
12
+ // Axios with bun workaround
13
+ axios.defaults.headers.common["Accept-Encoding"] = "gzip";
14
+ const PORT = process.env.PORT || 3000;
15
+ const app = new Elysia()
16
+ .use(swagger())
17
+ .get("/", () => "Merkl API")
18
+ .use(campaignsCacheUpdater) // /v3/update
19
+ .use(opportunityUpdater) // /v3/updateOpportunity
20
+ .use(priceUpdater) // /v3/updatePrices
21
+ .use(healthCheck) // /v3/health
22
+ .use(sync) // GET /jobs/api/sync-with-engine
23
+ .onError(ctx => {
24
+ console.error(ctx.error.message);
25
+ console.error(ctx.error.stack);
26
+ if (ctx.code === "NOT_FOUND")
27
+ return new Response(JSON.stringify({
28
+ path: ctx.path,
29
+ error: ctx.code,
30
+ message: "Path does not exist",
31
+ }), {
32
+ status: 404,
33
+ });
34
+ return (ctx.set.status = "Internal Server Error");
35
+ })
36
+ .listen(PORT, ({ hostname, port }) => {
37
+ log.info(`🔄 Background Jobs started (${hostname}:${port})`);
38
+ });
39
+ // ─── Signal Handling ─────────────────────────────────────────────────────────
40
+ process.on("SIGTERM", () => {
41
+ engineDbClient.$disconnect();
42
+ redisClient.disconnect();
43
+ process.exit();
44
+ });
@@ -0,0 +1,160 @@
1
+ import { Redis } from "../../cache";
2
+ import { campaignsToOldFormat } from "../../libs/deprecated-merklv3";
3
+ import { AprService, CampaignService, OpportunityService } from "../../modules/v4";
4
+ import { CacheService } from "../../modules/v4/cache";
5
+ import { TTLPresets } from "../../modules/v4/cache/cache.model";
6
+ import { OpportunityRepository } from "../../modules/v4/opportunity/opportunity.repository";
7
+ import { RewardService } from "../../modules/v4/reward";
8
+ import { TvlService } from "../../modules/v4/tvl";
9
+ import { engineDbClient } from "../../utils/prisma";
10
+ import { Campaign, ChainId, NETWORK_LABELS, isSupportedChain, } from "@sdk";
11
+ import { Elysia, t } from "elysia";
12
+ import moment from "moment";
13
+ import { campaignsDynamicData } from "../../libs/campaigns/campaignsDynamicData";
14
+ import { merklChainData } from "../../libs/merklChainData";
15
+ import { staticCampaignWithCache } from "../../libs/staticCampaigns";
16
+ import { InvalidParameter, UnsupportedNetwork } from "../../utils/error";
17
+ import { executeSimple } from "../../utils/execute";
18
+ import { log } from "../../utils/logger";
19
+ import { ALL_CAMPAIGNS_FOR_CHAIN_AFTER } from "../../utils/queries/allCampaigns";
20
+ const highCampaignsChains = [ChainId.ARBITRUM, ChainId.POLYGON, ChainId.BLAST, ChainId.BASE];
21
+ export const campaignsCacheUpdater = new Elysia().get("/v3/update", async ({ query, set }) => {
22
+ const rawChainId = query.chainId;
23
+ let chainId;
24
+ if (typeof rawChainId === "string") {
25
+ chainId = Number.parseInt(rawChainId);
26
+ if (!isSupportedChain(chainId, "merkl"))
27
+ throw new UnsupportedNetwork(chainId);
28
+ }
29
+ else {
30
+ throw new InvalidParameter("Invalid chainId provided");
31
+ }
32
+ let success = true;
33
+ try {
34
+ await Redis.safeSet(`MerklChainData_${chainId}`, await merklChainData(chainId));
35
+ }
36
+ catch (error) {
37
+ log.error(`❌ update merklChainData cache failed for ${NETWORK_LABELS[chainId]}`, error);
38
+ success = false;
39
+ }
40
+ log.local(`🔁 updating ${NETWORK_LABELS[chainId]} Campaigns cache`);
41
+ let campaignsAfter = moment().subtract(3, "months").unix();
42
+ if (highCampaignsChains.includes(chainId)) {
43
+ campaignsAfter = moment().subtract(1, "months").unix();
44
+ }
45
+ const TWO_WEEKS_AGO = moment().subtract(2, "weeks").unix();
46
+ try {
47
+ const dynamicData = {};
48
+ let staticData = (await engineDbClient.$queryRaw(ALL_CAMPAIGNS_FOR_CHAIN_AFTER(chainId, campaignsAfter)));
49
+ log.local(`Data length before filtering: ${staticData.length}`);
50
+ const mainParameters = {};
51
+ staticData = staticData.filter(campaign => {
52
+ if (campaign.endTimestamp < TWO_WEEKS_AGO && campaign.campaignType === Campaign.CLAMM) {
53
+ campaign.campaignParameters.forwarders = [];
54
+ }
55
+ mainParameters[campaign.mainParameter] = true;
56
+ return true;
57
+ });
58
+ log.local(`Data length after filtering: ${staticData.length}`);
59
+ if (!!staticData) {
60
+ // Build list of existing campaign types for this chain
61
+ const campaignTypes = !staticData
62
+ ? []
63
+ : staticData
64
+ .map(campaign => campaign.campaignType)
65
+ .reduce((prev, campaignType) => {
66
+ if (!prev.includes(campaignType))
67
+ prev.push(campaignType);
68
+ return prev;
69
+ }, []);
70
+ // Fetch dynamic data for all these types
71
+ const promisesPerType = campaignTypes.map(async (campaignType) => {
72
+ const campaigns = staticData.filter(campaign => campaign.campaignType === campaignType);
73
+ await executeSimple(chainId, campaignsDynamicData(chainId, campaigns, campaignType)).then(r => {
74
+ for (const d of r) {
75
+ if (!!d) {
76
+ // Main Parameter OVERRIDING
77
+ if (d.campaignType === Campaign.SILO && d.campaignParameters.whitelist?.length === 1) {
78
+ d.mainParameter = `${d.mainParameter}-${d.campaignParameters.whitelist[0]}`;
79
+ }
80
+ if (!dynamicData[`${d.campaignType}_${d.mainParameter}`])
81
+ dynamicData[`${d.campaignType}_${d.mainParameter}`] = {};
82
+ dynamicData[`${d.campaignType}_${d.mainParameter}`][d.campaignId] = d;
83
+ }
84
+ }
85
+ });
86
+ });
87
+ await Promise.all(promisesPerType);
88
+ }
89
+ if (!!dynamicData && Object.keys(dynamicData).length > 0) {
90
+ await Redis.safeSet(`Campaigns_${chainId}`, dynamicData);
91
+ // Set live or future campaigns
92
+ const liveDynamicData = {};
93
+ for (const [type_mainParameter, value] of Object.entries(dynamicData)) {
94
+ for (const [campaignId, data] of Object.entries(value)) {
95
+ if (data.endTimestamp > moment().unix()) {
96
+ if (!liveDynamicData[type_mainParameter]) {
97
+ liveDynamicData[type_mainParameter] = {};
98
+ }
99
+ liveDynamicData[type_mainParameter][campaignId] = data;
100
+ }
101
+ }
102
+ }
103
+ await Redis.safeSet(`LiveCampaigns_${chainId}`, liveDynamicData);
104
+ const merklChainData = await Redis.get("MerklChainData", chainId);
105
+ await Redis.safeSet(`CampaignsOldFormat_${chainId}`, campaignsToOldFormat(dynamicData, merklChainData));
106
+ await Redis.safeSet(`LiveCampaignsOldFormat_${chainId}`, campaignsToOldFormat(liveDynamicData, merklChainData));
107
+ log.info(`✅ ${NETWORK_LABELS[chainId]} caches updated successfully`);
108
+ for (const entry of Object.entries(liveDynamicData)) {
109
+ await CampaignService.fill(Object.values(entry[1]).map(({ campaignId, chainId }) => ({
110
+ campaignId,
111
+ distributionChain: chainId,
112
+ })));
113
+ const [type, mainParameter] = entry[0].split("_");
114
+ const apr = AprService.extractFromDynamicData(+type, Object.values(entry[1]));
115
+ const tvl = TvlService.extractFromDynamicData(+type, Object.values(entry[1]));
116
+ const dailyRewards = await RewardService.extractDailyRewardsRecordFromDynamicData(+type, Object.values(entry[1]));
117
+ const opportunityId = OpportunityService.hashId({
118
+ chainId,
119
+ identifier: mainParameter,
120
+ type: CampaignService.getTypeFromV3(+type),
121
+ });
122
+ await OpportunityRepository.updateRecords(opportunityId, apr, tvl, dailyRewards);
123
+ }
124
+ await OpportunityService.updateMetadata(chainId);
125
+ // ─── Refresh Cache For GET /opportunities ────
126
+ await CacheService.set(TTLPresets.MIN_5, OpportunityService.getMany, { items: 50, page: 0 });
127
+ log.info(`✅ ${NETWORK_LABELS[chainId]} DB records updated successfully`);
128
+ }
129
+ else {
130
+ if (chainId === ChainId.CORE || chainId === ChainId.THUNDERCORE) {
131
+ log.info(`⚠️ no campaigns found for ${NETWORK_LABELS[chainId]}, setting empty cache`);
132
+ for (const key of [
133
+ "Campaigns",
134
+ "LiveCampaigns",
135
+ "CampaignsOldFormat",
136
+ "LiveCampaignsOldFormat",
137
+ ]) {
138
+ await Redis.safeSet(`${key}_${chainId}`, {});
139
+ }
140
+ log.info(`✅ ${NETWORK_LABELS[chainId]} caches updated - empty cache`);
141
+ }
142
+ }
143
+ }
144
+ catch (error) {
145
+ log.error(`❌ update Campaigns cache failed for ${NETWORK_LABELS[chainId]}`, error);
146
+ success = false;
147
+ }
148
+ // This is independant of campaigns cache update, so not in the if condition
149
+ try {
150
+ await staticCampaignWithCache(chainId);
151
+ }
152
+ catch (error) {
153
+ log.error(`❌ update Campaigns cache failed for ${NETWORK_LABELS[chainId]}`, error);
154
+ }
155
+ return { success };
156
+ }, {
157
+ query: t.Object({
158
+ chainId: t.String(),
159
+ }),
160
+ });
@@ -0,0 +1,15 @@
1
+ import { Redis } from "../../cache";
2
+ import { t } from "elysia";
3
+ export const response = t.Object({ success: t.Boolean() });
4
+ export const healthCheck = (app) => {
5
+ return app.get("/v3/health", async () => {
6
+ // Check if the cache is working
7
+ await Redis.get("Prices");
8
+ return {
9
+ success: true,
10
+ };
11
+ }, {
12
+ query: t.Object({}),
13
+ tags: ["Onchain"],
14
+ });
15
+ };