@merkl/api 0.10.129 → 0.10.131

Sign up to get free protection for your applications and to get access to all the features.
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,90 @@
1
+ import { HttpError } from "../errors";
2
+ import { NETWORK_LABELS } from "@sdk";
3
+ import { ValidationError } from "elysia";
4
+ export class InvalidParameter extends Error {
5
+ message;
6
+ constructor(message) {
7
+ super(message);
8
+ this.message = message;
9
+ this.name = "INVALID_PARAMETER";
10
+ }
11
+ }
12
+ export class UnsupportedNetwork extends Error {
13
+ chainId;
14
+ constructor(chainId) {
15
+ super(`API for Merkl products by Angle Labs does not support (yet) network ${chainId}`);
16
+ this.chainId = chainId;
17
+ this.name = "UNSUPPORTED_NETWORK";
18
+ }
19
+ }
20
+ export class OpportunityNotFound extends Error {
21
+ mainParameter;
22
+ chainId;
23
+ constructor(mainParameter, chainId) {
24
+ super(`No campaigns found for mainParameter ${mainParameter} on chain ${NETWORK_LABELS[chainId]}`);
25
+ this.mainParameter = mainParameter;
26
+ this.chainId = chainId;
27
+ this.name = "OPPORTUNITY_NOT_FOUND";
28
+ }
29
+ }
30
+ export class MerkleRootNotFound extends Error {
31
+ chainId;
32
+ constructor(chainId) {
33
+ super(`No Merkl root found for network ${NETWORK_LABELS[chainId]} (${chainId})`);
34
+ this.chainId = chainId;
35
+ this.name = "MERKLE_ROOT_NOT_FOUND";
36
+ }
37
+ }
38
+ export class InvalidCacheCall extends Error {
39
+ message;
40
+ constructor(message) {
41
+ super(message);
42
+ this.message = message;
43
+ this.name = "INVALID_CACHE_CALL";
44
+ }
45
+ }
46
+ export const errorHandler = (canLog = true) => {
47
+ return (app) => app
48
+ .error({
49
+ InvalidParameter,
50
+ UnsupportedNetwork,
51
+ OpportunityNotFound,
52
+ MerkleRootNotFound,
53
+ ValidationError,
54
+ InvalidCacheCall,
55
+ HttpError,
56
+ })
57
+ .onError(({ error, path, query, code, set, ...all }) => {
58
+ const response = (status, log = true, overrides) => {
59
+ if (canLog && log)
60
+ console.error(`[${path}](${JSON.stringify(query) ?? ""}): ${error.message} : ${error.stack}`);
61
+ return new Response(JSON.stringify(Object.assign({
62
+ error: error.name !== "Error" ? error.name : code,
63
+ message: error.message,
64
+ }, overrides ?? {})), {
65
+ status,
66
+ });
67
+ };
68
+ switch (code) {
69
+ case "InvalidParameter":
70
+ case "InvalidCacheCall":
71
+ return response(400, false);
72
+ case "NOT_FOUND":
73
+ return response(404, false, { message: `${path} does not exist` });
74
+ case "UnsupportedNetwork":
75
+ case "OpportunityNotFound":
76
+ case "MerkleRootNotFound":
77
+ return response(404, false);
78
+ case "VALIDATION": {
79
+ const errorObj = JSON.parse(error.message);
80
+ const property = (errorObj.property ?? "").replaceAll("/", "");
81
+ return response(400, false, {
82
+ message: errorObj.summary,
83
+ found: (property === "" ? errorObj.found : errorObj.found?.[property]) ?? "undefined",
84
+ });
85
+ }
86
+ default:
87
+ return response(500);
88
+ }
89
+ });
90
+ };
@@ -0,0 +1,41 @@
1
+ import { batchMulticallCall, multicallContractCall } from "./generic";
2
+ import { log } from "./logger";
3
+ import { archiveMulticalls, multicalls } from "./providers";
4
+ /**
5
+ * Functions
6
+ */
7
+ export async function executeSimple(chainId, componentCall) {
8
+ const c = await componentCall;
9
+ if (c.cached === true)
10
+ return c.result;
11
+ return (await execute(chainId, [c.call]))[0];
12
+ }
13
+ const execute = async (chainId, callList, shouldRetry, blockNumber) => {
14
+ const calls = [];
15
+ for (const subCall of callList) {
16
+ calls.push(...subCall.callData);
17
+ }
18
+ try {
19
+ let result;
20
+ if (calls.length > 0) {
21
+ result = await batchMulticallCall(multicallContractCall, !!blockNumber ? archiveMulticalls[chainId] : multicalls[chainId], { blockNumber: blockNumber, data: calls }, shouldRetry);
22
+ }
23
+ else {
24
+ result = [];
25
+ }
26
+ let startIndex = 0;
27
+ const promises = [];
28
+ for (const subCall of callList) {
29
+ promises.push(subCall.reducer(result.slice(startIndex, startIndex + subCall.callData.length)));
30
+ startIndex += subCall.callData.length;
31
+ }
32
+ return await Promise.all(promises);
33
+ }
34
+ catch (e) {
35
+ for (const subCall of callList) {
36
+ log.error("execute", e);
37
+ subCall.handler();
38
+ }
39
+ }
40
+ return [];
41
+ };
@@ -0,0 +1,89 @@
1
+ import { tokenType } from "../libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType";
2
+ export function generateCardName(type, typeInfo, campaign, symbols = [""]) {
3
+ switch (type) {
4
+ case tokenType.uniswapv2:
5
+ case tokenType.poolside:
6
+ case tokenType.velodrome:
7
+ case tokenType.aerodrome:
8
+ case tokenType.dragonswap:
9
+ case tokenType.akron:
10
+ case tokenType.koi:
11
+ case tokenType.baseswap:
12
+ case tokenType.fenix:
13
+ case tokenType.zkswap:
14
+ case tokenType.ra:
15
+ case tokenType.syncswap:
16
+ return `${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
17
+ case tokenType.pendle:
18
+ return `Provide ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
19
+ case tokenType.balancerGauge:
20
+ return `${typeInfo.protocol} ${symbols.join("/")}`;
21
+ case tokenType.balancerPool: {
22
+ let cardName = `${typeInfo.protocol} ${symbols.join("/")}`;
23
+ if (typeInfo.vault === "0xFB43069f6d0473B85686a85F4Ce4Fc1FD8F00875") {
24
+ cardName = `Jellyverse Pool ${symbols.join("/")}`;
25
+ }
26
+ return cardName;
27
+ }
28
+ case tokenType.aura:
29
+ return `${typeInfo.protocol} ${symbols.join("/")}`;
30
+ case tokenType.gearbox:
31
+ return `${typeInfo.protocol} ${typeInfo.symbolUnderlyingToken} Deposit`;
32
+ case tokenType.compound:
33
+ return `Lend ${typeInfo.symbolBaseToken} on ${typeInfo.protocol}`;
34
+ case tokenType.radiant_lend: {
35
+ let cardToken = typeInfo.symbolUnderlyingToken;
36
+ if (campaign.campaignParameters.symbolTargetToken.startsWith("r")) {
37
+ cardToken = campaign.campaignParameters.symbolTargetToken.substring(1);
38
+ }
39
+ return `Lend ${cardToken} on ${typeInfo.protocol}`;
40
+ }
41
+ case tokenType.rfx:
42
+ return `Supply ${typeInfo.symbolShortToken}/${typeInfo.symbolLongToken} on ${typeInfo.protocol}`;
43
+ case tokenType.radiant_borrow:
44
+ case tokenType.aave_borrowing:
45
+ case tokenType.yei_borrowing:
46
+ case tokenType.ironclad_borrowing:
47
+ case tokenType.zerolend_borrowing:
48
+ case tokenType.euler_borrow:
49
+ return `Borrow ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
50
+ case tokenType.ionic:
51
+ case tokenType.layerbank:
52
+ case tokenType.moonwell:
53
+ case tokenType.splice:
54
+ case tokenType.aave_lending:
55
+ case tokenType.yei_lending:
56
+ case tokenType.ironclad_lending:
57
+ case tokenType.zerolend_lending:
58
+ case tokenType.fraxlend:
59
+ case tokenType.euler_lend:
60
+ return `Supply ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
61
+ case tokenType.metamorpho:
62
+ return `Supply to ${typeInfo.name} on ${typeInfo.protocol}`;
63
+ case tokenType.sturdy_aggregator:
64
+ return `Supply ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol} ${typeInfo.name}`;
65
+ case tokenType.sturdy_silo:
66
+ return `Supply ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol} ${typeInfo.symbolCollateral} Silo`;
67
+ case tokenType.curve:
68
+ case tokenType.curve_2:
69
+ return `${typeInfo.protocol} ${Object.values(typeInfo.poolTokens).join("/")}`;
70
+ case tokenType.fluid:
71
+ return `Lend ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
72
+ case tokenType.enzyme:
73
+ return `Supply to the ${typeInfo.name} on ${typeInfo.protocol}`;
74
+ case tokenType.filament:
75
+ return `Earn Yield on ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
76
+ case tokenType.silostaking:
77
+ return `Stake ${typeInfo.symbolUnderlyingToken} on ${typeInfo.protocol}`;
78
+ case tokenType.beefy:
79
+ return `${typeInfo.protocol} ${typeInfo.symbolToken0}/${typeInfo.symbolToken1}`;
80
+ case tokenType.toros:
81
+ return `${typeInfo.name} (${campaign.campaignParameters.symbolTargetToken}) on ${typeInfo.protocol}`;
82
+ case tokenType.ironcladStaking:
83
+ return `Stake ${campaign.campaignParameters.symbolTargetToken} on ${typeInfo.protocol}`;
84
+ case tokenType.woofi:
85
+ return `Supercharge ${typeInfo.symbolUnderlying} on ${typeInfo.protocol}`;
86
+ default:
87
+ return `Hold ${typeInfo.name} (${campaign.campaignParameters.symbolTargetToken})`;
88
+ }
89
+ }
@@ -0,0 +1,117 @@
1
+ import { withRetry } from "@sdk";
2
+ import { constants, BigNumber } from "ethers";
3
+ import { MAX_NUM_SUBCALLS } from "../constants";
4
+ import { log } from "./logger";
5
+ import { multicalls } from "./providers";
6
+ export async function multicallContractCall(contract, args) {
7
+ let result;
8
+ try {
9
+ // TO SIMULATE - USE CAUTIOUSLY AS IT USES CREDITS
10
+ // console.log(
11
+ // await callTenderly(
12
+ // {
13
+ // chainId: (await contract.provider.getNetwork()).chainId.toString(),
14
+ // data: contract.interface.encodeFunctionData('aggregate', [args.data]),
15
+ // from: !!args.from ? args.from : constants.AddressZero,
16
+ // saveSimulation: true,
17
+ // to: contract.address,
18
+ // value: '0',
19
+ // },
20
+ // undefined,
21
+ // true
22
+ // )
23
+ // );
24
+ result = await contract.provider.call({
25
+ data: contract.interface.encodeFunctionData("aggregate3", [
26
+ args.data.map(c => {
27
+ return {
28
+ allowFailure: !!c.allowFailure,
29
+ callData: c.callData,
30
+ target: c.target,
31
+ };
32
+ }),
33
+ ]),
34
+ from: !!args.from ? args.from : constants.AddressZero,
35
+ to: contract.address,
36
+ }, !!args.blockNumber ? args.blockNumber : undefined);
37
+ }
38
+ catch (e) {
39
+ log.error("multicallContractCall failed", e);
40
+ throw new Error("❌ failed to decode multicall data");
41
+ }
42
+ return contract.interface.decodeFunctionResult("aggregate3", result)[0].map((r) => r?.returnData);
43
+ }
44
+ export async function batchMulticallCall(func, contract, args, shouldRetry = true) {
45
+ let callsLeft = args.data.length;
46
+ let lowerIdx = 0;
47
+ let upperIdx = Math.min(args.data.length, MAX_NUM_SUBCALLS);
48
+ const multicallBatch = [];
49
+ while (callsLeft !== 0) {
50
+ multicallBatch.push(shouldRetry
51
+ ? withRetry(func, [
52
+ // TODO: fix typing
53
+ contract,
54
+ {
55
+ blockNumber: args.blockNumber,
56
+ data: args.data.slice(lowerIdx, upperIdx),
57
+ },
58
+ ])
59
+ : func(contract, args));
60
+ callsLeft -= upperIdx - lowerIdx;
61
+ lowerIdx = upperIdx;
62
+ upperIdx = Math.min(args.data.length, upperIdx + MAX_NUM_SUBCALLS);
63
+ }
64
+ /** Executing batched multicall */
65
+ const results = await Promise.allSettled(multicallBatch);
66
+ let fetchedData = [];
67
+ for (let k = 0; k < results.length; k++) {
68
+ const res = results[k];
69
+ if (res.status === "fulfilled") {
70
+ fetchedData = fetchedData.concat(res.value);
71
+ }
72
+ else {
73
+ log.error(`batchMulticallCall failed to ${args.data[k].target}, data: ${args.data[k].callData}`, res);
74
+ fetchedData.concat("0x");
75
+ }
76
+ }
77
+ return fetchedData;
78
+ }
79
+ export async function archiveContractMethodCall(contract, args) {
80
+ return contract.interface.decodeFunctionResult("aggregate3", !!args.blockNumber
81
+ ? await contract.provider.call({
82
+ data: contract.interface.encodeFunctionData("aggregate3", [args.calls]),
83
+ to: contract.address,
84
+ }, BigNumber.from(args.blockNumber).toNumber())
85
+ : await contract.provider.call({
86
+ data: contract.interface.encodeFunctionData("aggregate3", [args.calls]),
87
+ to: contract.address,
88
+ }))[0];
89
+ }
90
+ export async function batchMulticallCallWithRetry(chainId, args) {
91
+ let fetchedData = [];
92
+ let remainingCalls = args.calls.length;
93
+ let lowerIdx = 0;
94
+ let upperIdx = Math.min(args.calls.length, MAX_NUM_SUBCALLS);
95
+ const multicallBatch = [];
96
+ while (remainingCalls !== 0) {
97
+ multicallBatch.push(await withRetry(archiveContractMethodCall, [
98
+ multicalls[chainId],
99
+ {
100
+ blockNumber: args.blockNumber,
101
+ calls: args.calls.slice(lowerIdx, upperIdx),
102
+ },
103
+ ]));
104
+ remainingCalls -= upperIdx - lowerIdx;
105
+ lowerIdx = upperIdx;
106
+ upperIdx = Math.min(args.calls.length, upperIdx + MAX_NUM_SUBCALLS);
107
+ }
108
+ /** Executing batched multicall */
109
+ const results = await Promise.allSettled(multicallBatch);
110
+ for (let k = 0; k < results.length; k++) {
111
+ const res = results[k];
112
+ if (res.status === "fulfilled") {
113
+ fetchedData = fetchedData.concat(res.value);
114
+ }
115
+ }
116
+ return fetchedData;
117
+ }
@@ -0,0 +1,4 @@
1
+ import { sha256 } from "../utils/crypto";
2
+ export function hashArray(...args) {
3
+ return args.length > 0 ? sha256(JSON.stringify(args.map(a => a.toString()))) : "";
4
+ }
@@ -0,0 +1,78 @@
1
+ import { Redis } from "../cache";
2
+ import { hashArray } from "./hashArray";
3
+ import { BigNumber } from "ethers";
4
+ import moment from "moment";
5
+ import { log } from "./logger";
6
+ import { providers } from "./providers";
7
+ /**
8
+ * Fetches the timestamp of a block with up to RETRIES retries in case of failure
9
+ */
10
+ const RETRIES = 10;
11
+ export const getBlockTimestamp = async (provider, blockNumber) => {
12
+ let res = null;
13
+ let trial = 0;
14
+ while (res === null && trial < RETRIES) {
15
+ try {
16
+ res = await provider.send("eth_getBlockByNumber", [`0x${blockNumber.toString(16)}`, false]);
17
+ }
18
+ catch { }
19
+ trial++;
20
+ }
21
+ if (trial > 1) {
22
+ console.log(`${trial - 1} calls failed fetching blocktimestamp for block ${blockNumber}.`);
23
+ }
24
+ return BigNumber.from(res?.timestamp).toNumber();
25
+ };
26
+ /**
27
+ * Binary search to search the last block before a given timestamp
28
+ */
29
+ const getLastBlockBefore = async (timestamp, chainId) => {
30
+ if (moment().unix() < timestamp) {
31
+ log.error("getLastBlockBefore", `Timestamp ${timestamp} is in the future`);
32
+ return 0;
33
+ }
34
+ const provider = providers[chainId];
35
+ const current = await provider.getBlockNumber();
36
+ let upper = current;
37
+ let lower = 0;
38
+ let step = Math.floor((upper - lower) / 2);
39
+ let fixUpper = false;
40
+ let fixLower = false;
41
+ while (upper - lower > 1) {
42
+ // Reduce step size of interval has been found
43
+ if (upper - lower < 2 * step) {
44
+ step = Math.floor(step / 2);
45
+ fixUpper = false;
46
+ fixLower = false;
47
+ }
48
+ // Check reduction of upper bound
49
+ if (!fixUpper) {
50
+ const auxUpper = upper - step;
51
+ const auxUpperTimestamp = await getBlockTimestamp(provider, auxUpper);
52
+ if (auxUpperTimestamp > timestamp) {
53
+ upper = auxUpper;
54
+ }
55
+ else {
56
+ fixUpper = true;
57
+ }
58
+ }
59
+ // Check reduction of lower bound
60
+ if (!fixLower) {
61
+ const auxLower = lower + step;
62
+ const auxLowerTimestamp = await getBlockTimestamp(provider, auxLower);
63
+ if (auxLowerTimestamp <= timestamp) {
64
+ lower = auxLower;
65
+ }
66
+ else {
67
+ // auxLower timestamp >= timestamp
68
+ // We want to return the last block with a timestamp <= timestamp
69
+ fixLower = true;
70
+ if (auxLowerTimestamp === timestamp) {
71
+ return auxLower;
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return lower;
77
+ };
78
+ export const getLastBlockBeforeWithCache = async (timestamp, chainId) => await Redis.getOrSet(`LastBlockBefore_${hashArray([timestamp, chainId])}`, getLastBlockBefore, timestamp, chainId);
@@ -0,0 +1,52 @@
1
+ import { createPinoLogger } from "@bogeychan/elysia-logger";
2
+ export const logger = createPinoLogger({
3
+ base: undefined,
4
+ formatters: {
5
+ level(level) {
6
+ return { level };
7
+ },
8
+ },
9
+ level: process.env.LOG_LEVEL || "info",
10
+ name: process.env.APP_NAME || "api",
11
+ transport: process.env.ENV !== "local"
12
+ ? undefined
13
+ : {
14
+ options: {
15
+ colorize: true,
16
+ ignore: "time,name,hostname,pid,baseUrl,fullUrl,requestId,chain",
17
+ messageFormat: "\u001b[35m{baseUrl}\u001b[39m \u001b[33m{chain}\u001b[39m {msg}",
18
+ },
19
+ target: "pino-pretty",
20
+ },
21
+ });
22
+ const logConstructor = (type, message, errorMessage, onlyDev, service, url) => {
23
+ if (onlyDev && process.env.ENV !== "local")
24
+ return;
25
+ if (type === "error") {
26
+ if (!!service && !!url) {
27
+ logger.child({ service, url }).error(errorMessage, message);
28
+ }
29
+ else if (!!service) {
30
+ logger.child({ service }).error(errorMessage, message);
31
+ }
32
+ else {
33
+ logger.error(errorMessage, message);
34
+ }
35
+ }
36
+ else if (type === "warn") {
37
+ logger.warn(message);
38
+ }
39
+ else if (type === "debug") {
40
+ logger.debug(message);
41
+ }
42
+ else {
43
+ logger.info(message);
44
+ }
45
+ };
46
+ export const log = {
47
+ debug: (message) => logConstructor("debug", message),
48
+ error: (message, errorMessage, service, url) => logConstructor("error", message, errorMessage, false, service, url),
49
+ info: (message) => logConstructor("info", message),
50
+ local: (message) => logConstructor("info", message, undefined, true),
51
+ warn: (message) => logConstructor("warn", message),
52
+ };
@@ -0,0 +1,180 @@
1
+ import { Redis } from "../cache";
2
+ import { ChainId, NETWORK_LABELS } from "@sdk";
3
+ import axios from "axios";
4
+ import { log } from "./logger";
5
+ import PriceService from "./prices/priceService";
6
+ const defiLamaChains = {
7
+ [ChainId.MAINNET]: "ethereum",
8
+ [ChainId.POLYGON]: "polygon",
9
+ [ChainId.FANTOM]: "fantom",
10
+ [ChainId.AVALANCHE]: "avax",
11
+ [ChainId.BSC]: "bsc",
12
+ [ChainId.OPTIMISM]: "optimism",
13
+ [ChainId.ARBITRUM]: "arbitrum",
14
+ [ChainId.BASE]: "base",
15
+ [ChainId.GNOSIS]: "gnosis",
16
+ };
17
+ export var PRICING_METHODS;
18
+ (function (PRICING_METHODS) {
19
+ PRICING_METHODS[PRICING_METHODS["defillama"] = 0] = "defillama";
20
+ PRICING_METHODS[PRICING_METHODS["quickswap"] = 1] = "quickswap";
21
+ PRICING_METHODS[PRICING_METHODS["abandonned"] = -1] = "abandonned";
22
+ })(PRICING_METHODS || (PRICING_METHODS = {}));
23
+ export class Pricer {
24
+ prices;
25
+ extraPricesData;
26
+ constructor(prices, extraPricesData) {
27
+ this.prices = prices;
28
+ this.extraPricesData = extraPricesData;
29
+ }
30
+ static async load() {
31
+ const { prices, extraPricesData } = await Redis.get("Prices");
32
+ const pricer = new Pricer(prices ?? {}, extraPricesData ?? []);
33
+ if (!prices) {
34
+ log.error("Pricer", "prices not found in cache when instanciating class");
35
+ await pricer.update();
36
+ }
37
+ return pricer;
38
+ }
39
+ getArray() {
40
+ return Object.keys(this.prices)
41
+ .filter(t => this.prices[t] >= 0)
42
+ .map(t => {
43
+ return {
44
+ rate: this.prices[t],
45
+ token: t,
46
+ };
47
+ });
48
+ }
49
+ /** Tries to fetch a given price sequentially using a given method */
50
+ async fetchPerMethod(x, method) {
51
+ switch (method) {
52
+ case PRICING_METHODS.abandonned:
53
+ return 0;
54
+ case PRICING_METHODS.defillama: {
55
+ let defillamaId;
56
+ if (!!x.chainId && !!x.address) {
57
+ defillamaId = `${defiLamaChains[x.chainId] ?? NETWORK_LABELS[x.chainId].toLowerCase()}:${x.address}`;
58
+ }
59
+ else {
60
+ defillamaId = `coingecko:${x.symbol}`;
61
+ }
62
+ const defillamaUrl = `https://coins.llama.fi/prices/current/${defillamaId}`;
63
+ try {
64
+ return (await axios.get(defillamaUrl, { timeout: 1000 })).data.coins[defillamaId].price;
65
+ }
66
+ catch { }
67
+ break;
68
+ }
69
+ case PRICING_METHODS.quickswap:
70
+ if (!!x.chainId && !!x.address) {
71
+ const quickswapUrl = `https://leaderboard.quickswap.exchange/utils/token-prices/v3?chainId=${x.chainId}&addresses=${x.address}`;
72
+ try {
73
+ return (await axios.get(quickswapUrl, { timeout: 1000 })).data?.[0].price;
74
+ }
75
+ catch { }
76
+ }
77
+ break;
78
+ }
79
+ return 0;
80
+ }
81
+ /** Tries to fetch a given price sequentially using all available methods */
82
+ async fetch(x) {
83
+ if (!!x.symbol && x.symbol?.toLowerCase().includes("test"))
84
+ return { method: PRICING_METHODS.abandonned, price: 0 };
85
+ for (const method of Object.values(PRICING_METHODS)) {
86
+ if (method === Number.parseInt(method.toString())) {
87
+ const price = await this.fetchPerMethod(x, method);
88
+ if (!!price)
89
+ return { method, price };
90
+ }
91
+ }
92
+ return { method: PRICING_METHODS.abandonned, price: 0 };
93
+ }
94
+ /** Returns the price if possible, otherwise tries to fetch it */
95
+ async get(x) {
96
+ if (x.symbol === "test")
97
+ return 0; // FIXME
98
+ // Normalize address
99
+ x.address = x?.address?.toLowerCase();
100
+ if (!!x.address && !!this.prices[x.address]) {
101
+ if (this.prices[x.address] !== -1)
102
+ return this.prices[x.address];
103
+ }
104
+ if (!!x.symbol && !!this.prices[x.symbol]) {
105
+ if (this.prices[x.symbol] === -1)
106
+ return undefined;
107
+ return this.prices[x.symbol];
108
+ }
109
+ if (!!x.symbol && x.symbol.toLowerCase().startsWith("w")) {
110
+ const symbol = x.symbol.slice(1);
111
+ if (!!this.prices[symbol]) {
112
+ if (this.prices[symbol] === -1)
113
+ return undefined;
114
+ return this.prices[symbol];
115
+ }
116
+ }
117
+ if (!!x.symbol && x.symbol.toLowerCase().startsWith("r")) {
118
+ const symbol = x.symbol.slice(1);
119
+ if (!!this.prices[symbol]) {
120
+ if (this.prices[symbol] === -1)
121
+ return undefined;
122
+ return this.prices[symbol];
123
+ }
124
+ }
125
+ if (!!x.symbol && x.symbol.toLowerCase().startsWith("r") && x.symbol.toLowerCase().endsWith("n")) {
126
+ const symbol = x.symbol.slice(1, -1);
127
+ if (!!this.prices[symbol]) {
128
+ if (this.prices[symbol] === -1)
129
+ return undefined;
130
+ return this.prices[symbol];
131
+ }
132
+ }
133
+ if (!!x.symbol && x.symbol.toLowerCase().startsWith("variableDebt")) {
134
+ const symbol = x.symbol.slice(12);
135
+ if (!!this.prices[symbol]) {
136
+ if (this.prices[symbol] === -1)
137
+ return undefined;
138
+ return this.prices[symbol];
139
+ }
140
+ }
141
+ if (!!x.symbol && x.symbol.toLowerCase().startsWith("variableDebt") && x.symbol.toLowerCase().endsWith("n")) {
142
+ const symbol = x.symbol.slice(12, -1);
143
+ if (!!this.prices[symbol]) {
144
+ if (this.prices[symbol] === -1)
145
+ return undefined;
146
+ return this.prices[symbol];
147
+ }
148
+ }
149
+ }
150
+ /** Saves the current price data in the cache */
151
+ async save() {
152
+ await Redis.safeSet("Prices", {
153
+ extraPricesData: this.extraPricesData,
154
+ prices: this.prices,
155
+ });
156
+ }
157
+ /** Recomputes all prices and saves them in the cache */
158
+ async update() {
159
+ // Update prices
160
+ this.prices = await PriceService.instance.fetchPrices();
161
+ // Update extra prices
162
+ this.extraPricesData = this.extraPricesData.filter(x => !!x.symbol && this.prices[x.symbol] === undefined && !!x.address && this.prices[x.address] === undefined);
163
+ for (const x of this.extraPricesData) {
164
+ try {
165
+ const price = await this.fetchPerMethod({ address: x.address, chainId: x.chainId, symbol: x.symbol }, x.method);
166
+ if (!!price) {
167
+ log.info(`price for ${x.symbol} - ${x.address} on ${NETWORK_LABELS[x.chainId ?? 1]}: ${price} added to cache`);
168
+ if (!!x.address && this.prices[x.address] === undefined)
169
+ this.prices[x.address] = price;
170
+ if (!!x.symbol && this.prices[x.symbol] === undefined)
171
+ this.prices[x.symbol] = price;
172
+ }
173
+ }
174
+ catch (e) {
175
+ log.error("pricer update", e);
176
+ }
177
+ } // Update extraPricesData
178
+ await this.save();
179
+ }
180
+ }
@@ -0,0 +1,8 @@
1
+ import { BN2Number } from "@sdk";
2
+ import { Contract, utils } from "ethers";
3
+ import { providers } from "../providers";
4
+ export async function getChainlinkLatestPrice(chainId, oracle) {
5
+ const abi = new utils.Interface(["function latestAnswer() external view returns(int256)"]);
6
+ const contract = new Contract(oracle, abi, providers[chainId]);
7
+ return BN2Number(await contract.latestAnswer(), 8);
8
+ }
@@ -0,0 +1,7 @@
1
+ import { BN2Number } from "@sdk";
2
+ import { Contract } from "ethers";
3
+ import { providers } from "../providers";
4
+ export async function getVirtualPrice(chainId, pool) {
5
+ const contract = new Contract(pool, ["function get_virtual_price() external view returns(uint256)"], providers[chainId]);
6
+ return BN2Number(await contract.get_virtual_price());
7
+ }
@@ -0,0 +1,8 @@
1
+ import { BN2Number } from "@sdk";
2
+ import { Contract, utils } from "ethers";
3
+ import { providers } from "../providers";
4
+ export async function getDQUICKPrice(chainId, contractAddress, assetDecimals = 18, vaultDecimals = 18) {
5
+ const contract = new Contract(contractAddress, ["function dQUICKForQUICK(uint256) external view returns(uint256)"], providers[chainId]);
6
+ const assetAmount = await contract.dQUICKForQUICK(utils.parseUnits("1", vaultDecimals));
7
+ return BN2Number(assetAmount, assetDecimals);
8
+ }