@merkl/api 0.10.129 → 0.10.131
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
});
|