@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.
- package/dist/database/api/.generated/default.js +1 -0
- package/dist/database/api/.generated/edge.js +609 -0
- package/dist/database/api/.generated/index-browser.js +586 -0
- package/dist/database/api/.generated/index.js +638 -0
- package/dist/database/api/.generated/runtime/edge-esm.js +31 -0
- package/dist/database/api/.generated/runtime/edge.js +31 -0
- package/dist/database/api/.generated/runtime/index-browser.js +13 -0
- package/dist/database/api/.generated/runtime/library.js +143 -0
- package/dist/database/api/.generated/runtime/react-native.js +80 -0
- package/dist/database/api/.generated/runtime/wasm.js +32 -0
- package/dist/database/api/.generated/wasm.js +586 -0
- package/dist/database/api/seeder/resources/protocol.js +341 -0
- package/dist/database/engine/.generated/default.js +1 -0
- package/dist/database/engine/.generated/edge.js +438 -0
- package/dist/database/engine/.generated/index-browser.js +415 -0
- package/dist/database/engine/.generated/index.js +467 -0
- package/dist/database/engine/.generated/runtime/edge-esm.js +31 -0
- package/dist/database/engine/.generated/runtime/edge.js +31 -0
- package/dist/database/engine/.generated/runtime/index-browser.js +13 -0
- package/dist/database/engine/.generated/runtime/library.js +143 -0
- package/dist/database/engine/.generated/runtime/react-native.js +80 -0
- package/dist/database/engine/.generated/runtime/wasm.js +32 -0
- package/dist/database/engine/.generated/wasm.js +415 -0
- package/dist/src/backgroundJobs/index.js +44 -0
- package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +160 -0
- package/dist/src/backgroundJobs/jobs/health.js +15 -0
- package/dist/src/backgroundJobs/jobs/opportunityUpdater.js +63 -0
- package/dist/src/backgroundJobs/jobs/priceUpdater.js +16 -0
- package/dist/src/backgroundJobs/jobs/sync.js +33 -0
- package/dist/src/cache/declaration.js +146 -0
- package/dist/src/cache/index.js +152 -0
- package/dist/src/cache/redis.js +49 -0
- package/dist/src/constants.js +119 -0
- package/dist/src/entities/campaign.js +134 -0
- package/dist/src/entities/opportunity.js +549 -0
- package/dist/src/errors/BadRequest.error.js +7 -0
- package/dist/src/errors/Conflict.error.js +7 -0
- package/dist/src/errors/HttpError.js +11 -0
- package/dist/src/errors/NotFound.error.js +7 -0
- package/dist/src/errors/Opportunity.error.js +11 -0
- package/dist/src/errors/Unauthorized.error.js +7 -0
- package/dist/src/errors/index.js +5 -0
- package/dist/src/guards/BackOffice.guard.js +10 -0
- package/dist/src/guards/Engine.guard.js +10 -0
- package/dist/src/guards/TokenAuth.guard.js +10 -0
- package/dist/src/hooks/checkQueryAddressValidity.js +7 -0
- package/dist/src/hooks/checkQueryChainIdValidity.js +7 -0
- package/dist/src/index.js +79 -0
- package/dist/src/internal/controllers/endingCampaigns.js +41 -0
- package/dist/src/internal/controllers/unclaimed.js +36 -0
- package/dist/src/internal/index.js +30 -0
- package/dist/src/libs/campaigns/campaignTypes/AjnaDynamicData.js +111 -0
- package/dist/src/libs/campaigns/campaignTypes/BadgerDynamicData.js +93 -0
- package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +942 -0
- package/dist/src/libs/campaigns/campaignTypes/CompoundDynamicData.js +90 -0
- package/dist/src/libs/campaigns/campaignTypes/DolomiteDynamicData.js +60 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +162 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +159 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/eulerVaultNames.js +13 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/factoryFinder.js +29 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/getBlacklistedSupply.js +22 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/metamorphoTvl.js +35 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/spliceTVL.js +21 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +106 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AaveProcessor.js +26 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AssetProcessor.js +47 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.js +103 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerGaugeProcessor.js +83 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BalancerPoolProcessor.js +99 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/BeefyProcessor.js +51 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/CompoundProcessor.js +36 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EnzymeProcessor.js +51 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerBorrowProcessor.js +46 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/EulerLendProcessor.js +47 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FluidProcessor.js +36 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/FraxProcessor.js +41 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GearboxProcessor.js +44 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GenericProcessor.js +239 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/MetamorphoProcessor.js +43 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.js +31 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RadiantProcessor.js +58 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/RfxProcessor.js +64 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SpliceProcessor.js +35 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/SturdySiloProcessor.js +37 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TemplateProcessor.js +40 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/TorosProcessor.js +33 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/UniswapProcessor.js +48 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/WoofiProcessor.js +40 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/curveProcessor.js +68 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +77 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPrices.js +583 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPricesRefactoFinal.js +24 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.js +1209 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +194 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2.js +645 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2RefactoFinal.js +22 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3.js +392 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3RefactoFinal.js +22 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4.js +323 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4RefactoFinal.js +22 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20_SNAPSHOTDynamicData.js +38 -0
- package/dist/src/libs/campaigns/campaignTypes/EulerDynamicData.js +165 -0
- package/dist/src/libs/campaigns/campaignTypes/JSON_AIRDROPDynamicData.js +19 -0
- package/dist/src/libs/campaigns/campaignTypes/MORPHODynamicData.js +120 -0
- package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.js +112 -0
- package/dist/src/libs/campaigns/campaignTypes/SILODynamicData.js +113 -0
- package/dist/src/libs/campaigns/campaignsDynamicData.js +83 -0
- package/dist/src/libs/campaigns/campaignsDynamicDataRefacto.js +78 -0
- package/dist/src/libs/campaigns/getCampaigns.js +18 -0
- package/dist/src/libs/campaigns/utils/fetchA51Strategies.js +44 -0
- package/dist/src/libs/campaigns/utils/fetchClamInfo.js +27 -0
- package/dist/src/libs/campaigns/utils/fetchLogs.js +91 -0
- package/dist/src/libs/campaigns/utils/getCompV2ForksVaults.js +122 -0
- package/dist/src/libs/campaigns/utils/getContractCreationBlock.js +44 -0
- package/dist/src/libs/campaigns/utils/getDolomiteMarkets.js +50 -0
- package/dist/src/libs/campaigns/utils/getEulerV2Vaults.js +87 -0
- package/dist/src/libs/campaigns/utils/getLastEligibilityRatio.js +56 -0
- package/dist/src/libs/computeFee.js +34 -0
- package/dist/src/libs/custom/twtParticipants.js +54 -0
- package/dist/src/libs/deprecated-merklv3/index.js +184 -0
- package/dist/src/libs/getTokensList.js +37 -0
- package/dist/src/libs/merklChainData.js +129 -0
- package/dist/src/libs/parse/marketsWithCache.js +8 -0
- package/dist/src/libs/positions/ajna/index.js +107 -0
- package/dist/src/libs/positions/badger/index.js +79 -0
- package/dist/src/libs/positions/clamm/index.js +419 -0
- package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.js +35 -0
- package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.js +35 -0
- package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.js +44 -0
- package/dist/src/libs/positions/clamm/thegraph/index.js +162 -0
- package/dist/src/libs/positions/compound/index.js +93 -0
- package/dist/src/libs/positions/dolomite/index.js +49 -0
- package/dist/src/libs/positions/erc20/index.js +55 -0
- package/dist/src/libs/positions/euler/index.js +57 -0
- package/dist/src/libs/positions/index.js +48 -0
- package/dist/src/libs/positions/morpho/index.js +177 -0
- package/dist/src/libs/positions/prepareFetch.js +339 -0
- package/dist/src/libs/positions/silo/index.js +67 -0
- package/dist/src/libs/positions/types.js +1 -0
- package/dist/src/libs/reports/campaignReport.js +37 -0
- package/dist/src/libs/reports/mainParameterRewards.js +48 -0
- package/dist/src/libs/rewards/userRewards.js +154 -0
- package/dist/src/libs/staticCampaigns.js +10 -0
- package/dist/src/libs/tokens/balances.js +126 -0
- package/dist/src/libs/tokens/tokenInfo.js +22 -0
- package/dist/src/modules/v4/accounting/accounting.controller.js +66 -0
- package/dist/src/modules/v4/accounting/accounting.model.js +32 -0
- package/dist/src/modules/v4/accounting/accounting.repository.js +100 -0
- package/dist/src/modules/v4/accounting/accounting.service.js +78 -0
- package/dist/src/modules/v4/accounting/index.js +3 -0
- package/dist/src/modules/v4/apr/apr.controller.js +1 -0
- package/dist/src/modules/v4/apr/apr.model.js +1 -0
- package/dist/src/modules/v4/apr/apr.repository.js +1 -0
- package/dist/src/modules/v4/apr/apr.service.js +40 -0
- package/dist/src/modules/v4/apr/index.js +2 -0
- package/dist/src/modules/v4/blacklist/blacklist.controller.js +45 -0
- package/dist/src/modules/v4/blacklist/blacklist.model.js +13 -0
- package/dist/src/modules/v4/blacklist/blacklist.repository.js +56 -0
- package/dist/src/modules/v4/blacklist/blacklist.service.js +24 -0
- package/dist/src/modules/v4/blacklist/index.js +3 -0
- package/dist/src/modules/v4/cache/cache.model.js +14 -0
- package/dist/src/modules/v4/cache/cache.repository.js +10 -0
- package/dist/src/modules/v4/cache/cache.service.js +44 -0
- package/dist/src/modules/v4/cache/index.js +1 -0
- package/dist/src/modules/v4/campaign/campaign.controller.js +56 -0
- package/dist/src/modules/v4/campaign/campaign.model.js +54 -0
- package/dist/src/modules/v4/campaign/campaign.repository.js +346 -0
- package/dist/src/modules/v4/campaign/campaign.service.js +203 -0
- package/dist/src/modules/v4/campaign/index.js +3 -0
- package/dist/src/modules/v4/chain/chain.controller.js +40 -0
- package/dist/src/modules/v4/chain/chain.model.js +17 -0
- package/dist/src/modules/v4/chain/chain.repository.js +64 -0
- package/dist/src/modules/v4/chain/chain.service.js +42 -0
- package/dist/src/modules/v4/chain/index.js +3 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +19 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.model.js +6 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.repository.js +1 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.service.js +49 -0
- package/dist/src/modules/v4/dynamicData/index.js +3 -0
- package/dist/src/modules/v4/enso/enso.model.js +108 -0
- package/dist/src/modules/v4/enso/enso.service.js +46 -0
- package/dist/src/modules/v4/explorer/explorer.model.js +2 -0
- package/dist/src/modules/v4/explorer/explorer.repository.js +23 -0
- package/dist/src/modules/v4/explorer/explorer.service.js +24 -0
- package/dist/src/modules/v4/explorer/index.js +1 -0
- package/dist/src/modules/v4/index.js +4 -0
- package/dist/src/modules/v4/merklRoot/index.js +3 -0
- package/dist/src/modules/v4/merklRoot/merklRoot.controller.js +19 -0
- package/dist/src/modules/v4/merklRoot/merklRoot.model.js +6 -0
- package/dist/src/modules/v4/merklRoot/merklRoot.repository.js +31 -0
- package/dist/src/modules/v4/merklRoot/merklRoot.service.js +38 -0
- package/dist/src/modules/v4/opportunity/index.js +3 -0
- package/dist/src/modules/v4/opportunity/opportunity.controller.js +69 -0
- package/dist/src/modules/v4/opportunity/opportunity.model.js +36 -0
- package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +14 -0
- package/dist/src/modules/v4/opportunity/opportunity.repository.js +217 -0
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +0 -15
- package/dist/src/modules/v4/opportunity/opportunity.service.js +180 -0
- package/dist/src/modules/v4/opportunity/subservices/getAjnaMetadata.service.js +50 -0
- package/dist/src/modules/v4/opportunity/subservices/getBadgerMetadata.service.js +23 -0
- package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +33 -0
- package/dist/src/modules/v4/opportunity/subservices/getCompoundMetadata.service.js +18 -0
- package/dist/src/modules/v4/opportunity/subservices/getDolomiteMetadata.service.js +15 -0
- package/dist/src/modules/v4/opportunity/subservices/getErc20Metadata.service.js +63 -0
- package/dist/src/modules/v4/opportunity/subservices/getErc20SnapshotMetadata.service.js +8 -0
- package/dist/src/modules/v4/opportunity/subservices/getEulerMetadata.service.js +30 -0
- package/dist/src/modules/v4/opportunity/subservices/getJsonAirDropMetadata.service.js +36 -0
- package/dist/src/modules/v4/opportunity/subservices/getMorphoMetadata.service.js +19 -0
- package/dist/src/modules/v4/opportunity/subservices/getRadiantMetadata.service.js +9 -0
- package/dist/src/modules/v4/opportunity/subservices/getSiloMetadata.service.js +13 -0
- package/dist/src/modules/v4/opportunity/transform-id.pipe.js +6 -0
- package/dist/src/modules/v4/opportunity/validate-id.pipe.js +12 -0
- package/dist/src/modules/v4/participate/participate.controller.js +66 -0
- package/dist/src/modules/v4/participate/participate.model.js +24 -0
- package/dist/src/modules/v4/participate/participate.service.js +33 -0
- package/dist/src/modules/v4/price/index.js +3 -0
- package/dist/src/modules/v4/price/price.controller.js +62 -0
- package/dist/src/modules/v4/price/price.model.js +12 -0
- package/dist/src/modules/v4/price/price.repository.js +18 -0
- package/dist/src/modules/v4/price/price.service.js +44 -0
- package/dist/src/modules/v4/prisma/index.js +1 -0
- package/dist/src/modules/v4/protocol/index.js +3 -0
- package/dist/src/modules/v4/protocol/protocol.controller.js +23 -0
- package/dist/src/modules/v4/protocol/protocol.model.js +68 -0
- package/dist/src/modules/v4/protocol/protocol.repository.js +37 -0
- package/dist/src/modules/v4/protocol/protocol.service.js +77 -0
- package/dist/src/modules/v4/reward/index.js +3 -0
- package/dist/src/modules/v4/reward/reward.controller.js +52 -0
- package/dist/src/modules/v4/reward/reward.model.js +104 -0
- package/dist/src/modules/v4/reward/reward.repository.js +237 -0
- package/dist/src/modules/v4/reward/reward.service.js +283 -0
- package/dist/src/modules/v4/reward/rewardConvertor.service.js +136 -0
- package/dist/src/modules/v4/router.js +57 -0
- package/dist/src/modules/v4/status/index.js +3 -0
- package/dist/src/modules/v4/status/status.controller.js +48 -0
- package/dist/src/modules/v4/status/status.model.js +24 -0
- package/dist/src/modules/v4/status/status.repository.js +88 -0
- package/dist/src/modules/v4/status/status.service.js +60 -0
- package/dist/src/modules/v4/token/index.js +3 -0
- package/dist/src/modules/v4/token/token.controller.js +32 -0
- package/dist/src/modules/v4/token/token.model.js +23 -0
- package/dist/src/modules/v4/token/token.repository.js +128 -0
- package/dist/src/modules/v4/token/token.service.js +268 -0
- package/dist/src/modules/v4/tvl/index.js +2 -0
- package/dist/src/modules/v4/tvl/tvl.controller.js +1 -0
- package/dist/src/modules/v4/tvl/tvl.model.js +1 -0
- package/dist/src/modules/v4/tvl/tvl.repository.js +1 -0
- package/dist/src/modules/v4/tvl/tvl.service.js +49 -0
- package/dist/src/modules/v4/uniswapV4/index.js +4 -0
- package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.js +11 -0
- package/dist/src/modules/v4/uniswapV4/uniswapV4.model.js +17 -0
- package/dist/src/modules/v4/uniswapV4/uniswapV4.repository.js +2 -0
- package/dist/src/modules/v4/uniswapV4/uniswapV4.service.js +73 -0
- package/dist/src/modules/v4/user/index.js +3 -0
- package/dist/src/modules/v4/user/user.controller.js +69 -0
- package/dist/src/modules/v4/user/user.model.js +18 -0
- package/dist/src/modules/v4/user/user.repository.js +38 -0
- package/dist/src/modules/v4/user/user.service.js +50 -0
- package/dist/src/plugins/error-handling.plugin.js +28 -0
- package/dist/src/plugins/logger.plugin.js +22 -0
- package/dist/src/routes/v1/allowances.js +115 -0
- package/dist/src/routes/v1/balances.js +25 -0
- package/dist/src/routes/v1/prices.js +11 -0
- package/dist/src/routes/v1/tokens.js +17 -0
- package/dist/src/routes/v2/merkl.js +13 -0
- package/dist/src/routes/v3/ERC20Campaigns.js +63 -0
- package/dist/src/routes/v3/app.js +18 -0
- package/dist/src/routes/v3/blacklist.js +18 -0
- package/dist/src/routes/v3/campaign/delay.js +78 -0
- package/dist/src/routes/v3/campaignClaims.js +24 -0
- package/dist/src/routes/v3/campaignReport.js +22 -0
- package/dist/src/routes/v3/campaignUnclaimed.js +28 -0
- package/dist/src/routes/v3/campaigns.js +101 -0
- package/dist/src/routes/v3/campaignsForMainParameter.js +19 -0
- package/dist/src/routes/v3/campaignsInfo.js +54 -0
- package/dist/src/routes/v3/campaignsRewardsReport.js +47 -0
- package/dist/src/routes/v3/claims.js +45 -0
- package/dist/src/routes/v3/compoundV2.js +9 -0
- package/dist/src/routes/v3/createCampaign.js +66 -0
- package/dist/src/routes/v3/dolomite.js +9 -0
- package/dist/src/routes/v3/euler.js +9 -0
- package/dist/src/routes/v3/exports/campaigns.js +28 -0
- package/dist/src/routes/v3/fetch.js +27 -0
- package/dist/src/routes/v3/health.js +13 -0
- package/dist/src/routes/v3/lostyield.js +98 -0
- package/dist/src/routes/v3/merkl.js +119 -0
- package/dist/src/routes/v3/morphoMarkets.js +27 -0
- package/dist/src/routes/v3/morphoVaults.js +22 -0
- package/dist/src/routes/v3/multiChainPositions.js +69 -0
- package/dist/src/routes/v3/opportunity.js +63 -0
- package/dist/src/routes/v3/overview.js +73 -0
- package/dist/src/routes/v3/parse.js +23 -0
- package/dist/src/routes/v3/payload.js +40 -0
- package/dist/src/routes/v3/poolInfo.js +88 -0
- package/dist/src/routes/v3/positions.js +62 -0
- package/dist/src/routes/v3/radiant.js +26 -0
- package/dist/src/routes/v3/recipients.js +20 -0
- package/dist/src/routes/v3/rewards.js +33 -0
- package/dist/src/routes/v3/rewardsReport.js +51 -0
- package/dist/src/routes/v3/rootForTimestamp.js +47 -0
- package/dist/src/routes/v3/silo.js +20 -0
- package/dist/src/routes/v3/token.js +24 -0
- package/dist/src/routes/v3/tokenUnclaimed.js +24 -0
- package/dist/src/routes/v3/twt/participants.js +11 -0
- package/dist/src/routes/v3/updates.js +47 -0
- package/dist/src/routes/v3/userRewards.js +59 -0
- package/dist/src/types/index.js +6 -0
- package/dist/src/types/parameters/Action.js +11 -0
- package/dist/src/types/parameters/Chain.js +13 -0
- package/dist/src/types/parameters/ChainCampaignId.js +13 -0
- package/dist/src/types/parameters/MainParameter.js +19 -0
- package/dist/src/types/parameters/OpportunityId.js +14 -0
- package/dist/src/types/parameters/Timestamp.js +16 -0
- package/dist/src/types/parameters/Type.js +15 -0
- package/dist/src/types/parameters/index.js +17 -0
- package/dist/src/types/returnTypes.js +1 -0
- package/dist/src/types/utils.js +1 -0
- package/dist/src/utils/addString.js +6 -0
- package/dist/src/utils/bigintToString.js +20 -0
- package/dist/src/utils/crypto.js +4 -0
- package/dist/src/utils/decodeCalls.js +170 -0
- package/dist/src/utils/encodeCalls.js +240 -0
- package/dist/src/utils/error.js +90 -0
- package/dist/src/utils/execute.js +41 -0
- package/dist/src/utils/generateCardName.js +89 -0
- package/dist/src/utils/generic.js +117 -0
- package/dist/src/utils/hashArray.js +4 -0
- package/dist/src/utils/lastBlockBefore.js +78 -0
- package/dist/src/utils/logger.js +52 -0
- package/dist/src/utils/pricer.js +180 -0
- package/dist/src/utils/prices/chainlinkRead.js +8 -0
- package/dist/src/utils/prices/curveVirtualPrice.js +7 -0
- package/dist/src/utils/prices/getDQUICK.js +8 -0
- package/dist/src/utils/prices/priceFetcherFactory.js +29 -0
- package/dist/src/utils/prices/priceService.js +328 -0
- package/dist/src/utils/prices/services/coinGeckoService.js +53 -0
- package/dist/src/utils/prices/services/defillamaService.js +53 -0
- package/dist/src/utils/prices/services/dexScreenerService.js +62 -0
- package/dist/src/utils/prices/services/erc4626Service.js +30 -0
- package/dist/src/utils/prices/services/getERC4626.js +11 -0
- package/dist/src/utils/prices/services/indexCoopService.js +55 -0
- package/dist/src/utils/prices/services/priceFetcher.js +1 -0
- package/dist/src/utils/prices/uniV2Price.js +40 -0
- package/dist/src/utils/prisma.js +12 -0
- package/dist/src/utils/providers.js +30 -0
- package/dist/src/utils/queries/activeCampaigns.js +22 -0
- package/dist/src/utils/queries/allCampaigns.js +51 -0
- package/dist/src/utils/queries/campaignsForMainParameter.js +23 -0
- package/dist/src/utils/queries/claimsOverTime.js +111 -0
- package/dist/src/utils/queries/endingCampaigns.js +21 -0
- package/dist/src/utils/queries/futureCampaigns.js +19 -0
- package/dist/src/utils/queries/mainParameterCampaigns.js +11 -0
- package/dist/src/utils/queries/rewardsAmount.js +106 -0
- package/dist/src/utils/queries/unclaimed.js +81 -0
- package/dist/src/utils/rateLimit.js +13 -0
- package/dist/src/utils/stryke.js +4 -0
- package/dist/src/utils/throw.js +27 -0
- package/dist/src/utils/validation.js +20 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/package.json +0 -91
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import param from "../../types/parameters";
|
|
2
|
+
import { ANGLE_NETWORKS } from "@sdk";
|
|
3
|
+
import { withTimeout } from "@sdk";
|
|
4
|
+
import { t } from "elysia";
|
|
5
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
6
|
+
import { merklChainDataWithCache } from "../../libs/merklChainData";
|
|
7
|
+
import { log } from "../../utils/logger";
|
|
8
|
+
export const query = t.Object({
|
|
9
|
+
chainId: t.Optional(param.Chain.type),
|
|
10
|
+
});
|
|
11
|
+
export const response = t.Object({
|
|
12
|
+
disputes: t.Record(t.String({ title: "ChainId" }), t.Object({
|
|
13
|
+
disputeLive: t.Boolean(),
|
|
14
|
+
endOfDisputePeriod: t.Number(),
|
|
15
|
+
root: t.String(),
|
|
16
|
+
treeRoot: t.String(),
|
|
17
|
+
lastTreeRoot: t.String(),
|
|
18
|
+
})),
|
|
19
|
+
rewardTokens: t.Record(t.String({ title: "ChainId" }), t.Array(t.Union([
|
|
20
|
+
t.Object({
|
|
21
|
+
decimals: t.Number(),
|
|
22
|
+
minimumAmountPerEpoch: t.Number(),
|
|
23
|
+
symbol: t.String(),
|
|
24
|
+
token: t.String(),
|
|
25
|
+
}),
|
|
26
|
+
t.Object({
|
|
27
|
+
decimals: t.Number(),
|
|
28
|
+
minimumAmountPerEpoch: t.Number(),
|
|
29
|
+
isTokenWrapper: t.String(),
|
|
30
|
+
token: t.String(),
|
|
31
|
+
}),
|
|
32
|
+
]))),
|
|
33
|
+
});
|
|
34
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query }) => {
|
|
35
|
+
const chainId = query.chainId;
|
|
36
|
+
const result = {
|
|
37
|
+
disputes: {},
|
|
38
|
+
rewardTokens: {},
|
|
39
|
+
};
|
|
40
|
+
const promises = [];
|
|
41
|
+
const chainsToInspect = chainId ? [chainId] : ANGLE_NETWORKS.merkl;
|
|
42
|
+
for (const chain of chainsToInspect) {
|
|
43
|
+
promises.push(withTimeout(merklChainDataWithCache(chain), 5000));
|
|
44
|
+
}
|
|
45
|
+
const merklChainDataPromises = await Promise.allSettled(promises);
|
|
46
|
+
for (let i = 0; i < merklChainDataPromises.length; i++) {
|
|
47
|
+
const merklChainDataPromise = merklChainDataPromises[i];
|
|
48
|
+
if (merklChainDataPromise.status === "rejected") {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const merklChainData = merklChainDataPromise.value;
|
|
52
|
+
if (!!merklChainData && !!merklChainData?.validRewardTokens) {
|
|
53
|
+
result.disputes[chainsToInspect[i]] = {
|
|
54
|
+
disputeLive: merklChainData.disputeLive,
|
|
55
|
+
endOfDisputePeriod: merklChainData.endOfDisputePeriod ?? 0,
|
|
56
|
+
root: merklChainData.merkleRoot,
|
|
57
|
+
treeRoot: merklChainData.treeRoot,
|
|
58
|
+
lastTreeRoot: merklChainData.lastTreeRoot,
|
|
59
|
+
};
|
|
60
|
+
result.rewardTokens[chainsToInspect[i]] = merklChainData.validRewardTokens;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
log.local(`Failed to get validRewardTokens for chain ${chainsToInspect[i]}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}, {
|
|
68
|
+
transform({ query }) {
|
|
69
|
+
query.chainId = !query.chainId ? undefined : Number.parseInt(query.chainId);
|
|
70
|
+
},
|
|
71
|
+
query,
|
|
72
|
+
tags: ["Merkl"],
|
|
73
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { parseCampaign } from "@sdk";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
4
|
+
export const query = t.Object({
|
|
5
|
+
campaign: t.Any(),
|
|
6
|
+
chainId: t.Numeric(),
|
|
7
|
+
index: t.Optional(t.Numeric()),
|
|
8
|
+
});
|
|
9
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async (request) => {
|
|
10
|
+
const chainId = request.query.chainId;
|
|
11
|
+
try {
|
|
12
|
+
const parsingResult = await parseCampaign(chainId, await JSON.parse(request.query.campaign), request.query.index ?? 0);
|
|
13
|
+
if (parsingResult.success)
|
|
14
|
+
return JSON.stringify(parsingResult.parsedCampaign);
|
|
15
|
+
throw parsingResult.message;
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
return { message: `Error parsing campaign: ${e}`, name: "Error" };
|
|
19
|
+
}
|
|
20
|
+
}, {
|
|
21
|
+
query,
|
|
22
|
+
tags: ["Campaigns"],
|
|
23
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BASE_9, Campaign, buildCampaignPayload, parseCampaign } from "@sdk";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
import { BigNumber } from "ethers";
|
|
4
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
5
|
+
import { computeFee } from "../../libs/computeFee";
|
|
6
|
+
export const query = t.Object({
|
|
7
|
+
chainId: t.Numeric(),
|
|
8
|
+
config: t.String(),
|
|
9
|
+
signature: t.Optional(t.Any()),
|
|
10
|
+
});
|
|
11
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async (request) => {
|
|
12
|
+
const chainId = request.query.chainId;
|
|
13
|
+
// TODO cleaner type enforcing and conversion
|
|
14
|
+
const parsedConfig = JSON.parse(request.query.config);
|
|
15
|
+
if (!!parsedConfig.url) {
|
|
16
|
+
if (!parsedConfig.url.startsWith("http")) {
|
|
17
|
+
parsedConfig.url = Buffer.from(parsedConfig.url, "base64").toString("utf-8");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const feePromise = computeFee(chainId, parsedConfig);
|
|
21
|
+
/** In the json case the amount given is "post-fees" */
|
|
22
|
+
let fee;
|
|
23
|
+
if (parsedConfig.campaignType === Campaign.JSON_AIRDROP) {
|
|
24
|
+
fee = (await feePromise).fee;
|
|
25
|
+
parsedConfig.amount = BigNumber.from(parsedConfig.amount)?.mul(BASE_9)?.div(BASE_9.sub(fee)).add(1).toString();
|
|
26
|
+
}
|
|
27
|
+
const { args, payload } = buildCampaignPayload(parsedConfig, chainId, request.query.signature);
|
|
28
|
+
const parsingResult = await parseCampaign(chainId, args, 0);
|
|
29
|
+
if (!parsingResult.success) {
|
|
30
|
+
return { message: parsingResult.message, name: "Error" };
|
|
31
|
+
}
|
|
32
|
+
/** In other cases we can compute the fee only now */
|
|
33
|
+
if (parsedConfig.campaignType !== Campaign.JSON_AIRDROP) {
|
|
34
|
+
fee = (await feePromise).fee;
|
|
35
|
+
}
|
|
36
|
+
return { args, parsedCampaign: parsingResult.parsedCampaign, payload, fee };
|
|
37
|
+
}, {
|
|
38
|
+
query,
|
|
39
|
+
tags: ["Campaigns"],
|
|
40
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AMM, BN2Number, FactoryAddress, IzumiPool__factory, UniswapV3Pool__factory } from "@sdk";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
import { ethers, utils } from "ethers";
|
|
4
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
5
|
+
import { log } from "../../utils/logger";
|
|
6
|
+
import { providers } from "../../utils/providers";
|
|
7
|
+
const fetchPoolData = async (poolAddress, chainId) => {
|
|
8
|
+
const result = {};
|
|
9
|
+
const poolContract = UniswapV3Pool__factory.connect(poolAddress.toLowerCase(), providers[chainId]);
|
|
10
|
+
const izumiContract = IzumiPool__factory.connect(poolAddress.toLowerCase(), providers[chainId]);
|
|
11
|
+
try {
|
|
12
|
+
let poolName = "";
|
|
13
|
+
const factory = await poolContract.factory();
|
|
14
|
+
let found = false;
|
|
15
|
+
for (const amm in AMM) {
|
|
16
|
+
// enums store both name and index as keys, we are only interesed by the names one
|
|
17
|
+
if (!Number.isNaN(Number(amm)))
|
|
18
|
+
continue;
|
|
19
|
+
const sdkFactoryAddress = FactoryAddress[chainId][AMM[amm]];
|
|
20
|
+
if (!!sdkFactoryAddress &&
|
|
21
|
+
utils.getAddress(factory.toLowerCase()) === utils.getAddress(sdkFactoryAddress.toLowerCase())) {
|
|
22
|
+
found = true;
|
|
23
|
+
result.amm = AMM[amm];
|
|
24
|
+
poolName += `${amm} - `;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!found)
|
|
29
|
+
return result;
|
|
30
|
+
try {
|
|
31
|
+
const token0 = await poolContract.token0();
|
|
32
|
+
result.token0 = token0;
|
|
33
|
+
const tokenContract = new ethers.Contract(token0, ["function symbol() external view returns(string)"], providers[chainId]);
|
|
34
|
+
poolName += await tokenContract.symbol();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
try {
|
|
38
|
+
const token0 = await izumiContract.tokenX();
|
|
39
|
+
result.token0 = token0;
|
|
40
|
+
const tokenContract = new ethers.Contract(token0, ["function symbol() external view returns(string)"], providers[chainId]);
|
|
41
|
+
poolName += await tokenContract.symbol();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
log.error(`❌ cannot fetch token0 data for ${poolName}`, error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const token1 = await poolContract.token1();
|
|
49
|
+
result.token1 = token1;
|
|
50
|
+
const tokenContract = new ethers.Contract(token1, ["function symbol() external view returns(string)"], providers[chainId]);
|
|
51
|
+
poolName += `/${await tokenContract.symbol()}`;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
try {
|
|
55
|
+
const token1 = await izumiContract.tokenY();
|
|
56
|
+
result.token1 = token1;
|
|
57
|
+
const tokenContract = new ethers.Contract(token1, ["function symbol() external view returns(string)"], providers[chainId]);
|
|
58
|
+
poolName += await tokenContract.symbol();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
log.error(`❌ cannot fetch token1 data for ${poolName}`, error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const fee = await poolContract.fee();
|
|
66
|
+
result.fee = BN2Number(fee, 4);
|
|
67
|
+
poolName += `-${BN2Number(fee, 4)}%`;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
log.error(`cannot fetch fee for ${poolName}`, error);
|
|
71
|
+
}
|
|
72
|
+
result.name = poolName;
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
log.error("fetchUniswapV3PoolData failed", e);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
};
|
|
79
|
+
export const query = t.Object({
|
|
80
|
+
chainId: t.Numeric(),
|
|
81
|
+
poolAddress: t.String(),
|
|
82
|
+
});
|
|
83
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query }) => {
|
|
84
|
+
return await fetchPoolData(query.poolAddress, query.chainId);
|
|
85
|
+
}, {
|
|
86
|
+
query,
|
|
87
|
+
tags: ["Protocols"],
|
|
88
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Redis } from "../../cache";
|
|
2
|
+
import param from "../../types/parameters";
|
|
3
|
+
import { Campaign } from "@sdk";
|
|
4
|
+
import { t } from "elysia";
|
|
5
|
+
import checkQueryAddressValidity from "../../hooks/checkQueryAddressValidity";
|
|
6
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
7
|
+
import { getUserPositionsV2 } from "../../libs/positions";
|
|
8
|
+
import { prepareFetch } from "../../libs/positions/prepareFetch";
|
|
9
|
+
export const query = t.Object({
|
|
10
|
+
chainId: param.Chain.type,
|
|
11
|
+
user: t.String(),
|
|
12
|
+
});
|
|
13
|
+
const positions = {
|
|
14
|
+
[Campaign.CLAMM]: t.Object({
|
|
15
|
+
almAddress: t.Optional(t.String()),
|
|
16
|
+
id: t.String(),
|
|
17
|
+
origin: t.Number(),
|
|
18
|
+
inRangeLiquidity: t.Number(),
|
|
19
|
+
lowerTick: t.Number(),
|
|
20
|
+
upperTick: t.Number(),
|
|
21
|
+
totalLiquidity: t.Number(),
|
|
22
|
+
tvl: t.Number(),
|
|
23
|
+
balance0: t.Number(),
|
|
24
|
+
balance1: t.Number(),
|
|
25
|
+
}),
|
|
26
|
+
[Campaign.SILO]: t.Object({
|
|
27
|
+
origin: t.String(),
|
|
28
|
+
totalSupply: t.Number(),
|
|
29
|
+
tvl: t.Number(),
|
|
30
|
+
balance: t.Number(),
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
export const response = t.Record(t.TemplateLiteral([param.Type.type, t.Literal("_"), t.String()]), t.Object({
|
|
34
|
+
userPositions: t.Array(t.Union(Object.values(positions))),
|
|
35
|
+
}));
|
|
36
|
+
export default (app) => app
|
|
37
|
+
.use(checkQueryAddressValidity())
|
|
38
|
+
.use(checkQueryChainIdValidity())
|
|
39
|
+
.get("", async ({ query }) => {
|
|
40
|
+
const user = query.user;
|
|
41
|
+
const chainId = query.chainId;
|
|
42
|
+
// Check that chainId is a valid MerklChainId
|
|
43
|
+
const allOpportunities = await Redis.get("LiveCampaigns", chainId);
|
|
44
|
+
if (!allOpportunities) {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
const positionsToCheck = {}; // TODO: add typing (depends on campaign type)
|
|
48
|
+
for (const campaigns of Object.values(allOpportunities)) {
|
|
49
|
+
for (const campaign of Object.values(campaigns)) {
|
|
50
|
+
const type = campaign.campaignType;
|
|
51
|
+
// Allows to have only one call getting campaign data
|
|
52
|
+
positionsToCheck[type] = prepareFetch(type, positionsToCheck[type] ? positionsToCheck[type] : {}, campaign);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return await getUserPositionsV2(positionsToCheck, chainId, user);
|
|
56
|
+
}, {
|
|
57
|
+
transform({ query }) {
|
|
58
|
+
query.chainId = !query.chainId ? undefined : Number.parseInt(query.chainId);
|
|
59
|
+
},
|
|
60
|
+
query,
|
|
61
|
+
tags: ["Merkl"],
|
|
62
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getRadiantMarketsWithCache } from "../../libs/parse/marketsWithCache";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
export const query = t.Object({
|
|
4
|
+
poolAddressProvider: t.String(),
|
|
5
|
+
chainId: t.Numeric(),
|
|
6
|
+
});
|
|
7
|
+
export const response = t.Array(t.Object({
|
|
8
|
+
asset: t.String(),
|
|
9
|
+
symbol: t.String(),
|
|
10
|
+
aToken: t.Optional(t.String()),
|
|
11
|
+
stableDebtToken: t.Optional(t.String()),
|
|
12
|
+
variableDebtToken: t.Optional(t.String()),
|
|
13
|
+
aTokenSymbol: t.Optional(t.String()),
|
|
14
|
+
aTokenName: t.Optional(t.String()),
|
|
15
|
+
vdTokenSymbol: t.Optional(t.String()),
|
|
16
|
+
vdTokenName: t.Optional(t.String()),
|
|
17
|
+
vault: t.Optional(t.String()),
|
|
18
|
+
vaultSymbol: t.Optional(t.String()),
|
|
19
|
+
}));
|
|
20
|
+
export default (app) => app.get("", async (request) => {
|
|
21
|
+
const chainId = request.query.chainId;
|
|
22
|
+
return await getRadiantMarketsWithCache(chainId, request.query.poolAddressProvider);
|
|
23
|
+
}, {
|
|
24
|
+
query,
|
|
25
|
+
tags: ["Protocols"],
|
|
26
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getCampaignRewardsWithCache } from "../../libs/reports/campaignReport";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
4
|
+
import { merklChainDataWithCache } from "../../libs/merklChainData";
|
|
5
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query }) => {
|
|
6
|
+
const campaignId = query.campaignId;
|
|
7
|
+
const chainId = query.chainId;
|
|
8
|
+
const root = (await merklChainDataWithCache(chainId)).merkleRoot;
|
|
9
|
+
let recipients = [];
|
|
10
|
+
if (!!root) {
|
|
11
|
+
recipients = await getCampaignRewardsWithCache(chainId, root, campaignId);
|
|
12
|
+
}
|
|
13
|
+
return recipients;
|
|
14
|
+
}, {
|
|
15
|
+
query: t.Object({
|
|
16
|
+
campaignId: t.String(),
|
|
17
|
+
chainId: t.Numeric(),
|
|
18
|
+
}),
|
|
19
|
+
tags: ["Campaigns"],
|
|
20
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RewardService } from "../../modules/v4/reward";
|
|
2
|
+
import { RewardConvertorService } from "../../modules/v4/reward/rewardConvertor.service";
|
|
3
|
+
import { ChainId, isSupportedChain } from "@sdk";
|
|
4
|
+
import { t } from "elysia";
|
|
5
|
+
import checkQueryAddressValidity from "../../hooks/checkQueryAddressValidity";
|
|
6
|
+
export const query = t.Object({
|
|
7
|
+
chainIds: t.Optional(t.Union([t.String(), t.Array(t.String())])),
|
|
8
|
+
user: t.String(),
|
|
9
|
+
creatorTag: t.Optional(t.String()),
|
|
10
|
+
});
|
|
11
|
+
export default (app) => app.use(checkQueryAddressValidity()).get("", async ({ query }) => {
|
|
12
|
+
let rawChainIds = query.chainIds;
|
|
13
|
+
if (typeof rawChainIds === "string" && rawChainIds.includes(",")) {
|
|
14
|
+
rawChainIds = rawChainIds.split(",");
|
|
15
|
+
}
|
|
16
|
+
let chainIds;
|
|
17
|
+
if (!rawChainIds) {
|
|
18
|
+
chainIds = Object.keys(ChainId)
|
|
19
|
+
.map(k => Number.parseInt(k))
|
|
20
|
+
.filter(k => isSupportedChain(k, "merkl"));
|
|
21
|
+
}
|
|
22
|
+
else if (typeof rawChainIds === "string") {
|
|
23
|
+
chainIds = [Number.parseInt(rawChainIds)];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
chainIds = rawChainIds.map(chainId => Number.parseInt(chainId));
|
|
27
|
+
}
|
|
28
|
+
const user = query.user;
|
|
29
|
+
// @Warning: this is not taking into account the creator tag filter
|
|
30
|
+
const v4Res = await RewardService.getUserRewardsByChain(user, false, chainIds);
|
|
31
|
+
const v3Res = RewardConvertorService.convertV4toRewardV3(v4Res);
|
|
32
|
+
return v3Res;
|
|
33
|
+
}, { query, tags: ["Rewards"] });
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { t } from "elysia";
|
|
2
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
3
|
+
import { merklChainDataWithCache } from "../../libs/merklChainData";
|
|
4
|
+
import { getCampaignRewardsDeltaWithCache, getCampaignRewardsWithCache } from "../../libs/reports/campaignReport";
|
|
5
|
+
import { getRewardsMainParameterDeltaWithCache, getRewardsMainParameterWithCache, } from "../../libs/reports/mainParameterRewards";
|
|
6
|
+
import { InvalidParameter } from "../../utils/error";
|
|
7
|
+
export const query = t.Object({
|
|
8
|
+
campaignId: t.Optional(t.String()),
|
|
9
|
+
chainId: t.Numeric(),
|
|
10
|
+
from: t.Optional(t.Numeric()),
|
|
11
|
+
mainParameter: t.Optional(t.String()),
|
|
12
|
+
to: t.Optional(t.Numeric()),
|
|
13
|
+
});
|
|
14
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query, set }) => {
|
|
15
|
+
const mainParameter = query.mainParameter;
|
|
16
|
+
const campaignId = query.campaignId;
|
|
17
|
+
const chainId = query.chainId;
|
|
18
|
+
const from = query.from;
|
|
19
|
+
const to = query.to;
|
|
20
|
+
if ((!!to && !from) || (!to && !!from))
|
|
21
|
+
throw new InvalidParameter("API for Merkl products by Angle Labs requires both from and to timestamps when to timestamp is provided");
|
|
22
|
+
if (!!campaignId && !!mainParameter)
|
|
23
|
+
throw new InvalidParameter("API for Merkl products by Angle Labs requires either a campaignId or a mainParameter, not both");
|
|
24
|
+
if (!campaignId && !mainParameter)
|
|
25
|
+
throw new InvalidParameter("API for Merkl products by Angle Labs requires either a campaignId or a mainParameter");
|
|
26
|
+
if (!to && !from) {
|
|
27
|
+
// Get the latest root and return the current rewards state
|
|
28
|
+
const currentRoot = (await merklChainDataWithCache(chainId)).merkleRoot;
|
|
29
|
+
if (!currentRoot) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
if (!!campaignId) {
|
|
33
|
+
return await getCampaignRewardsWithCache(chainId, currentRoot, campaignId);
|
|
34
|
+
}
|
|
35
|
+
if (!!mainParameter) {
|
|
36
|
+
return await getRewardsMainParameterWithCache(chainId, currentRoot, mainParameter);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!!to && !!from) {
|
|
40
|
+
if (!!campaignId) {
|
|
41
|
+
return await getCampaignRewardsDeltaWithCache(chainId, from, to, campaignId);
|
|
42
|
+
}
|
|
43
|
+
if (!!mainParameter) {
|
|
44
|
+
return await getRewardsMainParameterDeltaWithCache(chainId, from, to, mainParameter);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}, {
|
|
49
|
+
query,
|
|
50
|
+
tags: ["Rewards"],
|
|
51
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import param from "../../types/parameters";
|
|
2
|
+
import { engineDbClient } from "../../utils/prisma";
|
|
3
|
+
import { t } from "elysia";
|
|
4
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
5
|
+
export const query = t.Object({
|
|
6
|
+
chainId: t.Numeric(),
|
|
7
|
+
timestamp: t.Numeric(),
|
|
8
|
+
});
|
|
9
|
+
export const response = t.Object({
|
|
10
|
+
chainId: param.Chain.type,
|
|
11
|
+
epoch: t.Number(),
|
|
12
|
+
root: t.String(),
|
|
13
|
+
timestamp: t.Number(),
|
|
14
|
+
});
|
|
15
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query }) => {
|
|
16
|
+
const chainId = query.chainId;
|
|
17
|
+
// Query all campaigns
|
|
18
|
+
let root = await engineDbClient.merklRoots.findFirst({
|
|
19
|
+
orderBy: {
|
|
20
|
+
timestamp: "desc",
|
|
21
|
+
},
|
|
22
|
+
where: {
|
|
23
|
+
chainId: chainId,
|
|
24
|
+
timestamp: {
|
|
25
|
+
lte: query.timestamp,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (!root) {
|
|
30
|
+
// Find the root with the lowest timestamp
|
|
31
|
+
root = await engineDbClient.merklRoots.findFirst({
|
|
32
|
+
orderBy: {
|
|
33
|
+
timestamp: "asc",
|
|
34
|
+
},
|
|
35
|
+
where: {
|
|
36
|
+
chainId: chainId,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return root;
|
|
41
|
+
}, {
|
|
42
|
+
transform({ query }) {
|
|
43
|
+
query.chainId = !query.chainId ? undefined : Number.parseInt(query.chainId);
|
|
44
|
+
},
|
|
45
|
+
query,
|
|
46
|
+
tags: ["Merkl"],
|
|
47
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getSiloMarketsWithCache } from "../../libs/parse/marketsWithCache";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
export const query = t.Object({
|
|
4
|
+
repository: t.String(),
|
|
5
|
+
chainId: t.Numeric(),
|
|
6
|
+
});
|
|
7
|
+
export const response = t.Array(t.Object({
|
|
8
|
+
asset: t.String(),
|
|
9
|
+
assetSymbol: t.String(),
|
|
10
|
+
silo: t.String(),
|
|
11
|
+
version: t.Number(),
|
|
12
|
+
assets: t.Array(t.Object({ address: t.String(), symbol: t.String() })),
|
|
13
|
+
}));
|
|
14
|
+
export default (app) => app.get("", async (request) => {
|
|
15
|
+
const chainId = request.query.chainId;
|
|
16
|
+
return await getSiloMarketsWithCache(chainId, request.query.repository);
|
|
17
|
+
}, {
|
|
18
|
+
query,
|
|
19
|
+
tags: ["Protocols"],
|
|
20
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import checkQueryAddressValidity from "../../hooks/checkQueryAddressValidity";
|
|
2
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
3
|
+
import { getTokenInfo } from "../../libs/tokens/tokenInfo";
|
|
4
|
+
import { executeSimple } from "../../utils/execute";
|
|
5
|
+
import { t } from "elysia";
|
|
6
|
+
export const query = t.Object({
|
|
7
|
+
chainId: t.Numeric(),
|
|
8
|
+
address: t.String(),
|
|
9
|
+
});
|
|
10
|
+
export const response = t.Object({
|
|
11
|
+
name: t.String(),
|
|
12
|
+
symbol: t.String(),
|
|
13
|
+
decimals: t.Number(),
|
|
14
|
+
});
|
|
15
|
+
export default (app) => app
|
|
16
|
+
.use(checkQueryChainIdValidity())
|
|
17
|
+
.use(checkQueryAddressValidity("address"))
|
|
18
|
+
.get("", async ({ query: { address, chainId } }) => {
|
|
19
|
+
return await executeSimple(chainId, getTokenInfo(address));
|
|
20
|
+
}, {
|
|
21
|
+
query,
|
|
22
|
+
response: { 200: response },
|
|
23
|
+
tags: ["Onchain"],
|
|
24
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// import type { MerklChainId } from "@sdk";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
4
|
+
// import { merklChainDataWithCache } from "../../libs/merklChainData";
|
|
5
|
+
// import { MerkleRootNotFound } from "../../utils/error";
|
|
6
|
+
// import { prisma } from "../../utils/prisma";
|
|
7
|
+
// import { UNCLAIMED_BY_TOKEN } from "../../utils/queries/unclaimed";
|
|
8
|
+
export const query = t.Object({
|
|
9
|
+
token: t.String(),
|
|
10
|
+
chainId: t.Numeric(),
|
|
11
|
+
});
|
|
12
|
+
export default (app) => app.use(checkQueryChainIdValidity()).get("", async ({ query }) => {
|
|
13
|
+
// const token = query.token;
|
|
14
|
+
// const chainId = query.chainId as MerklChainId;
|
|
15
|
+
// const currentRoot = (await merklChainDataWithCache(chainId)).merkleRoot;
|
|
16
|
+
// if (!currentRoot) throw new MerkleRootNotFound(chainId);
|
|
17
|
+
// return await prisma.$queryRaw(UNCLAIMED_BY_TOKEN(currentRoot, chainId, token));
|
|
18
|
+
return {
|
|
19
|
+
message: "Route removed for performance improvement, please reach out to the team for more information.",
|
|
20
|
+
};
|
|
21
|
+
}, {
|
|
22
|
+
query,
|
|
23
|
+
tags: ["Rewards"],
|
|
24
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { t } from "elysia";
|
|
2
|
+
import { getTwtParticipantsWithCache } from "../../../libs/custom/twtParticipants";
|
|
3
|
+
export const query = t.Object({
|
|
4
|
+
chainId: t.Numeric(),
|
|
5
|
+
});
|
|
6
|
+
export default (app) => app.get("", async ({ query, set }) => {
|
|
7
|
+
const chainId = query.chainId;
|
|
8
|
+
return await getTwtParticipantsWithCache(chainId);
|
|
9
|
+
}, {
|
|
10
|
+
query,
|
|
11
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Redis } from "../../cache";
|
|
2
|
+
import { staticCampaignWithCache } from "../../libs/staticCampaigns";
|
|
3
|
+
import { ChainId, HOUR, isSupportedChain } from "@sdk";
|
|
4
|
+
import { t } from "elysia";
|
|
5
|
+
export const query = t.Object({});
|
|
6
|
+
export const response = t.Record(t.String({ title: "ChainId" }), t.Record(t.String({ title: "CampaignId" }), t.Number()));
|
|
7
|
+
export default (app) => app.get("", computeUpdatesWithCache, {
|
|
8
|
+
query,
|
|
9
|
+
response: {
|
|
10
|
+
400: t.Object({
|
|
11
|
+
error: t.String(),
|
|
12
|
+
message: t.Optional(t.String()),
|
|
13
|
+
}),
|
|
14
|
+
},
|
|
15
|
+
tags: ["Campaigns"],
|
|
16
|
+
});
|
|
17
|
+
const computeUpdates = async () => {
|
|
18
|
+
const chainIds = Object.keys(ChainId)
|
|
19
|
+
.map(k => Number.parseInt(k))
|
|
20
|
+
.filter(k => isSupportedChain(k, "merkl"));
|
|
21
|
+
const res = {};
|
|
22
|
+
const cacheData = await Redis.getManyWithArgs("MerklChainData", chainIds);
|
|
23
|
+
const lastUpdatesByChain = {};
|
|
24
|
+
chainIds.forEach((chainId, index) => {
|
|
25
|
+
if (!cacheData[index])
|
|
26
|
+
return;
|
|
27
|
+
lastUpdatesByChain[chainId] = cacheData[index].endOfDisputePeriod - 2 * HOUR;
|
|
28
|
+
});
|
|
29
|
+
const now = Math.floor(Date.now() / 1000);
|
|
30
|
+
for (const chainId of chainIds) {
|
|
31
|
+
if (!res[chainId])
|
|
32
|
+
res[chainId] = {};
|
|
33
|
+
const campaigns = await staticCampaignWithCache(chainId);
|
|
34
|
+
for (const campaign of campaigns) {
|
|
35
|
+
const campaignId = campaign.campaignId;
|
|
36
|
+
if (campaign.startTimestamp <= now && now <= campaign.endTimestamp) {
|
|
37
|
+
res[chainId][campaignId] =
|
|
38
|
+
lastUpdatesByChain?.[campaign?.chainId] ?? lastUpdatesByChain[chainId] ?? campaign.startTimestamp;
|
|
39
|
+
}
|
|
40
|
+
else if (now > campaign.endTimestamp) {
|
|
41
|
+
res[chainId][campaignId] = campaign.endTimestamp;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return res;
|
|
46
|
+
};
|
|
47
|
+
const computeUpdatesWithCache = async () => await Redis.getOrSet("Updates", computeUpdates);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import checkQueryAddressValidity from "../../hooks/checkQueryAddressValidity";
|
|
2
|
+
import { RewardService, UserRewardV3Dto } from "../../modules/v4/reward";
|
|
3
|
+
import { RewardConvertorService } from "../../modules/v4/reward/rewardConvertor.service";
|
|
4
|
+
import param from "../../types/parameters";
|
|
5
|
+
import { InvalidParameter } from "../../utils/error";
|
|
6
|
+
import { throwOnUnsupportedChainId } from "../../utils/throw";
|
|
7
|
+
import { t } from "elysia";
|
|
8
|
+
import { utils } from "ethers";
|
|
9
|
+
import checkQueryChainIdValidity from "../../hooks/checkQueryChainIdValidity";
|
|
10
|
+
export const query = t.Object({
|
|
11
|
+
chainId: param.Chain.type,
|
|
12
|
+
mainParameter: t.Optional(t.String()),
|
|
13
|
+
proof: t.Optional(t.String()),
|
|
14
|
+
rewardToken: t.Optional(t.String()),
|
|
15
|
+
user: t.String(),
|
|
16
|
+
});
|
|
17
|
+
export default (app) => app
|
|
18
|
+
.use(checkQueryChainIdValidity())
|
|
19
|
+
.use(checkQueryAddressValidity())
|
|
20
|
+
.get("", async ({ query }) => {
|
|
21
|
+
const { chainId, user } = query;
|
|
22
|
+
throwOnUnsupportedChainId(chainId);
|
|
23
|
+
let proofString = query.proof;
|
|
24
|
+
let proof = false;
|
|
25
|
+
if (proofString) {
|
|
26
|
+
proofString = proofString.toLowerCase();
|
|
27
|
+
if (proofString !== "true" && proofString !== "false") {
|
|
28
|
+
throw new InvalidParameter(`Invalid proof parameter: ${proofString} is not a boolean`);
|
|
29
|
+
}
|
|
30
|
+
if (proofString === "true") {
|
|
31
|
+
proof = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
let mainParameter = query.mainParameter;
|
|
35
|
+
if (mainParameter) {
|
|
36
|
+
try {
|
|
37
|
+
mainParameter = utils.getAddress(mainParameter);
|
|
38
|
+
}
|
|
39
|
+
catch (_e) {
|
|
40
|
+
throw new InvalidParameter(`Invalid main parameter: ${mainParameter} is not an address`);
|
|
41
|
+
}
|
|
42
|
+
if (proof) {
|
|
43
|
+
throw new InvalidParameter("Cannot request proof and mainParameter at the same time");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// @Warning: this is not taking into account the mainParameter filter
|
|
47
|
+
const v4Res = await RewardService.getUserRewardsByChain(user, false, [chainId]);
|
|
48
|
+
const v3Res = RewardConvertorService.convertV4toUserRewardV3(v4Res, proof);
|
|
49
|
+
return v3Res;
|
|
50
|
+
}, {
|
|
51
|
+
transform({ query }) {
|
|
52
|
+
if (query.chainId !== undefined) {
|
|
53
|
+
query.chainId = Number.parseInt(query.chainId);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
query,
|
|
57
|
+
response: { 200: UserRewardV3Dto },
|
|
58
|
+
tags: ["Rewards"],
|
|
59
|
+
});
|