@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,203 @@
1
+ import { HttpError } from "../../../errors";
2
+ import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
3
+ import { campaignTypeToEnumMap, } from "./";
4
+ import { CampaignRepository } from "./campaign.repository";
5
+ import { OpportunityService } from "../opportunity";
6
+ import { executeSimple } from "../../../utils/execute";
7
+ import { log } from "../../../utils/logger";
8
+ import { NETWORK_LABELS } from "@sdk";
9
+ import moment from "moment";
10
+ import { StatusService } from "../status";
11
+ export class CampaignService {
12
+ static hashId(campaign) {
13
+ return Bun.hash(`${campaign.distributionChain}${campaign.campaignId}`).toString();
14
+ }
15
+ static async create(campaign) {
16
+ const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
17
+ const opportunityMetadata = await OpportunityService.getMetadata({
18
+ id,
19
+ ...campaign,
20
+ });
21
+ return await CampaignRepository.upsert({ id, ...campaign }, opportunityMetadata);
22
+ }
23
+ static async createMany(campaigns) {
24
+ const campaignToOppMetadata = {};
25
+ const failedToFetchMetadata = [];
26
+ const campaignsToInsert = [];
27
+ await Promise.all(campaigns.map(async (campaign) => {
28
+ const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
29
+ campaign.computeChainId = campaign.computeChainId === 0 ? campaign.chainId : campaign.computeChainId;
30
+ try {
31
+ const oppMetadata = await OpportunityService.getMetadata({
32
+ id,
33
+ ...campaign,
34
+ });
35
+ campaignToOppMetadata[id] = oppMetadata;
36
+ campaignsToInsert.push({ id, ...campaign });
37
+ }
38
+ catch (err) {
39
+ log.error(`Cannot get Opportunity metadata for campaign ${campaign.campaignId} of type ${CampaignService.getTypeFromV3(campaign.type)}`, err);
40
+ failedToFetchMetadata.push(campaign);
41
+ }
42
+ }));
43
+ let { success, fail } = await CampaignRepository.upsertMany(campaignsToInsert, campaignToOppMetadata);
44
+ fail += failedToFetchMetadata.length;
45
+ return { success, fail };
46
+ }
47
+ /**
48
+ * Get the list of campaigns satisfying the query
49
+ * @param query
50
+ * @returns A list of campaigns
51
+ */
52
+ static async findMany(query) {
53
+ if (query.subType && !query.type) {
54
+ throw new HttpError("Bad Request: Cannot specify a subType without a type", 400);
55
+ }
56
+ const campaigns = await CampaignRepository.findMany(query);
57
+ return campaigns.map(CampaignService.format);
58
+ }
59
+ /**
60
+ * Counts the number of campaigns that complies to query
61
+ * @description used for pagination purposes
62
+ * @param query
63
+ * @returns the number of campaigns
64
+ */
65
+ static async countMany(query) {
66
+ if (query.subType && !query.type) {
67
+ throw new HttpError("Bad Request: Cannot specify a subType without a type", 400);
68
+ }
69
+ return await CampaignRepository.countMany(query);
70
+ }
71
+ static async checkIfExist(campaign) {
72
+ return await CampaignRepository.checkIfExist(campaign);
73
+ }
74
+ static async findUnique(campaign) {
75
+ return await CampaignRepository.findUnique(campaign);
76
+ }
77
+ static async findUniqueOrThrow(campaign) {
78
+ return await CampaignRepository.findUniqueOrThrow(campaign);
79
+ }
80
+ static async findCampaignsToProcess(distributionChainId) {
81
+ return (await CampaignRepository.findCampaignsToProcess(distributionChainId)).filter(campaign => campaign.endTimestamp > campaign.CampaignStatus[0].computedUntil);
82
+ }
83
+ static async pickCampaignToProcess(chainId) {
84
+ const campaigns = await CampaignService.findCampaignsToProcess(chainId);
85
+ for (const campaign of campaigns) {
86
+ try {
87
+ await StatusService.update({
88
+ distributionChain: chainId,
89
+ campaignId: campaign.campaignId,
90
+ status: { value: "PROCESSING" },
91
+ });
92
+ return campaign.campaignId;
93
+ }
94
+ catch { }
95
+ }
96
+ throw new Error(`No campaign to process found on ${NETWORK_LABELS[chainId]}`);
97
+ }
98
+ static async fill(campaigns) {
99
+ const campaignsFromEngine = await CampaignRepository.getFromEngineDbWithId(campaigns);
100
+ for (const campaign of campaigns) {
101
+ if (campaignsFromEngine.findIndex(c => c.campaignId === campaign.campaignId) === -1) {
102
+ log.warn(`Campaign ${campaign.campaignId} on ${NETWORK_LABELS[campaign.distributionChain]} not found in engine db`);
103
+ }
104
+ }
105
+ return await CampaignService.createMany(campaignsFromEngine.map(campaign => {
106
+ return {
107
+ amount: campaign.amount,
108
+ chainId: campaign.chainId,
109
+ computeChainId: campaign.computeChainId,
110
+ creator: campaign.creator,
111
+ endTimestamp: campaign.endTimestamp.toString(),
112
+ campaignId: campaign.campaignId,
113
+ opportunityIdentifier: campaign.mainParameter,
114
+ params: JSON.stringify(campaign.campaignParameters),
115
+ rewardTokenAddress: campaign.rewardToken,
116
+ startTimestamp: campaign.startTimestamp.toString(),
117
+ type: campaign.campaignType,
118
+ subType: campaign.campaignSubType,
119
+ };
120
+ }));
121
+ }
122
+ static async fetchMissingCampaigns(chainId, campaignIds) {
123
+ const foundCampaignIds = (await CampaignRepository.findManyCampaignId(chainId)).reduce((acc, { campaignId }) => acc.add(CampaignService.hashId({ distributionChain: chainId, campaignId })), new Set());
124
+ const missingCampaigns = campaignIds.filter(campaignId => !foundCampaignIds.has(CampaignService.hashId(campaignId)));
125
+ if (!missingCampaigns.length)
126
+ return { success: 0, fail: 0 };
127
+ return await CampaignService.fill(missingCampaigns);
128
+ }
129
+ static async findChains() {
130
+ return await CampaignRepository.findChains();
131
+ }
132
+ /**
133
+ * Returns the campaign data
134
+ * @param type index of Campaign enum from sdk
135
+ * @returns CampaignType as db-related enum for v4
136
+ */
137
+ static getTypeFromV3(type) {
138
+ return Object.entries(campaignTypeToEnumMap).find(([_, v3]) => v3 === type)?.[0];
139
+ }
140
+ /**
141
+ * Split a campaigns array into three array for each status
142
+ * @param campaigns
143
+ * @param timestamp to compare to campaigns timestamps
144
+ * @returns a status => campaigns map
145
+ */
146
+ static splitOnStatus(campaigns, timestamp = moment().unix()) {
147
+ const past = campaigns.filter(({ endTimestamp: end }) => end <= timestamp);
148
+ const live = campaigns.filter(({ startTimestamp: start, endTimestamp: end }) => start <= timestamp && end > timestamp);
149
+ const soon = campaigns.filter(({ startTimestamp: start }) => start > timestamp);
150
+ return { past, live, soon };
151
+ }
152
+ /**
153
+ * Returns the campaign data
154
+ * @param chainId to fetch campaigns for
155
+ * @param timestamp from which campaigns endTimestamp are filtered
156
+ * @returns
157
+ */
158
+ static async getFromEngineDb(chainId, timestamp) {
159
+ return CampaignRepository.getFromEngineDb(chainId, timestamp);
160
+ }
161
+ /**
162
+ * Convert raw
163
+ * @param query
164
+ * @returns A list of opportunities
165
+ * TODO: remove this function in favor of prisma client extensions
166
+ */
167
+ static format(campaign) {
168
+ if (campaign === null)
169
+ return null;
170
+ const { DistributionChain, ComputeChain, RewardToken, params, ...c } = campaign;
171
+ return {
172
+ ...c,
173
+ params: params,
174
+ chain: ComputeChain,
175
+ rewardToken: RewardToken,
176
+ distributionChain: DistributionChain === null ? undefined : DistributionChain,
177
+ };
178
+ }
179
+ /**
180
+ * Fetches the campaign dynamic data for a v3 campaign onchain
181
+ * @param chainId
182
+ * @param campaignType
183
+ * @param campaigns of v3 type
184
+ * @returns
185
+ */
186
+ static async fetchDynamicData(chainId, campaignType, campaigns) {
187
+ const calls = campaignsDynamicData(chainId, campaigns, campaignTypeToEnumMap[campaignType]);
188
+ return await executeSimple(chainId, calls);
189
+ }
190
+ /**
191
+ * Shortcut to get daily amount from total
192
+ * @param start timestamp
193
+ * @param end timestamp
194
+ * @param amount
195
+ * @returns daily token amount
196
+ */
197
+ static getDailyAmount(start, end, amount) {
198
+ const timespan = Math.abs(Number(end - start));
199
+ const dayspan = Math.max(1, Math.floor(timespan / (60 * 60 * 24)));
200
+ const dailyAmount = BigInt(amount) / BigInt(dayspan);
201
+ return dailyAmount;
202
+ }
203
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./campaign.model";
2
+ export * from "./campaign.service";
3
+ export * from "./campaign.controller";
@@ -0,0 +1,40 @@
1
+ import { AuthorizationHeadersDto } from "../../../guards/BackOffice.guard";
2
+ import { TokenAuthGuard } from "../../../guards/TokenAuth.guard";
3
+ import Elysia from "elysia";
4
+ import { ExplorerService } from "../explorer";
5
+ import { ChainUniqueDto, CreateChainExplorerDto, GetChainQueryDto } from "./chain.model";
6
+ import { ChainService } from "./chain.service";
7
+ // ─── Chains Controller ───────────────────────────────────────────────────────
8
+ export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: ["Chains"] } })
9
+ // ─── Get A Chain By Id ───────────────────────────────────────────────
10
+ .get("/:chainId", async ({ params: { chainId } }) => {
11
+ const chain = await ChainService.get(chainId);
12
+ if (!chain)
13
+ return null;
14
+ const { Explorer, ...rest } = chain;
15
+ return { explorers: chain.Explorer, ...rest };
16
+ }, {
17
+ params: ChainUniqueDto,
18
+ })
19
+ // ─── Get All Supported Chains ────────────────────────────────────────
20
+ .get("/", async ({ query }) => {
21
+ const chains = await ChainService.getMany(query);
22
+ return chains.map(({ Explorer, ...chain }) => ({ explorers: Explorer, ...chain }));
23
+ }, {
24
+ query: GetChainQueryDto,
25
+ })
26
+ .get("/count", async ({ query }) => {
27
+ return await ChainService.countMany(query);
28
+ }, {
29
+ query: GetChainQueryDto,
30
+ })
31
+ // ─── Get All Supported Chains ────────────────────────────────────────
32
+ .group("/explorers", app => {
33
+ return app.post("", async ({ body: { chainId, type, url } }) => {
34
+ return await ExplorerService.create(chainId, type, url);
35
+ }, {
36
+ beforeHandle: TokenAuthGuard,
37
+ headers: AuthorizationHeadersDto,
38
+ body: CreateChainExplorerDto,
39
+ });
40
+ });
@@ -0,0 +1,17 @@
1
+ import { ExplorerType } from "../../../../database/api/.generated";
2
+ import { t } from "elysia";
3
+ // ─── DTOs ────────────────────────────────────────────────────────────────────
4
+ export const GetChainQueryDto = t.Object({
5
+ search: t.Optional(t.String()),
6
+ });
7
+ export const ChainUniqueDto = t.Object({
8
+ chainId: t.Numeric(),
9
+ });
10
+ export const ChainArrayDto = t.Object({
11
+ chainId: t.Union([t.Numeric(), t.Array(t.Numeric())]),
12
+ });
13
+ export const CreateChainExplorerDto = t.Object({
14
+ type: t.Enum(ExplorerType),
15
+ chainId: t.Number(),
16
+ url: t.String(),
17
+ });
@@ -0,0 +1,64 @@
1
+ import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
2
+ import { executeSimple } from "../../../utils/execute";
3
+ import { apiDbClient } from "../../../utils/prisma";
4
+ export class ChainRepository {
5
+ /**
6
+ * @param id ChainId
7
+ * @returns
8
+ */
9
+ static async read(id) {
10
+ //TODO: tweak query to not have 5
11
+ return apiDbClient.chain.findUnique({ where: { id }, include: { Explorer: { take: 5 } } });
12
+ }
13
+ static #transformQueryToPrismaFilters(query) {
14
+ return {
15
+ where: { name: { contains: query.search, mode: "insensitive" } },
16
+ };
17
+ }
18
+ /** Returns many chains based on query
19
+ * @param query object with fields to search for
20
+ * @returns
21
+ */
22
+ static async readMany(query) {
23
+ const args = ChainRepository.#transformQueryToPrismaFilters(query);
24
+ return apiDbClient.chain.findMany({
25
+ include: { Explorer: { take: 5 } },
26
+ ...args,
27
+ });
28
+ }
29
+ static async countMany(query) {
30
+ const args = ChainRepository.#transformQueryToPrismaFilters(query);
31
+ return apiDbClient.chain.count({
32
+ ...args,
33
+ });
34
+ }
35
+ /** Returns all chainIds in the database
36
+ */
37
+ static async readIds() {
38
+ return apiDbClient.chain.findMany({
39
+ select: { id: true },
40
+ });
41
+ }
42
+ /**
43
+ * Creates a new chain
44
+ * @param template for chain creation
45
+ * @returns
46
+ */
47
+ static async create(template) {
48
+ return apiDbClient.chain.create(template);
49
+ }
50
+ static async findMany() {
51
+ return apiDbClient.chain.findMany();
52
+ }
53
+ /**
54
+ * Fetches the campaign dynamic data for a v3 campaign onchain
55
+ * @param chainId
56
+ * @param campaignType
57
+ * @param campaigns of v3 type
58
+ * @returns
59
+ */
60
+ static async fetchDynamicDataV3(chainId, campaignType, campaigns) {
61
+ const calls = campaignsDynamicData(chainId, campaigns, campaignType);
62
+ return executeSimple(chainId, calls);
63
+ }
64
+ }
@@ -0,0 +1,42 @@
1
+ import { DistributorService } from "@sdk";
2
+ import { CacheService } from "../cache";
3
+ import { TTLPresets } from "../cache/cache.model";
4
+ import { ChainRepository } from "./chain.repository";
5
+ export class ChainService {
6
+ static async get(chainId) {
7
+ return ChainRepository.read(chainId);
8
+ }
9
+ //TODO: determine find vs get nomenclature and cache handling
10
+ static async findMany() {
11
+ return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany);
12
+ }
13
+ static async getMany(query) {
14
+ return ChainRepository.readMany(query);
15
+ }
16
+ static async countMany(query) {
17
+ return ChainRepository.countMany(query);
18
+ }
19
+ /** List all chainIds available in the databse
20
+ * @warning some chains may not be fully integrated yet
21
+ * @returns an array of chainId
22
+ */
23
+ static async getIds() {
24
+ const ids = await ChainRepository.readIds();
25
+ return ids.map(({ id }) => id);
26
+ }
27
+ /** List all chainIds which have a distribituor (i.e. which is fully integrated)
28
+ * @returns an array of chainId
29
+ */
30
+ static async getSupportedIds() {
31
+ const ids = await ChainService.getIds();
32
+ const supportedIds = [];
33
+ for (const chainId of ids) {
34
+ try {
35
+ DistributorService(chainId);
36
+ supportedIds.push(chainId);
37
+ }
38
+ catch { }
39
+ }
40
+ return supportedIds;
41
+ }
42
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./chain.controller";
2
+ export * from "./chain.service";
3
+ export * from "./chain.model";
@@ -0,0 +1,19 @@
1
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
+ import Elysia from "elysia";
3
+ import { throwOnUnsupportedChainId } from "src/utils/throw";
4
+ import { DynamicDataSourceIdentifier } from "./dynamicData.model";
5
+ import { DynamicDataService } from "./dynamicData.service";
6
+ // ─── DynamicDatas Controller ───────────────────────────────────────────────────────
7
+ export const DynamicDataController = new Elysia({ prefix: "/dynamicData", detail: { tags: ["DynamicData"] } })
8
+ // ─── Get All DynamicDatas ──────────────────────────────────────────────────
9
+ // ─── Get type Info By Token Address ───────────────────────────────────────
10
+ .get("/chainId/:chainId/token/:tokenAddress", async ({ params }) => {
11
+ return await DynamicDataService.queryERC20DynamicData(params.chainId, params.tokenAddress);
12
+ }, {
13
+ params: DynamicDataSourceIdentifier,
14
+ headers: AuthorizationHeadersDto,
15
+ beforeHandle: ({ params, headers }) => {
16
+ BackOfficeGuard({ headers });
17
+ throwOnUnsupportedChainId(params.chainId);
18
+ },
19
+ });
@@ -0,0 +1,6 @@
1
+ import { t } from "elysia";
2
+ // ─── DTOs ────────────────────────────────────────────────────────────────────
3
+ export const DynamicDataSourceIdentifier = t.Object({
4
+ chainId: t.Numeric(),
5
+ tokenAddress: t.String(),
6
+ });
@@ -0,0 +1,49 @@
1
+ import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
2
+ import { executeSimple } from "../../../utils/execute";
3
+ import { log } from "../../../utils/logger";
4
+ import { Campaign, NETWORK_LABELS } from "@sdk";
5
+ export class DynamicDataService {
6
+ // ─── DynamicDatas ──────────────────────────────────────────────────────────
7
+ /** Fetches a single price */
8
+ static async queryERC20DynamicData(chainId, tokenAddress) {
9
+ const campaigns = [
10
+ {
11
+ campaignId: tokenAddress,
12
+ amount: "1000000000000000000", // 1 EXR in wei
13
+ campaignSubType: 0,
14
+ chainId: chainId,
15
+ computeChainId: 1,
16
+ creator: "0xexamplecreatoraddress",
17
+ endTimestamp: 1672531199, // Example end timestamp
18
+ index: 0,
19
+ mainParameter: "0xexamplemainparameter",
20
+ rewardToken: "0xexamplerewardtokenaddress",
21
+ startTimestamp: 1672444800, // Example start timestamp
22
+ lastEligibilityRatio: 1,
23
+ campaignParameters: {
24
+ blacklist: [],
25
+ decimalsRewardToken: 18,
26
+ decimalsTargetToken: 18,
27
+ duration: 30,
28
+ forwarders: [],
29
+ hooks: [],
30
+ shouldIgnore: false,
31
+ symbolRewardToken: "EXR",
32
+ symbolTargetToken: "EXT",
33
+ targetToken: tokenAddress,
34
+ whitelist: [],
35
+ },
36
+ campaignType: Campaign.ERC20,
37
+ },
38
+ ];
39
+ log.info(`querying mock campaign on chain: ${NETWORK_LABELS[chainId]}`);
40
+ const result = await executeSimple(Number(chainId), campaignsDynamicData(Number(chainId), campaigns, Campaign.ERC20));
41
+ return {
42
+ priceTargetToken: result[0]?.typeInfo.priceTargetToken,
43
+ totalSupply: result[0]?.typeInfo.totalSupply,
44
+ blacklistedSupply: result[0]?.typeInfo.blacklistedSupply,
45
+ cardName: result[0]?.typeInfo.cardName,
46
+ tvl: result[0]?.typeInfo.tvl,
47
+ };
48
+ }
49
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./dynamicData.controller";
2
+ export * from "./dynamicData.service";
3
+ export * from "./dynamicData.model";
@@ -0,0 +1,108 @@
1
+ import { t } from "elysia";
2
+ export const slugToProtocolId = {
3
+ "uniswap-v2": "uniswap-v2",
4
+ "aave-v2": "aave",
5
+ "camelot-v2": "camelot",
6
+ };
7
+ export const apiTypes = {
8
+ "/v1/protocols": {
9
+ query: t.Object({
10
+ slug: t.String({ example: "uniswap-v2" }),
11
+ }),
12
+ response: t.Array(t.Object({
13
+ slug: t.String({ example: "uniswap-v2" }),
14
+ name: t.String({ example: "Uniswap V2" }),
15
+ desription: t.String(),
16
+ url: t.String(),
17
+ logosUri: t.String(),
18
+ chains: t.Array(t.Object({ id: t.Number(), name: t.String() })),
19
+ })),
20
+ },
21
+ "/v1/tokens": {
22
+ query: t.Object({
23
+ protocolSlug: t.Optional(t.String({ example: "uniswap-v2" })),
24
+ primaryAddress: t.Optional(t.String({ description: "Ethereum address for contract interaction of defi token" })),
25
+ address: t.Optional(t.String({ description: "Ethereum address of the token" })),
26
+ chainId: t.Number(),
27
+ type: t.Optional(t.Enum({ defi: "defi", base: "base" })),
28
+ page: t.Number(),
29
+ inludeMetadatra: t.Optional(t.Boolean()),
30
+ }),
31
+ response: t.Object({
32
+ data: t.Array(t.Object({
33
+ chainId: t.Number(),
34
+ address: t.String(),
35
+ type: t.Enum({ defi: "defi", base: "base" }),
36
+ primaryAddress: t.String({ description: "Ethereum address for contract interaction of defi token" }),
37
+ underlyingTokens: t.Array(t.Object({
38
+ address: t.String(),
39
+ chainId: t.Number(),
40
+ type: t.Enum({ defi: "defi", base: "base" }),
41
+ })),
42
+ apy: t.Number(),
43
+ })),
44
+ meta: t.Object({
45
+ total: t.Number(),
46
+ lastPage: t.Number(),
47
+ currentPage: t.Number(),
48
+ perPage: t.Number(),
49
+ prev: t.Union([t.Null(), t.Number()]),
50
+ next: t.Union([t.Null(), t.Number()]),
51
+ }),
52
+ }),
53
+ },
54
+ "/v1/shortcuts/quote": {
55
+ query: t.Object({
56
+ chainId: t.Optional(t.Numeric()),
57
+ fromAddress: t.Optional(t.String()),
58
+ routingStrategy: t.Enum({ ensowallet: "ensowallet", delegate: "delegate", router: "router" }),
59
+ feeReceiver: t.Optional(t.String()),
60
+ tokenIn: t.Array(t.String()),
61
+ tokenOut: t.Array(t.String()),
62
+ amountIn: t.Array(t.String()),
63
+ fee: t.Optional(t.Array(t.String())),
64
+ disableRFQs: t.Optional(t.Boolean()),
65
+ ignoreAggregators: t.Optional(t.Array(t.String())),
66
+ ignoreStandards: t.Optional(t.Array(t.String())),
67
+ }),
68
+ response: t.Object({
69
+ gas: t.String(),
70
+ amountOut: t.Object({}),
71
+ priceImpact: t.Number(),
72
+ feeAmount: t.Array(t.String()),
73
+ }),
74
+ },
75
+ "/v1/shortcuts/route": {
76
+ query: t.Object({
77
+ chainId: t.Optional(t.Numeric()),
78
+ fromAddress: t.String(),
79
+ routingStrategy: t.Enum({ ensowallet: "ensowallet", delegate: "delegate", router: "router" }),
80
+ receiver: t.Optional(t.String()),
81
+ spender: t.Optional(t.String()),
82
+ amountIn: t.Array(t.String()),
83
+ amountOut: t.Optional(t.Array(t.String())),
84
+ minAmountOut: t.Optional(t.Array(t.String())),
85
+ slippage: t.Optional(t.String()),
86
+ fee: t.Optional(t.Array(t.String())),
87
+ feeReceiver: t.Optional(t.String()),
88
+ disableRFQs: t.Optional(t.Boolean()),
89
+ ignoreAggregators: t.Optional(t.Array(t.String())),
90
+ ignoreStandards: t.Optional(t.Array(t.String())),
91
+ tokenIn: t.Array(t.String()),
92
+ tokenOut: t.Array(t.String()),
93
+ }),
94
+ response: t.Object({
95
+ gas: t.String(),
96
+ amountOut: t.String(),
97
+ priceImpact: t.Number(),
98
+ feeAmount: t.Array(t.String()),
99
+ createAt: t.Number(),
100
+ tx: t.Object({
101
+ data: t.String(),
102
+ to: t.String(),
103
+ from: t.String(),
104
+ value: t.String(),
105
+ }),
106
+ }),
107
+ },
108
+ };
@@ -0,0 +1,46 @@
1
+ import { ProtocolService } from "../protocol";
2
+ import { slugToProtocolId } from "./enso.model";
3
+ const ENSO = `https://api.enso.finance/api`;
4
+ export class EnsoService {
5
+ static async #fetch(route, params) {
6
+ const res = await fetch(`${ENSO}${route}?${params?.query ? new URLSearchParams(params?.query) : ""}`, {
7
+ headers: new Headers({
8
+ Authorization: `Bearer ${"8dbbda50-6ed5-4bda-bf54-ea2796602057"}`,
9
+ "Content-Type": "application/json",
10
+ }),
11
+ });
12
+ if (res?.status !== 200)
13
+ throw "Unsucessful call";
14
+ return (await res.json());
15
+ }
16
+ static getSlug(protocolId) {
17
+ const slug = Object.entries(slugToProtocolId).find(([_slug, id]) => id === protocolId)?.[0];
18
+ return slug;
19
+ }
20
+ static getProtocolId(slug) {
21
+ return slugToProtocolId[slug];
22
+ }
23
+ static async getCompatibleProtocols(query) {
24
+ const ensoProtocols = await EnsoService.#fetch("/v1/protocols");
25
+ const protocolIds = ensoProtocols
26
+ .filter(p => query.chainId === undefined || p.chains.some(c => c.id === query.chainId))
27
+ .map(p => EnsoService.getProtocolId(p.slug))
28
+ .filter(id => id !== undefined);
29
+ return await ProtocolService.findMany({ id: protocolIds });
30
+ }
31
+ static async getTokens(chainId, slug, identifier) {
32
+ const tokens = await EnsoService.#fetch("/v1/tokens", {
33
+ query: identifier
34
+ ? { protocolSlug: slug, chainId, page: 1, address: identifier }
35
+ : { protocolSlug: slug, chainId, page: 1 },
36
+ });
37
+ return tokens.data;
38
+ }
39
+ static async getQuote(query) {
40
+ return await EnsoService.#fetch("/v1/shortcuts/quote", { query });
41
+ }
42
+ static async getTransaction(query) {
43
+ return await EnsoService.#fetch("/v1/shortcuts/route", { query });
44
+ }
45
+ static getDepositSchema(protocolId) { }
46
+ }
@@ -0,0 +1,2 @@
1
+ // ─── Schemas ─────────────────────────────────────────────────────────────────
2
+ export {};
@@ -0,0 +1,23 @@
1
+ import { apiDbClient } from "../../../utils/prisma";
2
+ import { ExplorerService } from "./explorer.service";
3
+ export class ExplorerRepository {
4
+ static async getByChainId(chainId) {
5
+ return await apiDbClient.explorer.findFirstOrThrow({ where: { chainId } });
6
+ }
7
+ /**
8
+ * Creates an explorer
9
+ * @param chainId to attach explorer to
10
+ * @param type that defines the subsequents links for transactions, addresses...
11
+ * @param url base url without / suffix
12
+ */
13
+ static async create(chainId, type, url) {
14
+ return apiDbClient.explorer.create({
15
+ data: {
16
+ chainId,
17
+ type,
18
+ url,
19
+ id: ExplorerService.hashId(type, chainId),
20
+ },
21
+ });
22
+ }
23
+ }