@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,126 @@
1
+ import { Erc20__factory } from "@sdk";
2
+ import { log } from "../../utils/logger";
3
+ import { getTokensListWithCache } from "../getTokensList";
4
+ export async function getOnlyUserBalance(chainId, userAddress, tokenAddresses) {
5
+ const calls = [];
6
+ const ERC20_Interface = Erc20__factory.createInterface();
7
+ for (const tokenAddress of tokenAddresses) {
8
+ calls.push({
9
+ allowFailure: true,
10
+ callData: ERC20_Interface.encodeFunctionData("balanceOf", [userAddress]),
11
+ target: tokenAddress,
12
+ });
13
+ }
14
+ return {
15
+ cached: false,
16
+ call: {
17
+ callData: calls,
18
+ handler: () => { },
19
+ reducer: async (result) => {
20
+ const res = {};
21
+ for (let j = 0; j < tokenAddresses.length; j++) {
22
+ const tokenAddress = tokenAddresses[j];
23
+ let balance = "0";
24
+ try {
25
+ balance = ERC20_Interface.decodeFunctionResult("balanceOf", result[j])[0]?.toString();
26
+ }
27
+ catch (_error) {
28
+ log.local(`❌ Failed to call balanceOf for ${tokenAddress} on ${chainId}`);
29
+ }
30
+ res[tokenAddress] = {
31
+ balance: balance,
32
+ decimals: 0,
33
+ symbol: "",
34
+ };
35
+ }
36
+ return res;
37
+ },
38
+ },
39
+ };
40
+ }
41
+ export async function getUserBalances(user, chainId, tokenAddresses) {
42
+ const tokens = (await getTokensListWithCache())?.[chainId];
43
+ if (!tokens) {
44
+ log.debug("❌ Chain not supported");
45
+ return {
46
+ cached: false,
47
+ call: {
48
+ callData: [],
49
+ handler: () => { },
50
+ reducer: async () => {
51
+ return {};
52
+ },
53
+ },
54
+ };
55
+ }
56
+ const tokenListAddresses = Object.keys(tokens).filter(t => t !== "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE");
57
+ const ERC20_Interface = Erc20__factory.createInterface();
58
+ const calls = [];
59
+ for (const tokenAddress of tokenListAddresses) {
60
+ calls.push({
61
+ allowFailure: true,
62
+ callData: ERC20_Interface.encodeFunctionData("balanceOf", [user]),
63
+ target: tokenAddress,
64
+ });
65
+ }
66
+ /** Only if the route is called from mainnet */
67
+ if (!!tokenAddresses && tokenAddresses?.length > 0) {
68
+ for (const externalTokenAddress of tokenAddresses) {
69
+ calls.push({
70
+ allowFailure: true,
71
+ callData: ERC20_Interface.encodeFunctionData("balanceOf", [user]),
72
+ target: externalTokenAddress,
73
+ }, {
74
+ allowFailure: true,
75
+ callData: ERC20_Interface.encodeFunctionData("decimals"),
76
+ target: externalTokenAddress,
77
+ }, {
78
+ allowFailure: true,
79
+ callData: ERC20_Interface.encodeFunctionData("symbol"),
80
+ target: externalTokenAddress,
81
+ });
82
+ }
83
+ }
84
+ return {
85
+ cached: false,
86
+ call: {
87
+ callData: calls,
88
+ handler: () => { },
89
+ reducer: async (result) => {
90
+ const res = {};
91
+ for (let j = 0; j < tokenListAddresses.length; j++) {
92
+ const tokenAddress = tokenListAddresses[j];
93
+ let balance = "0";
94
+ try {
95
+ balance = ERC20_Interface.decodeFunctionResult("balanceOf", result[j])[0]?.toString();
96
+ }
97
+ catch (_error) {
98
+ log.local(`❌ Failed to call balanceOf for ${tokenAddress} on ${chainId}`);
99
+ }
100
+ res[tokenAddress] = {
101
+ balance: balance,
102
+ decimals: tokens[tokenAddress]?.decimals,
103
+ symbol: tokens[tokenAddress]?.symbol,
104
+ };
105
+ }
106
+ if (!!tokenAddresses && tokenAddresses?.length > 0) {
107
+ for (let j = 0; j < tokenAddresses.length; j++) {
108
+ const externalTokenAddress = tokenAddresses[j];
109
+ try {
110
+ res[externalTokenAddress] = {
111
+ balance: ERC20_Interface.decodeFunctionResult("balanceOf", result[Object.keys(tokens)?.length + 3 * j])[0]?.toString(),
112
+ decimals: ERC20_Interface.decodeFunctionResult("decimals", result[Object.keys(tokens)?.length + 3 * j + 1])[0]?.toString(),
113
+ symbol: ERC20_Interface.decodeFunctionResult("symbol", result[Object.keys(tokens)?.length + 3 * j + 2])[0]?.toString(),
114
+ };
115
+ }
116
+ catch (error) {
117
+ // If it fails we don't return the token info
118
+ log.local(`❌ Failed to call balanceOf, decimals or symbol for ${externalTokenAddress} on ${chainId}`);
119
+ }
120
+ }
121
+ }
122
+ return res;
123
+ },
124
+ },
125
+ };
126
+ }
@@ -0,0 +1,22 @@
1
+ import { Erc20__factory } from "@sdk";
2
+ export async function getTokenInfo(address) {
3
+ const ERC20_Interface = Erc20__factory.createInterface();
4
+ const read = ["symbol", "name", "decimals"];
5
+ const calls = read.map(fn => ({
6
+ allowFailure: false,
7
+ callData: ERC20_Interface.encodeFunctionData(fn),
8
+ target: address,
9
+ }));
10
+ return {
11
+ cached: false,
12
+ call: {
13
+ callData: calls,
14
+ handler: () => { },
15
+ reducer: async (result) => {
16
+ return read.reduce((res, fn, index) => Object.assign(res, {
17
+ [fn]: ERC20_Interface.decodeFunctionResult(fn, result[index])[0],
18
+ }), {});
19
+ },
20
+ },
21
+ };
22
+ }
@@ -0,0 +1,66 @@
1
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
+ import { AccountingService, ChainDto, DateDto, GetTransactionsQueryModel, RevenuesDto, TokensDateDto, TokensDto, } from "./";
3
+ import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
4
+ import Elysia from "elysia";
5
+ export const AccountingController = new Elysia({ prefix: "/accounting", detail: { tags: ["Accounting"] } })
6
+ .get("/", async ({ query }) => await AccountingService.getMany(query), {
7
+ query: GetTransactionsQueryModel,
8
+ headers: AuthorizationHeadersDto,
9
+ beforeHandle: async ({ headers }) => {
10
+ await BackOfficeGuard({ headers });
11
+ },
12
+ })
13
+ .group("/revenues", app => {
14
+ return app
15
+ .get("", async () => await AccountingService.getRevenue(), {
16
+ headers: AuthorizationHeadersDto,
17
+ beforeHandle: async ({ headers }) => {
18
+ await BackOfficeGuard({ headers });
19
+ },
20
+ })
21
+ .get("/per-month/:year/:month", async ({ params }) => await AccountingService.getMonthlyRevenue(params.year, params.month), {
22
+ params: DateDto,
23
+ headers: AuthorizationHeadersDto,
24
+ beforeHandle: async ({ headers }) => {
25
+ await BackOfficeGuard({ headers });
26
+ },
27
+ })
28
+ .get("/chains/:chainId", async ({ params }) => await AccountingService.getRevenueByChain(params.chainId), {
29
+ params: ChainDto,
30
+ headers: AuthorizationHeadersDto,
31
+ beforeHandle: async ({ params, headers }) => {
32
+ await BackOfficeGuard({ headers });
33
+ throwOnUnsupportedChainId(params.chainId);
34
+ },
35
+ })
36
+ .get("/chains/:chainId/per-month/:year/:month", async ({ params }) => await AccountingService.getMonthlyRevenueByChain(params.chainId, params.year, params.month), {
37
+ params: RevenuesDto,
38
+ headers: AuthorizationHeadersDto,
39
+ beforeHandle: async ({ params, headers }) => {
40
+ await BackOfficeGuard({ headers });
41
+ throwOnUnsupportedChainId(params.chainId);
42
+ },
43
+ });
44
+ })
45
+ // ─── Tokens Group ────────────────────────────────────────────────────
46
+ .group("/tokens", app => {
47
+ return app
48
+ .get("/:chainId/:tokenAddress", async ({ params }) => await AccountingService.getTokenTransaction(params.tokenAddress, params.chainId), {
49
+ params: TokensDto,
50
+ headers: AuthorizationHeadersDto,
51
+ beforeHandle: async ({ params, headers }) => {
52
+ await BackOfficeGuard({ headers });
53
+ params.tokenAddress = throwOnInvalidRequiredAddress(params.tokenAddress);
54
+ throwOnUnsupportedChainId(params.chainId);
55
+ },
56
+ })
57
+ .get("/:chainId/:tokenAddress/per-month/:year/:month", async ({ params }) => await AccountingService.getTokenMonthlyTransaction(params.tokenAddress, params.chainId, params.year, params.month), {
58
+ params: TokensDateDto,
59
+ headers: AuthorizationHeadersDto,
60
+ beforeHandle: async ({ params, headers }) => {
61
+ await BackOfficeGuard({ headers });
62
+ params.tokenAddress = throwOnInvalidRequiredAddress(params.tokenAddress);
63
+ throwOnUnsupportedChainId(params.chainId);
64
+ },
65
+ });
66
+ });
@@ -0,0 +1,32 @@
1
+ import { t } from "elysia";
2
+ export const TokensDto = t.Object({
3
+ chainId: t.Numeric(),
4
+ tokenAddress: t.String(),
5
+ });
6
+ export const GetTransactionsQueryModel = t.Object({
7
+ page: t.Optional(t.Numeric()),
8
+ items: t.Optional(t.Numeric()),
9
+ });
10
+ export const TokensDateDto = t.Object({
11
+ chainId: t.Numeric(),
12
+ tokenAddress: t.String(),
13
+ month: t.Numeric(),
14
+ year: t.Numeric(),
15
+ });
16
+ export const DateDto = t.Object({
17
+ month: t.Numeric(),
18
+ year: t.Numeric(),
19
+ });
20
+ export const ChainDto = t.Object({
21
+ chainId: t.Numeric(),
22
+ });
23
+ export const RevenuesDto = t.Object({
24
+ chainId: t.Numeric(),
25
+ month: t.Numeric(),
26
+ year: t.Numeric(),
27
+ });
28
+ export const GetRevenuesDto = t.Object({
29
+ chainId: t.Numeric(),
30
+ month: t.Numeric(),
31
+ year: t.Numeric(),
32
+ });
@@ -0,0 +1,100 @@
1
+ import { apiDbClient } from "../../../utils/prisma";
2
+ export class AccountingRepository {
3
+ static async findMany(query) {
4
+ const { page: _page, items: _items } = query;
5
+ const page = _page ? _page : 0;
6
+ const items = _items ? _items : 20;
7
+ return await apiDbClient.dump.findMany({
8
+ take: items,
9
+ skip: page * items,
10
+ });
11
+ }
12
+ static async getByTokenForDumper(fromTokenId) {
13
+ return await apiDbClient.dump.findMany({
14
+ where: {
15
+ fromTokenId,
16
+ NOT: {
17
+ recipient: {
18
+ equals: apiDbClient.dump.fields.multisig,
19
+ },
20
+ },
21
+ },
22
+ });
23
+ }
24
+ static async getForMonthForRecipient(recipient, toTokenId, month, year) {
25
+ const startDate = new Date(year, month, 0);
26
+ const endDate = new Date(year, month + 1, 0);
27
+ return await apiDbClient.dump.findMany({
28
+ where: {
29
+ toTokenId,
30
+ recipient,
31
+ datetime: {
32
+ gte: startDate,
33
+ lt: endDate,
34
+ },
35
+ },
36
+ });
37
+ }
38
+ static async getForMultisigBetweenDates(startDate, endDate) {
39
+ return await apiDbClient.dump.findMany({
40
+ where: {
41
+ recipient: {
42
+ equals: apiDbClient.dump.fields.multisig,
43
+ },
44
+ datetime: {
45
+ gte: startDate,
46
+ lt: endDate,
47
+ },
48
+ },
49
+ });
50
+ }
51
+ static async getForMultisig() {
52
+ return await apiDbClient.dump.findMany({
53
+ where: {
54
+ recipient: {
55
+ equals: apiDbClient.dump.fields.multisig,
56
+ },
57
+ },
58
+ });
59
+ }
60
+ static async getForMultisigByChain(chainId) {
61
+ return await apiDbClient.dump.findMany({
62
+ where: {
63
+ chainId,
64
+ recipient: {
65
+ equals: apiDbClient.dump.fields.multisig,
66
+ },
67
+ },
68
+ });
69
+ }
70
+ static async getForMultisigByChainBetweenDates(chainId, startDate, endDate) {
71
+ return await apiDbClient.dump.findMany({
72
+ where: {
73
+ chainId,
74
+ datetime: {
75
+ gte: startDate,
76
+ lte: endDate,
77
+ },
78
+ recipient: {
79
+ equals: apiDbClient.dump.fields.multisig,
80
+ },
81
+ },
82
+ });
83
+ }
84
+ static async getForDumperBetweenDates(fromTokenId, startDate, endDate) {
85
+ return await apiDbClient.dump.findMany({
86
+ where: {
87
+ fromTokenId,
88
+ datetime: {
89
+ gte: startDate,
90
+ lte: endDate,
91
+ },
92
+ NOT: {
93
+ recipient: {
94
+ equals: apiDbClient.dump.fields.multisig,
95
+ },
96
+ },
97
+ },
98
+ });
99
+ }
100
+ }
@@ -0,0 +1,78 @@
1
+ import { AccountingRepository } from "./accounting.repository";
2
+ import { TokenService } from "../token";
3
+ export class AccountingService {
4
+ static hashId(chainId, fromTokenId, toTokenId, timestamp) {
5
+ return Bun.hash(`${chainId}${fromTokenId}${toTokenId}${timestamp}`).toString();
6
+ }
7
+ static getTokenId(chainId, address) {
8
+ return TokenService.hashId({ chainId, address });
9
+ }
10
+ static async getMany(query) {
11
+ return await AccountingRepository.findMany(query);
12
+ }
13
+ static async getRevenue() {
14
+ const data = await AccountingRepository.getForMultisig();
15
+ let totalAmount = 0;
16
+ for (const tx of data) {
17
+ totalAmount += Number(tx.amountIn);
18
+ }
19
+ return { totalAmount };
20
+ }
21
+ static async getRevenueByChain(chainId) {
22
+ const data = await AccountingRepository.getForMultisigByChain(chainId);
23
+ let totalAmount = 0;
24
+ for (const tx of data) {
25
+ totalAmount += Number(tx.amountIn);
26
+ }
27
+ return { totalAmount };
28
+ }
29
+ static async getMonthlyRevenue(year, month) {
30
+ const startDate = new Date(year, month - 1, 1);
31
+ const endDate = new Date(year, month, 0, 23, 59, 59);
32
+ const monthlyData = await AccountingRepository.getForMultisigBetweenDates(startDate, endDate);
33
+ let totalAmount = 0;
34
+ for (const tx of monthlyData) {
35
+ totalAmount += Number(tx.amountIn);
36
+ }
37
+ return { totalAmount, from: startDate.toDateString(), to: endDate.toDateString() };
38
+ }
39
+ static async getMonthlyRevenueByChain(chainId, year, month) {
40
+ const startDate = new Date(year, month - 1, 1);
41
+ const endDate = new Date(year, month, 0, 23, 59, 59);
42
+ const monthlyData = await AccountingRepository.getForMultisigByChainBetweenDates(chainId, startDate, endDate);
43
+ let totalAmount = 0;
44
+ for (const tx of monthlyData) {
45
+ totalAmount += Number(tx.amountIn);
46
+ }
47
+ return { totalAmount, from: startDate.toDateString(), to: endDate.toDateString() };
48
+ }
49
+ static async getTokenTransaction(tokenAddress, chainId) {
50
+ const tokenId = AccountingService.getTokenId(chainId, tokenAddress);
51
+ const data = await AccountingRepository.getByTokenForDumper(tokenId);
52
+ let totalAmount = 0;
53
+ let totalAmountUSD = 0;
54
+ for (const tx of data) {
55
+ totalAmount += Number(tx.amountIn);
56
+ totalAmountUSD += Number(tx.amountOut);
57
+ }
58
+ return { totalAmount: totalAmount, totalAmountUSD: totalAmountUSD };
59
+ }
60
+ static async getTokenMonthlyTransaction(tokenAddress, chainId, year, month) {
61
+ const startDate = new Date(year, month - 1, 1);
62
+ const endDate = new Date(year, month, 0, 23, 59, 59);
63
+ const tokenId = AccountingService.getTokenId(chainId, tokenAddress);
64
+ const monthlyData = await AccountingRepository.getForDumperBetweenDates(tokenId, startDate, endDate);
65
+ let totalAmount = 0;
66
+ let totalAmountUSD = 0;
67
+ for (const tx of monthlyData) {
68
+ totalAmount += Number(tx.amountIn);
69
+ totalAmountUSD += Number(tx.amountOut);
70
+ }
71
+ return {
72
+ totalAmount: totalAmount,
73
+ totalAmountUSD: totalAmountUSD,
74
+ from: startDate.toDateString(),
75
+ to: endDate.toDateString(),
76
+ };
77
+ }
78
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./accounting.model";
2
+ export * from "./accounting.controller";
3
+ export * from "./accounting.service";
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,40 @@
1
+ import { AprType } from "../../../../database/api/.generated";
2
+ import { Campaign as CampaignTypeV3 } from "@sdk";
3
+ import moment from "moment";
4
+ export class AprService {
5
+ static hashId(opportunityId, timestamp) {
6
+ return Bun.hash(`${opportunityId}${timestamp}`).toString();
7
+ }
8
+ static extractFromDynamicData(type, campaignsDynamicData, timestamp = BigInt(moment().unix())) {
9
+ const typesWithoutApr = [CampaignTypeV3.INVALID, CampaignTypeV3.JSON_AIRDROP, CampaignTypeV3.ERC20_SNAPSHOT];
10
+ if (typesWithoutApr.includes(type))
11
+ return { timestamp, cumulated: 0, breakdowns: [] };
12
+ let cumulated = campaignsDynamicData.reduce((sum, campaign) => sum + (Number.isNaN(Number(campaign.apr)) ? 0 : Number(campaign.apr)), 0) ?? 0;
13
+ cumulated = Number.isNaN(Number(cumulated)) || !Number.isFinite(cumulated) ? 0 : cumulated;
14
+ const breakdowns = campaignsDynamicData.map(campaign => {
15
+ return {
16
+ identifier: campaign.campaignId,
17
+ type: AprType.CAMPAIGN,
18
+ value: Number.isNaN(campaign.apr) || !Number.isFinite(campaign.apr) ? 0 : Number(campaign.apr),
19
+ };
20
+ });
21
+ if (type === CampaignTypeV3.CLAMM) {
22
+ for (const campaign of campaignsDynamicData) {
23
+ if (campaign.forwarders) {
24
+ for (const forwarder of campaign.forwarders) {
25
+ breakdowns.push({
26
+ identifier: forwarder.label,
27
+ type: AprType.PROTOCOL,
28
+ value: Number.isNaN(forwarder.almAPR) || !Number.isFinite(forwarder.almAPR) ? 0 : Number(forwarder.almAPR),
29
+ });
30
+ }
31
+ }
32
+ }
33
+ }
34
+ return {
35
+ timestamp,
36
+ cumulated,
37
+ breakdowns,
38
+ };
39
+ }
40
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./apr.model";
2
+ export * from "./apr.service";
@@ -0,0 +1,45 @@
1
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
+ import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
3
+ import { NULL_ADDRESS } from "@sdk";
4
+ import Elysia from "elysia";
5
+ import { AddBlacklistDto, CheckBlacklistDto, RemoveBlacklistDto } from "./blacklist.model";
6
+ import { BlacklistService } from "./blacklist.service";
7
+ export const BlacklistController = new Elysia({ prefix: "/blacklists", detail: { tags: ["Blacklists"] } })
8
+ // ─── Get Entire Blacklist ────────────────────────────────────────────
9
+ .get("/", async () => {
10
+ return await BlacklistService.findMany();
11
+ })
12
+ // ─── Get Blacklist From Cache ────────────────────────────────────────
13
+ .get("/all", async () => {
14
+ return await BlacklistService.getMany();
15
+ })
16
+ // ─── Check If An Address Is Blacklisted ──────────────────────────────
17
+ .get("/check/:address", async ({ params }) => await BlacklistService.isBlacklisted(params.address), {
18
+ params: CheckBlacklistDto,
19
+ beforeHandle: ({ params }) => {
20
+ params.address = throwOnInvalidRequiredAddress(params.address);
21
+ },
22
+ })
23
+ // ─── Add User To Blacklist ───────────────────────────────────────────
24
+ .post("/", async ({ body }) => await BlacklistService.add({
25
+ ...body,
26
+ id: BlacklistService.hashId(body.chainId, body.userAddress, body.poolAddress),
27
+ }), {
28
+ body: AddBlacklistDto,
29
+ headers: AuthorizationHeadersDto,
30
+ beforeHandle: async ({ body, headers }) => {
31
+ await BackOfficeGuard({ headers });
32
+ body.userAddress = throwOnInvalidRequiredAddress(body.userAddress);
33
+ body.poolAddress = throwOnInvalidRequiredAddress(body.poolAddress ?? NULL_ADDRESS);
34
+ throwOnUnsupportedChainId(body.chainId);
35
+ },
36
+ })
37
+ // ─── Remove A User From Blacklist ────────────────────────────────────
38
+ .delete("/user/:address", async ({ params }) => await BlacklistService.remove(params.address), {
39
+ params: RemoveBlacklistDto,
40
+ headers: AuthorizationHeadersDto,
41
+ beforeHandle: async ({ headers, params }) => {
42
+ await BackOfficeGuard({ headers });
43
+ params.address = throwOnInvalidRequiredAddress(params.address);
44
+ },
45
+ });
@@ -0,0 +1,13 @@
1
+ import { t } from "elysia";
2
+ export const AddBlacklistDto = t.Object({
3
+ chainId: t.Numeric(),
4
+ userAddress: t.String(),
5
+ poolAddress: t.String(),
6
+ reason: t.Optional(t.String()),
7
+ });
8
+ export const CheckBlacklistDto = t.Object({
9
+ address: t.String(),
10
+ });
11
+ export const RemoveBlacklistDto = t.Object({
12
+ address: t.String(),
13
+ });
@@ -0,0 +1,56 @@
1
+ import { apiDbClient } from "../../../utils/prisma";
2
+ import { NULL_ADDRESS } from "@sdk";
3
+ import { utils } from "ethers";
4
+ export class BlacklistRepository {
5
+ static async findMany() {
6
+ return await apiDbClient.blacklist.findMany();
7
+ }
8
+ static async getMany() {
9
+ return (await BlacklistRepository.findMany()).reduce((prev, { userAddress, arrestTimestamp }) => {
10
+ if (!!arrestTimestamp) {
11
+ prev[utils.getAddress(userAddress)] = true;
12
+ }
13
+ return prev;
14
+ }, {});
15
+ }
16
+ static async check(address) {
17
+ return ((await apiDbClient.blacklist.findMany({
18
+ where: {
19
+ userAddress: address,
20
+ },
21
+ })).findIndex(x => !!x.arrestTimestamp) !== -1);
22
+ }
23
+ static async remove(address) {
24
+ const points = await apiDbClient.blacklist.findMany({ where: { userAddress: address } });
25
+ if (points?.filter(x => !!x.arrestTimestamp).length === 0) {
26
+ throw new Error(`Address ${address} is not blacklisted`);
27
+ }
28
+ for (const point of points) {
29
+ await apiDbClient.blacklist.update({
30
+ data: {
31
+ arrestTimestamp: 0,
32
+ },
33
+ where: {
34
+ chainId_userAddress_poolAddress: {
35
+ chainId: point.chainId,
36
+ userAddress: point.userAddress,
37
+ poolAddress: point.poolAddress,
38
+ },
39
+ },
40
+ });
41
+ }
42
+ return true;
43
+ }
44
+ static async add(x) {
45
+ return await apiDbClient.blacklist.create({
46
+ data: {
47
+ id: x.id,
48
+ User: { connectOrCreate: { where: { address: x.userAddress }, create: { address: x.userAddress } } },
49
+ Chain: { connect: { id: x.chainId } },
50
+ poolAddress: x.poolAddress ?? NULL_ADDRESS,
51
+ arrestTimestamp: Date.now(),
52
+ arrestDetails: !x.reason ? {} : { reason: x.reason },
53
+ },
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,24 @@
1
+ import { utils } from "ethers";
2
+ import { CacheService } from "../cache";
3
+ import { TTLPresets } from "../cache/cache.model";
4
+ import { BlacklistRepository } from "./blacklist.repository";
5
+ export class BlacklistService {
6
+ static hashId(chainId, userAddress, poolAddress) {
7
+ return Bun.hash(`${chainId}${userAddress}${poolAddress}`).toString();
8
+ }
9
+ static async getMany() {
10
+ return await CacheService.wrap(TTLPresets.MIN_5, BlacklistRepository.getMany);
11
+ }
12
+ static async findMany() {
13
+ return await BlacklistRepository.findMany();
14
+ }
15
+ static async isBlacklisted(address) {
16
+ return BlacklistRepository.check(utils.getAddress(address));
17
+ }
18
+ static async remove(address) {
19
+ return await BlacklistRepository.remove(address);
20
+ }
21
+ static async add(x) {
22
+ return await BlacklistRepository.add(x);
23
+ }
24
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./blacklist.model";
2
+ export * from "./blacklist.controller";
3
+ export * from "./blacklist.service";
@@ -0,0 +1,14 @@
1
+ export var TTLPresets;
2
+ (function (TTLPresets) {
3
+ TTLPresets[TTLPresets["MIN_1"] = 60] = "MIN_1";
4
+ TTLPresets[TTLPresets["MIN_5"] = 300] = "MIN_5";
5
+ TTLPresets[TTLPresets["MIN_10"] = 600] = "MIN_10";
6
+ TTLPresets[TTLPresets["MIN_30"] = 1800] = "MIN_30";
7
+ TTLPresets[TTLPresets["HOUR_1"] = 3600] = "HOUR_1";
8
+ TTLPresets[TTLPresets["HOUR_4"] = 14400] = "HOUR_4";
9
+ TTLPresets[TTLPresets["HOUR_8"] = 28800] = "HOUR_8";
10
+ TTLPresets[TTLPresets["HOUR_12"] = 43200] = "HOUR_12";
11
+ TTLPresets[TTLPresets["DAY_1"] = 86400] = "DAY_1";
12
+ TTLPresets[TTLPresets["WEEK_1"] = 604800] = "WEEK_1";
13
+ TTLPresets[TTLPresets["MONTH_1"] = 2592000] = "MONTH_1";
14
+ })(TTLPresets || (TTLPresets = {}));
@@ -0,0 +1,10 @@
1
+ import { REDIS_READ_TIMEOUT, REDIS_RETRIES, redisClient } from "../../../cache/redis";
2
+ import { withRetry, withTimeout } from "@sdk";
3
+ export class CacheRepository {
4
+ static async set(ttl, key, value) {
5
+ await redisClient.set(key, value, { EX: ttl });
6
+ }
7
+ static async get(key) {
8
+ return await withRetry(withTimeout, [redisClient.get(key), REDIS_READ_TIMEOUT], REDIS_RETRIES);
9
+ }
10
+ }