@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,203 @@
|
|
|
1
|
+
import { HttpError } from "../../../errors";
|
|
2
|
+
import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
|
|
3
|
+
import { campaignTypeToEnumMap, } from "./";
|
|
4
|
+
import { CampaignRepository } from "./campaign.repository";
|
|
5
|
+
import { OpportunityService } from "../opportunity";
|
|
6
|
+
import { executeSimple } from "../../../utils/execute";
|
|
7
|
+
import { log } from "../../../utils/logger";
|
|
8
|
+
import { NETWORK_LABELS } from "@sdk";
|
|
9
|
+
import moment from "moment";
|
|
10
|
+
import { StatusService } from "../status";
|
|
11
|
+
export class CampaignService {
|
|
12
|
+
static hashId(campaign) {
|
|
13
|
+
return Bun.hash(`${campaign.distributionChain}${campaign.campaignId}`).toString();
|
|
14
|
+
}
|
|
15
|
+
static async create(campaign) {
|
|
16
|
+
const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
|
|
17
|
+
const opportunityMetadata = await OpportunityService.getMetadata({
|
|
18
|
+
id,
|
|
19
|
+
...campaign,
|
|
20
|
+
});
|
|
21
|
+
return await CampaignRepository.upsert({ id, ...campaign }, opportunityMetadata);
|
|
22
|
+
}
|
|
23
|
+
static async createMany(campaigns) {
|
|
24
|
+
const campaignToOppMetadata = {};
|
|
25
|
+
const failedToFetchMetadata = [];
|
|
26
|
+
const campaignsToInsert = [];
|
|
27
|
+
await Promise.all(campaigns.map(async (campaign) => {
|
|
28
|
+
const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
|
|
29
|
+
campaign.computeChainId = campaign.computeChainId === 0 ? campaign.chainId : campaign.computeChainId;
|
|
30
|
+
try {
|
|
31
|
+
const oppMetadata = await OpportunityService.getMetadata({
|
|
32
|
+
id,
|
|
33
|
+
...campaign,
|
|
34
|
+
});
|
|
35
|
+
campaignToOppMetadata[id] = oppMetadata;
|
|
36
|
+
campaignsToInsert.push({ id, ...campaign });
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
log.error(`Cannot get Opportunity metadata for campaign ${campaign.campaignId} of type ${CampaignService.getTypeFromV3(campaign.type)}`, err);
|
|
40
|
+
failedToFetchMetadata.push(campaign);
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
let { success, fail } = await CampaignRepository.upsertMany(campaignsToInsert, campaignToOppMetadata);
|
|
44
|
+
fail += failedToFetchMetadata.length;
|
|
45
|
+
return { success, fail };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the list of campaigns satisfying the query
|
|
49
|
+
* @param query
|
|
50
|
+
* @returns A list of campaigns
|
|
51
|
+
*/
|
|
52
|
+
static async findMany(query) {
|
|
53
|
+
if (query.subType && !query.type) {
|
|
54
|
+
throw new HttpError("Bad Request: Cannot specify a subType without a type", 400);
|
|
55
|
+
}
|
|
56
|
+
const campaigns = await CampaignRepository.findMany(query);
|
|
57
|
+
return campaigns.map(CampaignService.format);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Counts the number of campaigns that complies to query
|
|
61
|
+
* @description used for pagination purposes
|
|
62
|
+
* @param query
|
|
63
|
+
* @returns the number of campaigns
|
|
64
|
+
*/
|
|
65
|
+
static async countMany(query) {
|
|
66
|
+
if (query.subType && !query.type) {
|
|
67
|
+
throw new HttpError("Bad Request: Cannot specify a subType without a type", 400);
|
|
68
|
+
}
|
|
69
|
+
return await CampaignRepository.countMany(query);
|
|
70
|
+
}
|
|
71
|
+
static async checkIfExist(campaign) {
|
|
72
|
+
return await CampaignRepository.checkIfExist(campaign);
|
|
73
|
+
}
|
|
74
|
+
static async findUnique(campaign) {
|
|
75
|
+
return await CampaignRepository.findUnique(campaign);
|
|
76
|
+
}
|
|
77
|
+
static async findUniqueOrThrow(campaign) {
|
|
78
|
+
return await CampaignRepository.findUniqueOrThrow(campaign);
|
|
79
|
+
}
|
|
80
|
+
static async findCampaignsToProcess(distributionChainId) {
|
|
81
|
+
return (await CampaignRepository.findCampaignsToProcess(distributionChainId)).filter(campaign => campaign.endTimestamp > campaign.CampaignStatus[0].computedUntil);
|
|
82
|
+
}
|
|
83
|
+
static async pickCampaignToProcess(chainId) {
|
|
84
|
+
const campaigns = await CampaignService.findCampaignsToProcess(chainId);
|
|
85
|
+
for (const campaign of campaigns) {
|
|
86
|
+
try {
|
|
87
|
+
await StatusService.update({
|
|
88
|
+
distributionChain: chainId,
|
|
89
|
+
campaignId: campaign.campaignId,
|
|
90
|
+
status: { value: "PROCESSING" },
|
|
91
|
+
});
|
|
92
|
+
return campaign.campaignId;
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`No campaign to process found on ${NETWORK_LABELS[chainId]}`);
|
|
97
|
+
}
|
|
98
|
+
static async fill(campaigns) {
|
|
99
|
+
const campaignsFromEngine = await CampaignRepository.getFromEngineDbWithId(campaigns);
|
|
100
|
+
for (const campaign of campaigns) {
|
|
101
|
+
if (campaignsFromEngine.findIndex(c => c.campaignId === campaign.campaignId) === -1) {
|
|
102
|
+
log.warn(`Campaign ${campaign.campaignId} on ${NETWORK_LABELS[campaign.distributionChain]} not found in engine db`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return await CampaignService.createMany(campaignsFromEngine.map(campaign => {
|
|
106
|
+
return {
|
|
107
|
+
amount: campaign.amount,
|
|
108
|
+
chainId: campaign.chainId,
|
|
109
|
+
computeChainId: campaign.computeChainId,
|
|
110
|
+
creator: campaign.creator,
|
|
111
|
+
endTimestamp: campaign.endTimestamp.toString(),
|
|
112
|
+
campaignId: campaign.campaignId,
|
|
113
|
+
opportunityIdentifier: campaign.mainParameter,
|
|
114
|
+
params: JSON.stringify(campaign.campaignParameters),
|
|
115
|
+
rewardTokenAddress: campaign.rewardToken,
|
|
116
|
+
startTimestamp: campaign.startTimestamp.toString(),
|
|
117
|
+
type: campaign.campaignType,
|
|
118
|
+
subType: campaign.campaignSubType,
|
|
119
|
+
};
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
static async fetchMissingCampaigns(chainId, campaignIds) {
|
|
123
|
+
const foundCampaignIds = (await CampaignRepository.findManyCampaignId(chainId)).reduce((acc, { campaignId }) => acc.add(CampaignService.hashId({ distributionChain: chainId, campaignId })), new Set());
|
|
124
|
+
const missingCampaigns = campaignIds.filter(campaignId => !foundCampaignIds.has(CampaignService.hashId(campaignId)));
|
|
125
|
+
if (!missingCampaigns.length)
|
|
126
|
+
return { success: 0, fail: 0 };
|
|
127
|
+
return await CampaignService.fill(missingCampaigns);
|
|
128
|
+
}
|
|
129
|
+
static async findChains() {
|
|
130
|
+
return await CampaignRepository.findChains();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Returns the campaign data
|
|
134
|
+
* @param type index of Campaign enum from sdk
|
|
135
|
+
* @returns CampaignType as db-related enum for v4
|
|
136
|
+
*/
|
|
137
|
+
static getTypeFromV3(type) {
|
|
138
|
+
return Object.entries(campaignTypeToEnumMap).find(([_, v3]) => v3 === type)?.[0];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Split a campaigns array into three array for each status
|
|
142
|
+
* @param campaigns
|
|
143
|
+
* @param timestamp to compare to campaigns timestamps
|
|
144
|
+
* @returns a status => campaigns map
|
|
145
|
+
*/
|
|
146
|
+
static splitOnStatus(campaigns, timestamp = moment().unix()) {
|
|
147
|
+
const past = campaigns.filter(({ endTimestamp: end }) => end <= timestamp);
|
|
148
|
+
const live = campaigns.filter(({ startTimestamp: start, endTimestamp: end }) => start <= timestamp && end > timestamp);
|
|
149
|
+
const soon = campaigns.filter(({ startTimestamp: start }) => start > timestamp);
|
|
150
|
+
return { past, live, soon };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns the campaign data
|
|
154
|
+
* @param chainId to fetch campaigns for
|
|
155
|
+
* @param timestamp from which campaigns endTimestamp are filtered
|
|
156
|
+
* @returns
|
|
157
|
+
*/
|
|
158
|
+
static async getFromEngineDb(chainId, timestamp) {
|
|
159
|
+
return CampaignRepository.getFromEngineDb(chainId, timestamp);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Convert raw
|
|
163
|
+
* @param query
|
|
164
|
+
* @returns A list of opportunities
|
|
165
|
+
* TODO: remove this function in favor of prisma client extensions
|
|
166
|
+
*/
|
|
167
|
+
static format(campaign) {
|
|
168
|
+
if (campaign === null)
|
|
169
|
+
return null;
|
|
170
|
+
const { DistributionChain, ComputeChain, RewardToken, params, ...c } = campaign;
|
|
171
|
+
return {
|
|
172
|
+
...c,
|
|
173
|
+
params: params,
|
|
174
|
+
chain: ComputeChain,
|
|
175
|
+
rewardToken: RewardToken,
|
|
176
|
+
distributionChain: DistributionChain === null ? undefined : DistributionChain,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Fetches the campaign dynamic data for a v3 campaign onchain
|
|
181
|
+
* @param chainId
|
|
182
|
+
* @param campaignType
|
|
183
|
+
* @param campaigns of v3 type
|
|
184
|
+
* @returns
|
|
185
|
+
*/
|
|
186
|
+
static async fetchDynamicData(chainId, campaignType, campaigns) {
|
|
187
|
+
const calls = campaignsDynamicData(chainId, campaigns, campaignTypeToEnumMap[campaignType]);
|
|
188
|
+
return await executeSimple(chainId, calls);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Shortcut to get daily amount from total
|
|
192
|
+
* @param start timestamp
|
|
193
|
+
* @param end timestamp
|
|
194
|
+
* @param amount
|
|
195
|
+
* @returns daily token amount
|
|
196
|
+
*/
|
|
197
|
+
static getDailyAmount(start, end, amount) {
|
|
198
|
+
const timespan = Math.abs(Number(end - start));
|
|
199
|
+
const dayspan = Math.max(1, Math.floor(timespan / (60 * 60 * 24)));
|
|
200
|
+
const dailyAmount = BigInt(amount) / BigInt(dayspan);
|
|
201
|
+
return dailyAmount;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AuthorizationHeadersDto } from "../../../guards/BackOffice.guard";
|
|
2
|
+
import { TokenAuthGuard } from "../../../guards/TokenAuth.guard";
|
|
3
|
+
import Elysia from "elysia";
|
|
4
|
+
import { ExplorerService } from "../explorer";
|
|
5
|
+
import { ChainUniqueDto, CreateChainExplorerDto, GetChainQueryDto } from "./chain.model";
|
|
6
|
+
import { ChainService } from "./chain.service";
|
|
7
|
+
// ─── Chains Controller ───────────────────────────────────────────────────────
|
|
8
|
+
export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: ["Chains"] } })
|
|
9
|
+
// ─── Get A Chain By Id ───────────────────────────────────────────────
|
|
10
|
+
.get("/:chainId", async ({ params: { chainId } }) => {
|
|
11
|
+
const chain = await ChainService.get(chainId);
|
|
12
|
+
if (!chain)
|
|
13
|
+
return null;
|
|
14
|
+
const { Explorer, ...rest } = chain;
|
|
15
|
+
return { explorers: chain.Explorer, ...rest };
|
|
16
|
+
}, {
|
|
17
|
+
params: ChainUniqueDto,
|
|
18
|
+
})
|
|
19
|
+
// ─── Get All Supported Chains ────────────────────────────────────────
|
|
20
|
+
.get("/", async ({ query }) => {
|
|
21
|
+
const chains = await ChainService.getMany(query);
|
|
22
|
+
return chains.map(({ Explorer, ...chain }) => ({ explorers: Explorer, ...chain }));
|
|
23
|
+
}, {
|
|
24
|
+
query: GetChainQueryDto,
|
|
25
|
+
})
|
|
26
|
+
.get("/count", async ({ query }) => {
|
|
27
|
+
return await ChainService.countMany(query);
|
|
28
|
+
}, {
|
|
29
|
+
query: GetChainQueryDto,
|
|
30
|
+
})
|
|
31
|
+
// ─── Get All Supported Chains ────────────────────────────────────────
|
|
32
|
+
.group("/explorers", app => {
|
|
33
|
+
return app.post("", async ({ body: { chainId, type, url } }) => {
|
|
34
|
+
return await ExplorerService.create(chainId, type, url);
|
|
35
|
+
}, {
|
|
36
|
+
beforeHandle: TokenAuthGuard,
|
|
37
|
+
headers: AuthorizationHeadersDto,
|
|
38
|
+
body: CreateChainExplorerDto,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ExplorerType } from "../../../../database/api/.generated";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
// ─── DTOs ────────────────────────────────────────────────────────────────────
|
|
4
|
+
export const GetChainQueryDto = t.Object({
|
|
5
|
+
search: t.Optional(t.String()),
|
|
6
|
+
});
|
|
7
|
+
export const ChainUniqueDto = t.Object({
|
|
8
|
+
chainId: t.Numeric(),
|
|
9
|
+
});
|
|
10
|
+
export const ChainArrayDto = t.Object({
|
|
11
|
+
chainId: t.Union([t.Numeric(), t.Array(t.Numeric())]),
|
|
12
|
+
});
|
|
13
|
+
export const CreateChainExplorerDto = t.Object({
|
|
14
|
+
type: t.Enum(ExplorerType),
|
|
15
|
+
chainId: t.Number(),
|
|
16
|
+
url: t.String(),
|
|
17
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
|
|
2
|
+
import { executeSimple } from "../../../utils/execute";
|
|
3
|
+
import { apiDbClient } from "../../../utils/prisma";
|
|
4
|
+
export class ChainRepository {
|
|
5
|
+
/**
|
|
6
|
+
* @param id ChainId
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
static async read(id) {
|
|
10
|
+
//TODO: tweak query to not have 5
|
|
11
|
+
return apiDbClient.chain.findUnique({ where: { id }, include: { Explorer: { take: 5 } } });
|
|
12
|
+
}
|
|
13
|
+
static #transformQueryToPrismaFilters(query) {
|
|
14
|
+
return {
|
|
15
|
+
where: { name: { contains: query.search, mode: "insensitive" } },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Returns many chains based on query
|
|
19
|
+
* @param query object with fields to search for
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
static async readMany(query) {
|
|
23
|
+
const args = ChainRepository.#transformQueryToPrismaFilters(query);
|
|
24
|
+
return apiDbClient.chain.findMany({
|
|
25
|
+
include: { Explorer: { take: 5 } },
|
|
26
|
+
...args,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
static async countMany(query) {
|
|
30
|
+
const args = ChainRepository.#transformQueryToPrismaFilters(query);
|
|
31
|
+
return apiDbClient.chain.count({
|
|
32
|
+
...args,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Returns all chainIds in the database
|
|
36
|
+
*/
|
|
37
|
+
static async readIds() {
|
|
38
|
+
return apiDbClient.chain.findMany({
|
|
39
|
+
select: { id: true },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new chain
|
|
44
|
+
* @param template for chain creation
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
static async create(template) {
|
|
48
|
+
return apiDbClient.chain.create(template);
|
|
49
|
+
}
|
|
50
|
+
static async findMany() {
|
|
51
|
+
return apiDbClient.chain.findMany();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Fetches the campaign dynamic data for a v3 campaign onchain
|
|
55
|
+
* @param chainId
|
|
56
|
+
* @param campaignType
|
|
57
|
+
* @param campaigns of v3 type
|
|
58
|
+
* @returns
|
|
59
|
+
*/
|
|
60
|
+
static async fetchDynamicDataV3(chainId, campaignType, campaigns) {
|
|
61
|
+
const calls = campaignsDynamicData(chainId, campaigns, campaignType);
|
|
62
|
+
return executeSimple(chainId, calls);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { DistributorService } from "@sdk";
|
|
2
|
+
import { CacheService } from "../cache";
|
|
3
|
+
import { TTLPresets } from "../cache/cache.model";
|
|
4
|
+
import { ChainRepository } from "./chain.repository";
|
|
5
|
+
export class ChainService {
|
|
6
|
+
static async get(chainId) {
|
|
7
|
+
return ChainRepository.read(chainId);
|
|
8
|
+
}
|
|
9
|
+
//TODO: determine find vs get nomenclature and cache handling
|
|
10
|
+
static async findMany() {
|
|
11
|
+
return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany);
|
|
12
|
+
}
|
|
13
|
+
static async getMany(query) {
|
|
14
|
+
return ChainRepository.readMany(query);
|
|
15
|
+
}
|
|
16
|
+
static async countMany(query) {
|
|
17
|
+
return ChainRepository.countMany(query);
|
|
18
|
+
}
|
|
19
|
+
/** List all chainIds available in the databse
|
|
20
|
+
* @warning some chains may not be fully integrated yet
|
|
21
|
+
* @returns an array of chainId
|
|
22
|
+
*/
|
|
23
|
+
static async getIds() {
|
|
24
|
+
const ids = await ChainRepository.readIds();
|
|
25
|
+
return ids.map(({ id }) => id);
|
|
26
|
+
}
|
|
27
|
+
/** List all chainIds which have a distribituor (i.e. which is fully integrated)
|
|
28
|
+
* @returns an array of chainId
|
|
29
|
+
*/
|
|
30
|
+
static async getSupportedIds() {
|
|
31
|
+
const ids = await ChainService.getIds();
|
|
32
|
+
const supportedIds = [];
|
|
33
|
+
for (const chainId of ids) {
|
|
34
|
+
try {
|
|
35
|
+
DistributorService(chainId);
|
|
36
|
+
supportedIds.push(chainId);
|
|
37
|
+
}
|
|
38
|
+
catch { }
|
|
39
|
+
}
|
|
40
|
+
return supportedIds;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
|
|
2
|
+
import Elysia from "elysia";
|
|
3
|
+
import { throwOnUnsupportedChainId } from "src/utils/throw";
|
|
4
|
+
import { DynamicDataSourceIdentifier } from "./dynamicData.model";
|
|
5
|
+
import { DynamicDataService } from "./dynamicData.service";
|
|
6
|
+
// ─── DynamicDatas Controller ───────────────────────────────────────────────────────
|
|
7
|
+
export const DynamicDataController = new Elysia({ prefix: "/dynamicData", detail: { tags: ["DynamicData"] } })
|
|
8
|
+
// ─── Get All DynamicDatas ──────────────────────────────────────────────────
|
|
9
|
+
// ─── Get type Info By Token Address ───────────────────────────────────────
|
|
10
|
+
.get("/chainId/:chainId/token/:tokenAddress", async ({ params }) => {
|
|
11
|
+
return await DynamicDataService.queryERC20DynamicData(params.chainId, params.tokenAddress);
|
|
12
|
+
}, {
|
|
13
|
+
params: DynamicDataSourceIdentifier,
|
|
14
|
+
headers: AuthorizationHeadersDto,
|
|
15
|
+
beforeHandle: ({ params, headers }) => {
|
|
16
|
+
BackOfficeGuard({ headers });
|
|
17
|
+
throwOnUnsupportedChainId(params.chainId);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { campaignsDynamicData } from "../../../libs/campaigns/campaignsDynamicData";
|
|
2
|
+
import { executeSimple } from "../../../utils/execute";
|
|
3
|
+
import { log } from "../../../utils/logger";
|
|
4
|
+
import { Campaign, NETWORK_LABELS } from "@sdk";
|
|
5
|
+
export class DynamicDataService {
|
|
6
|
+
// ─── DynamicDatas ──────────────────────────────────────────────────────────
|
|
7
|
+
/** Fetches a single price */
|
|
8
|
+
static async queryERC20DynamicData(chainId, tokenAddress) {
|
|
9
|
+
const campaigns = [
|
|
10
|
+
{
|
|
11
|
+
campaignId: tokenAddress,
|
|
12
|
+
amount: "1000000000000000000", // 1 EXR in wei
|
|
13
|
+
campaignSubType: 0,
|
|
14
|
+
chainId: chainId,
|
|
15
|
+
computeChainId: 1,
|
|
16
|
+
creator: "0xexamplecreatoraddress",
|
|
17
|
+
endTimestamp: 1672531199, // Example end timestamp
|
|
18
|
+
index: 0,
|
|
19
|
+
mainParameter: "0xexamplemainparameter",
|
|
20
|
+
rewardToken: "0xexamplerewardtokenaddress",
|
|
21
|
+
startTimestamp: 1672444800, // Example start timestamp
|
|
22
|
+
lastEligibilityRatio: 1,
|
|
23
|
+
campaignParameters: {
|
|
24
|
+
blacklist: [],
|
|
25
|
+
decimalsRewardToken: 18,
|
|
26
|
+
decimalsTargetToken: 18,
|
|
27
|
+
duration: 30,
|
|
28
|
+
forwarders: [],
|
|
29
|
+
hooks: [],
|
|
30
|
+
shouldIgnore: false,
|
|
31
|
+
symbolRewardToken: "EXR",
|
|
32
|
+
symbolTargetToken: "EXT",
|
|
33
|
+
targetToken: tokenAddress,
|
|
34
|
+
whitelist: [],
|
|
35
|
+
},
|
|
36
|
+
campaignType: Campaign.ERC20,
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
log.info(`querying mock campaign on chain: ${NETWORK_LABELS[chainId]}`);
|
|
40
|
+
const result = await executeSimple(Number(chainId), campaignsDynamicData(Number(chainId), campaigns, Campaign.ERC20));
|
|
41
|
+
return {
|
|
42
|
+
priceTargetToken: result[0]?.typeInfo.priceTargetToken,
|
|
43
|
+
totalSupply: result[0]?.typeInfo.totalSupply,
|
|
44
|
+
blacklistedSupply: result[0]?.typeInfo.blacklistedSupply,
|
|
45
|
+
cardName: result[0]?.typeInfo.cardName,
|
|
46
|
+
tvl: result[0]?.typeInfo.tvl,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { t } from "elysia";
|
|
2
|
+
export const slugToProtocolId = {
|
|
3
|
+
"uniswap-v2": "uniswap-v2",
|
|
4
|
+
"aave-v2": "aave",
|
|
5
|
+
"camelot-v2": "camelot",
|
|
6
|
+
};
|
|
7
|
+
export const apiTypes = {
|
|
8
|
+
"/v1/protocols": {
|
|
9
|
+
query: t.Object({
|
|
10
|
+
slug: t.String({ example: "uniswap-v2" }),
|
|
11
|
+
}),
|
|
12
|
+
response: t.Array(t.Object({
|
|
13
|
+
slug: t.String({ example: "uniswap-v2" }),
|
|
14
|
+
name: t.String({ example: "Uniswap V2" }),
|
|
15
|
+
desription: t.String(),
|
|
16
|
+
url: t.String(),
|
|
17
|
+
logosUri: t.String(),
|
|
18
|
+
chains: t.Array(t.Object({ id: t.Number(), name: t.String() })),
|
|
19
|
+
})),
|
|
20
|
+
},
|
|
21
|
+
"/v1/tokens": {
|
|
22
|
+
query: t.Object({
|
|
23
|
+
protocolSlug: t.Optional(t.String({ example: "uniswap-v2" })),
|
|
24
|
+
primaryAddress: t.Optional(t.String({ description: "Ethereum address for contract interaction of defi token" })),
|
|
25
|
+
address: t.Optional(t.String({ description: "Ethereum address of the token" })),
|
|
26
|
+
chainId: t.Number(),
|
|
27
|
+
type: t.Optional(t.Enum({ defi: "defi", base: "base" })),
|
|
28
|
+
page: t.Number(),
|
|
29
|
+
inludeMetadatra: t.Optional(t.Boolean()),
|
|
30
|
+
}),
|
|
31
|
+
response: t.Object({
|
|
32
|
+
data: t.Array(t.Object({
|
|
33
|
+
chainId: t.Number(),
|
|
34
|
+
address: t.String(),
|
|
35
|
+
type: t.Enum({ defi: "defi", base: "base" }),
|
|
36
|
+
primaryAddress: t.String({ description: "Ethereum address for contract interaction of defi token" }),
|
|
37
|
+
underlyingTokens: t.Array(t.Object({
|
|
38
|
+
address: t.String(),
|
|
39
|
+
chainId: t.Number(),
|
|
40
|
+
type: t.Enum({ defi: "defi", base: "base" }),
|
|
41
|
+
})),
|
|
42
|
+
apy: t.Number(),
|
|
43
|
+
})),
|
|
44
|
+
meta: t.Object({
|
|
45
|
+
total: t.Number(),
|
|
46
|
+
lastPage: t.Number(),
|
|
47
|
+
currentPage: t.Number(),
|
|
48
|
+
perPage: t.Number(),
|
|
49
|
+
prev: t.Union([t.Null(), t.Number()]),
|
|
50
|
+
next: t.Union([t.Null(), t.Number()]),
|
|
51
|
+
}),
|
|
52
|
+
}),
|
|
53
|
+
},
|
|
54
|
+
"/v1/shortcuts/quote": {
|
|
55
|
+
query: t.Object({
|
|
56
|
+
chainId: t.Optional(t.Numeric()),
|
|
57
|
+
fromAddress: t.Optional(t.String()),
|
|
58
|
+
routingStrategy: t.Enum({ ensowallet: "ensowallet", delegate: "delegate", router: "router" }),
|
|
59
|
+
feeReceiver: t.Optional(t.String()),
|
|
60
|
+
tokenIn: t.Array(t.String()),
|
|
61
|
+
tokenOut: t.Array(t.String()),
|
|
62
|
+
amountIn: t.Array(t.String()),
|
|
63
|
+
fee: t.Optional(t.Array(t.String())),
|
|
64
|
+
disableRFQs: t.Optional(t.Boolean()),
|
|
65
|
+
ignoreAggregators: t.Optional(t.Array(t.String())),
|
|
66
|
+
ignoreStandards: t.Optional(t.Array(t.String())),
|
|
67
|
+
}),
|
|
68
|
+
response: t.Object({
|
|
69
|
+
gas: t.String(),
|
|
70
|
+
amountOut: t.Object({}),
|
|
71
|
+
priceImpact: t.Number(),
|
|
72
|
+
feeAmount: t.Array(t.String()),
|
|
73
|
+
}),
|
|
74
|
+
},
|
|
75
|
+
"/v1/shortcuts/route": {
|
|
76
|
+
query: t.Object({
|
|
77
|
+
chainId: t.Optional(t.Numeric()),
|
|
78
|
+
fromAddress: t.String(),
|
|
79
|
+
routingStrategy: t.Enum({ ensowallet: "ensowallet", delegate: "delegate", router: "router" }),
|
|
80
|
+
receiver: t.Optional(t.String()),
|
|
81
|
+
spender: t.Optional(t.String()),
|
|
82
|
+
amountIn: t.Array(t.String()),
|
|
83
|
+
amountOut: t.Optional(t.Array(t.String())),
|
|
84
|
+
minAmountOut: t.Optional(t.Array(t.String())),
|
|
85
|
+
slippage: t.Optional(t.String()),
|
|
86
|
+
fee: t.Optional(t.Array(t.String())),
|
|
87
|
+
feeReceiver: t.Optional(t.String()),
|
|
88
|
+
disableRFQs: t.Optional(t.Boolean()),
|
|
89
|
+
ignoreAggregators: t.Optional(t.Array(t.String())),
|
|
90
|
+
ignoreStandards: t.Optional(t.Array(t.String())),
|
|
91
|
+
tokenIn: t.Array(t.String()),
|
|
92
|
+
tokenOut: t.Array(t.String()),
|
|
93
|
+
}),
|
|
94
|
+
response: t.Object({
|
|
95
|
+
gas: t.String(),
|
|
96
|
+
amountOut: t.String(),
|
|
97
|
+
priceImpact: t.Number(),
|
|
98
|
+
feeAmount: t.Array(t.String()),
|
|
99
|
+
createAt: t.Number(),
|
|
100
|
+
tx: t.Object({
|
|
101
|
+
data: t.String(),
|
|
102
|
+
to: t.String(),
|
|
103
|
+
from: t.String(),
|
|
104
|
+
value: t.String(),
|
|
105
|
+
}),
|
|
106
|
+
}),
|
|
107
|
+
},
|
|
108
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ProtocolService } from "../protocol";
|
|
2
|
+
import { slugToProtocolId } from "./enso.model";
|
|
3
|
+
const ENSO = `https://api.enso.finance/api`;
|
|
4
|
+
export class EnsoService {
|
|
5
|
+
static async #fetch(route, params) {
|
|
6
|
+
const res = await fetch(`${ENSO}${route}?${params?.query ? new URLSearchParams(params?.query) : ""}`, {
|
|
7
|
+
headers: new Headers({
|
|
8
|
+
Authorization: `Bearer ${"8dbbda50-6ed5-4bda-bf54-ea2796602057"}`,
|
|
9
|
+
"Content-Type": "application/json",
|
|
10
|
+
}),
|
|
11
|
+
});
|
|
12
|
+
if (res?.status !== 200)
|
|
13
|
+
throw "Unsucessful call";
|
|
14
|
+
return (await res.json());
|
|
15
|
+
}
|
|
16
|
+
static getSlug(protocolId) {
|
|
17
|
+
const slug = Object.entries(slugToProtocolId).find(([_slug, id]) => id === protocolId)?.[0];
|
|
18
|
+
return slug;
|
|
19
|
+
}
|
|
20
|
+
static getProtocolId(slug) {
|
|
21
|
+
return slugToProtocolId[slug];
|
|
22
|
+
}
|
|
23
|
+
static async getCompatibleProtocols(query) {
|
|
24
|
+
const ensoProtocols = await EnsoService.#fetch("/v1/protocols");
|
|
25
|
+
const protocolIds = ensoProtocols
|
|
26
|
+
.filter(p => query.chainId === undefined || p.chains.some(c => c.id === query.chainId))
|
|
27
|
+
.map(p => EnsoService.getProtocolId(p.slug))
|
|
28
|
+
.filter(id => id !== undefined);
|
|
29
|
+
return await ProtocolService.findMany({ id: protocolIds });
|
|
30
|
+
}
|
|
31
|
+
static async getTokens(chainId, slug, identifier) {
|
|
32
|
+
const tokens = await EnsoService.#fetch("/v1/tokens", {
|
|
33
|
+
query: identifier
|
|
34
|
+
? { protocolSlug: slug, chainId, page: 1, address: identifier }
|
|
35
|
+
: { protocolSlug: slug, chainId, page: 1 },
|
|
36
|
+
});
|
|
37
|
+
return tokens.data;
|
|
38
|
+
}
|
|
39
|
+
static async getQuote(query) {
|
|
40
|
+
return await EnsoService.#fetch("/v1/shortcuts/quote", { query });
|
|
41
|
+
}
|
|
42
|
+
static async getTransaction(query) {
|
|
43
|
+
return await EnsoService.#fetch("/v1/shortcuts/route", { query });
|
|
44
|
+
}
|
|
45
|
+
static getDepositSchema(protocolId) { }
|
|
46
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { apiDbClient } from "../../../utils/prisma";
|
|
2
|
+
import { ExplorerService } from "./explorer.service";
|
|
3
|
+
export class ExplorerRepository {
|
|
4
|
+
static async getByChainId(chainId) {
|
|
5
|
+
return await apiDbClient.explorer.findFirstOrThrow({ where: { chainId } });
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates an explorer
|
|
9
|
+
* @param chainId to attach explorer to
|
|
10
|
+
* @param type that defines the subsequents links for transactions, addresses...
|
|
11
|
+
* @param url base url without / suffix
|
|
12
|
+
*/
|
|
13
|
+
static async create(chainId, type, url) {
|
|
14
|
+
return apiDbClient.explorer.create({
|
|
15
|
+
data: {
|
|
16
|
+
chainId,
|
|
17
|
+
type,
|
|
18
|
+
url,
|
|
19
|
+
id: ExplorerService.hashId(type, chainId),
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|