@merkl/api 0.10.128 → 0.10.130

Sign up to get free protection for your applications and to get access to all the features.
Files changed (402) 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/node_modules/@elysiajs/eden/eden/LICENSE +7 -0
  25. package/dist/node_modules/@elysiajs/eden/eden/README.md +46 -0
  26. package/dist/node_modules/@elysiajs/eden/eden/bunfig.toml +2 -0
  27. package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-2IHGLN7W.mjs +1 -0
  28. package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-7WO4HTSU.mjs +1 -0
  29. package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-XYW4OUFN.mjs +1 -0
  30. package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-YAG46HFR.mjs +1 -0
  31. package/dist/node_modules/@elysiajs/eden/eden/dist/errors.d.ts +5 -0
  32. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch/index.d.ts +4 -0
  33. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch/types.d.ts +44 -0
  34. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.d.mts +48 -0
  35. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.d.ts +48 -0
  36. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.global.js +1 -0
  37. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.js +1 -0
  38. package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.mjs +1 -0
  39. package/dist/node_modules/@elysiajs/eden/eden/dist/index.d.mts +5 -0
  40. package/dist/node_modules/@elysiajs/eden/eden/dist/index.d.ts +5 -0
  41. package/dist/node_modules/@elysiajs/eden/eden/dist/index.global.js +1 -0
  42. package/dist/node_modules/@elysiajs/eden/eden/dist/index.js +1 -0
  43. package/dist/node_modules/@elysiajs/eden/eden/dist/index.mjs +1 -0
  44. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/index.d.ts +17 -0
  45. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/types.d.ts +99 -0
  46. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/utils.d.ts +1 -0
  47. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.d.mts +114 -0
  48. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.d.ts +114 -0
  49. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.global.js +1 -0
  50. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.js +1 -0
  51. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.mjs +1 -0
  52. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/index.d.ts +5 -0
  53. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/types.d.ts +86 -0
  54. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/ws.d.ts +14 -0
  55. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.d.mts +103 -0
  56. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.d.ts +103 -0
  57. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.global.js +1 -0
  58. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.js +1 -0
  59. package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.mjs +1 -0
  60. package/dist/node_modules/@elysiajs/eden/eden/dist/types-C41kuZ-K.d.mts +44 -0
  61. package/dist/node_modules/@elysiajs/eden/eden/dist/types-C41kuZ-K.d.ts +44 -0
  62. package/dist/node_modules/@elysiajs/eden/eden/dist/types.d.ts +39 -0
  63. package/dist/node_modules/@elysiajs/eden/eden/dist/utils/parsingUtils.d.ts +6 -0
  64. package/dist/node_modules/@elysiajs/eden/eden/package.json +85 -0
  65. package/dist/package.json +2 -2
  66. package/dist/src/backgroundJobs/index.js +44 -0
  67. package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +160 -0
  68. package/dist/src/backgroundJobs/jobs/health.js +15 -0
  69. package/dist/src/backgroundJobs/jobs/opportunityUpdater.js +63 -0
  70. package/dist/src/backgroundJobs/jobs/priceUpdater.js +16 -0
  71. package/dist/src/backgroundJobs/jobs/sync.js +33 -0
  72. package/dist/src/cache/declaration.js +146 -0
  73. package/dist/src/cache/index.js +152 -0
  74. package/dist/src/cache/redis.js +49 -0
  75. package/dist/src/constants.js +119 -0
  76. package/dist/src/entities/campaign.js +134 -0
  77. package/dist/src/entities/opportunity.js +549 -0
  78. package/dist/src/errors/BadRequest.error.js +7 -0
  79. package/dist/src/errors/Conflict.error.js +7 -0
  80. package/dist/src/errors/HttpError.js +11 -0
  81. package/dist/src/errors/NotFound.error.js +7 -0
  82. package/dist/src/errors/Opportunity.error.js +11 -0
  83. package/dist/src/errors/Unauthorized.error.js +7 -0
  84. package/dist/src/errors/index.js +5 -0
  85. package/dist/src/guards/BackOffice.guard.js +10 -0
  86. package/dist/src/guards/Engine.guard.js +10 -0
  87. package/dist/src/guards/TokenAuth.guard.js +10 -0
  88. package/dist/src/hooks/checkQueryAddressValidity.js +7 -0
  89. package/dist/src/hooks/checkQueryChainIdValidity.js +7 -0
  90. package/dist/src/index.js +79 -0
  91. package/dist/src/internal/controllers/endingCampaigns.js +41 -0
  92. package/dist/src/internal/controllers/unclaimed.js +36 -0
  93. package/dist/src/internal/index.js +30 -0
  94. package/dist/src/libs/campaigns/campaignTypes/AjnaDynamicData.js +111 -0
  95. package/dist/src/libs/campaigns/campaignTypes/BadgerDynamicData.js +93 -0
  96. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +942 -0
  97. package/dist/src/libs/campaigns/campaignTypes/CompoundDynamicData.js +90 -0
  98. package/dist/src/libs/campaigns/campaignTypes/DolomiteDynamicData.js +60 -0
  99. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +162 -0
  100. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +159 -0
  101. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/eulerVaultNames.js +13 -0
  102. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/factoryFinder.js +29 -0
  103. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/getBlacklistedSupply.js +22 -0
  104. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/metamorphoTvl.js +35 -0
  105. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/spliceTVL.js +21 -0
  106. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +106 -0
  107. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AaveProcessor.js +26 -0
  108. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AssetProcessor.js +47 -0
  109. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.js +103 -0
  110. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerGaugeProcessor.js +83 -0
  111. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerPoolProcessor.js +99 -0
  112. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BeefyProcessor.js +51 -0
  113. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/CompoundProcessor.js +36 -0
  114. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EnzymeProcessor.js +51 -0
  115. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerBorrowProcessor.js +46 -0
  116. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerLendProcessor.js +47 -0
  117. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FluidProcessor.js +36 -0
  118. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FraxProcessor.js +41 -0
  119. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GearboxProcessor.js +44 -0
  120. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GenericProcessor.js +239 -0
  121. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/MetamorphoProcessor.js +43 -0
  122. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.js +31 -0
  123. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RadiantProcessor.js +58 -0
  124. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RfxProcessor.js +64 -0
  125. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SpliceProcessor.js +35 -0
  126. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SturdySiloProcessor.js +37 -0
  127. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TemplateProcessor.js +40 -0
  128. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TorosProcessor.js +33 -0
  129. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/UniswapProcessor.js +48 -0
  130. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/WoofiProcessor.js +40 -0
  131. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/curveProcessor.js +68 -0
  132. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +77 -0
  133. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPrices.js +583 -0
  134. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPricesRefactoFinal.js +24 -0
  135. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.js +1209 -0
  136. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +194 -0
  137. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2.js +645 -0
  138. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2RefactoFinal.js +22 -0
  139. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3.js +392 -0
  140. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3RefactoFinal.js +22 -0
  141. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4.js +323 -0
  142. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4RefactoFinal.js +22 -0
  143. package/dist/src/libs/campaigns/campaignTypes/ERC20_SNAPSHOTDynamicData.js +38 -0
  144. package/dist/src/libs/campaigns/campaignTypes/EulerDynamicData.js +165 -0
  145. package/dist/src/libs/campaigns/campaignTypes/JSON_AIRDROPDynamicData.js +19 -0
  146. package/dist/src/libs/campaigns/campaignTypes/MORPHODynamicData.js +120 -0
  147. package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.js +112 -0
  148. package/dist/src/libs/campaigns/campaignTypes/SILODynamicData.js +113 -0
  149. package/dist/src/libs/campaigns/campaignsDynamicData.js +83 -0
  150. package/dist/src/libs/campaigns/campaignsDynamicDataRefacto.js +78 -0
  151. package/dist/src/libs/campaigns/getCampaigns.js +18 -0
  152. package/dist/src/libs/campaigns/utils/fetchA51Strategies.js +44 -0
  153. package/dist/src/libs/campaigns/utils/fetchClamInfo.js +27 -0
  154. package/dist/src/libs/campaigns/utils/fetchLogs.js +91 -0
  155. package/dist/src/libs/campaigns/utils/getCompV2ForksVaults.js +122 -0
  156. package/dist/src/libs/campaigns/utils/getContractCreationBlock.js +44 -0
  157. package/dist/src/libs/campaigns/utils/getDolomiteMarkets.js +50 -0
  158. package/dist/src/libs/campaigns/utils/getEulerV2Vaults.js +87 -0
  159. package/dist/src/libs/campaigns/utils/getLastEligibilityRatio.js +56 -0
  160. package/dist/src/libs/computeFee.js +34 -0
  161. package/dist/src/libs/custom/twtParticipants.js +54 -0
  162. package/dist/src/libs/deprecated-merklv3/index.js +184 -0
  163. package/dist/src/libs/getTokensList.js +37 -0
  164. package/dist/src/libs/merklChainData.js +129 -0
  165. package/dist/src/libs/parse/marketsWithCache.js +8 -0
  166. package/dist/src/libs/positions/ajna/index.js +107 -0
  167. package/dist/src/libs/positions/badger/index.js +79 -0
  168. package/dist/src/libs/positions/clamm/index.js +419 -0
  169. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.js +35 -0
  170. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.js +35 -0
  171. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.js +44 -0
  172. package/dist/src/libs/positions/clamm/thegraph/index.js +162 -0
  173. package/dist/src/libs/positions/compound/index.js +93 -0
  174. package/dist/src/libs/positions/dolomite/index.js +49 -0
  175. package/dist/src/libs/positions/erc20/index.js +55 -0
  176. package/dist/src/libs/positions/euler/index.js +57 -0
  177. package/dist/src/libs/positions/index.js +48 -0
  178. package/dist/src/libs/positions/morpho/index.js +177 -0
  179. package/dist/src/libs/positions/prepareFetch.js +339 -0
  180. package/dist/src/libs/positions/silo/index.js +67 -0
  181. package/dist/src/libs/positions/types.js +1 -0
  182. package/dist/src/libs/reports/campaignReport.js +37 -0
  183. package/dist/src/libs/reports/mainParameterRewards.js +48 -0
  184. package/dist/src/libs/rewards/userRewards.js +154 -0
  185. package/dist/src/libs/staticCampaigns.js +10 -0
  186. package/dist/src/libs/tokens/balances.js +126 -0
  187. package/dist/src/libs/tokens/tokenInfo.js +22 -0
  188. package/dist/src/modules/v4/accounting/accounting.controller.js +66 -0
  189. package/dist/src/modules/v4/accounting/accounting.model.js +32 -0
  190. package/dist/src/modules/v4/accounting/accounting.repository.js +100 -0
  191. package/dist/src/modules/v4/accounting/accounting.service.js +78 -0
  192. package/dist/src/modules/v4/accounting/index.js +3 -0
  193. package/dist/src/modules/v4/apr/apr.controller.js +1 -0
  194. package/dist/src/modules/v4/apr/apr.model.js +1 -0
  195. package/dist/src/modules/v4/apr/apr.repository.js +1 -0
  196. package/dist/src/modules/v4/apr/apr.service.js +40 -0
  197. package/dist/src/modules/v4/apr/index.js +2 -0
  198. package/dist/src/modules/v4/blacklist/blacklist.controller.js +45 -0
  199. package/dist/src/modules/v4/blacklist/blacklist.model.js +13 -0
  200. package/dist/src/modules/v4/blacklist/blacklist.repository.js +56 -0
  201. package/dist/src/modules/v4/blacklist/blacklist.service.js +24 -0
  202. package/dist/src/modules/v4/blacklist/index.js +3 -0
  203. package/dist/src/modules/v4/cache/cache.model.js +14 -0
  204. package/dist/src/modules/v4/cache/cache.repository.js +10 -0
  205. package/dist/src/modules/v4/cache/cache.service.js +44 -0
  206. package/dist/src/modules/v4/cache/index.js +1 -0
  207. package/dist/src/modules/v4/campaign/campaign.controller.js +56 -0
  208. package/dist/src/modules/v4/campaign/campaign.model.js +54 -0
  209. package/dist/src/modules/v4/campaign/campaign.repository.js +346 -0
  210. package/dist/src/modules/v4/campaign/campaign.service.js +203 -0
  211. package/dist/src/modules/v4/campaign/index.js +3 -0
  212. package/dist/src/modules/v4/chain/chain.controller.js +40 -0
  213. package/dist/src/modules/v4/chain/chain.model.js +17 -0
  214. package/dist/src/modules/v4/chain/chain.repository.js +64 -0
  215. package/dist/src/modules/v4/chain/chain.service.js +42 -0
  216. package/dist/src/modules/v4/chain/index.js +3 -0
  217. package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +19 -0
  218. package/dist/src/modules/v4/dynamicData/dynamicData.model.js +6 -0
  219. package/dist/src/modules/v4/dynamicData/dynamicData.repository.js +1 -0
  220. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +49 -0
  221. package/dist/src/modules/v4/dynamicData/index.js +3 -0
  222. package/dist/src/modules/v4/enso/enso.model.js +108 -0
  223. package/dist/src/modules/v4/enso/enso.service.js +46 -0
  224. package/dist/src/modules/v4/explorer/explorer.model.js +2 -0
  225. package/dist/src/modules/v4/explorer/explorer.repository.js +23 -0
  226. package/dist/src/modules/v4/explorer/explorer.service.js +24 -0
  227. package/dist/src/modules/v4/explorer/index.js +1 -0
  228. package/dist/src/modules/v4/index.js +4 -0
  229. package/dist/src/modules/v4/merklRoot/index.js +3 -0
  230. package/dist/src/modules/v4/merklRoot/merklRoot.controller.js +19 -0
  231. package/dist/src/modules/v4/merklRoot/merklRoot.model.js +6 -0
  232. package/dist/src/modules/v4/merklRoot/merklRoot.repository.js +31 -0
  233. package/dist/src/modules/v4/merklRoot/merklRoot.service.js +38 -0
  234. package/dist/src/modules/v4/opportunity/index.js +3 -0
  235. package/dist/src/modules/v4/opportunity/opportunity.controller.js +69 -0
  236. package/dist/src/modules/v4/opportunity/opportunity.model.js +36 -0
  237. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +14 -0
  238. package/dist/src/modules/v4/opportunity/opportunity.repository.js +217 -0
  239. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +0 -15
  240. package/dist/src/modules/v4/opportunity/opportunity.service.js +180 -0
  241. package/dist/src/modules/v4/opportunity/subservices/getAjnaMetadata.service.js +50 -0
  242. package/dist/src/modules/v4/opportunity/subservices/getBadgerMetadata.service.js +23 -0
  243. package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +33 -0
  244. package/dist/src/modules/v4/opportunity/subservices/getCompoundMetadata.service.js +18 -0
  245. package/dist/src/modules/v4/opportunity/subservices/getDolomiteMetadata.service.js +15 -0
  246. package/dist/src/modules/v4/opportunity/subservices/getErc20Metadata.service.js +63 -0
  247. package/dist/src/modules/v4/opportunity/subservices/getErc20SnapshotMetadata.service.js +8 -0
  248. package/dist/src/modules/v4/opportunity/subservices/getEulerMetadata.service.js +30 -0
  249. package/dist/src/modules/v4/opportunity/subservices/getJsonAirDropMetadata.service.js +36 -0
  250. package/dist/src/modules/v4/opportunity/subservices/getMorphoMetadata.service.js +19 -0
  251. package/dist/src/modules/v4/opportunity/subservices/getRadiantMetadata.service.js +9 -0
  252. package/dist/src/modules/v4/opportunity/subservices/getSiloMetadata.service.js +13 -0
  253. package/dist/src/modules/v4/opportunity/transform-id.pipe.js +6 -0
  254. package/dist/src/modules/v4/opportunity/validate-id.pipe.js +12 -0
  255. package/dist/src/modules/v4/participate/participate.controller.js +66 -0
  256. package/dist/src/modules/v4/participate/participate.model.js +24 -0
  257. package/dist/src/modules/v4/participate/participate.service.js +33 -0
  258. package/dist/src/modules/v4/price/index.js +3 -0
  259. package/dist/src/modules/v4/price/price.controller.js +62 -0
  260. package/dist/src/modules/v4/price/price.model.js +12 -0
  261. package/dist/src/modules/v4/price/price.repository.js +18 -0
  262. package/dist/src/modules/v4/price/price.service.js +44 -0
  263. package/dist/src/modules/v4/prisma/index.js +1 -0
  264. package/dist/src/modules/v4/protocol/index.js +3 -0
  265. package/dist/src/modules/v4/protocol/protocol.controller.js +23 -0
  266. package/dist/src/modules/v4/protocol/protocol.model.js +68 -0
  267. package/dist/src/modules/v4/protocol/protocol.repository.js +37 -0
  268. package/dist/src/modules/v4/protocol/protocol.service.js +77 -0
  269. package/dist/src/modules/v4/reward/index.js +3 -0
  270. package/dist/src/modules/v4/reward/reward.controller.js +52 -0
  271. package/dist/src/modules/v4/reward/reward.model.js +104 -0
  272. package/dist/src/modules/v4/reward/reward.repository.js +237 -0
  273. package/dist/src/modules/v4/reward/reward.service.js +283 -0
  274. package/dist/src/modules/v4/reward/rewardConvertor.service.js +136 -0
  275. package/dist/src/modules/v4/router.js +57 -0
  276. package/dist/src/modules/v4/status/index.js +3 -0
  277. package/dist/src/modules/v4/status/status.controller.js +48 -0
  278. package/dist/src/modules/v4/status/status.model.js +24 -0
  279. package/dist/src/modules/v4/status/status.repository.js +88 -0
  280. package/dist/src/modules/v4/status/status.service.js +60 -0
  281. package/dist/src/modules/v4/token/index.js +3 -0
  282. package/dist/src/modules/v4/token/token.controller.js +32 -0
  283. package/dist/src/modules/v4/token/token.model.js +23 -0
  284. package/dist/src/modules/v4/token/token.repository.js +128 -0
  285. package/dist/src/modules/v4/token/token.service.js +268 -0
  286. package/dist/src/modules/v4/tvl/index.js +2 -0
  287. package/dist/src/modules/v4/tvl/tvl.controller.js +1 -0
  288. package/dist/src/modules/v4/tvl/tvl.model.js +1 -0
  289. package/dist/src/modules/v4/tvl/tvl.repository.js +1 -0
  290. package/dist/src/modules/v4/tvl/tvl.service.js +49 -0
  291. package/dist/src/modules/v4/uniswapV4/index.js +4 -0
  292. package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.js +11 -0
  293. package/dist/src/modules/v4/uniswapV4/uniswapV4.model.js +17 -0
  294. package/dist/src/modules/v4/uniswapV4/uniswapV4.repository.js +2 -0
  295. package/dist/src/modules/v4/uniswapV4/uniswapV4.service.js +73 -0
  296. package/dist/src/modules/v4/user/index.js +3 -0
  297. package/dist/src/modules/v4/user/user.controller.js +69 -0
  298. package/dist/src/modules/v4/user/user.model.js +18 -0
  299. package/dist/src/modules/v4/user/user.repository.js +38 -0
  300. package/dist/src/modules/v4/user/user.service.js +50 -0
  301. package/dist/src/plugins/error-handling.plugin.js +28 -0
  302. package/dist/src/plugins/logger.plugin.js +22 -0
  303. package/dist/src/routes/v1/allowances.js +115 -0
  304. package/dist/src/routes/v1/balances.js +25 -0
  305. package/dist/src/routes/v1/prices.js +11 -0
  306. package/dist/src/routes/v1/tokens.js +17 -0
  307. package/dist/src/routes/v2/merkl.js +13 -0
  308. package/dist/src/routes/v3/ERC20Campaigns.js +63 -0
  309. package/dist/src/routes/v3/app.js +18 -0
  310. package/dist/src/routes/v3/blacklist.js +18 -0
  311. package/dist/src/routes/v3/campaign/delay.js +78 -0
  312. package/dist/src/routes/v3/campaignClaims.js +24 -0
  313. package/dist/src/routes/v3/campaignReport.js +22 -0
  314. package/dist/src/routes/v3/campaignUnclaimed.js +28 -0
  315. package/dist/src/routes/v3/campaigns.js +101 -0
  316. package/dist/src/routes/v3/campaignsForMainParameter.js +19 -0
  317. package/dist/src/routes/v3/campaignsInfo.js +54 -0
  318. package/dist/src/routes/v3/campaignsRewardsReport.js +47 -0
  319. package/dist/src/routes/v3/claims.js +45 -0
  320. package/dist/src/routes/v3/compoundV2.js +9 -0
  321. package/dist/src/routes/v3/createCampaign.js +66 -0
  322. package/dist/src/routes/v3/dolomite.js +9 -0
  323. package/dist/src/routes/v3/euler.js +9 -0
  324. package/dist/src/routes/v3/exports/campaigns.js +28 -0
  325. package/dist/src/routes/v3/fetch.js +27 -0
  326. package/dist/src/routes/v3/health.js +13 -0
  327. package/dist/src/routes/v3/lostyield.js +98 -0
  328. package/dist/src/routes/v3/merkl.js +119 -0
  329. package/dist/src/routes/v3/morphoMarkets.js +27 -0
  330. package/dist/src/routes/v3/morphoVaults.js +22 -0
  331. package/dist/src/routes/v3/multiChainPositions.js +69 -0
  332. package/dist/src/routes/v3/opportunity.js +63 -0
  333. package/dist/src/routes/v3/overview.js +73 -0
  334. package/dist/src/routes/v3/parse.js +23 -0
  335. package/dist/src/routes/v3/payload.js +40 -0
  336. package/dist/src/routes/v3/poolInfo.js +88 -0
  337. package/dist/src/routes/v3/positions.js +62 -0
  338. package/dist/src/routes/v3/radiant.js +26 -0
  339. package/dist/src/routes/v3/recipients.js +20 -0
  340. package/dist/src/routes/v3/rewards.js +33 -0
  341. package/dist/src/routes/v3/rewardsReport.js +51 -0
  342. package/dist/src/routes/v3/rootForTimestamp.js +47 -0
  343. package/dist/src/routes/v3/silo.js +20 -0
  344. package/dist/src/routes/v3/token.js +24 -0
  345. package/dist/src/routes/v3/tokenUnclaimed.js +24 -0
  346. package/dist/src/routes/v3/twt/participants.js +11 -0
  347. package/dist/src/routes/v3/updates.js +47 -0
  348. package/dist/src/routes/v3/userRewards.js +59 -0
  349. package/dist/src/types/index.js +6 -0
  350. package/dist/src/types/parameters/Action.js +11 -0
  351. package/dist/src/types/parameters/Chain.js +13 -0
  352. package/dist/src/types/parameters/ChainCampaignId.js +13 -0
  353. package/dist/src/types/parameters/MainParameter.js +19 -0
  354. package/dist/src/types/parameters/OpportunityId.js +14 -0
  355. package/dist/src/types/parameters/Timestamp.js +16 -0
  356. package/dist/src/types/parameters/Type.js +15 -0
  357. package/dist/src/types/parameters/index.js +17 -0
  358. package/dist/src/types/returnTypes.js +1 -0
  359. package/dist/src/types/utils.js +1 -0
  360. package/dist/src/utils/addString.js +6 -0
  361. package/dist/src/utils/bigintToString.js +20 -0
  362. package/dist/src/utils/crypto.js +4 -0
  363. package/dist/src/utils/decodeCalls.js +170 -0
  364. package/dist/src/utils/encodeCalls.js +240 -0
  365. package/dist/src/utils/error.js +90 -0
  366. package/dist/src/utils/execute.js +41 -0
  367. package/dist/src/utils/generateCardName.js +89 -0
  368. package/dist/src/utils/generic.js +117 -0
  369. package/dist/src/utils/hashArray.js +4 -0
  370. package/dist/src/utils/lastBlockBefore.js +78 -0
  371. package/dist/src/utils/logger.js +52 -0
  372. package/dist/src/utils/pricer.js +180 -0
  373. package/dist/src/utils/prices/chainlinkRead.js +8 -0
  374. package/dist/src/utils/prices/curveVirtualPrice.js +7 -0
  375. package/dist/src/utils/prices/getDQUICK.js +8 -0
  376. package/dist/src/utils/prices/priceFetcherFactory.js +29 -0
  377. package/dist/src/utils/prices/priceService.js +328 -0
  378. package/dist/src/utils/prices/services/coinGeckoService.js +53 -0
  379. package/dist/src/utils/prices/services/defillamaService.js +53 -0
  380. package/dist/src/utils/prices/services/dexScreenerService.js +62 -0
  381. package/dist/src/utils/prices/services/erc4626Service.js +30 -0
  382. package/dist/src/utils/prices/services/getERC4626.js +11 -0
  383. package/dist/src/utils/prices/services/indexCoopService.js +55 -0
  384. package/dist/src/utils/prices/services/priceFetcher.js +1 -0
  385. package/dist/src/utils/prices/uniV2Price.js +40 -0
  386. package/dist/src/utils/prisma.js +12 -0
  387. package/dist/src/utils/providers.js +30 -0
  388. package/dist/src/utils/queries/activeCampaigns.js +22 -0
  389. package/dist/src/utils/queries/allCampaigns.js +51 -0
  390. package/dist/src/utils/queries/campaignsForMainParameter.js +23 -0
  391. package/dist/src/utils/queries/claimsOverTime.js +111 -0
  392. package/dist/src/utils/queries/endingCampaigns.js +21 -0
  393. package/dist/src/utils/queries/futureCampaigns.js +19 -0
  394. package/dist/src/utils/queries/mainParameterCampaigns.js +11 -0
  395. package/dist/src/utils/queries/rewardsAmount.js +106 -0
  396. package/dist/src/utils/queries/unclaimed.js +81 -0
  397. package/dist/src/utils/rateLimit.js +13 -0
  398. package/dist/src/utils/stryke.js +4 -0
  399. package/dist/src/utils/throw.js +27 -0
  400. package/dist/src/utils/validation.js +20 -0
  401. package/dist/tsconfig.package.tsbuildinfo +1 -1
  402. package/package.json +2 -2
