@merkl/api 0.10.129 → 0.10.130
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/node_modules/@elysiajs/eden/eden/LICENSE +7 -0
- package/dist/node_modules/@elysiajs/eden/eden/README.md +46 -0
- package/dist/node_modules/@elysiajs/eden/eden/bunfig.toml +2 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-2IHGLN7W.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-7WO4HTSU.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-XYW4OUFN.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/chunk-YAG46HFR.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/errors.d.ts +5 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch/index.d.ts +4 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch/types.d.ts +44 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.d.mts +48 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.d.ts +48 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.global.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/fetch.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/index.d.mts +5 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/index.d.ts +5 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/index.global.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/index.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/index.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/index.d.ts +17 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/types.d.ts +99 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty/utils.d.ts +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.d.mts +114 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.d.ts +114 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.global.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/index.d.ts +5 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/types.d.ts +86 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2/ws.d.ts +14 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.d.mts +103 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.d.ts +103 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.global.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.js +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/treaty2.mjs +1 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/types-C41kuZ-K.d.mts +44 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/types-C41kuZ-K.d.ts +44 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/types.d.ts +39 -0
- package/dist/node_modules/@elysiajs/eden/eden/dist/utils/parsingUtils.d.ts +6 -0
- package/dist/node_modules/@elysiajs/eden/eden/package.json +85 -0
- package/dist/package.json +2 -2
- 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
@@ -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
|
+
}
|