@merkl/api 0.10.199 → 0.10.200
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/src/eden/index.d.ts +2 -6398
- package/dist/src/errors/HttpError.d.ts +5 -0
- package/dist/src/errors/HttpError.js +6 -0
- package/dist/src/errors/NotFound.error.d.ts +4 -0
- package/dist/src/errors/NotFound.error.js +5 -0
- package/dist/src/index.d.ts +1 -2464
- package/dist/src/index.js +56 -7
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +15 -22
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/factoryFinder.js +1 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +3 -1
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +8 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GammaProcessor.d.ts +43 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GammaProcessor.js +63 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GenericProcessor.d.ts +3 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/GenericProcessor.js +3 -1
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/NoLinkVaultProcessor.d.ts +36 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/NoLinkVaultProcessor.js +51 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.d.ts +0 -1
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.js +15 -7
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +4 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPrices.d.ts +1 -1
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPrices.js +13 -572
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.d.ts +2 -21
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.js +197 -1174
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2.d.ts +1 -5
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2.js +11 -634
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3.d.ts +1 -4
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3.js +10 -380
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4.d.ts +3 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4.js +11 -312
- package/dist/src/libs/campaigns/campaignTypes/EulerDynamicData.js +8 -8
- package/dist/src/libs/campaigns/campaignTypes/RadiantDynamicData.js +3 -4
- package/dist/src/libs/campaigns/campaignsDynamicData.js +0 -5
- package/dist/src/modules/v4/accounting/accounting.controller.js +1 -1
- package/dist/src/modules/v4/apr/apr.model.d.ts +26 -0
- package/dist/src/modules/v4/apr/apr.model.js +15 -1
- package/dist/src/modules/v4/blacklist/blacklist.controller.js +1 -1
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +4 -4
- package/dist/src/modules/v4/campaign/campaign.controller.js +14 -4
- package/dist/src/modules/v4/campaign/campaign.model.d.ts +50 -5
- package/dist/src/modules/v4/campaign/campaign.model.js +47 -13
- package/dist/src/modules/v4/campaign/campaign.repository.d.ts +2 -2
- package/dist/src/modules/v4/campaign/campaign.service.d.ts +2 -2
- package/dist/src/modules/v4/chain/chain.controller.d.ts +2 -2
- package/dist/src/modules/v4/chain/chain.controller.js +7 -2
- package/dist/src/modules/v4/chain/chain.model.d.ts +6 -1
- package/dist/src/modules/v4/chain/chain.model.js +8 -1
- package/dist/src/modules/v4/chain/chain.repository.js +1 -1
- package/dist/src/modules/v4/claims/claims.controller.js +1 -1
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +4 -1
- package/dist/src/modules/v4/enso/enso.model.d.ts +1 -1
- package/dist/src/modules/v4/enso/enso.model.js +2 -1
- package/dist/src/modules/v4/enso/enso.service.d.ts +0 -1
- package/dist/src/modules/v4/enso/enso.service.js +4 -4
- package/dist/src/modules/v4/interaction/interaction.controller.d.ts +26 -17
- package/dist/src/modules/v4/interaction/interaction.controller.js +19 -28
- package/dist/src/modules/v4/interaction/interaction.model.d.ts +17 -5
- package/dist/src/modules/v4/interaction/interaction.model.js +3 -3
- package/dist/src/modules/v4/interaction/interaction.service.d.ts +18 -3
- package/dist/src/modules/v4/interaction/interaction.service.js +89 -11
- package/dist/src/modules/v4/kyberzap/kyberzap.model.d.ts +72 -0
- package/dist/src/modules/v4/kyberzap/kyberzap.model.js +79 -0
- package/dist/src/modules/v4/kyberzap/kyberzap.service.d.ts +15 -0
- package/dist/src/modules/v4/kyberzap/kyberzap.service.js +84 -0
- package/dist/src/modules/v4/liquidity/liquidity.controller.js +1 -1
- package/dist/src/modules/v4/merklRoot/merklRoot.controller.js +1 -1
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +224 -213
- package/dist/src/modules/v4/opportunity/opportunity.controller.js +39 -10
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +252 -22
- package/dist/src/modules/v4/opportunity/opportunity.model.js +58 -15
- package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +11 -11
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +12 -232
- package/dist/src/modules/v4/opportunity/opportunity.service.js +0 -32
- package/dist/src/modules/v4/price/price.controller.js +1 -1
- package/dist/src/modules/v4/protocol/protocol.controller.d.ts +23 -24
- package/dist/src/modules/v4/protocol/protocol.controller.js +15 -9
- package/dist/src/modules/v4/protocol/protocol.model.d.ts +13 -1
- package/dist/src/modules/v4/protocol/protocol.model.js +12 -8
- package/dist/src/modules/v4/reward/reward.controller.js +1 -1
- package/dist/src/modules/v4/reward/reward.model.d.ts +44 -1
- package/dist/src/modules/v4/reward/reward.model.js +15 -0
- package/dist/src/modules/v4/reward/reward.repository.d.ts +2 -2
- package/dist/src/modules/v4/reward/reward.service.d.ts +11 -11
- package/dist/src/modules/v4/reward/reward.service.js +1 -1
- package/dist/src/modules/v4/router.d.ts +287 -268
- package/dist/src/modules/v4/status/status.controller.js +2 -3
- package/dist/src/modules/v4/status/status.model.d.ts +12 -0
- package/dist/src/modules/v4/status/status.model.js +12 -0
- package/dist/src/modules/v4/token/token.controller.d.ts +4 -4
- package/dist/src/modules/v4/token/token.controller.js +1 -1
- package/dist/src/modules/v4/token/token.model.d.ts +12 -0
- package/dist/src/modules/v4/token/token.model.js +12 -0
- package/dist/src/modules/v4/token/token.repository.d.ts +2 -2
- package/dist/src/modules/v4/token/token.service.d.ts +7 -7
- package/dist/src/modules/v4/tvl/tvl.model.d.ts +24 -0
- package/dist/src/modules/v4/tvl/tvl.model.js +15 -1
- package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.d.ts +1 -1
- package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.js +9 -8
- package/dist/src/modules/v4/user/user.controller.d.ts +4 -4
- package/dist/src/modules/v4/user/user.controller.js +20 -17
- package/dist/src/modules/v4/user/user.model.d.ts +30 -0
- package/dist/src/modules/v4/user/user.model.js +27 -0
- package/dist/src/modules/v4/zyfi/zyfi.model.d.ts +45 -0
- package/dist/src/modules/v4/zyfi/zyfi.model.js +1 -0
- package/dist/src/modules/v4/zyfi/zyfi.service.d.ts +30 -0
- package/dist/src/modules/v4/zyfi/zyfi.service.js +35 -0
- package/dist/src/plugins/error-handling.plugin.d.ts +2 -2
- package/dist/src/plugins/error-handling.plugin.js +9 -3
- package/dist/src/plugins/logger.plugin.js +1 -20
- package/dist/src/routes/v1/allowances.d.ts +1 -1
- package/dist/src/routes/v1/allowances.js +1 -1
- package/dist/src/routes/v1/balances.d.ts +1 -1
- package/dist/src/routes/v1/balances.js +1 -1
- package/dist/src/routes/v1/prices.d.ts +1 -1
- package/dist/src/routes/v1/prices.js +1 -1
- package/dist/src/routes/v1/router.d.ts +102 -0
- package/dist/src/routes/v1/router.js +6 -0
- package/dist/src/routes/v1/tokens.d.ts +1 -1
- package/dist/src/routes/v1/tokens.js +1 -1
- package/dist/src/routes/v2/merkl.d.ts +5 -5
- package/dist/src/routes/v2/merkl.js +1 -1
- package/dist/src/routes/v2/router.d.ts +46 -0
- package/dist/src/routes/v2/router.js +3 -0
- package/dist/src/routes/v3/app.d.ts +1 -1
- package/dist/src/routes/v3/app.js +1 -1
- package/dist/src/routes/v3/blacklist.d.ts +1 -2479
- package/dist/src/routes/v3/blacklist.js +1 -1
- package/dist/src/routes/v3/campaignClaims.d.ts +1 -1
- package/dist/src/routes/v3/campaignClaims.js +1 -1
- package/dist/src/routes/v3/campaignReport.d.ts +1 -1
- package/dist/src/routes/v3/campaignReport.js +1 -1
- package/dist/src/routes/v3/campaignUnclaimed.d.ts +1 -1
- package/dist/src/routes/v3/campaignUnclaimed.js +1 -1
- package/dist/src/routes/v3/campaigns.d.ts +1 -2483
- package/dist/src/routes/v3/campaigns.js +1 -1
- package/dist/src/routes/v3/campaignsForMainParameter.d.ts +1 -1
- package/dist/src/routes/v3/campaignsForMainParameter.js +1 -1
- package/dist/src/routes/v3/campaignsInfo.d.ts +1 -2481
- package/dist/src/routes/v3/campaignsInfo.js +1 -1
- package/dist/src/routes/v3/campaignsRewardsReport.d.ts +1 -1
- package/dist/src/routes/v3/campaignsRewardsReport.js +1 -1
- package/dist/src/routes/v3/claims.d.ts +1 -1
- package/dist/src/routes/v3/claims.js +1 -1
- package/dist/src/routes/v3/compoundV2.d.ts +1 -1
- package/dist/src/routes/v3/compoundV2.js +1 -1
- package/dist/src/routes/v3/createCampaign.d.ts +1 -1
- package/dist/src/routes/v3/createCampaign.js +1 -1
- package/dist/src/routes/v3/dolomite.d.ts +1 -1
- package/dist/src/routes/v3/dolomite.js +1 -1
- package/dist/src/routes/v3/euler.d.ts +1 -1
- package/dist/src/routes/v3/euler.js +1 -1
- package/dist/src/routes/v3/fetch.d.ts +1 -1
- package/dist/src/routes/v3/fetch.js +1 -1
- package/dist/src/routes/v3/health.d.ts +1 -1
- package/dist/src/routes/v3/health.js +1 -1
- package/dist/src/routes/v3/lostyield.d.ts +1 -1
- package/dist/src/routes/v3/lostyield.js +1 -1
- package/dist/src/routes/v3/merkl.d.ts +1 -1
- package/dist/src/routes/v3/merkl.js +1 -1
- package/dist/src/routes/v3/morphoMarkets.d.ts +1 -1
- package/dist/src/routes/v3/morphoMarkets.js +1 -1
- package/dist/src/routes/v3/morphoVaults.d.ts +1 -1
- package/dist/src/routes/v3/morphoVaults.js +1 -1
- package/dist/src/routes/v3/multiChainPositions.d.ts +1 -2480
- package/dist/src/routes/v3/multiChainPositions.js +1 -1
- package/dist/src/routes/v3/opportunity.d.ts +1 -2483
- package/dist/src/routes/v3/opportunity.js +1 -1
- package/dist/src/routes/v3/overview.d.ts +1 -1
- package/dist/src/routes/v3/overview.js +1 -1
- package/dist/src/routes/v3/parse.d.ts +1 -1
- package/dist/src/routes/v3/parse.js +1 -1
- package/dist/src/routes/v3/payload.d.ts +1 -1
- package/dist/src/routes/v3/payload.js +1 -1
- package/dist/src/routes/v3/poolInfo.js +1 -1
- package/dist/src/routes/v3/positions.d.ts +1 -2479
- package/dist/src/routes/v3/positions.js +1 -1
- package/dist/src/routes/v3/radiant.d.ts +1 -1
- package/dist/src/routes/v3/radiant.js +1 -1
- package/dist/src/routes/v3/recipients.d.ts +1 -1
- package/dist/src/routes/v3/recipients.js +1 -1
- package/dist/src/routes/v3/rewards.d.ts +1 -2508
- package/dist/src/routes/v3/rewards.js +1 -1
- package/dist/src/routes/v3/rewardsReport.d.ts +1 -1
- package/dist/src/routes/v3/rewardsReport.js +1 -1
- package/dist/src/routes/v3/router.d.ts +1 -0
- package/dist/src/routes/v3/router.js +74 -0
- package/dist/src/routes/v3/silo.d.ts +1 -1
- package/dist/src/routes/v3/silo.js +1 -1
- package/dist/src/routes/v3/token.d.ts +1 -1
- package/dist/src/routes/v3/token.js +1 -1
- package/dist/src/routes/v3/tokenUnclaimed.d.ts +1 -1
- package/dist/src/routes/v3/tokenUnclaimed.js +1 -1
- package/dist/src/routes/v3/updates.d.ts +1 -2483
- package/dist/src/routes/v3/updates.js +1 -1
- package/dist/src/routes/v3/userRewards.d.ts +1 -2499
- package/dist/src/routes/v3/userRewards.js +1 -1
- package/dist/src/utils/decodeCalls.js +12 -1
- package/dist/src/utils/encodeCalls.js +26 -3
- package/dist/src/utils/generateCardName.js +2 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +2 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.d.ts +0 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +0 -155
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPricesRefactoFinal.d.ts +0 -4
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesPricesRefactoFinal.js +0 -24
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.d.ts +0 -4
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +0 -230
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2RefactoFinal.d.ts +0 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound2RefactoFinal.js +0 -22
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3RefactoFinal.d.ts +0 -3
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound3RefactoFinal.js +0 -22
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4RefactoFinal.d.ts +0 -4
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound4RefactoFinal.js +0 -22
- package/dist/src/libs/campaigns/campaignsDynamicDataRefacto.d.ts +0 -3
- package/dist/src/libs/campaigns/campaignsDynamicDataRefacto.js +0 -75
|
@@ -1,33 +1,111 @@
|
|
|
1
|
+
import { decodeFunctionResult, encodeFunctionData, parseAbi } from "viem";
|
|
2
|
+
import { ChainInteractionService } from "../chainInteraction";
|
|
1
3
|
import { EnsoService } from "../enso/enso.service";
|
|
2
|
-
import {
|
|
4
|
+
import { KyberZapService } from "../kyberzap/kyberzap.service";
|
|
3
5
|
export class InteractionService {
|
|
4
6
|
static async getTarget(chainId, protocolId, identifier) {
|
|
7
|
+
const targets = [];
|
|
8
|
+
const slug = EnsoService.getSlug(protocolId);
|
|
9
|
+
if (slug) {
|
|
10
|
+
const tokens = await EnsoService.getTokens(chainId, slug, identifier);
|
|
11
|
+
const ensoTargets = await InteractionService.getTargetsFromEnsoTokens(tokens);
|
|
12
|
+
targets.push(ensoTargets?.[0]);
|
|
13
|
+
}
|
|
14
|
+
return targets;
|
|
15
|
+
}
|
|
16
|
+
static getTargetFromKyberZap(chainId, protocolId, identifier) {
|
|
17
|
+
const dexId = KyberZapService.getDexId(protocolId);
|
|
18
|
+
const chainLabel = KyberZapService.getChainLabel(chainId);
|
|
19
|
+
if (!dexId || !chainLabel)
|
|
20
|
+
return;
|
|
21
|
+
return {
|
|
22
|
+
provider: "zap",
|
|
23
|
+
chainId: chainId,
|
|
24
|
+
identifier: identifier,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
static async getTargetFromEnso(chainId, protocolId, identifier) {
|
|
5
28
|
const slug = EnsoService.getSlug(protocolId);
|
|
6
29
|
if (!slug)
|
|
7
30
|
return;
|
|
8
31
|
const tokens = await EnsoService.getTokens(chainId, slug, identifier);
|
|
9
|
-
|
|
32
|
+
const ensoTargets = await InteractionService.getTargetsFromEnsoTokens(tokens);
|
|
33
|
+
return ensoTargets?.[0];
|
|
10
34
|
}
|
|
11
35
|
static async getTargetsFromEnsoTokens(tokens) {
|
|
12
36
|
const targets = [];
|
|
13
37
|
for (const { address, underlyingTokens, ...target } of tokens) {
|
|
14
38
|
try {
|
|
15
|
-
const [utilityToken, ...assetTokens] = await TokenService.getManyOrCreate([{ chainId: target.chainId, address }].concat(underlyingTokens));
|
|
16
39
|
targets.push({
|
|
40
|
+
provider: "enso",
|
|
41
|
+
chainId: target.chainId,
|
|
17
42
|
identifier: address,
|
|
18
|
-
name: `${utilityToken?.symbol}: ${assetTokens.map(t => t?.symbol).join("/")}`,
|
|
19
|
-
tokens: assetTokens.filter(t => t !== undefined),
|
|
20
43
|
});
|
|
21
44
|
}
|
|
22
45
|
catch { }
|
|
23
46
|
}
|
|
24
47
|
return targets;
|
|
25
48
|
}
|
|
26
|
-
static async getTargets(chainId, protocolId) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
49
|
+
static async getTargets(chainId, protocolId, identifier) {
|
|
50
|
+
const targets = [];
|
|
51
|
+
const ensoTarget = await InteractionService.getTargetFromEnso(chainId, protocolId, identifier);
|
|
52
|
+
const zapTarget = InteractionService.getTargetFromKyberZap(chainId, protocolId, identifier);
|
|
53
|
+
if (zapTarget)
|
|
54
|
+
targets.push(zapTarget);
|
|
55
|
+
if (ensoTarget)
|
|
56
|
+
targets.push(ensoTarget);
|
|
57
|
+
return targets;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Gets approval information onchain
|
|
61
|
+
* @returns approved?, approval tx & allowance amount
|
|
62
|
+
*/
|
|
63
|
+
static async getApproval(chainId, owner, spender, tokenAddress, amount) {
|
|
64
|
+
//TODO: add utils to make using viem type-safety more concise
|
|
65
|
+
const abi = parseAbi([
|
|
66
|
+
"function approve(address, uint256) returns (bool)",
|
|
67
|
+
"function allowance(address owner, address spender) returns (uint256)",
|
|
68
|
+
]);
|
|
69
|
+
const decode = (r) => decodeFunctionResult({
|
|
70
|
+
abi,
|
|
71
|
+
functionName: "allowance",
|
|
72
|
+
data: r?.returnData,
|
|
73
|
+
});
|
|
74
|
+
const allowance = await ChainInteractionService(chainId).fetchAndDecode({
|
|
75
|
+
target: tokenAddress,
|
|
76
|
+
allowFailure: true,
|
|
77
|
+
callData: encodeFunctionData({
|
|
78
|
+
abi,
|
|
79
|
+
functionName: "allowance",
|
|
80
|
+
args: [owner, spender],
|
|
81
|
+
}),
|
|
82
|
+
}, decode);
|
|
83
|
+
const approved = allowance >= amount;
|
|
84
|
+
return {
|
|
85
|
+
approved,
|
|
86
|
+
allowance,
|
|
87
|
+
approval: {
|
|
88
|
+
to: tokenAddress,
|
|
89
|
+
data: encodeFunctionData({
|
|
90
|
+
abi,
|
|
91
|
+
functionName: "approve",
|
|
92
|
+
args: [spender, amount],
|
|
93
|
+
}),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
static async getTransaction(provider, chainId, protocolId, identifier, userAddress, fromTokenAddress, fromTokenAmount) {
|
|
98
|
+
if (provider === "zap")
|
|
99
|
+
return await KyberZapService.getTransaction(chainId, protocolId, identifier, userAddress, fromTokenAddress, fromTokenAmount);
|
|
100
|
+
const { tx, ...quote } = await EnsoService.getTransaction({
|
|
101
|
+
fromAddress: userAddress,
|
|
102
|
+
tokenIn: [fromTokenAddress],
|
|
103
|
+
tokenOut: [identifier],
|
|
104
|
+
amountIn: [fromTokenAmount.toString()],
|
|
105
|
+
routingStrategy: "router",
|
|
106
|
+
chainId,
|
|
107
|
+
});
|
|
108
|
+
const { allowance, approval, approved } = await InteractionService.getApproval(chainId, userAddress, tx.to, fromTokenAddress, fromTokenAmount);
|
|
109
|
+
return { ...quote, allowance, approval, approved, transaction: tx };
|
|
32
110
|
}
|
|
33
111
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const dexIdToProtocolId: {
|
|
2
|
+
readonly DEX_UNISWAPV3: "uniswap-v3";
|
|
3
|
+
readonly DEX_UNISWAPV2: "uniswap-v2";
|
|
4
|
+
readonly DEX_PANCAKESWAPV3: "pancakeswap-v3";
|
|
5
|
+
readonly DEX_SUSHISWAPV3: "sushiswap-v3";
|
|
6
|
+
readonly DEX_CURVE: "curve";
|
|
7
|
+
readonly DEX_QUICKSWAPV3UNI: "quickswap-uni";
|
|
8
|
+
readonly DEX_QUICKSWAPV3ALGEBRA: "quickswap-algebra";
|
|
9
|
+
readonly DEX_THRUSTERV3: "thruster";
|
|
10
|
+
readonly DEX_CAMELOTV3: "camelot";
|
|
11
|
+
readonly DEX_BEEFY: "beefy";
|
|
12
|
+
readonly DEX_KOICL: "koi";
|
|
13
|
+
readonly DEX_AERODROMECL: "aerodrome";
|
|
14
|
+
readonly DEX_BALANCER: "balancer";
|
|
15
|
+
};
|
|
16
|
+
export declare const chainToKyberLabel: {
|
|
17
|
+
[chainId: number]: string;
|
|
18
|
+
};
|
|
19
|
+
export type KyberZapDexId = keyof typeof dexIdToProtocolId;
|
|
20
|
+
export declare const apiTypes: {
|
|
21
|
+
readonly "/api/v1/in/route": {
|
|
22
|
+
readonly query: import("@sinclair/typebox").TObject<{
|
|
23
|
+
dex: import("@sinclair/typebox").TString;
|
|
24
|
+
"pool.id": import("@sinclair/typebox").TString;
|
|
25
|
+
"position.tickLower": import("@sinclair/typebox").TString;
|
|
26
|
+
"position.tickUpper": import("@sinclair/typebox").TString;
|
|
27
|
+
tokenIn: import("@sinclair/typebox").TString;
|
|
28
|
+
amountIn: import("@sinclair/typebox").TString;
|
|
29
|
+
feeAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
30
|
+
feePcm: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
31
|
+
}>;
|
|
32
|
+
readonly response: import("@sinclair/typebox").TObject<{
|
|
33
|
+
message: import("@sinclair/typebox").TString;
|
|
34
|
+
data: import("@sinclair/typebox").TObject<{
|
|
35
|
+
poolDetails: import("@sinclair/typebox").TObject<{}>;
|
|
36
|
+
positionDetails: import("@sinclair/typebox").TObject<{}>;
|
|
37
|
+
zapDetails: import("@sinclair/typebox").TObject<{
|
|
38
|
+
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{}>>;
|
|
39
|
+
finalAmountUsd: import("@sinclair/typebox").TString;
|
|
40
|
+
priceImpact: import("@sinclair/typebox").TNumber;
|
|
41
|
+
}>;
|
|
42
|
+
route: import("@sinclair/typebox").TString;
|
|
43
|
+
routerAddress: import("@sinclair/typebox").TString;
|
|
44
|
+
}>;
|
|
45
|
+
requestId: import("@sinclair/typebox").TString;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
readonly "/api/v1/in/route/build": {
|
|
49
|
+
readonly query: import("@sinclair/typebox").TObject<{}>;
|
|
50
|
+
readonly body: import("@sinclair/typebox").TObject<{
|
|
51
|
+
sender: import("@sinclair/typebox").TString;
|
|
52
|
+
recipient: import("@sinclair/typebox").TString;
|
|
53
|
+
route: import("@sinclair/typebox").TString;
|
|
54
|
+
deadline: import("@sinclair/typebox").TNumber;
|
|
55
|
+
source: import("@sinclair/typebox").TString;
|
|
56
|
+
}>;
|
|
57
|
+
readonly response: import("@sinclair/typebox").TObject<{
|
|
58
|
+
message: import("@sinclair/typebox").TString;
|
|
59
|
+
data: import("@sinclair/typebox").TObject<{
|
|
60
|
+
routerAddress: import("@sinclair/typebox").TString;
|
|
61
|
+
callData: import("@sinclair/typebox").TString;
|
|
62
|
+
value: import("@sinclair/typebox").TString;
|
|
63
|
+
}>;
|
|
64
|
+
requestId: import("@sinclair/typebox").TString;
|
|
65
|
+
}>;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
export type KyberZapRoute = keyof typeof apiTypes;
|
|
69
|
+
export type KyberZapPostRoute = {
|
|
70
|
+
[R in KyberZapRoute]: "body" extends keyof KyberZapApi<R> ? R : never;
|
|
71
|
+
}[KyberZapRoute];
|
|
72
|
+
export type KyberZapApi<T extends KyberZapRoute> = (typeof apiTypes)[T];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ChainId } from "@sdk";
|
|
2
|
+
import { t } from "elysia";
|
|
3
|
+
export const dexIdToProtocolId = {
|
|
4
|
+
DEX_UNISWAPV3: "uniswap-v3",
|
|
5
|
+
DEX_UNISWAPV2: "uniswap-v2",
|
|
6
|
+
DEX_PANCAKESWAPV3: "pancakeswap-v3",
|
|
7
|
+
DEX_SUSHISWAPV3: "sushiswap-v3",
|
|
8
|
+
DEX_CURVE: "curve",
|
|
9
|
+
DEX_QUICKSWAPV3UNI: "quickswap-uni",
|
|
10
|
+
DEX_QUICKSWAPV3ALGEBRA: "quickswap-algebra",
|
|
11
|
+
DEX_THRUSTERV3: "thruster",
|
|
12
|
+
DEX_CAMELOTV3: "camelot",
|
|
13
|
+
DEX_BEEFY: "beefy",
|
|
14
|
+
DEX_KOICL: "koi",
|
|
15
|
+
DEX_AERODROMECL: "aerodrome",
|
|
16
|
+
DEX_BALANCER: "balancer",
|
|
17
|
+
};
|
|
18
|
+
export const chainToKyberLabel = {
|
|
19
|
+
[ChainId.ARBITRUM]: "arbitrum",
|
|
20
|
+
[ChainId.AVALANCHE]: "avalance",
|
|
21
|
+
[ChainId.BASE]: "base",
|
|
22
|
+
[ChainId.BLAST]: "blast",
|
|
23
|
+
[ChainId.BSC]: "bsc",
|
|
24
|
+
[ChainId.MAINNET]: "ethereum",
|
|
25
|
+
[ChainId.LINEA]: "linea",
|
|
26
|
+
[ChainId.OPTIMISM]: "optimism",
|
|
27
|
+
[ChainId.POLYGON]: "polygon",
|
|
28
|
+
[ChainId.POLYGONZKEVM]: "polygon-zkevm",
|
|
29
|
+
[ChainId.SCROLL]: "scroll",
|
|
30
|
+
[ChainId.ZKSYNC]: "zksync",
|
|
31
|
+
};
|
|
32
|
+
export const apiTypes = {
|
|
33
|
+
"/api/v1/in/route": {
|
|
34
|
+
query: t.Object({
|
|
35
|
+
dex: t.String({ example: "DEX_UNISWAPV3" }),
|
|
36
|
+
"pool.id": t.String({ example: "0x2f5e87c9312fa29aed5c179e456625d79015299c" }),
|
|
37
|
+
"position.tickLower": t.String(),
|
|
38
|
+
"position.tickUpper": t.String(),
|
|
39
|
+
tokenIn: t.String(),
|
|
40
|
+
amountIn: t.String(),
|
|
41
|
+
feeAddress: t.Optional(t.String()),
|
|
42
|
+
feePcm: t.Optional(t.Number()),
|
|
43
|
+
}),
|
|
44
|
+
response: t.Object({
|
|
45
|
+
message: t.String({ example: "OK" }),
|
|
46
|
+
data: t.Object({
|
|
47
|
+
poolDetails: t.Object({}),
|
|
48
|
+
positionDetails: t.Object({}),
|
|
49
|
+
zapDetails: t.Object({
|
|
50
|
+
actions: t.Array(t.Object({})),
|
|
51
|
+
finalAmountUsd: t.String(),
|
|
52
|
+
priceImpact: t.Number(),
|
|
53
|
+
}),
|
|
54
|
+
route: t.String(),
|
|
55
|
+
routerAddress: t.String(),
|
|
56
|
+
}),
|
|
57
|
+
requestId: t.String(),
|
|
58
|
+
}),
|
|
59
|
+
},
|
|
60
|
+
"/api/v1/in/route/build": {
|
|
61
|
+
query: t.Object({}),
|
|
62
|
+
body: t.Object({
|
|
63
|
+
sender: t.String(),
|
|
64
|
+
recipient: t.String(),
|
|
65
|
+
route: t.String(),
|
|
66
|
+
deadline: t.Number(),
|
|
67
|
+
source: t.String(),
|
|
68
|
+
}),
|
|
69
|
+
response: t.Object({
|
|
70
|
+
message: t.String({ example: "OK" }),
|
|
71
|
+
data: t.Object({
|
|
72
|
+
routerAddress: t.String(),
|
|
73
|
+
callData: t.String(),
|
|
74
|
+
value: t.String(),
|
|
75
|
+
}),
|
|
76
|
+
requestId: t.String(),
|
|
77
|
+
}),
|
|
78
|
+
},
|
|
79
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { InteractionQuote } from "../interaction/interaction.model";
|
|
2
|
+
import type { ProtocolId } from "../protocol";
|
|
3
|
+
import { type KyberZapDexId } from "./kyberzap.model";
|
|
4
|
+
export declare abstract class KyberZapService {
|
|
5
|
+
#private;
|
|
6
|
+
static getDexId(protocolId: ProtocolId | string): KyberZapDexId | undefined;
|
|
7
|
+
static getChainLabel(chainId: number): string | undefined;
|
|
8
|
+
static getProtocolId(dexId: KyberZapDexId | string): ProtocolId | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* @notice We don't handle tick setting in the UI for now, until we do this give the full-range ticks
|
|
11
|
+
* @param param0
|
|
12
|
+
*/
|
|
13
|
+
static getFullRangeTicks(): number[];
|
|
14
|
+
static getTransaction(chainId: number, protocol: ProtocolId, identifier: string, userAddress: string, fromTokenAddress: string, fromTokenAmount: bigint): Promise<InteractionQuote>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { InteractionService } from "../interaction/interaction.service";
|
|
2
|
+
import { chainToKyberLabel, dexIdToProtocolId, } from "./kyberzap.model";
|
|
3
|
+
const KYBERZAP = `https://zap-api.kyberswap.com/`;
|
|
4
|
+
export class KyberZapService {
|
|
5
|
+
static async #fetch(route, params) {
|
|
6
|
+
const res = await fetch(`${KYBERZAP}${chainToKyberLabel[params?.chainId] ?? ""}${route}?${params?.query ? new URLSearchParams(params?.query) : ""}`, {
|
|
7
|
+
headers: new Headers({
|
|
8
|
+
Authorization: `Bearer ${process.env.KYBERSWAP_ZAP_API_KEY}`,
|
|
9
|
+
"Content-Type": "application/json",
|
|
10
|
+
}),
|
|
11
|
+
});
|
|
12
|
+
if (res.status !== 200)
|
|
13
|
+
throw new Error((await res.json())?.message);
|
|
14
|
+
return (await res.json());
|
|
15
|
+
}
|
|
16
|
+
static async #post(route, params) {
|
|
17
|
+
const res = await fetch(`${KYBERZAP}${chainToKyberLabel[params?.chainId] ?? ""}${route}`, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
body: JSON.stringify(params?.body),
|
|
20
|
+
headers: new Headers({
|
|
21
|
+
Authorization: `Bearer ${"8dbbda50-6ed5-4bda-bf54-ea2796602057"}`,
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (res.status !== 200)
|
|
26
|
+
throw new Error((await res.json())?.message);
|
|
27
|
+
return (await res.json());
|
|
28
|
+
}
|
|
29
|
+
static getDexId(protocolId) {
|
|
30
|
+
const dexId = Object.entries(dexIdToProtocolId).find(([_, id]) => id === protocolId)?.[0];
|
|
31
|
+
return dexId;
|
|
32
|
+
}
|
|
33
|
+
static getChainLabel(chainId) {
|
|
34
|
+
return chainToKyberLabel?.[chainId];
|
|
35
|
+
}
|
|
36
|
+
static getProtocolId(dexId) {
|
|
37
|
+
return dexIdToProtocolId[dexId];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @notice We don't handle tick setting in the UI for now, until we do this give the full-range ticks
|
|
41
|
+
* @param param0
|
|
42
|
+
*/
|
|
43
|
+
static getFullRangeTicks() {
|
|
44
|
+
return [-886800, 886800];
|
|
45
|
+
}
|
|
46
|
+
static async getTransaction(chainId, protocol, identifier, userAddress, fromTokenAddress, fromTokenAmount) {
|
|
47
|
+
const [lower, upper] = KyberZapService.getFullRangeTicks();
|
|
48
|
+
const { data: route } = await KyberZapService.#fetch("/api/v1/in/route", {
|
|
49
|
+
query: {
|
|
50
|
+
tokenIn: fromTokenAddress,
|
|
51
|
+
amountIn: fromTokenAmount?.toString(),
|
|
52
|
+
"pool.id": identifier,
|
|
53
|
+
"position.tickLower": lower?.toString(),
|
|
54
|
+
"position.tickUpper": upper?.toString(),
|
|
55
|
+
dex: KyberZapService.getDexId(protocol),
|
|
56
|
+
},
|
|
57
|
+
chainId,
|
|
58
|
+
});
|
|
59
|
+
const { data: transaction } = await KyberZapService.#post("/api/v1/in/route/build", {
|
|
60
|
+
query: {},
|
|
61
|
+
body: {
|
|
62
|
+
//TODO: add a more relevant value here
|
|
63
|
+
deadline: 1800000000,
|
|
64
|
+
recipient: userAddress,
|
|
65
|
+
sender: userAddress,
|
|
66
|
+
route: route.route,
|
|
67
|
+
source: "merkl",
|
|
68
|
+
},
|
|
69
|
+
chainId,
|
|
70
|
+
});
|
|
71
|
+
const { allowance, approval, approved } = await InteractionService.getApproval(chainId, userAddress, route.routerAddress, fromTokenAddress, fromTokenAmount);
|
|
72
|
+
return {
|
|
73
|
+
allowance,
|
|
74
|
+
approval,
|
|
75
|
+
approved,
|
|
76
|
+
amountIn: fromTokenAmount,
|
|
77
|
+
transaction: {
|
|
78
|
+
to: transaction.routerAddress,
|
|
79
|
+
data: transaction.callData,
|
|
80
|
+
value: 0n,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -3,7 +3,7 @@ import { Elysia } from "elysia";
|
|
|
3
3
|
import { PositionsInputDto } from "./liquidity.model";
|
|
4
4
|
import { LiquidityService } from "./liquidity.service";
|
|
5
5
|
// ─── Positions Controller ──────────────────────────────────────────────
|
|
6
|
-
export const LiquidityController = new Elysia({ prefix: "/liquidity", detail: { tags: ["Positions"] } })
|
|
6
|
+
export const LiquidityController = new Elysia({ prefix: "/liquidity", detail: { tags: ["Positions"], hide: true } })
|
|
7
7
|
// ─── Get User Positions on a Chain ───────────────────────────────────
|
|
8
8
|
.get("/", async ({ query }) => {
|
|
9
9
|
return await LiquidityService.fetchPositions(query);
|
|
@@ -4,7 +4,7 @@ import Elysia from "elysia";
|
|
|
4
4
|
import { CreateRootDto, RootByTimestampsDto } from "./merklRoot.model";
|
|
5
5
|
import { MerklRootService } from "./merklRoot.service";
|
|
6
6
|
// ─── Merkl Roots Controller ─────────────────────────────────────────────
|
|
7
|
-
export const MerklRootController = new Elysia({ prefix: "/roots", detail: { tags: ["Roots"] } })
|
|
7
|
+
export const MerklRootController = new Elysia({ prefix: "/roots", detail: { tags: ["Roots"], hide: true } })
|
|
8
8
|
// ─── Get Merkl Root By Timestamp ─────────────────────────────────────
|
|
9
9
|
.get("/", async ({ query }) => await MerklRootService.rootForTimestamp(query), {
|
|
10
10
|
query: RootByTimestampsDto,
|