@@ -0,0 +1,44 @@
1
+ import bigintToString from "../../../utils/bigintToString";
2
+ import { CacheRepository } from "./cache.repository";
3
+ export class CacheService {
4
+ static encoder = new TextEncoder();
5
+ static decoder = new TextDecoder();
6
+ static #hashKey(fn, args) {
7
+ const prototype = [Bun.hash(fn.toString()).toString()];
8
+ return Bun.hash(JSON.stringify(prototype.concat(args?.map(a => JSON.stringify(a))))).toString();
9
+ }
10
+ static #compress(result) {
11
+ const encoded = CacheService.encoder.encode(JSON.stringify(result));
12
+ return Buffer.from(Bun.gzipSync(encoded)).toString("base64");
13
+ }
14
+ static #uncompress(compressedData) {
15
+ const encoded = Buffer.from(compressedData, "base64");
16
+ const uncompressed = Bun.gunzipSync(encoded);
17
+ const decoded = CacheService.decoder.decode(uncompressed);
18
+ return JSON.parse(decoded);
19
+ }
20
+ static async wrap(ttl, fn, ...args) {
21
+ const key = CacheService.#hashKey(fn, args);
22
+ const cached = await CacheRepository.get(key);
23
+ if (cached !== null)
24
+ return CacheService.#uncompress(cached);
25
+ const result = await fn(...args);
26
+ const compressed = CacheService.#compress(bigintToString(result));
27
+ await CacheRepository.set(ttl, key, compressed);
28
+ return result;
29
+ }
30
+ static async set(ttl, fn, ...args) {
31
+ const key = CacheService.#hashKey(fn, args);
32
+ const result = await fn(...args);
33
+ const compressed = CacheService.#compress(bigintToString(result));
34
+ await CacheRepository.set(ttl, key, compressed);
35
+ return result;
36
+ }
37
+ static async get(fn, args) {
38
+ const key = CacheService.#hashKey(fn, args);
39
+ const cached = await CacheRepository.get(key);
40
+ if (cached === null)
41
+ return null;
42
+ return CacheService.#uncompress(cached);
43
+ }
44
+ }
@@ -0,0 +1 @@
1
+ export * from "./cache.service";
@@ -0,0 +1,56 @@
1
+ import { AuthorizationHeadersDto, EngineGuard } from "../../../guards/Engine.guard";
2
+ import Elysia from "elysia";
3
+ import { throwOnUnsupportedChainId } from "src/utils/throw";
4
+ import { ChainDto } from "../status";
5
+ import { CreateCampaignDto, GetCampaignQueryDto } from "./campaign.model";
6
+ import { CampaignService } from "./campaign.service";
7
+ // ─── Campaigns Controller ────────────────────────────────────────────────────
8
+ export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { tags: ["Campaigns"] } })
9
+ // ─── Create A Campaign ───────────────────────────────────────────────
10
+ .post("/", async ({ body }) => {
11
+ return await CampaignService.create(body);
12
+ }, {
13
+ beforeHandle: EngineGuard,
14
+ headers: AuthorizationHeadersDto,
15
+ body: CreateCampaignDto,
16
+ })
17
+ // ─── Get Many Campaigns ──────────────────────────────────────────────
18
+ .get("/", async ({ query }) => {
19
+ return await CampaignService.findMany(query);
20
+ }, { query: GetCampaignQueryDto })
21
+ // ─── Get Total Campaigns Count ───────────────────────────────────────
22
+ .get("/count", async ({ query }) => {
23
+ return await CampaignService.countMany(query);
24
+ }, { query: GetCampaignQueryDto })
25
+ .group("/campaignsToProcess", app => {
26
+ return (app
27
+ // ─── Get the List of CampaignsToProcess ─────────────────────────────-
28
+ .get("/", async ({ query }) => {
29
+ return await CampaignService.findCampaignsToProcess(query.chainId);
30
+ }, {
31
+ query: ChainDto,
32
+ beforeHandle: ({ query }) => {
33
+ throwOnUnsupportedChainId(query.chainId);
34
+ },
35
+ })
36
+ // ─── Get Count of CampaignsToProcess ─────────────────────────────────
37
+ .get("/count", async ({ query }) => {
38
+ return (await CampaignService.findCampaignsToProcess(query.chainId)).length;
39
+ }, {
40
+ query: ChainDto,
41
+ beforeHandle: ({ query }) => {
42
+ throwOnUnsupportedChainId(query.chainId);
43
+ },
44
+ })
45
+ // ─── Returns a CampaignId to Process and flags it as PROCESSING ──────-
46
+ .post("/", async ({ query }) => {
47
+ return await CampaignService.pickCampaignToProcess(query.chainId);
48
+ }, {
49
+ query: ChainDto,
50
+ beforeHandle: async ({ query, headers }) => {
51
+ await EngineGuard({ headers });
52
+ throwOnUnsupportedChainId(query.chainId);
53
+ },
54
+ headers: AuthorizationHeadersDto,
55
+ }));
56
+ });
@@ -0,0 +1,54 @@
1
+ import { CampaignType } from "../../../../database/api/.generated";
2
+ import { Campaign as CampaignTypeEnum } from "@sdk";
3
+ import { t } from "elysia";
4
+ // ─── Utils ───────────────────────────────────────────────────────────────────
5
+ export const campaignTypeToEnumMap = {
6
+ INVALID: CampaignTypeEnum.INVALID,
7
+ CLAMM: CampaignTypeEnum.CLAMM,
8
+ ERC20: CampaignTypeEnum.ERC20,
9
+ BADGER: CampaignTypeEnum.BADGER,
10
+ AJNA: CampaignTypeEnum.AJNA,
11
+ COMPOUND: CampaignTypeEnum.COMPOUND,
12
+ EULER: CampaignTypeEnum.EULER,
13
+ DOLOMITE: CampaignTypeEnum.DOLOMITE,
14
+ ERC20_SNAPSHOT: CampaignTypeEnum.ERC20_SNAPSHOT,
15
+ MORPHO: CampaignTypeEnum.MORPHO,
16
+ RADIANT: CampaignTypeEnum.RADIANT,
17
+ SILO: CampaignTypeEnum.SILO,
18
+ JSON_AIRDROP: CampaignTypeEnum.JSON_AIRDROP,
19
+ UNISWAP_V4: CampaignTypeEnum.UNISWAP_V4,
20
+ };
21
+ // ─── DTOs ────────────────────────────────────────────────────────────────────
22
+ export const CampaignUniqueDto = t.Object({
23
+ distributionChain: t.Numeric(),
24
+ campaignId: t.String(),
25
+ });
26
+ export const CreateCampaignDto = t.Object({
27
+ computeChainId: t.Number(),
28
+ chainId: t.Number(),
29
+ campaignId: t.String(),
30
+ identifier: t.Optional(t.String()),
31
+ creator: t.String(),
32
+ type: t.Number(),
33
+ subType: t.Optional(t.Number()),
34
+ rewardTokenAddress: t.String(),
35
+ amount: t.String(),
36
+ opportunityIdentifier: t.String(),
37
+ startTimestamp: t.String(),
38
+ endTimestamp: t.String(),
39
+ params: t.String(),
40
+ });
41
+ export const GetCampaignQueryDto = t.Object({
42
+ page: t.Optional(t.Numeric()),
43
+ items: t.Optional(t.Numeric()),
44
+ chainId: t.Optional(t.Numeric()),
45
+ type: t.Optional(t.Enum(CampaignType)),
46
+ subType: t.Optional(t.Number()),
47
+ campaignId: t.Optional(t.String()),
48
+ mainParameter: t.Optional(t.String()),
49
+ tokenSymbol: t.Optional(t.String()),
50
+ tokenAddress: t.Optional(t.String()),
51
+ opportunityId: t.Optional(t.String()),
52
+ startTimestamp: t.Optional(t.String({ pattern: "[0-9].*" })),
53
+ endTimestamp: t.Optional(t.String({ pattern: "[0-9].*" })),
54
+ });
@@ -0,0 +1,346 @@
1
+ import { CampaignService } from "./";
2
+ import { log } from "../../../utils/logger";
3
+ import { apiDbClient, engineDbClient } from "../../../utils/prisma";
4
+ import { ALL_CAMPAIGNS_FOR_CHAIN_AFTER } from "../../../utils/queries/allCampaigns";
5
+ import { RunStatus, Status } from "../../../../database/api/.generated";
6
+ import { MAX_COMPUTE_JOB_TIME, WEEK } from "@sdk";
7
+ import moment from "moment";
8
+ import { OpportunityService } from "../opportunity";
9
+ import { TokenService } from "../token";
10
+ export class CampaignRepository {
11
+ // ─── Private Methods ─────────────────────────────────────────────────
12
+ static #transformQueryToPrismaFilters(query) {
13
+ const { chainId, endTimestamp, opportunityId, mainParameter, campaignId, startTimestamp, subType, type, tokenAddress, tokenSymbol, } = query;
14
+ return {
15
+ where: {
16
+ computeChainId: chainId,
17
+ endTimestamp: endTimestamp ? { gte: +endTimestamp } : undefined,
18
+ opportunityId,
19
+ campaignId,
20
+ Opportunity: {
21
+ identifier: mainParameter,
22
+ },
23
+ startTimestamp: startTimestamp ? { gte: +startTimestamp } : undefined,
24
+ subType,
25
+ type,
26
+ RewardToken: {
27
+ address: tokenAddress ? tokenAddress : undefined,
28
+ symbol: tokenSymbol ? tokenSymbol : undefined,
29
+ },
30
+ },
31
+ };
32
+ }
33
+ // ─── Public Methods ──────────────────────────────────────────────────
34
+ static async upsert(campaign, metadata) {
35
+ const campaignType = CampaignService.getTypeFromV3(campaign.type);
36
+ try {
37
+ let tokens = await TokenService.getManyOrCreate(metadata.tokens);
38
+ const [rewardToken] = await TokenService.getManyOrCreate([
39
+ { chainId: campaign.chainId, address: campaign.rewardTokenAddress },
40
+ ]);
41
+ if (!rewardToken) {
42
+ throw new Error(`unable to fetch data for token ${campaign.rewardTokenAddress}`);
43
+ }
44
+ tokens = tokens.filter(t => t !== undefined);
45
+ const opportunityId = OpportunityService.hashId({
46
+ chainId: campaign.computeChainId,
47
+ identifier: campaign.opportunityIdentifier,
48
+ type: campaignType,
49
+ });
50
+ const opportunityTokens = tokens.map(t => {
51
+ return {
52
+ chainId_address: { chainId: t.chainId, address: t.address }, //TODO: use id
53
+ };
54
+ });
55
+ const data = {
56
+ id: campaign.id,
57
+ amount: campaign.amount,
58
+ campaignId: campaign.campaignId,
59
+ endTimestamp: BigInt(campaign.endTimestamp),
60
+ params: JSON.parse(campaign.params),
61
+ startTimestamp: BigInt(campaign.startTimestamp),
62
+ type: campaignType,
63
+ ComputeChain: {
64
+ connect: {
65
+ id: campaign.computeChainId,
66
+ },
67
+ },
68
+ Creator: {
69
+ connectOrCreate: {
70
+ where: { address: campaign.creator },
71
+ create: {
72
+ address: campaign.creator,
73
+ },
74
+ },
75
+ },
76
+ Opportunity: {
77
+ connectOrCreate: {
78
+ where: { id: opportunityId },
79
+ create: {
80
+ id: opportunityId,
81
+ Chain: { connect: { id: campaign.chainId } },
82
+ type: campaignType,
83
+ identifier: campaign.opportunityIdentifier, // mainParameter
84
+ name: metadata.name,
85
+ status: +campaign.startTimestamp >= new Date().getTime() * 1000
86
+ ? Status.LIVE
87
+ : +campaign.endTimestamp < new Date().getTime() * 1000
88
+ ? Status.PAST
89
+ : Status.SOON,
90
+ action: metadata.action,
91
+ Tokens: { connect: opportunityTokens },
92
+ MainProtocol: {
93
+ connect: metadata.mainProtocol && { id: metadata.mainProtocol },
94
+ },
95
+ },
96
+ },
97
+ },
98
+ RewardToken: {
99
+ connectOrCreate: { where: { id: rewardToken?.id }, create: rewardToken },
100
+ },
101
+ subType: campaign.subType,
102
+ DistributionChain: { connect: { id: campaign.chainId } },
103
+ };
104
+ return await apiDbClient.campaign.upsert({
105
+ where: {
106
+ id: campaign.id,
107
+ },
108
+ create: data,
109
+ update: data,
110
+ });
111
+ }
112
+ catch (err) {
113
+ log.error(`Failed to upsert campaign ${campaign.campaignId}`, err);
114
+ }
115
+ }
116
+ static async upsertMany(campaigns, campaignToOpp) {
117
+ const data = [];
118
+ for (const campaign of campaigns) {
119
+ const campaignType = CampaignService.getTypeFromV3(campaign.type);
120
+ let tokens = await TokenService.getManyOrCreate(campaignToOpp[campaign.id].tokens);
121
+ const [rewardToken] = await TokenService.getManyOrCreate([
122
+ { chainId: campaign.chainId, address: campaign.rewardTokenAddress },
123
+ ]);
124
+ tokens = tokens.filter(t => t !== undefined);
125
+ const opportunityId = OpportunityService.hashId({
126
+ chainId: campaign.computeChainId,
127
+ identifier: campaign.opportunityIdentifier,
128
+ type: campaignType,
129
+ });
130
+ const opportunityTokens = tokens.map(t => {
131
+ return { id: t?.id };
132
+ });
133
+ data.push({
134
+ id: campaign.id,
135
+ amount: campaign.amount,
136
+ campaignId: campaign.campaignId,
137
+ endTimestamp: BigInt(campaign.endTimestamp),
138
+ params: JSON.parse(campaign.params),
139
+ startTimestamp: BigInt(campaign.startTimestamp),
140
+ type: campaignType,
141
+ ComputeChain: {
142
+ connect: {
143
+ id: campaign.computeChainId,
144
+ },
145
+ },
146
+ Creator: {
147
+ connectOrCreate: {
148
+ where: { address: campaign.creator },
149
+ create: { address: campaign.creator },
150
+ },
151
+ },
152
+ Opportunity: {
153
+ connectOrCreate: {
154
+ where: { id: opportunityId },
155
+ create: {
156
+ id: opportunityId,
157
+ Chain: {
158
+ connect: {
159
+ id: campaign.computeChainId,
160
+ },
161
+ },
162
+ type: campaignType,
163
+ identifier: campaign.opportunityIdentifier, // mainParameter
164
+ name: campaignToOpp[campaign.id].name,
165
+ status: +campaign.startTimestamp >= new Date().getTime() * 1000
166
+ ? Status.LIVE
167
+ : +campaign.endTimestamp < new Date().getTime() * 1000
168
+ ? Status.PAST
169
+ : Status.SOON,
170
+ action: campaignToOpp[campaign.id].action,
171
+ Tokens: { connect: opportunityTokens },
172
+ MainProtocol: {
173
+ connect: campaignToOpp[campaign.id].mainProtocol && {
174
+ id: campaignToOpp[campaign.id].mainProtocol,
175
+ },
176
+ },
177
+ },
178
+ },
179
+ },
180
+ RewardToken: {
181
+ connect: rewardToken ? { id: TokenService.hashId(rewardToken) } : undefined,
182
+ },
183
+ subType: campaign.subType,
184
+ DistributionChain: { connect: { id: campaign.chainId } },
185
+ });
186
+ }
187
+ const failedCampaigns = [];
188
+ const successCampaigns = [];
189
+ for (const campaign of data) {
190
+ try {
191
+ await apiDbClient.campaign.upsert({
192
+ where: {
193
+ // TODO: use id
194
+ id: CampaignService.hashId({
195
+ campaignId: campaign.campaignId,
196
+ distributionChain: campaign.DistributionChain.connect?.id,
197
+ }),
198
+ },
199
+ create: campaign,
200
+ update: campaign,
201
+ });
202
+ successCampaigns.push(campaign);
203
+ }
204
+ catch (err) {
205
+ log.error(`Failed to upsert campaign ${campaign.campaignId}`, err);
206
+ failedCampaigns.push(campaign);
207
+ }
208
+ }
209
+ return { success: successCampaigns.length, fail: failedCampaigns.length };
210
+ }
211
+ /**
212
+ * Fetches the campaign static data for a v3 campaign in database
213
+ * @param chainId
214
+ * @param timestamp from which campaigns endTimestamp are filtered
215
+ * @returns
216
+ */
217
+ static async getFromEngineDb(chainId, timestamp) {
218
+ //TODO use a typesafe fetching methode (this one is from campaignUpdater)
219
+ return (await engineDbClient.$queryRaw(ALL_CAMPAIGNS_FOR_CHAIN_AFTER(chainId, timestamp)));
220
+ }
221
+ static async getFromEngineDbWithId(campaignIds) {
222
+ return await engineDbClient.campaigns.findMany({
223
+ where: {
224
+ OR: campaignIds.map(campaign => {
225
+ return {
226
+ chainId: campaign.distributionChain,
227
+ campaignId: campaign.campaignId,
228
+ };
229
+ }),
230
+ },
231
+ });
232
+ }
233
+ static async checkIfExist(campaign) {
234
+ return !!(await apiDbClient.campaign.findFirst({
235
+ select: {
236
+ id: true,
237
+ },
238
+ where: {
239
+ id: CampaignService.hashId(campaign),
240
+ },
241
+ }));
242
+ }
243
+ static async findUnique(campaign) {
244
+ return await apiDbClient.campaign.findUnique({
245
+ where: {
246
+ id: CampaignService.hashId(campaign),
247
+ },
248
+ });
249
+ }
250
+ static async findUniqueOrThrow(campaign) {
251
+ return await apiDbClient.campaign.findUniqueOrThrow({
252
+ where: {
253
+ id: CampaignService.hashId(campaign),
254
+ },
255
+ });
256
+ }
257
+ static async findCampaignsToProcess(distributionChainId) {
258
+ const currentTime = moment().startOf("minute").unix(); // Round to the minute for concurrency mismatchs
259
+ return await apiDbClient.campaign.findMany({
260
+ where: {
261
+ distributionChainId,
262
+ startTimestamp: { lte: currentTime }, // The campaign has started
263
+ endTimestamp: { gte: currentTime - WEEK }, // The campaign ended less than a week ago
264
+ params: {
265
+ path: ["shouldIgnore"], // There is no "shouldIgnore" flag in the api database
266
+ not: "true",
267
+ },
268
+ CampaignStatus: {
269
+ some: {
270
+ // The campaign is not currently processing or has been processing for too long
271
+ OR: [
272
+ {
273
+ status: {
274
+ not: RunStatus.PROCESSING,
275
+ },
276
+ },
277
+ {
278
+ status: RunStatus.PROCESSING,
279
+ processingStarted: {
280
+ lt: currentTime - MAX_COMPUTE_JOB_TIME,
281
+ },
282
+ },
283
+ ],
284
+ },
285
+ },
286
+ },
287
+ select: {
288
+ campaignId: true,
289
+ endTimestamp: true,
290
+ CampaignStatus: {
291
+ // To be able to filter out campaigns that are already fully computed
292
+ take: 1,
293
+ select: {
294
+ computedUntil: true,
295
+ },
296
+ },
297
+ },
298
+ orderBy: {
299
+ amount: "desc",
300
+ },
301
+ });
302
+ }
303
+ // ─── Search Many Campaigns ───────────────────────────────────────────
304
+ static async findMany(query) {
305
+ const { page: _page, items: _items, ...filters } = query;
306
+ const page = _page ? _page : 0;
307
+ const items = _items ? _items : 20;
308
+ const args = CampaignRepository.#transformQueryToPrismaFilters(query);
309
+ return await apiDbClient.campaign.findMany({
310
+ take: items,
311
+ skip: page * items,
312
+ include: {
313
+ DistributionChain: true,
314
+ ComputeChain: true,
315
+ RewardToken: true,
316
+ },
317
+ orderBy: {
318
+ endTimestamp: "desc",
319
+ },
320
+ ...args,
321
+ });
322
+ }
323
+ static async countMany(query) {
324
+ const args = CampaignRepository.#transformQueryToPrismaFilters(query);
325
+ return await apiDbClient.campaign.count(args);
326
+ }
327
+ static async findManyCampaignId(chainId) {
328
+ return await apiDbClient.campaign.findMany({
329
+ select: {
330
+ campaignId: true,
331
+ },
332
+ where: {
333
+ distributionChainId: chainId,
334
+ },
335
+ });
336
+ }
337
+ static async findChains() {
338
+ const campaigns = await apiDbClient.campaign.findMany({
339
+ select: { distributionChainId: true, id: true },
340
+ });
341
+ return campaigns.reduce((acc, campaign) => {
342
+ acc[campaign.id] = campaign.distributionChainId;
343
+ return acc;
344
+ }, {});
345
+ }
346
+ }