@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,29 @@
1
+ import { PriceSourceMethod } from "../../../database/api/.generated";
2
+ import CoingeckoService from "./services/coinGeckoService";
3
+ import DefillamaService from "./services/defillamaService";
4
+ import DexScreenerService from "./services/dexScreenerService";
5
+ import ERC4626Service from "./services/erc4626Service";
6
+ import IndexCoop from "./services/indexCoopService";
7
+ /**
8
+ * @description Factory pattern to get the correct price fetcher
9
+ */
10
+ export default class PriceFetcherFactory {
11
+ static instance = new PriceFetcherFactory();
12
+ constructor() { }
13
+ get(type) {
14
+ switch (type) {
15
+ case PriceSourceMethod.COINGECKO:
16
+ return CoingeckoService.instance;
17
+ case PriceSourceMethod.DEFILLAMA:
18
+ return DefillamaService.instance;
19
+ case PriceSourceMethod.ERC4626:
20
+ return ERC4626Service.instance;
21
+ case PriceSourceMethod.DEXSCREENER:
22
+ return DexScreenerService.instance;
23
+ case PriceSourceMethod.INDEXCOOP:
24
+ return IndexCoop.instance;
25
+ default:
26
+ throw new Error(`Price reader service not found for ${type}`);
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,328 @@
1
+ import { PriceService as PriceSourceService } from "../../modules/v4/price";
2
+ import { PriceSourceMethod } from "../../../database/api/.generated";
3
+ import { BN2Number, ChainId, Stable, registry } from "@sdk";
4
+ import axios from "axios";
5
+ import { Contract } from "ethers";
6
+ import { constantChain } from "../../constants";
7
+ import { getTokensListWithCache } from "../../libs/getTokensList";
8
+ import { log } from "../logger";
9
+ import { providers } from "../providers";
10
+ import { getChainlinkLatestPrice } from "./chainlinkRead";
11
+ import { getVirtualPrice } from "./curveVirtualPrice";
12
+ import { getDQUICKPrice } from "./getDQUICK";
13
+ import PriceFetcherFactory from "./priceFetcherFactory";
14
+ import { getERC4626Price } from "./services/getERC4626";
15
+ import { getCurveV2Price, getUniV2Price } from "./uniV2Price";
16
+ export default class PriceService {
17
+ static instance = new PriceService();
18
+ _prices = {};
19
+ constructor() { }
20
+ get prices() {
21
+ return this._prices;
22
+ }
23
+ setPrices = (res) => {
24
+ res.forEach(tokenPrice => {
25
+ this._prices[tokenPrice.token] = tokenPrice.rate;
26
+ });
27
+ };
28
+ async fetchPrices() {
29
+ const tokenPriceSources = await PriceSourceService.getManyPriceSources();
30
+ /**
31
+ * @description Factory pricer's call to get prices from different sources
32
+ */
33
+ try {
34
+ for (const method of Object.values(PriceSourceMethod)) {
35
+ if (method !== PriceSourceMethod.CONSTANT && method !== PriceSourceMethod.EQUAL_TO) {
36
+ await PriceFetcherFactory.instance
37
+ .get(PriceSourceMethod[method])
38
+ .getPrice(tokenPriceSources)
39
+ .then(this.setPrices);
40
+ }
41
+ }
42
+ }
43
+ catch (e) {
44
+ log.error("Error fetching prices", e);
45
+ }
46
+ /** San Token Prices */
47
+ this._prices["sanUSDC_EUR"] = 1.2120307 * this._prices["USDC"];
48
+ this._prices["sanDAI_EUR"] = 1.0926287 * this._prices["DAI"];
49
+ this._prices["sanFRAX_EUR"] = 1.077969 * this._prices["FRAX"];
50
+ this._prices["sanFEI_EUR"] = 1.02814 * this._prices["FEI"];
51
+ this._prices["sanWETH_EUR"] = 6.732341 * this._prices["ETH"];
52
+ const promises = [];
53
+ /** Sushiswap & UniV2 Prices */
54
+ promises.push(getUniV2Price(ChainId.MAINNET, this._prices[Stable.EUR], this._prices["ANGLE"], "0x1f4c763bde1d4832b3ea0640e66da00b98831355").then(sushiEURA_ANGLE => {
55
+ if (!!sushiEURA_ANGLE) {
56
+ this._prices["Sushi EURA-ANGLE LP"] = sushiEURA_ANGLE;
57
+ }
58
+ }));
59
+ promises.push(getUniV2Price(ChainId.MAINNET, this._prices["ANGLE"], this._prices["ETH"], "0xfb55af0ef0dcdec92bd3752e7a9237dfefb8acc0").then(sushiANGLE_ETH => {
60
+ if (!!sushiANGLE_ETH) {
61
+ this._prices["Sushi ANGLE-ETH LP"] = sushiANGLE_ETH;
62
+ }
63
+ }));
64
+ promises.push(getUniV2Price(ChainId.MAINNET, this._prices[Stable.EUR], this._prices["FEI"], "0xf89ce5ed65737da8440411544b0499c9fad323b2").then(uni_EURA_FEI => {
65
+ if (!!uni_EURA_FEI) {
66
+ this._prices["Uni-V2 EURA-FEI LP"] = uni_EURA_FEI;
67
+ }
68
+ }));
69
+ promises.push(getUniV2Price(ChainId.MAINNET, this._prices["stTAO"], this._prices["WETH"], "0xAe57eB8DD23C90769962d413A8802Ba68181aD0F").then(uni_stTAO_WETH => {
70
+ if (!!uni_stTAO_WETH) {
71
+ this._prices["0xAe57eB8DD23C90769962d413A8802Ba68181aD0F"] = uni_stTAO_WETH;
72
+ }
73
+ }));
74
+ promises.push(getUniV2Price(ChainId.BLAST, this._prices["WETH"], this._prices["YIELD"], "0x3Df8AAC90Eb2FeeA4378368D46a72AF47eBDc268").then(uni_WETH_YIELD => {
75
+ if (!!uni_WETH_YIELD) {
76
+ this._prices["0x3Df8AAC90Eb2FeeA4378368D46a72AF47eBDc268"] = uni_WETH_YIELD;
77
+ }
78
+ }));
79
+ promises.push((async () => {
80
+ try {
81
+ const d = await new Contract("0x3a29cab2e124919d14a6f735b6033a3aad2b260f", ["function discount() external view returns(uint256)"], providers[ChainId.POLYGON]).discount();
82
+ this._prices["oRETRO"] = this._prices["RETRO"] * (1 - Number.parseInt(d.toString()) / 100);
83
+ }
84
+ catch (e) {
85
+ log.error(`❌ error fetching oRetro discount:`, e);
86
+ this._prices["oRETRO"] = this._prices["RETRO"] * 0.6;
87
+ }
88
+ })());
89
+ this.setConstantPrices(tokenPriceSources);
90
+ this.setEqualsToPrices(tokenPriceSources);
91
+ /** Hardcoded prices */
92
+ this._prices["oICL"] = 0.5 * this._prices["ICL"];
93
+ this._prices["$ERA"] = 0.001;
94
+ this._prices["Bridged mstETH"] = this._prices["mstETH"];
95
+ // Mock collats
96
+ this._prices["MockCollat0"] = this._prices["EUR"];
97
+ this._prices["MockCollat1"] = this._prices["EUR"];
98
+ this._prices["MockCollat2"] = this._prices["EUR"];
99
+ // USDA price
100
+ this._prices[Stable.USD] = 1;
101
+ this._prices["agUSD"] = 1;
102
+ // veANGLE price
103
+ this._prices["veANGLE"] = this._prices["ANGLE"];
104
+ // Hardcoded prices
105
+ this._prices["KAI"] = 0.015;
106
+ this._prices["USSD"] = 1;
107
+ this._prices["crvUSD"] = 1;
108
+ for (const id in ChainId) {
109
+ const chainId = Number(id);
110
+ const savingsAddressUSD = registry(chainId)?.USD?.Savings;
111
+ const savingsAddressEUR = registry(chainId)?.EUR?.Savings;
112
+ if (!!savingsAddressUSD) {
113
+ promises.push(getERC4626Price(chainId, savingsAddressUSD).then(sharePrice => {
114
+ this._prices[`stUSD-${chainId}`] = sharePrice * this._prices[Stable.USD];
115
+ this._prices[`STUSD-${chainId}`] = this._prices[`stUSD-${chainId}`];
116
+ }));
117
+ }
118
+ if (!!savingsAddressEUR) {
119
+ promises.push(getERC4626Price(chainId, savingsAddressEUR).then(sharePrice => {
120
+ this._prices[`stEUR-${chainId}`] = sharePrice * this._prices[Stable.EUR];
121
+ this._prices[`STEUR-${chainId}`] = this._prices[`stEUR-${chainId}`];
122
+ }));
123
+ }
124
+ }
125
+ promises.push(getERC4626Price(ChainId.MAINNET, "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB", 6, 18).then(sharePrice => {
126
+ this._prices["steakUSDC"] = sharePrice * this._prices["USDC"];
127
+ this._prices["STEAKUSDC"] = this._prices["steakUSDC"];
128
+ this._prices["Steakhouse USDC"] = this._prices["steakUSDC"];
129
+ }));
130
+ promises.push(getERC4626Price(ChainId.BASE, "0xbEEfa1aBfEbE621DF50ceaEF9f54FdB73648c92C", 18, 18).then(sharePrice => {
131
+ this._prices["steakUSDA"] = sharePrice * this._prices["USDA"];
132
+ this._prices["STEAKUSDA"] = this._prices["steakUSDA"];
133
+ this._prices["Steakhouse USDA"] = this._prices["steakUSDA"];
134
+ }));
135
+ promises.push(getERC4626Price(ChainId.BASE, "0xBEeFA28D5e56d41D35df760AB53B94D9FfD7051F", 18, 18).then(sharePrice => {
136
+ this._prices["steakEURA"] = sharePrice * this._prices["EURA"];
137
+ this._prices["STEAKEURA"] = this._prices["steakEURA"];
138
+ this._prices["Steakhouse EURA"] = this._prices["steakEURA"];
139
+ }));
140
+ promises.push(getERC4626Price(ChainId.MAINNET, "0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6", 18, 18).then(sharePrice => {
141
+ this._prices["gtUSDAcore"] = sharePrice;
142
+ this._prices["Gauntlet USDA Core"] = sharePrice;
143
+ }));
144
+ promises.push(getERC4626Price(ChainId.MAINNET, "0x89D80f5e9BC88d8021b352064ae73F0eAf79EBd8", 18, 18).then(sharePrice => {
145
+ this._prices["Re7USDA"] = sharePrice;
146
+ this._prices["Re7 USDA"] = sharePrice;
147
+ }));
148
+ promises.push(getDQUICKPrice(ChainId.POLYGON, "0x958d208Cdf087843e9AD98d23823d32E17d723A1").then(sharePrice => {
149
+ this._prices["dQUICK"] = sharePrice * this._prices["QUICK"];
150
+ this._prices["DQUICK"] = this._prices["dQUICK"];
151
+ }));
152
+ promises.push(getVirtualPrice(ChainId.MAINNET, "0xb9446c4Ef5EBE66268dA6700D26f96273DE3d571").then(virtualPrice => {
153
+ this._prices["Curve 3EUR LP"] = virtualPrice * this._prices[Stable.EUR];
154
+ }));
155
+ promises.push(getVirtualPrice(ChainId.MAINNET, "0xB37D6c07482Bc11cd28a1f11f1a6ad7b66Dec933").then(virtualPrice => {
156
+ this._prices["Curve EURA-ibEUR LP"] = virtualPrice * this._prices[Stable.EUR];
157
+ }));
158
+ promises.push(getVirtualPrice(ChainId.MAINNET, constantChain[ChainId.MAINNET].crvANGLESDANGLE).then(virtualPrice => {
159
+ this._prices["Curve sdANGLE-ANGLE LP"] = virtualPrice * this._prices["ANGLE"];
160
+ }));
161
+ promises.push(getVirtualPrice(ChainId.MAINNET, constantChain[ChainId.MAINNET].crvEuropool).then(virtualPrice => {
162
+ this._prices["Curve Europool LP"] = virtualPrice * this._prices[Stable.EUR];
163
+ }));
164
+ promises.push(getVirtualPrice(ChainId.MAINNET, constantChain[ChainId.MAINNET].crvEURAEUROC).then(virtualPrice => {
165
+ this._prices["Curve EURA-EUROC LP"] = virtualPrice * this._prices[Stable.EUR];
166
+ }));
167
+ promises.push(getVirtualPrice(ChainId.MAINNET, constantChain[ChainId.MAINNET].crvEURAEURe).then(virtualPrice => {
168
+ this._prices["Curve EURA-EURe LP"] = virtualPrice * this._prices[Stable.EUR];
169
+ }));
170
+ promises.push(getChainlinkLatestPrice(ChainId.MAINNET, "0x32d1463EB53b73C095625719Afa544D5426354cB").then(chainlinkPrice => {
171
+ this._prices["bIB01"] = chainlinkPrice;
172
+ this._prices["IB01"] = chainlinkPrice;
173
+ }));
174
+ promises.push(getChainlinkLatestPrice(ChainId.ARBITRUM, "0x1940fEd49cDBC397941f2D336eb4994D599e568B").then(chainlinkPrice => {
175
+ this._prices["zZRO"] = chainlinkPrice;
176
+ }));
177
+ promises.push(getChainlinkLatestPrice(ChainId.MAINNET, "0x9E8E794ad6Ecdb6d5c7eaBE059D30E907F58859b").then(chainlinkPrice => {
178
+ this._prices["bHIGH"] = chainlinkPrice * this._prices["EUR"];
179
+ this._prices["HIGH"] = chainlinkPrice * this._prices["EUR"];
180
+ }));
181
+ promises.push(getChainlinkLatestPrice(ChainId.MAINNET, "0x6E27A25999B3C665E44D903B2139F5a4Be2B6C26").then(chainlinkPrice => {
182
+ this._prices["bC3M"] = chainlinkPrice * this._prices["EUR"];
183
+ this._prices["C3M"] = chainlinkPrice * this._prices["EUR"];
184
+ }));
185
+ promises.push(getChainlinkLatestPrice(ChainId.MAINNET, "0x475855DAe09af1e3f2d380d766b9E630926ad3CE").then(chainlinkPrice => {
186
+ this._prices["bERNX"] = chainlinkPrice * this._prices["EUR"];
187
+ this._prices["ERNX"] = chainlinkPrice * this._prices["EUR"];
188
+ }));
189
+ promises.push(getChainlinkLatestPrice(ChainId.MAINNET, "0x2674Cc47786740432b895a70D92CFDfB1d5BF798").then(chainlinkPrice => {
190
+ this._prices["bERNA"] = chainlinkPrice;
191
+ this._prices["ERNA"] = chainlinkPrice;
192
+ }));
193
+ promises.push(getChainlinkLatestPrice(ChainId.ARBITRUM, "0x395D5c5D552Df670dc4B2B1cef0c4EABfFba492f").then(chainlinkPrice => {
194
+ this._prices["gmBTC"] = chainlinkPrice;
195
+ }));
196
+ promises.push(getChainlinkLatestPrice(ChainId.ARBITRUM, "0xfB3264D1129824933a52374c2C1696F4470D041e").then(chainlinkPrice => {
197
+ this._prices["gmETH"] = chainlinkPrice;
198
+ }));
199
+ promises.push(getCurveV2Price(ChainId.MAINNET, this._prices, "0x58257e4291F95165184b4beA7793a1d6F8e7b627", constantChain[ChainId.MAINNET].crvFRAXEURA).then(virtualPrice => {
200
+ this._prices["Curve EURA-FRAXBP LP"] = virtualPrice * this._prices[Stable.EUR];
201
+ }));
202
+ await Promise.allSettled(promises);
203
+ /** Camelot API price completion */
204
+ try {
205
+ await axios
206
+ .get("https://api.camelot.exchange/tokens")
207
+ .then(res => {
208
+ if (!!res.data.data.tokens) {
209
+ for (const x of Object.values(res.data.data.tokens)) {
210
+ if (this._prices[x.symbol] === undefined || this._prices[x.symbol] === null) {
211
+ this._prices[x.symbol] = x.price;
212
+ }
213
+ }
214
+ }
215
+ });
216
+ }
217
+ catch (error) {
218
+ log.error("❌ call to fetch camelot api price failed", error);
219
+ }
220
+ /** Retro API price completion */
221
+ try {
222
+ await axios
223
+ .get("https://retro-backend.stabl.finance/api/v1/assets")
224
+ .then(res => {
225
+ if (res.data.success) {
226
+ for (const x of res.data.data) {
227
+ if (this._prices[x.symbol] === undefined || this._prices[x.symbol] === null) {
228
+ this._prices[x.symbol] = x.price;
229
+ }
230
+ }
231
+ }
232
+ });
233
+ }
234
+ catch (error) {
235
+ log.error("❌ call to fetch retro api price failed", error);
236
+ }
237
+ /** Blueprint API price completion */
238
+ try {
239
+ await axios
240
+ .get("https://blue-backend.stabl.finance/api/v1/assets")
241
+ .then(res => {
242
+ if (res.data.success) {
243
+ for (const x of res.data.data) {
244
+ if (this._prices[x.symbol] === undefined || this._prices[x.symbol] === null) {
245
+ this._prices[x.symbol] = x.price;
246
+ }
247
+ }
248
+ }
249
+ });
250
+ }
251
+ catch (error) {
252
+ log.error("❌ call to fetch blueprint api price failed", error);
253
+ }
254
+ promises.push((async () => {
255
+ try {
256
+ const d = await new Contract("0xEdb73D4ED90bE7A49D06d0D940055e6d181d22fa", ["function discount() external view returns(uint256)"], providers[ChainId.MAINNET]).discount();
257
+ this._prices["oBLUE"] = this._prices["BLUE"] * (1 - Number.parseInt(d.toString()) / 100);
258
+ }
259
+ catch (e) {
260
+ log.error("❌ error fetching oBLUE discount:", e);
261
+ this._prices["oBLUE"] = this._prices["BLUE"] * 0.6;
262
+ }
263
+ })());
264
+ this._prices["bveBLUE"] = this._prices["oBLUE"] * 0.85;
265
+ this._prices["BVEBLUE"] = this._prices["bveBLUE"];
266
+ /** Flux price completion */
267
+ promises.push((async () => {
268
+ try {
269
+ const d = await new Contract("0x465a5a630482f3abD6d3b84B39B29b07214d19e5", ["function exchangeRateStored() external view returns(uint256)"], providers[ChainId.MAINNET]).exchangeRateStored();
270
+ this._prices["fUSDC"] = this._prices["USDC"] * BN2Number(d) * 100;
271
+ this._prices["FUSDC"] = this._prices["fUSDC"];
272
+ }
273
+ catch (e) { }
274
+ })());
275
+ // Radiant prices
276
+ this._prices["rUSDCn"] = this._prices["USDC"];
277
+ for (const x of ["USDC", "USDT", "wstETH", "ARB", "wBTC", "DAI", "ETH"]) {
278
+ this._prices[`r${x}n`] = this._prices[x];
279
+ this._prices[`variableDebt${x}n`] = this._prices[x];
280
+ this._prices[`r${x}`] = this._prices[x];
281
+ this._prices[`variableDebt${x}`] = this._prices[x];
282
+ const xUpper = x.toUpperCase();
283
+ this._prices[`r${xUpper}n`] = this._prices[x];
284
+ this._prices[`variableDebt${xUpper}n`] = this._prices[x];
285
+ this._prices[`r${xUpper}`] = this._prices[x];
286
+ this._prices[`variableDebt${xUpper}`] = this._prices[x];
287
+ }
288
+ /** Fill all BorrowStaker prices */
289
+ const tokens = await getTokensListWithCache();
290
+ for (const chainIdString of Object.keys(tokens)) {
291
+ const chainId = Number.parseInt(chainIdString);
292
+ for (const token of Object.values(tokens?.[chainId] ?? {})) {
293
+ if (token.wrappingMethod === "BorrowStaker" && !!token.underlyingTokens) {
294
+ this._prices[token.address] = this._prices[token.underlyingTokens[0]];
295
+ }
296
+ }
297
+ }
298
+ return this._prices;
299
+ }
300
+ setConstantPrices(tokens) {
301
+ const filteredTokens = tokens.filter(token => token.method === PriceSourceMethod.CONSTANT);
302
+ if (filteredTokens.length === 0)
303
+ return [];
304
+ return filteredTokens.forEach(token => {
305
+ const args = token.args;
306
+ if (args.value !== null && args.value !== undefined) {
307
+ this._prices[token.symbol] = args.value;
308
+ }
309
+ else
310
+ log.warn(`❌ constant price ${token.symbol} has incorrect value in database`);
311
+ });
312
+ }
313
+ setEqualsToPrices(tokens) {
314
+ const filteredTokens = tokens.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.EQUAL_TO);
315
+ if (filteredTokens.length === 0)
316
+ return [];
317
+ return filteredTokens
318
+ .filter(token => token.method === PriceSourceMethod.EQUAL_TO)
319
+ .forEach(token => {
320
+ const args = token.args;
321
+ if (args.token !== null && args.token !== undefined) {
322
+ this._prices[token.symbol] = this._prices[args.token];
323
+ }
324
+ else
325
+ log.warn(`❌ equalsTo price ${token.symbol} has incorrect value in database`);
326
+ });
327
+ }
328
+ }
@@ -0,0 +1,53 @@
1
+ import { PriceSourceMethod } from "../../../../database/api/.generated";
2
+ import axios from "axios";
3
+ import { log } from "../../logger";
4
+ export default class CoingeckoService {
5
+ static instance = new CoingeckoService();
6
+ constructor() { }
7
+ baseUrl = "https://coins.llama.fi/prices/current/";
8
+ async getPrice(tickers) {
9
+ const filteredTokens = tickers.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.COINGECKO);
10
+ if (filteredTokens.length === 0)
11
+ return [];
12
+ return await this.fetchprices(filteredTokens);
13
+ }
14
+ buildUrl(tokens) {
15
+ const tikerParams = tokens
16
+ .map(token => {
17
+ const args = token.args;
18
+ if (!args?.ticker)
19
+ return log.warn(`❌ CoingeckoService ticker not found for ${token.symbol}`);
20
+ return `coingecko:${args.ticker}`;
21
+ })
22
+ .join(",");
23
+ return this.baseUrl.concat(tikerParams);
24
+ }
25
+ async fetchprices(tickers) {
26
+ const url = this.buildUrl(tickers);
27
+ return axios
28
+ .get(url, { timeout: 10000 })
29
+ .then(res => this.formatResponse(res, tickers))
30
+ .catch(err => {
31
+ log.error("❌ CoingeckoService not responding", err);
32
+ throw "❌ CoingeckoService not responding";
33
+ });
34
+ }
35
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation> Need to be typed according to coinguekko answer type
36
+ formatResponse(data, tokens) {
37
+ return tokens
38
+ .map(token => {
39
+ const args = token.args;
40
+ if (!args?.ticker)
41
+ return;
42
+ if (!data.data.coins[`coingecko:${args.ticker}`]?.price) {
43
+ log.warn(`❌ CoinGecko data failed for ${token.symbol} with ticker ${args.ticker}`);
44
+ return;
45
+ }
46
+ return {
47
+ token: token.symbol,
48
+ rate: data.data.coins[`coingecko:${args.ticker}`].price ?? -1,
49
+ };
50
+ })
51
+ .filter(item => item !== undefined);
52
+ }
53
+ }
@@ -0,0 +1,53 @@
1
+ import { PriceSourceMethod } from "../../../../database/api/.generated";
2
+ import axios from "axios";
3
+ import { log } from "../../logger";
4
+ export default class DefillamaService {
5
+ static instance = new DefillamaService();
6
+ constructor() { }
7
+ baseUrl = "https://coins.llama.fi/prices/current/";
8
+ async getPrice(sources) {
9
+ const filteredTokens = sources.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.DEFILLAMA);
10
+ if (filteredTokens.length === 0)
11
+ return [];
12
+ return await this.fetchprices(filteredTokens);
13
+ }
14
+ buildUrl(tokens) {
15
+ const tikerParams = tokens
16
+ .map(token => {
17
+ const args = token.args;
18
+ if (!args?.address || !args?.chain)
19
+ return log.warn(`❌ DefillamaService address not found for ${token.symbol}`);
20
+ return `${args?.chain}:${args.address}`;
21
+ })
22
+ .join(",");
23
+ return this.baseUrl.concat(tikerParams);
24
+ }
25
+ async fetchprices(sources) {
26
+ const url = this.buildUrl(sources);
27
+ return axios
28
+ .get(url, { timeout: 10000 })
29
+ .then(res => this.formatResponse(res, sources))
30
+ .catch(err => {
31
+ log.error("❌ DefillamaService not responding", err);
32
+ throw "❌ DefillamaService not responding";
33
+ });
34
+ }
35
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation> Need to be typed according to coinguekko answer type
36
+ formatResponse(data, tokens) {
37
+ return tokens
38
+ .map(token => {
39
+ const args = token.args;
40
+ if (!args?.address || !args?.chain)
41
+ return;
42
+ if (!data.data.coins[`${args?.chain}:${args.address}`]?.price) {
43
+ log.warn(`❌ DefillamaService data failed for ${token.symbol} with address ${args.address}`);
44
+ return;
45
+ }
46
+ return {
47
+ token: token.symbol,
48
+ rate: data.data.coins[`${args?.chain}:${args.address}`].price ?? -1,
49
+ };
50
+ })
51
+ .filter(item => item !== undefined);
52
+ }
53
+ }
@@ -0,0 +1,62 @@
1
+ import { PriceSourceMethod } from "../../../../database/api/.generated";
2
+ import axios from "axios";
3
+ import { log } from "../../logger";
4
+ export default class DexScreenerService {
5
+ static instance = new DexScreenerService();
6
+ baseUrl = "https://api.dexscreener.com/latest/dex/pairs/";
7
+ constructor() { }
8
+ async getPrice(tokens) {
9
+ const filteredTokens = tokens.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.DEXSCREENER);
10
+ if (filteredTokens.length === 0)
11
+ return [];
12
+ const tokensByChain = this.getTokenByChain(filteredTokens); // supports only one chain at a time
13
+ if (tokensByChain === undefined)
14
+ return [];
15
+ return this.fetchPrices(tokensByChain);
16
+ }
17
+ getTokenByChain(tokens) {
18
+ const tokensByChain = {};
19
+ for (const token of tokens) {
20
+ const args = token.args;
21
+ if (args?.chain && args?.pair) {
22
+ const chain = args.chain.toLowerCase();
23
+ const pair = args.pair;
24
+ // Initialize array if it doesn't exist for the chain
25
+ if (!tokensByChain[chain])
26
+ tokensByChain[chain] = [];
27
+ tokensByChain[chain].push(pair);
28
+ }
29
+ else
30
+ log.warn(`⚠️ DexScrenner Invalid token args: ${JSON.stringify(token.args)}`);
31
+ }
32
+ return tokensByChain;
33
+ }
34
+ /** @description Create a list by chain dexscreener only supports one chain at a time */
35
+ async fetchPrices(tokensByChain) {
36
+ // let tickerCallResult: AxiosResponse;
37
+ const res = [];
38
+ const fetchPromises = Object.entries(tokensByChain).map(async ([chain, pairs]) => {
39
+ const url = `${this.baseUrl}${chain.toLowerCase()}/${pairs.join(",")}`;
40
+ try {
41
+ const { data } = await axios.get(url, {
42
+ timeout: 10000,
43
+ });
44
+ if (!data.pairs) {
45
+ log.warn(`⚠️ DexScrenner No pairs found in the response for chain ${chain}`);
46
+ return [];
47
+ }
48
+ return data.pairs.map((pair) => ({
49
+ rate: Number.parseFloat(pair.priceUsd),
50
+ token: pair.baseToken.symbol,
51
+ }));
52
+ }
53
+ catch (error) {
54
+ log.error(`❌ DexScreener error fetching prices for chain ${chain}:`, error);
55
+ return [];
56
+ }
57
+ });
58
+ const results = await Promise.all(fetchPromises);
59
+ results.forEach(result => res.push(...result));
60
+ return res;
61
+ }
62
+ }
@@ -0,0 +1,30 @@
1
+ import { PriceSourceMethod } from "../../../../database/api/.generated";
2
+ import { log } from "../../logger";
3
+ import PriceService from "../priceService";
4
+ import { getERC4626Price } from "./getERC4626";
5
+ export default class ERC4626Service {
6
+ static instance = new ERC4626Service();
7
+ constructor() { }
8
+ async getPrice(tokens) {
9
+ const pricePromises = tokens
10
+ .filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.ERC4626)
11
+ .map(async (token) => {
12
+ const args = token.args;
13
+ if (!args?.chainId || !args.address || !args.vaultToken)
14
+ return log.warn(`❌ ERC4626Service ticker not found for ${token.symbol}`);
15
+ const rate = await getERC4626Price(args.chainId, args.address, args.decimals, args.vaultDecimals);
16
+ // 2 returned tokens as stUSD and STUSD (business requirement)
17
+ const price = this.priceCalculation(rate, args.vaultToken);
18
+ const res = [
19
+ { token: token.symbol, rate: price },
20
+ { token: token.symbol.toUpperCase(), rate: price },
21
+ ];
22
+ return res;
23
+ });
24
+ const resolvedPrices = await Promise.all(pricePromises);
25
+ return resolvedPrices.flat().filter(price => price !== undefined);
26
+ }
27
+ priceCalculation(rate, vaultToken) {
28
+ return rate * PriceService.instance.prices[vaultToken];
29
+ }
30
+ }
@@ -0,0 +1,11 @@
1
+ import { BN2Number } from "@sdk";
2
+ import { Contract, utils } from "ethers";
3
+ import { log } from "../../logger";
4
+ import { providers } from "../../providers";
5
+ export async function getERC4626Price(chainId, contractAddress, assetDecimals = 18, vaultDecimals = 18) {
6
+ const contract = new Contract(contractAddress, ["function convertToAssets(uint256) external view returns(uint256)"], providers[chainId]);
7
+ const assetAmount = await contract.convertToAssets(utils.parseUnits("1", vaultDecimals));
8
+ if (!assetAmount || Number.isNaN(assetAmount))
9
+ log.error("❌ ERC4626Service convertToAssets failed for address:", contractAddress);
10
+ return BN2Number(assetAmount, assetDecimals);
11
+ }
@@ -0,0 +1,55 @@
1
+ import { PriceSourceMethod } from "../../../../database/api/.generated";
2
+ import axios from "axios";
3
+ import { log } from "../../logger";
4
+ export default class IndexCoop {
5
+ static instance = new IndexCoop();
6
+ baseUrl = "https://api.indexcoop.com/";
7
+ constructor() { }
8
+ async getPrice(tokens) {
9
+ const filteredTokens = tokens.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.INDEXCOOP);
10
+ if (filteredTokens.length === 0)
11
+ return [];
12
+ const tokensByChain = this.getTokenByChain(filteredTokens);
13
+ if (tokensByChain === undefined)
14
+ return [];
15
+ return this.fetchPrice(tokensByChain);
16
+ }
17
+ getTokenByChain(tokens) {
18
+ const tokensByChain = {};
19
+ for (const token of tokens) {
20
+ // Ensure `args` has the expected structure
21
+ const args = token.args;
22
+ if (args?.chainId !== undefined) {
23
+ // Initialize array if it doesn't exist for the chain
24
+ if (!tokensByChain[args.chainId])
25
+ tokensByChain[args.chainId] = [];
26
+ tokensByChain[args.chainId].push(token.symbol);
27
+ }
28
+ else
29
+ log.warn(`⚠️ IndexCoop invalid token args: ${JSON.stringify(token.args)}`);
30
+ }
31
+ return tokensByChain;
32
+ }
33
+ async fetchPrice(tokensByChain) {
34
+ const res = [];
35
+ const fetchPromises = Object.entries(tokensByChain).flatMap(([chain, pairs]) => pairs.map(async (symbol) => {
36
+ const indexCoopUrl = this.buildUrl(chain, symbol);
37
+ try {
38
+ const { data } = await axios.get(indexCoopUrl, {
39
+ timeout: 10000,
40
+ });
41
+ res.push({ rate: Number.parseFloat(data.nav), token: symbol });
42
+ }
43
+ catch (e) {
44
+ log.error(`❌ IndexCoop not responding for chain ${chain}`, e);
45
+ }
46
+ }));
47
+ await Promise.all(fetchPromises);
48
+ return res;
49
+ }
50
+ buildUrl(chainId, symbol) {
51
+ return chainId !== "0"
52
+ ? `${this.baseUrl}${chainId}/${symbol.toLowerCase()}/nav`
53
+ : `${this.baseUrl}${symbol.toLowerCase()}/nav`;
54
+ }
55
+ }
@@ -0,0 +1 @@
1
+ export {};