@paraswap/dex-lib 4.7.25-0 → 4.7.25-add-origin-arms.0

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.
Files changed (159) hide show
  1. package/build/abi/PendleRouterStatic.json +19 -0
  2. package/build/abi/apex-defi/ApexDefiFactory.abi.json +1749 -0
  3. package/build/abi/apex-defi/ApexDefiRouter.abi.json +1120 -0
  4. package/build/abi/apex-defi/ApexDefiToken.abi.json +229 -0
  5. package/build/abi/apex-defi/ApexDefiWrapper.abi.json +92 -0
  6. package/build/abi/apex-defi/ApexDefiWrapperFactory.abi.json +1107 -0
  7. package/build/abi/pangolin-v3/PangolinV3StateMulticall.abi.json +796 -0
  8. package/build/abi/pendle/pendle-deployer.abi.json +520 -0
  9. package/build/abi/pendle/pendle-oracle.abi.json +413 -0
  10. package/build/abi/ring-v2/few-wrapped-token.json +587 -0
  11. package/build/abi/ring-v2/ring-v2-factory.json +125 -0
  12. package/build/abi/ring-v2/ring-v2-pool.json +461 -0
  13. package/build/abi/ring-v2/ring-v2-router.json +332 -0
  14. package/build/abi/stabull/stabull-curve.json +738 -0
  15. package/build/abi/stabull/stabull-router.json +76 -0
  16. package/build/abi/uniswap-v4/hooks/SpotDynamicFeeManager.json +26 -0
  17. package/build/abi/uniswap-v4/hooks/SpotHook.json +54 -0
  18. package/build/abi/uniswap-v4/hooks/SpotPolicyManager.json +45 -0
  19. package/build/abi/uniswap-v4/hooks/cabalcoin-hook.abi.json +682 -0
  20. package/build/abi/uniswap-v4/hooks/fee-hook.abi.json +1335 -0
  21. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.d.ts +29 -0
  22. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.js +153 -0
  23. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.js.map +1 -0
  24. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying.d.ts +40 -0
  25. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying.js +323 -0
  26. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying.js.map +1 -0
  27. package/build/dex/aave-pt-to-underlying/config.d.ts +3 -0
  28. package/build/dex/aave-pt-to-underlying/config.js +24 -0
  29. package/build/dex/aave-pt-to-underlying/config.js.map +1 -0
  30. package/build/dex/aave-pt-to-underlying/constants.d.ts +2 -0
  31. package/build/dex/aave-pt-to-underlying/constants.js +6 -0
  32. package/build/dex/aave-pt-to-underlying/constants.js.map +1 -0
  33. package/build/dex/aave-pt-to-underlying/types.d.ts +24 -0
  34. package/build/dex/aave-pt-to-underlying/types.js +3 -0
  35. package/build/dex/aave-pt-to-underlying/types.js.map +1 -0
  36. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.d.ts +39 -0
  37. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.js +244 -0
  38. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.js.map +1 -0
  39. package/build/dex/aave-pt-to-usdc/config.d.ts +3 -0
  40. package/build/dex/aave-pt-to-usdc/config.js +47 -0
  41. package/build/dex/aave-pt-to-usdc/config.js.map +1 -0
  42. package/build/dex/aave-pt-to-usdc/constants.d.ts +2 -0
  43. package/build/dex/aave-pt-to-usdc/constants.js +6 -0
  44. package/build/dex/aave-pt-to-usdc/constants.js.map +1 -0
  45. package/build/dex/aave-pt-to-usdc/types.d.ts +22 -0
  46. package/build/dex/aave-pt-to-usdc/types.js +3 -0
  47. package/build/dex/aave-pt-to-usdc/types.js.map +1 -0
  48. package/build/dex/apex-defi/apex-defi-factory.d.ts +26 -0
  49. package/build/dex/apex-defi/apex-defi-factory.js +53 -0
  50. package/build/dex/apex-defi/apex-defi-factory.js.map +1 -0
  51. package/build/dex/apex-defi/apex-defi-pool.d.ts +55 -0
  52. package/build/dex/apex-defi/apex-defi-pool.js +247 -0
  53. package/build/dex/apex-defi/apex-defi-pool.js.map +1 -0
  54. package/build/dex/apex-defi/apex-defi-wrapper-factory.d.ts +57 -0
  55. package/build/dex/apex-defi/apex-defi-wrapper-factory.js +250 -0
  56. package/build/dex/apex-defi/apex-defi-wrapper-factory.js.map +1 -0
  57. package/build/dex/apex-defi/apex-defi.d.ts +97 -0
  58. package/build/dex/apex-defi/apex-defi.js +1021 -0
  59. package/build/dex/apex-defi/apex-defi.js.map +1 -0
  60. package/build/dex/apex-defi/config.d.ts +4 -0
  61. package/build/dex/apex-defi/config.js +138 -0
  62. package/build/dex/apex-defi/config.js.map +1 -0
  63. package/build/dex/apex-defi/types.d.ts +32 -0
  64. package/build/dex/apex-defi/types.js +3 -0
  65. package/build/dex/apex-defi/types.js.map +1 -0
  66. package/build/dex/apex-defi/utils.d.ts +46 -0
  67. package/build/dex/apex-defi/utils.js +133 -0
  68. package/build/dex/apex-defi/utils.js.map +1 -0
  69. package/build/dex/idle-dao/idle-dao.d.ts +0 -1
  70. package/build/dex/idle-dao/idle-dao.js +11 -23
  71. package/build/dex/idle-dao/idle-dao.js.map +1 -1
  72. package/build/dex/infusion/infusion-stable-pool.d.ts +1 -1
  73. package/build/dex/infusion/infusion-stable-pool.js +1 -1
  74. package/build/dex/infusion/infusion-stable-pool.js.map +1 -1
  75. package/build/dex/infusion/infusion.d.ts +3 -4
  76. package/build/dex/infusion/infusion.js +72 -114
  77. package/build/dex/infusion/infusion.js.map +1 -1
  78. package/build/dex/maker-psm/maker-psm.d.ts +41 -4
  79. package/build/dex/maker-psm/maker-psm.js +143 -40
  80. package/build/dex/maker-psm/maker-psm.js.map +1 -1
  81. package/build/dex/miro-migrator/miro-migrator-state.d.ts +27 -0
  82. package/build/dex/miro-migrator/miro-migrator-state.js +89 -0
  83. package/build/dex/miro-migrator/miro-migrator-state.js.map +1 -0
  84. package/build/dex/oswap/config.js +16 -0
  85. package/build/dex/oswap/config.js.map +1 -1
  86. package/build/dex/oswap/oswap-pool.d.ts +17 -1
  87. package/build/dex/oswap/oswap-pool.js +95 -2
  88. package/build/dex/oswap/oswap-pool.js.map +1 -1
  89. package/build/dex/oswap/oswap.d.ts +3 -2
  90. package/build/dex/oswap/oswap.js +59 -3
  91. package/build/dex/oswap/oswap.js.map +1 -1
  92. package/build/dex/oswap/types.d.ts +8 -1
  93. package/build/dex/stabull/config.d.ts +3 -0
  94. package/build/dex/stabull/config.js +177 -0
  95. package/build/dex/stabull/config.js.map +1 -0
  96. package/build/dex/stabull/stabull-pool.d.ts +46 -0
  97. package/build/dex/stabull/stabull-pool.js +113 -0
  98. package/build/dex/stabull/stabull-pool.js.map +1 -0
  99. package/build/dex/stabull/stabull.d.ts +55 -0
  100. package/build/dex/stabull/stabull.js +286 -0
  101. package/build/dex/stabull/stabull.js.map +1 -0
  102. package/build/dex/stabull/types.d.ts +21 -0
  103. package/build/dex/stabull/types.js +3 -0
  104. package/build/dex/stabull/types.js.map +1 -0
  105. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.d.ts +4 -0
  106. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js +56 -0
  107. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js.map +1 -0
  108. package/build/dex/uniswap-v4/hooks/arena.d.ts +6 -0
  109. package/build/dex/uniswap-v4/hooks/arena.js +10 -0
  110. package/build/dex/uniswap-v4/hooks/arena.js.map +1 -0
  111. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.d.ts +0 -0
  112. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.js +2 -0
  113. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.js.map +1 -0
  114. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.d.ts +7 -0
  115. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js +28 -0
  116. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js.map +1 -0
  117. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.d.ts +0 -0
  118. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js +2 -0
  119. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js.map +1 -0
  120. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.d.ts +7 -0
  121. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js +28 -0
  122. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js.map +1 -0
  123. package/build/dex/uniswap-v4/hooks/fee-hook/types.d.ts +0 -0
  124. package/build/dex/uniswap-v4/hooks/fee-hook/types.js +2 -0
  125. package/build/dex/uniswap-v4/hooks/fee-hook/types.js.map +1 -0
  126. package/build/dex/uniswap-v4/hooks/index.d.ts +1 -0
  127. package/build/dex/uniswap-v4/hooks/index.js +18 -0
  128. package/build/dex/uniswap-v4/hooks/index.js.map +1 -0
  129. package/build/dex/uniswap-v4/hooks/spot.d.ts +15 -0
  130. package/build/dex/uniswap-v4/hooks/spot.js +109 -0
  131. package/build/dex/uniswap-v4/hooks/spot.js.map +1 -0
  132. package/build/dex/uniswap-v4/hooks/template.d.ts +150 -0
  133. package/build/dex/uniswap-v4/hooks/template.js +104 -0
  134. package/build/dex/uniswap-v4/hooks/template.js.map +1 -0
  135. package/build/dex/usdc-transmuter/usdc-transmuter-pool.d.ts +26 -0
  136. package/build/dex/usdc-transmuter/usdc-transmuter-pool.js +75 -0
  137. package/build/dex/usdc-transmuter/usdc-transmuter-pool.js.map +1 -0
  138. package/build/dex/usual/usual-usdc-usdc.d.ts +17 -0
  139. package/build/dex/usual/usual-usdc-usdc.js +59 -0
  140. package/build/dex/usual/usual-usdc-usdc.js.map +1 -0
  141. package/build/dex/yo/config.d.ts +3 -0
  142. package/build/dex/yo/config.js +21 -0
  143. package/build/dex/yo/config.js.map +1 -0
  144. package/build/dex/yo/types.d.ts +13 -0
  145. package/build/dex/yo/types.js +3 -0
  146. package/build/dex/yo/types.js.map +1 -0
  147. package/build/dex/yo/yo-pool.d.ts +13 -0
  148. package/build/dex/yo/yo-pool.js +26 -0
  149. package/build/dex/yo/yo-pool.js.map +1 -0
  150. package/build/dex/yo/yo.d.ts +39 -0
  151. package/build/dex/yo/yo.js +248 -0
  152. package/build/dex/yo/yo.js.map +1 -0
  153. package/build/implementations/api-paraswap-sdk.d.ts +25 -0
  154. package/build/implementations/api-paraswap-sdk.js +102 -0
  155. package/build/implementations/api-paraswap-sdk.js.map +1 -0
  156. package/package.json +1 -1
  157. package/build/executor/Executor02BytecodeBuilderMultiRoute.d.ts +0 -101
  158. package/build/executor/Executor02BytecodeBuilderMultiRoute.js +0 -877
  159. package/build/executor/Executor02BytecodeBuilderMultiRoute.js.map +0 -1
@@ -1,877 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Executor02BytecodeBuilderMultiRoute = void 0;
4
- const ethers_1 = require("ethers");
5
- const types_1 = require("./types");
6
- const utils_1 = require("../utils");
7
- const ExecutorBytecodeBuilder_1 = require("./ExecutorBytecodeBuilder");
8
- const constants_1 = require("./constants");
9
- const utils_2 = require("./utils");
10
- const { utils: { hexlify, hexDataLength, hexConcat, hexZeroPad, solidityPack }, } = ethers_1.ethers;
11
- // Disclaimer: Current encoding has a lot of complexity introduced to handle wraps/unwraps inside the route
12
- // but since RouteAdvisor release, we rely only on wrapped tokens inside the route and handle wraps/unwraps on dex level
13
- // so in theory we can simplify a lot of this logic in the future releases
14
- /**
15
- * Class to build bytecode for Executor02 - simpleSwap with N DEXs (VERTICAL_BRANCH), multiSwaps (VERTICAL_BRANCH_HORIZONTAL_SEQUENCE) and megaswaps (NESTED_VERTICAL_BRANCH_HORIZONTAL_SEQUENCE)
16
- */
17
- class Executor02BytecodeBuilderMultiRoute extends ExecutorBytecodeBuilder_1.ExecutorBytecodeBuilder {
18
- type = types_1.Executors.TWO;
19
- /**
20
- * Executor02 Flags:
21
- * switch (flag % 4):
22
- * case 0: don't insert fromAmount
23
- * case 1: sendEth equal to fromAmount
24
- * case 2: sendEth equal to fromAmount + insert fromAmount
25
- * case 3: insert fromAmount
26
-
27
- * switch (flag % 3):
28
- * case 0: don't check balance after swap
29
- * case 1: check eth balance after swap
30
- * case 2: check destToken balance after swap
31
- */
32
- buildSimpleSwapFlags(params) {
33
- const { maybeWethCallData, swapExchange, swap } = params;
34
- const { srcToken, destToken } = swap;
35
- const isEthSrc = (0, utils_1.isETHAddress)(srcToken);
36
- const isEthDest = (0, utils_1.isETHAddress)(destToken);
37
- const exchangeParam = swapExchange.build.dexParams;
38
- const { dexFuncHasRecipient, needWrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, preSwapUnwrapCalldata, sendEthButSupportsInsertFromAmount, } = exchangeParam;
39
- const needWrap = needWrapNative && isEthSrc && maybeWethCallData?.deposit;
40
- const needUnwrap = needWrapNative && isEthDest && maybeWethCallData?.withdraw;
41
- const isSpecialDex = specialDexFlag !== undefined && specialDexFlag !== types_1.SpecialDex.DEFAULT;
42
- const forcePreventInsertFromAmount = swappedAmountNotPresentInExchangeData ||
43
- (isSpecialDex && !specialDexSupportsInsertFromAmount);
44
- let dexFlag = forcePreventInsertFromAmount
45
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP
46
- : types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 0 or 3
47
- let approveFlag = types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 0
48
- if (isEthSrc && !needWrap) {
49
- dexFlag = dexFuncHasRecipient
50
- ? !sendEthButSupportsInsertFromAmount
51
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 9
52
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_PLUS_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 18
53
- : !sendEthButSupportsInsertFromAmount
54
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 5
55
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_PLUS_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 18
56
- }
57
- else if (isEthDest && !needUnwrap) {
58
- dexFlag = forcePreventInsertFromAmount
59
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP
60
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP; // 4 or 7
61
- }
62
- else if (!dexFuncHasRecipient || (isEthDest && needUnwrap)) {
63
- dexFlag = forcePreventInsertFromAmount
64
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP
65
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP; // 8 or 11
66
- }
67
- // Actual srcToken is eth, because we'll unwrap weth before swap.
68
- // Need to check balance, some dexes don't have 1:1 ETH -> custom_ETH rate
69
- if (preSwapUnwrapCalldata) {
70
- dexFlag =
71
- types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP;
72
- }
73
- return {
74
- dexFlag,
75
- approveFlag,
76
- };
77
- }
78
- /**
79
- * Executor02 Flags:
80
- * switch (flag % 4):
81
- * case 0: don't instert fromAmount
82
- * case 1: sendEth equal to fromAmount
83
- * case 2: sendEth equal to fromAmount + insert fromAmount
84
- * case 3: insert fromAmount
85
-
86
- * switch (flag % 3):
87
- * case 0: don't check balance after swap
88
- * case 1: check eth balance after swap
89
- * case 2: check destToken balance after swap
90
- */
91
- buildMultiMegaSwapFlags(params) {
92
- const { swaps, swap, swapExchange, maybeWethCallData, swapIndex, swapExchangeIndex, priceRouteType, swapBeforeMultiRoute, } = params;
93
- const exchangeParam = swapExchange.build.dexParams;
94
- const { srcToken, destToken } = swap;
95
- const applyVerticalBranching = this.doesSwapNeedToBeAsVerticalBranch(priceRouteType, swap);
96
- const isHorizontalSequence = swaps.length > 1; // check if route is a multi-swap (horizontal sequence)
97
- const isFirstSwap = swapIndex === 0;
98
- const isLastSwap = !isFirstSwap && swapIndex === swaps.length - 1;
99
- const { dexFuncHasRecipient, needWrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, wethAddress, sendEthButSupportsInsertFromAmount, preSwapUnwrapCalldata, } = exchangeParam;
100
- const isEthSrc = (0, utils_1.isETHAddress)(srcToken);
101
- const isEthDest = (0, utils_1.isETHAddress)(destToken);
102
- const isWethDest = (wethAddress && destToken.toLowerCase() === wethAddress.toLowerCase()) ||
103
- this.dexHelper.config.isWETH(destToken);
104
- const isSpecialDex = specialDexFlag !== undefined && specialDexFlag !== types_1.SpecialDex.DEFAULT;
105
- const forcePreventInsertFromAmount = swappedAmountNotPresentInExchangeData ||
106
- (isSpecialDex && !specialDexSupportsInsertFromAmount);
107
- const forceBalanceOfCheck = (isSpecialDex &&
108
- isHorizontalSequence &&
109
- !applyVerticalBranching &&
110
- !isLastSwap) ||
111
- !dexFuncHasRecipient ||
112
- !!swapBeforeMultiRoute;
113
- const needUnwrap = needWrapNative && isEthDest && maybeWethCallData?.withdraw;
114
- const needSendEth = isEthSrc && !needWrapNative;
115
- const needCheckEthBalance = isEthDest && !needWrapNative;
116
- const anyDexOnSwapDoesntNeedWrapNative = this.anyDexOnSwapDoesntNeedWrapNative(swap);
117
- // check if current exchange is the last with needWrapNative
118
- const isLastExchangeWithNeedWrapNative = this.isLastExchangeWithNeedWrapNative(swap, swapExchangeIndex);
119
- // for the first part, basically replicates the logic from `unwrap after last swap` in buildSingleSwapExchangeCallData
120
- const needCheckSrcTokenBalanceOf = (needUnwrap &&
121
- (!applyVerticalBranching ||
122
- (applyVerticalBranching && anyDexOnSwapDoesntNeedWrapNative)) &&
123
- (isLastExchangeWithNeedWrapNative || exchangeParam.wethAddress)) ||
124
- (isHorizontalSequence && !applyVerticalBranching && !isLastSwap);
125
- let dexFlag;
126
- let approveFlag = types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 0
127
- if (needSendEth) {
128
- const preventInsertForSendEth = forcePreventInsertFromAmount || !sendEthButSupportsInsertFromAmount;
129
- dexFlag =
130
- needCheckSrcTokenBalanceOf || forceBalanceOfCheck
131
- ? preventInsertForSendEth
132
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 5
133
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_PLUS_INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 14
134
- : dexFuncHasRecipient
135
- ? preventInsertForSendEth
136
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 9
137
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_PLUS_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 18
138
- : preventInsertForSendEth
139
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 5
140
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_PLUS_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 18
141
- }
142
- else if (needCheckEthBalance) {
143
- dexFlag =
144
- needCheckSrcTokenBalanceOf || forceBalanceOfCheck
145
- ? forcePreventInsertFromAmount && dexFuncHasRecipient
146
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP // 4
147
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP // 7
148
- : forcePreventInsertFromAmount && dexFuncHasRecipient
149
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 0
150
- : types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 3
151
- }
152
- else {
153
- dexFlag =
154
- needCheckSrcTokenBalanceOf || forceBalanceOfCheck
155
- ? forcePreventInsertFromAmount
156
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 8
157
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 11
158
- : forcePreventInsertFromAmount
159
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 0
160
- : types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 3
161
- }
162
- // Actual srcToken is eth, because we'll unwrap weth before swap.
163
- // Need to check balance, some dexes don't have 1:1 ETH -> custom_ETH rate
164
- if (preSwapUnwrapCalldata) {
165
- dexFlag =
166
- types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP;
167
- }
168
- return {
169
- dexFlag,
170
- approveFlag,
171
- };
172
- }
173
- buildDexCallData(params) {
174
- const { swapExchangeIndex, destToken, priceRouteType, swap, rootUnwrapEth, } = params;
175
- const swapExchange = swap.swapExchanges[swapExchangeIndex];
176
- const flag = swapExchange.build.dexFlag;
177
- const exchangeParam = swap.swapExchanges[swapExchangeIndex].build.dexParams;
178
- let { exchangeData, specialDexFlag, targetExchange, needWrapNative } = exchangeParam;
179
- const routeNeedsRootUnwrapEth = this.doesRouteNeedsRootUnwrapEth(destToken, rootUnwrapEth);
180
- const needUnwrap =
181
- // check if current exchange is the last with needWrapNative
182
- this.isLastExchangeWithNeedWrapNative(swap, swapExchangeIndex) ||
183
- exchangeParam.wethAddress;
184
- const needUnwrapAfterLastSwapInRoute = needUnwrap &&
185
- (0, utils_1.isETHAddress)(swap.destToken) &&
186
- this.anyDexOnSwapDoesntNeedWrapNative(swap);
187
- const returnAmountPos = exchangeParam.returnAmountPos !== undefined &&
188
- !routeNeedsRootUnwrapEth &&
189
- !needUnwrapAfterLastSwapInRoute // prevent returnAmoutPos optimisation if route needs root unwrap eth
190
- ? exchangeParam.returnAmountPos
191
- : constants_1.DEFAULT_RETURN_AMOUNT_POS;
192
- const applyVerticalBranching = this.doesSwapNeedToBeAsVerticalBranch(priceRouteType, swap);
193
- const dontCheckBalanceAfterSwap = flag % 3 === 0;
194
- const checkDestTokenBalanceAfterSwap = flag % 3 === 2;
195
- const insertFromAmount = flag % 4 === 3 || flag % 4 === 2;
196
- const srcTokenAddress = (0, utils_1.isETHAddress)(swap.srcToken) && needWrapNative
197
- ? this.getWETHAddress(exchangeParam)
198
- : swap.srcToken.toLowerCase();
199
- const destTokenAddress = (0, utils_1.isETHAddress)(swap.destToken) && needWrapNative
200
- ? this.getWETHAddress(exchangeParam)
201
- : swap.destToken.toLowerCase();
202
- exchangeData = this.addTokenAddressToCallData(exchangeData, srcTokenAddress);
203
- if (applyVerticalBranching ||
204
- (checkDestTokenBalanceAfterSwap && !dontCheckBalanceAfterSwap)) {
205
- exchangeData = this.addTokenAddressToCallData(exchangeData, destTokenAddress);
206
- }
207
- let destTokenPos = 0;
208
- if (checkDestTokenBalanceAfterSwap && !dontCheckBalanceAfterSwap) {
209
- const destTokenAddrIndex = exchangeData
210
- .replace('0x', '')
211
- .indexOf(destTokenAddress.replace('0x', ''));
212
- destTokenPos = (destTokenAddrIndex - 24) / 2;
213
- }
214
- let fromAmountPos = 0;
215
- if (insertFromAmount) {
216
- if (exchangeParam.insertFromAmountPos) {
217
- fromAmountPos = exchangeParam.insertFromAmountPos;
218
- }
219
- else {
220
- const fromAmount = ethers_1.ethers.utils.defaultAbiCoder.encode(['uint256'], [swapExchange.srcAmount]);
221
- const fromAmountIndex = exchangeData
222
- .replace('0x', '')
223
- .indexOf(fromAmount.replace('0x', ''));
224
- fromAmountPos =
225
- (fromAmountIndex !== -1 ? fromAmountIndex : exchangeData.length) / 2;
226
- }
227
- }
228
- return this.buildCallData(targetExchange, exchangeData, fromAmountPos, destTokenPos, specialDexFlag || types_1.SpecialDex.DEFAULT, flag, undefined, returnAmountPos);
229
- }
230
- wrapAsVerticalBranch(callData, percentage, swap, wrapWasAddedInSwapExchange, curExchangeParam = null, addedUnwrapForDexWithNoNeedWrapNative = false) {
231
- let srcTokenAddress = swap.srcToken;
232
- let doesAnyDexOnSwapNeedsWrapNative;
233
- // if (exchangeParamIndex > -1) { // TODO-multi: what this case is about?
234
- if (curExchangeParam) {
235
- doesAnyDexOnSwapNeedsWrapNative =
236
- (0, utils_1.isETHAddress)(srcTokenAddress) &&
237
- (curExchangeParam.needWrapNative ||
238
- (!curExchangeParam.needWrapNative &&
239
- addedUnwrapForDexWithNoNeedWrapNative));
240
- }
241
- else {
242
- doesAnyDexOnSwapNeedsWrapNative =
243
- (0, utils_1.isETHAddress)(srcTokenAddress) && this.anyDexOnSwapNeedsWrapNative(swap);
244
- }
245
- if (doesAnyDexOnSwapNeedsWrapNative &&
246
- (0, utils_1.isETHAddress)(srcTokenAddress) &&
247
- !wrapWasAddedInSwapExchange) {
248
- srcTokenAddress =
249
- // exchangeParamIndex > -1 TODO-multi
250
- curExchangeParam
251
- ? this.getWETHAddress(curExchangeParam)
252
- : this.dexHelper.config.data.wrappedNativeTokenAddress;
253
- }
254
- let srcTokenAddressLowered = srcTokenAddress.toLowerCase();
255
- let srcTokenPos;
256
- if (percentage === constants_1.SWAP_EXCHANGE_100_PERCENTAGE) {
257
- srcTokenPos = hexZeroPad(hexlify(0), 8);
258
- }
259
- else if ((0, utils_1.isETHAddress)(srcTokenAddressLowered)) {
260
- srcTokenPos = constants_1.ETH_SRC_TOKEN_POS_FOR_MULTISWAP_METADATA;
261
- }
262
- else {
263
- const srcTokenAddrIndex = callData
264
- .replace('0x', '')
265
- .indexOf(srcTokenAddressLowered.replace('0x', ''));
266
- srcTokenPos = hexZeroPad(hexlify(srcTokenAddrIndex / 2), 8);
267
- }
268
- return solidityPack(['bytes16', 'bytes8', 'bytes8', 'bytes'], [
269
- hexZeroPad(hexlify(hexDataLength(callData)), 16), // calldata size
270
- srcTokenPos, // srcTokenPos
271
- hexZeroPad(hexlify(Math.round(percentage * 100)), 8), // percentage
272
- callData, // swap calldata
273
- ]);
274
- }
275
- packVerticalBranchingData(swapCallData) {
276
- return solidityPack(['bytes28', 'bytes4', 'bytes32', 'bytes32', 'bytes'], [
277
- constants_1.ZEROS_28_BYTES, // empty bytes28
278
- constants_1.ZEROS_4_BYTES, // fallback selector
279
- hexZeroPad(hexlify(32), 32), // calldata offset
280
- hexZeroPad(hexlify(hexDataLength(swapCallData)), 32), // calldata length
281
- swapCallData, // calldata
282
- ]);
283
- }
284
- packVerticalBranchingCallData(verticalBranchingData, fromAmountPos, destTokenPos, flag) {
285
- return solidityPack([
286
- 'bytes20',
287
- 'bytes4',
288
- 'bytes2',
289
- 'bytes2',
290
- 'bytes1',
291
- 'bytes1',
292
- 'bytes2',
293
- 'bytes',
294
- ], [
295
- constants_1.ZEROS_20_BYTES, // zero address. go to vertical branch, so no call is made
296
- hexZeroPad(hexlify(hexDataLength(verticalBranchingData)), 4), // dex calldata length
297
- hexZeroPad(hexlify(fromAmountPos), 2), // fromAmountPos
298
- hexZeroPad(hexlify(destTokenPos), 2), // destTokenPos
299
- hexZeroPad(hexlify(0), 1), // returnAmountPos
300
- hexZeroPad(hexlify(types_1.SpecialDex.EXECUTE_VERTICAL_BRANCHING), 1), // special
301
- hexZeroPad(hexlify(flag), 2), // flag
302
- verticalBranchingData, // dexes calldata
303
- ]);
304
- }
305
- buildVerticalBranchingCallData(swap, swapCallData, flag, isRoot = false, routes = []) {
306
- const destTokenAddrLowered = swap.destToken.toLowerCase();
307
- const isEthDest = (0, utils_1.isETHAddress)(destTokenAddrLowered);
308
- let anyDexOnSwapNeedsWrapNative = false;
309
- let anyDexOnSwapDoesntNeedWrapNative = false;
310
- let destTokenPos;
311
- if (isEthDest) {
312
- if (!isRoot) {
313
- anyDexOnSwapNeedsWrapNative = this.anyDexOnSwapNeedsWrapNative(swap);
314
- anyDexOnSwapDoesntNeedWrapNative =
315
- this.anyDexOnSwapDoesntNeedWrapNative(swap);
316
- }
317
- else {
318
- const lastSwaps = (0, utils_2.getLastRouteSwaps)(routes);
319
- anyDexOnSwapNeedsWrapNative = lastSwaps.some(swap => this.anyDexOnSwapNeedsWrapNative(swap));
320
- anyDexOnSwapDoesntNeedWrapNative = lastSwaps.some(swap => this.anyDexOnSwapDoesntNeedWrapNative(swap));
321
- }
322
- }
323
- // 'bytes28', 'bytes4', 'bytes32', 'bytes32', 'bytes'
324
- const data = this.packVerticalBranchingData(swapCallData);
325
- if (isEthDest &&
326
- anyDexOnSwapDoesntNeedWrapNative &&
327
- !anyDexOnSwapNeedsWrapNative) {
328
- destTokenPos = 0;
329
- }
330
- else {
331
- const destTokenAddrIndex = data
332
- .replace('0x', '')
333
- .indexOf((isEthDest
334
- ? this.dexHelper.config.data.wrappedNativeTokenAddress.toLowerCase()
335
- : destTokenAddrLowered.toLowerCase()).replace('0x', ''));
336
- destTokenPos = destTokenAddrIndex / 2 - 40;
337
- }
338
- const fromAmountPos = hexDataLength(data) - 64 - 28; // 64 (position), 28 (selector padding);
339
- return this.packVerticalBranchingCallData(data, fromAmountPos, destTokenPos < 0 ? 0 : destTokenPos, flag);
340
- }
341
- buildVerticalBranchingCallDataNoEthDest(destToken, swapCallData, flag) {
342
- const destTokenAddrLowered = destToken.toLowerCase();
343
- let destTokenPos;
344
- // 'bytes28', 'bytes4', 'bytes32', 'bytes32', 'bytes'
345
- const data = this.packVerticalBranchingData(swapCallData);
346
- const destTokenAddrIndex = data
347
- .replace('0x', '')
348
- .indexOf(destTokenAddrLowered.toLowerCase().replace('0x', ''));
349
- destTokenPos = destTokenAddrIndex / 2 - 40;
350
- const fromAmountPos = hexDataLength(data) - 64 - 28; // 64 (position), 28 (selector padding);
351
- return this.packVerticalBranchingCallData(data, fromAmountPos, destTokenPos < 0 ? 0 : destTokenPos, flag);
352
- }
353
- buildSingleSwapExchangeCallData(swaps, routeIndex, swapIndex, swapExchangeIndex, addedWrapToSwapExchangeMap, allowToAddWrap = true, prevBranchWasWrapped = false, unwrapToSwapMap, srcToken, destToken, priceRouteType, rootUnwrapEth, rootWrapEth, maybeWethCallData) {
354
- const isSimpleSwap = priceRouteType === 'simple';
355
- let swapExchangeCallData = '';
356
- const swap = swaps[swapIndex];
357
- const hasMultipleSwapExchanges = swap.swapExchanges.length > 1;
358
- const swapExchange = swap.swapExchanges[swapExchangeIndex];
359
- const curExchangeParam = swapExchange.build.dexParams;
360
- const approveFlag = swapExchange.build.approveFlag;
361
- const dexCallData = this.buildDexCallData({
362
- swap,
363
- priceRouteType,
364
- rootUnwrapEth,
365
- swapExchangeIndex,
366
- destToken,
367
- // TODO-multi to be removed after refactoring
368
- routes: [],
369
- routeIndex,
370
- swapIndex,
371
- exchangeParams: [],
372
- exchangeParamIndex: constants_1.NOT_EXISTING_EXCHANGE_PARAM_INDEX,
373
- flag: types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP,
374
- });
375
- if (curExchangeParam.preSwapUnwrapCalldata) {
376
- const withdrawCallData = this.buildUnwrapEthCallData(this.getWETHAddress(curExchangeParam), curExchangeParam.preSwapUnwrapCalldata);
377
- swapExchangeCallData = hexConcat([withdrawCallData, dexCallData]);
378
- }
379
- else {
380
- swapExchangeCallData = hexConcat([dexCallData]);
381
- }
382
- const isLastSwap = swapIndex === swaps.length - 1;
383
- if (curExchangeParam.transferSrcTokenBeforeSwap) {
384
- const transferCallData = this.buildTransferCallData(this.erc20Interface.encodeFunctionData('transfer', [
385
- curExchangeParam.transferSrcTokenBeforeSwap,
386
- swapExchange.srcAmount,
387
- ]), (0, utils_1.isETHAddress)(swap.srcToken)
388
- ? this.getWETHAddress(curExchangeParam)
389
- : swap.srcToken.toLowerCase());
390
- swapExchangeCallData = hexConcat([
391
- transferCallData,
392
- swapExchangeCallData,
393
- ]);
394
- }
395
- if (!(0, utils_1.isETHAddress)(swap.srcToken) &&
396
- !curExchangeParam.transferSrcTokenBeforeSwap &&
397
- !curExchangeParam.skipApproval &&
398
- curExchangeParam.approveData) {
399
- const approveCallData = this.buildApproveCallData(curExchangeParam.approveData.target, curExchangeParam.approveData.token, approveFlag, curExchangeParam.permit2Approval);
400
- swapExchangeCallData = hexConcat([approveCallData, swapExchangeCallData]);
401
- }
402
- if (curExchangeParam.needWrapNative) {
403
- if ((0, utils_1.isETHAddress)(swap.srcToken)) {
404
- let approveWethCalldata = '0x';
405
- if (curExchangeParam.approveData &&
406
- !curExchangeParam.transferSrcTokenBeforeSwap &&
407
- !curExchangeParam.skipApproval) {
408
- approveWethCalldata = this.buildApproveCallData(curExchangeParam.approveData.target, curExchangeParam.approveData.token, approveFlag, curExchangeParam.permit2Approval);
409
- }
410
- const isNotFirstSwap = swapIndex !== 0;
411
- let skipWrap = false;
412
- if (isNotFirstSwap) {
413
- const prevSwap = swaps[swapIndex - 1];
414
- const anyDexOnSwapDoesntNeedWrapNative = this.anyDexOnSwapDoesntNeedWrapNative(prevSwap);
415
- skipWrap = !anyDexOnSwapDoesntNeedWrapNative;
416
- }
417
- let depositCallData = '0x';
418
- if (maybeWethCallData &&
419
- maybeWethCallData.deposit &&
420
- !this.doesRouteNeedsRootWrapEth(srcToken, rootWrapEth) &&
421
- allowToAddWrap &&
422
- !addedWrapToSwapExchangeMap[`${routeIndex}_${swapIndex}_${swapExchangeIndex}`] &&
423
- !skipWrap) {
424
- depositCallData = this.buildWrapEthCallData(this.getWETHAddress(curExchangeParam), maybeWethCallData.deposit.calldata, types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP);
425
- addedWrapToSwapExchangeMap[`${routeIndex}_${swapIndex}_${swapExchangeIndex}`] = true;
426
- }
427
- swapExchangeCallData = hexConcat([
428
- approveWethCalldata,
429
- depositCallData,
430
- swapExchangeCallData,
431
- ]);
432
- }
433
- const needUnwrap = (priceRouteType === 'multi' || priceRouteType === 'mega') &&
434
- hasMultipleSwapExchanges;
435
- // unwrap after last swap
436
- if (maybeWethCallData &&
437
- maybeWethCallData.withdraw &&
438
- ((!needUnwrap && (0, utils_1.isETHAddress)(swap.destToken)) ||
439
- (needUnwrap &&
440
- (0, utils_1.isETHAddress)(swap.destToken) &&
441
- this.anyDexOnSwapDoesntNeedWrapNative(swap)))) {
442
- let withdrawCallData = '0x';
443
- const customWethAddress = curExchangeParam.wethAddress;
444
- const nextSwap = swaps[swapIndex + 1];
445
- const needUnwrapAll = isSimpleSwap ||
446
- (isLastSwap
447
- ? !this.doesRouteNeedsRootUnwrapEth(destToken, rootUnwrapEth)
448
- : this.everyDexOnSwapNeedWrapNative(nextSwap) ||
449
- this.everyDexOnSwapDoesntNeedWrapNative(nextSwap));
450
- // check if current exchange is the last with needWrapNative
451
- const needUnwrap = needUnwrapAll &&
452
- this.isLastExchangeWithNeedWrapNative(swap, swapExchangeIndex);
453
- if (customWethAddress || needUnwrap) {
454
- unwrapToSwapMap[swapIndex] = true;
455
- withdrawCallData = this.buildUnwrapEthCallData(this.getWETHAddress(curExchangeParam), maybeWethCallData.withdraw.calldata);
456
- }
457
- swapExchangeCallData = hexConcat([
458
- swapExchangeCallData,
459
- withdrawCallData,
460
- ]);
461
- if (isSimpleSwap && (needUnwrap || customWethAddress)) {
462
- const finalSpecialFlagCalldata = this.buildFinalSpecialFlagCalldata();
463
- swapExchangeCallData = hexConcat([
464
- swapExchangeCallData,
465
- finalSpecialFlagCalldata,
466
- ]);
467
- }
468
- }
469
- }
470
- let addedUnwrapForDexWithNoNeedWrapNative = false;
471
- if ((0, utils_1.isETHAddress)(swap.srcToken) &&
472
- maybeWethCallData &&
473
- maybeWethCallData.withdraw &&
474
- !curExchangeParam.needWrapNative &&
475
- !unwrapToSwapMap[swapIndex - 1]) {
476
- const prevSwap = swaps[swapIndex - 1];
477
- let eachDexOnPrevSwapReturnsWeth = false;
478
- if (prevSwap && !prevBranchWasWrapped) {
479
- eachDexOnPrevSwapReturnsWeth =
480
- this.eachDexOnSwapNeedsWrapNative(prevSwap);
481
- }
482
- if (prevBranchWasWrapped || eachDexOnPrevSwapReturnsWeth) {
483
- const withdrawCallData = this.buildUnwrapEthCallData(this.getWETHAddress(curExchangeParam), maybeWethCallData.withdraw.calldata);
484
- swapExchangeCallData = hexConcat([
485
- withdrawCallData,
486
- swapExchangeCallData,
487
- ]);
488
- addedUnwrapForDexWithNoNeedWrapNative = true;
489
- }
490
- }
491
- if (isLastSwap &&
492
- !curExchangeParam.dexFuncHasRecipient &&
493
- !(0, utils_1.isETHAddress)(swap.destToken) &&
494
- destToken === swap.destToken) {
495
- const transferCallData = this.buildTransferCallData(this.erc20Interface.encodeFunctionData('transfer', [
496
- this.dexHelper.config.data.augustusV6Address,
497
- swapExchange.destAmount,
498
- ]), swap.destToken);
499
- swapExchangeCallData = hexConcat([
500
- swapExchangeCallData,
501
- transferCallData,
502
- ]);
503
- }
504
- if (!curExchangeParam.dexFuncHasRecipient &&
505
- (0, utils_1.isETHAddress)(swap.destToken) &&
506
- isLastSwap &&
507
- // don't need to send eth without unwrapping, handling unwrap and sendEth in the end of root branch
508
- !this.doesRouteNeedsRootUnwrapEth(destToken, rootUnwrapEth)) {
509
- const finalSpecialFlagCalldata = this.buildFinalSpecialFlagCalldata();
510
- swapExchangeCallData = hexConcat([
511
- swapExchangeCallData,
512
- finalSpecialFlagCalldata,
513
- ]);
514
- }
515
- // if swap has multiple exchanges, then each exchange is executed as part of vertical branching
516
- if (hasMultipleSwapExchanges) {
517
- return this.wrapAsVerticalBranch(swapExchangeCallData, swapExchange.percent, swap, addedWrapToSwapExchangeMap[`${routeIndex}_${swapIndex}_${swapExchangeIndex}`], curExchangeParam, addedUnwrapForDexWithNoNeedWrapNative);
518
- }
519
- return swapExchangeCallData;
520
- }
521
- appendWrapEthCallData(calldata, maybeWethCallData, checkWethBalanceAfter = false) {
522
- if (maybeWethCallData?.deposit) {
523
- const callData = checkWethBalanceAfter
524
- ? this.addTokenAddressToCallData(maybeWethCallData.deposit.calldata, this.dexHelper.config.data.wrappedNativeTokenAddress.toLowerCase())
525
- : maybeWethCallData.deposit.calldata;
526
- const depositCallData = this.buildWrapEthCallData(this.dexHelper.config.data.wrappedNativeTokenAddress.toLowerCase(), callData, checkWethBalanceAfter
527
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP // 5
528
- : types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP, // 9
529
- checkWethBalanceAfter ? 4 : 0);
530
- return hexConcat([calldata, depositCallData]);
531
- }
532
- return calldata;
533
- }
534
- eachDexOnSwapNeedsWrapNative(swap) {
535
- return swap.swapExchanges.every(se => {
536
- return (se.build.dexParams.needWrapNative && !se.build.dexParams.wethAddress);
537
- });
538
- }
539
- anyDexOnSwapNeedsWrapNative(swap) {
540
- return swap.swapExchanges
541
- .map(s => s.build.dexParams.needWrapNative && !s.build.dexParams.wethAddress)
542
- .includes(true);
543
- }
544
- isLastExchangeWithNeedWrapNative(swap, swapExchangeIndex) {
545
- return (swap.swapExchanges
546
- .map(t => t.build.dexParams.needWrapNative)
547
- .reduceRight((acc, needWrapNative, index) => needWrapNative === true && acc === -1 ? index : acc, -1) === swapExchangeIndex);
548
- }
549
- anyDexOnSwapDoesntNeedWrapNative(swap) {
550
- return swap.swapExchanges
551
- .map(s => !s.build.dexParams.needWrapNative)
552
- .includes(true);
553
- }
554
- everyDexOnSwapNeedWrapNative(swap) {
555
- if (!swap) {
556
- return false;
557
- }
558
- return swap.swapExchanges
559
- .map(s => s.build.dexParams.needWrapNative)
560
- .every(t => t === true);
561
- }
562
- everyDexOnSwapDoesntNeedWrapNative(swap) {
563
- if (!swap) {
564
- return false;
565
- }
566
- return swap.swapExchanges
567
- .map(s => s.build.dexParams.needWrapNative)
568
- .every(t => t === false);
569
- }
570
- doesSwapNeedToBeAsVerticalBranch(routeType, swap) {
571
- return ((routeType === 'multi' || routeType === 'mega') &&
572
- swap.swapExchanges.length > 1);
573
- }
574
- buildVerticalBranchingFlag(swap, destToken, isLastSwap) {
575
- let flag = types_1.Flag.INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP; // 11
576
- if (isLastSwap) {
577
- const isEthDest = (0, utils_1.isETHAddress)(destToken);
578
- const lastSwapExchanges = swap.swapExchanges;
579
- const anyDexLastSwapNeedUnwrap = lastSwapExchanges
580
- .map(se => se.build.dexParams.needWrapNative &&
581
- !se.build.dexParams.wethAddress)
582
- .includes(true);
583
- const noNeedUnwrap = isEthDest && !anyDexLastSwapNeedUnwrap;
584
- if (noNeedUnwrap || !isEthDest) {
585
- flag = types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 3
586
- }
587
- }
588
- else {
589
- const isEthDest = (0, utils_1.isETHAddress)(swap.destToken);
590
- if (isEthDest) {
591
- if (this.anyDexOnSwapDoesntNeedWrapNative(swap)) {
592
- flag = types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP; // 7
593
- }
594
- }
595
- }
596
- return flag;
597
- }
598
- buildSingleSwapCallData(params) {
599
- const { routeIndex, swapIndex, maybeWethCallData, wrapToSwapMap, unwrapToSwapMap, wrapToSwapExchangeMap, swap, srcToken, destToken, priceRouteType, rootUnwrapEth, rootWrapEth, swaps, isLastSwapOnTheRoute, } = params;
600
- const { swapExchanges } = swap;
601
- const isLastSwap = swaps.length - 1 === swapIndex;
602
- const applyVerticalBranching = this.doesSwapNeedToBeAsVerticalBranch(priceRouteType, swap);
603
- const anyDexOnSwapDoesntNeedWrapNative = this.anyDexOnSwapDoesntNeedWrapNative(swap);
604
- const needToAppendWrapCallData = (0, utils_1.isETHAddress)(swap.destToken) &&
605
- anyDexOnSwapDoesntNeedWrapNative &&
606
- !isLastSwap &&
607
- maybeWethCallData?.deposit;
608
- let swapCallData = swapExchanges.reduce((acc, _swapExchange, swapExchangeIndex) => {
609
- return hexConcat([
610
- acc,
611
- this.buildSingleSwapExchangeCallData(swaps, routeIndex, swapIndex, swapExchangeIndex, wrapToSwapExchangeMap, !wrapToSwapMap[swapIndex - 1], wrapToSwapMap[swapIndex - 1], unwrapToSwapMap, srcToken, destToken, priceRouteType, rootUnwrapEth, rootWrapEth, maybeWethCallData),
612
- ]);
613
- }, '0x');
614
- if (needToAppendWrapCallData) {
615
- wrapToSwapMap[swapIndex] = true;
616
- }
617
- if (priceRouteType === 'simple') {
618
- return needToAppendWrapCallData
619
- ? this.appendWrapEthCallData(swapCallData, maybeWethCallData)
620
- : swapCallData;
621
- }
622
- if (applyVerticalBranching) {
623
- const vertBranchingCallData = this.buildVerticalBranchingCallData(swap, swapCallData, this.buildVerticalBranchingFlag(swap, destToken, isLastSwapOnTheRoute ?? isLastSwap));
624
- return needToAppendWrapCallData
625
- ? this.appendWrapEthCallData(vertBranchingCallData, maybeWethCallData, true)
626
- : vertBranchingCallData;
627
- }
628
- return needToAppendWrapCallData
629
- ? this.appendWrapEthCallData(swapCallData, maybeWethCallData)
630
- : swapCallData;
631
- }
632
- buildRouteCallData(route, routeIndex, flags, sender, srcToken, destToken, priceRouteType, rootUnwrapEth, rootWrapEth, maybeWethCallData) {
633
- const buildSingleSwap = (swaps, swapIndex, swap, wrapToSwapExchangeMap, wrapToSwapMap, unwrapToSwapMap, isLastSwapOnTheRoute) => this.buildSingleSwapCallData({
634
- swaps,
635
- priceRouteType,
636
- rootUnwrapEth,
637
- rootWrapEth,
638
- routeIndex,
639
- swapIndex,
640
- wrapToSwapExchangeMap,
641
- wrapToSwapMap,
642
- unwrapToSwapMap,
643
- maybeWethCallData,
644
- swap,
645
- srcToken,
646
- destToken,
647
- isLastSwapOnTheRoute,
648
- // TODO-multi to be removed after refactoring
649
- sender,
650
- index: 0,
651
- flags,
652
- routes: [],
653
- exchangeParams: [],
654
- });
655
- const wrapToSwapExchangeMap = {}; // routeIndex_swapIndex_swapExchangeIndex
656
- const wrapToSwapMap = {}; // swapIndex
657
- const unwrapToSwapMap = {}; // swapIndex
658
- let callData = '0x';
659
- if (route.type === 'single-route') {
660
- callData = route.swaps.reduce((swapAcc, swap, swapIndex) => hexConcat([
661
- swapAcc,
662
- buildSingleSwap(route.swaps, swapIndex, swap, wrapToSwapExchangeMap, wrapToSwapMap, unwrapToSwapMap),
663
- ]), '0x');
664
- }
665
- else {
666
- route.swaps.forEach((multiRouteSwaps, routeSwapIndex) => {
667
- if ((0, utils_2.isMultiRouteSwap)(multiRouteSwaps)) {
668
- let multiRoutesCalldata = '0x'; // TODO-multi: do we need this prefix?
669
- multiRouteSwaps.forEach((swaps, multiRouteIndex) => {
670
- const mrWrapToSwapExchangeMap = {}; // routeIndex_swapIndex_swapExchangeIndex
671
- const mrWrapToSwapMap = {}; // swapIndex
672
- const mrUnwrapToSwapMap = {}; // swapIndex
673
- const multiRouteSwapsCalldata = swaps.reduce((swapAcc, swap, swapIndex) => hexConcat([
674
- swapAcc,
675
- buildSingleSwap(swaps, swapIndex, swap, mrWrapToSwapExchangeMap, mrWrapToSwapMap, mrUnwrapToSwapMap),
676
- ]), '0x');
677
- const multiRouteCalldata = this.wrapAsVerticalBranch(multiRouteSwapsCalldata, route.multiRoutePercents[multiRouteIndex], swaps[0], Object.values(mrWrapToSwapMap).includes(true) ||
678
- Object.values(mrWrapToSwapExchangeMap).includes(true), null);
679
- multiRoutesCalldata = hexConcat([
680
- multiRoutesCalldata,
681
- multiRouteCalldata,
682
- ]);
683
- });
684
- // should be the same for all routes in multi-route
685
- const destToken = multiRouteSwaps[0].at(-1).destToken;
686
- const isLast = routeSwapIndex === route.swaps.length - 1;
687
- // TODO-multi: as ETH is not used as intermediate connector since RouteAdvisor release, trying to simplify here
688
- const routeCalldata = this.buildVerticalBranchingCallDataNoEthDest(destToken, multiRoutesCalldata, isLast
689
- ? types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP
690
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP);
691
- callData = hexConcat([callData, routeCalldata]);
692
- }
693
- else {
694
- callData = hexConcat([
695
- callData,
696
- multiRouteSwaps.reduce((swapAcc, swap, swapIndex) => hexConcat([
697
- swapAcc,
698
- buildSingleSwap(multiRouteSwaps, swapIndex, swap, wrapToSwapExchangeMap, wrapToSwapMap, unwrapToSwapMap, routeSwapIndex === route.swaps.length - 1 &&
699
- swapIndex === multiRouteSwaps.length - 1),
700
- ]), '0x'),
701
- ]);
702
- }
703
- });
704
- }
705
- if (priceRouteType === 'mega') {
706
- const swap = (0, utils_2.getFirstRouteSwaps)([route])[0];
707
- return this.wrapAsVerticalBranch(callData, route.percent, swap, Object.values(wrapToSwapMap).includes(true) ||
708
- Object.values(wrapToSwapExchangeMap).includes(true), null);
709
- }
710
- return callData;
711
- }
712
- doesRouteNeedsRootWrapEth(srcToken, rootWrapEth) {
713
- if (!(0, utils_1.isETHAddress)(srcToken)) {
714
- return false;
715
- }
716
- return rootWrapEth;
717
- }
718
- // (check disclaimer above)
719
- // this method is still used to prevent changes on the legacy encoding with wrap/unwrap
720
- // imho, this method has incorrect naming and overall misleading logic
721
- doesRouteNeedsRootUnwrapEth(destToken, rootUnwrapEth) {
722
- if (!(0, utils_1.isETHAddress)(destToken)) {
723
- return false;
724
- }
725
- return rootUnwrapEth;
726
- }
727
- getAddress() {
728
- return this.dexHelper.config.data.executorsAddresses[types_1.Executors.TWO];
729
- }
730
- buildByteCode(priceRoute, routes, exchangeParams, sender, maybeWethCallData) {
731
- const needWrapEth = maybeWethCallData?.deposit && (0, utils_1.isETHAddress)(priceRoute.srcToken);
732
- const needUnwrapEth = maybeWethCallData?.withdraw && (0, utils_1.isETHAddress)(priceRoute.destToken);
733
- const needSendNativeEth = (0, utils_1.isETHAddress)(priceRoute.destToken);
734
- const rootWrapEth = !(0, utils_1.isETHAddress)(priceRoute.srcToken)
735
- ? false
736
- : (0, utils_2.getFirstRouteSwaps)(routes).every(swap => this.eachDexOnSwapNeedsWrapNative(swap));
737
- const rootUnwrapEth = !(0, utils_1.isETHAddress)(priceRoute.destToken)
738
- ? false
739
- : (0, utils_2.getLastRouteSwaps)(routes).some(swap => this.anyDexOnSwapNeedsWrapNative(swap));
740
- const priceRouteType = (0, utils_2.getPriceRouteType)(priceRoute);
741
- const flags = this.buildFlags(priceRoute.bestRoute, routes, exchangeParams, priceRoute.srcToken, priceRouteType, maybeWethCallData);
742
- let swapsCalldata = routes.reduce((routeAcc, route, routeIndex) => hexConcat([
743
- routeAcc,
744
- this.buildRouteCallData(route, routeIndex, flags, sender, priceRoute.srcToken, priceRoute.destToken, priceRouteType, rootUnwrapEth, rootWrapEth, maybeWethCallData),
745
- ]), '0x');
746
- // hack to do wrap/unwrap before the priceRoute execution
747
- // first make wrap/unwrap, then execute mega swap as vertical branch
748
- if (priceRouteType === 'mega' && (needWrapEth || needUnwrapEth)) {
749
- // TODO-multi: would it work? test this case
750
- const lastSwaps = (0, utils_2.getLastRouteSwaps)(routes);
751
- const lastSwap = lastSwaps[lastSwaps.length - 1];
752
- swapsCalldata = this.buildVerticalBranchingCallData(lastSwap, swapsCalldata, needWrapEth
753
- ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 0
754
- : types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP, // 8
755
- true, // isRoot branch
756
- routes);
757
- }
758
- // ETH wrap
759
- if (needWrapEth && rootWrapEth) {
760
- let depositCallData = this.buildWrapEthCallData(this.dexHelper.config.data.wrappedNativeTokenAddress, maybeWethCallData.deposit.calldata, types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP);
761
- if (priceRouteType === 'simple') {
762
- const swap = priceRoute.bestRoute[0].swaps[0];
763
- const percent = exchangeParams.every(ep => ep.needWrapNative)
764
- ? 100
765
- : swap.swapExchanges
766
- .filter((_se, index) => {
767
- return exchangeParams[index].needWrapNative;
768
- })
769
- .reduce((acc, se) => {
770
- acc += se.percent;
771
- return acc;
772
- }, 0);
773
- depositCallData = solidityPack(['bytes16', 'bytes16', 'bytes'], [
774
- hexZeroPad(hexlify(hexDataLength(depositCallData)), 16),
775
- hexZeroPad(hexlify(100 * percent), 16),
776
- depositCallData,
777
- ]);
778
- }
779
- swapsCalldata = hexConcat([depositCallData, swapsCalldata]);
780
- }
781
- // ETH unwrap, only for multiswaps and mega swaps
782
- if (needUnwrapEth &&
783
- rootUnwrapEth &&
784
- (priceRouteType === 'multi' || priceRouteType === 'mega')) {
785
- const withdrawCallData = this.buildUnwrapEthCallData(this.dexHelper.config.data.wrappedNativeTokenAddress, maybeWethCallData.withdraw.calldata);
786
- swapsCalldata = hexConcat([swapsCalldata, withdrawCallData]);
787
- }
788
- // Special flag (send native) calldata, only for multiswaps and mega swaps
789
- if (needSendNativeEth &&
790
- rootUnwrapEth &&
791
- (priceRouteType === 'multi' || priceRouteType === 'mega')) {
792
- const finalSpecialFlagCalldata = this.buildFinalSpecialFlagCalldata();
793
- swapsCalldata = hexConcat([swapsCalldata, finalSpecialFlagCalldata]);
794
- }
795
- if (((needWrapEth || needUnwrapEth) && priceRouteType === 'mega') ||
796
- priceRouteType === 'multi') {
797
- // TODO-multi: would it work? test this case
798
- const firstSwaps = (0, utils_2.getFirstRouteSwaps)(routes);
799
- swapsCalldata = this.wrapAsVerticalBranch(swapsCalldata, constants_1.SWAP_EXCHANGE_100_PERCENTAGE, firstSwaps[0], false, null);
800
- }
801
- return solidityPack(['bytes32', 'bytes', 'bytes'], [
802
- hexZeroPad(hexlify(32), 32), // calldata offset
803
- hexZeroPad(hexlify(hexDataLength(swapsCalldata) + constants_1.BYTES_64_LENGTH), // calldata length (64 bytes = bytes12(0) + msg.sender)
804
- 32),
805
- swapsCalldata, // calldata
806
- ]);
807
- }
808
- buildFlags(routes, buildRoutes, exchangeParams, srcToken, priceRouteType, maybeWethCallData) {
809
- const buildFlagsMethod = priceRouteType === 'multi' || priceRouteType === 'mega'
810
- ? this.buildMultiMegaSwapFlags.bind(this)
811
- : this.buildSimpleSwapFlags.bind(this);
812
- let flags = {
813
- dexes: [],
814
- approves: [],
815
- };
816
- const buildAndAssignFlags = (swaps, swap, swapIndex, swapBeforeMultiRoute) => {
817
- swap.swapExchanges.map((swapExchange, swapExchangeIndex) => {
818
- const { dexFlag, approveFlag } = buildFlagsMethod({
819
- priceRouteType,
820
- swaps,
821
- routes,
822
- exchangeParams, // not used
823
- routeIndex: 0, // not used on Ex02MultiRoute
824
- swapIndex,
825
- swapExchangeIndex,
826
- exchangeParamIndex: 0, // TODO-multi: to be removed after refactoring
827
- maybeWethCallData,
828
- swap,
829
- swapExchange,
830
- swapBeforeMultiRoute,
831
- });
832
- swapExchange.build.dexFlag = dexFlag;
833
- swapExchange.build.approveFlag = approveFlag;
834
- flags.dexes.push(dexFlag);
835
- flags.approves.push(approveFlag);
836
- });
837
- };
838
- buildRoutes.forEach(route => {
839
- if (route.type === 'single-route') {
840
- route.swaps.map((swap, swapIndex) => {
841
- buildAndAssignFlags(route.swaps, swap, swapIndex);
842
- });
843
- }
844
- else {
845
- route.swaps.forEach((routeSwaps, routeSwapsIndex) => {
846
- const isMultiRoute = (0, utils_2.isMultiRouteSwap)(routeSwaps);
847
- if (!isMultiRoute) {
848
- const nextSwaps = route.swaps[routeSwapsIndex + 1];
849
- let swapBeforeMultiRoute = false;
850
- if (nextSwaps && (0, utils_2.isMultiRouteSwap)(nextSwaps)) {
851
- swapBeforeMultiRoute = true;
852
- }
853
- // TODO-multi: should swapIndex be the index of the current multi-route, or the total route
854
- routeSwaps.forEach((swap, swapIndex) => {
855
- buildAndAssignFlags(routeSwaps, swap, swapIndex, swapBeforeMultiRoute);
856
- });
857
- }
858
- else {
859
- routeSwaps.forEach(swaps => {
860
- swaps.forEach((swap, swapIndex) => {
861
- buildAndAssignFlags(swaps, swap, swapIndex);
862
- });
863
- });
864
- }
865
- });
866
- }
867
- });
868
- return {
869
- ...flags,
870
- wrap: (0, utils_1.isETHAddress)(srcToken) && maybeWethCallData?.deposit
871
- ? types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 9
872
- : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP, // 7
873
- };
874
- }
875
- }
876
- exports.Executor02BytecodeBuilderMultiRoute = Executor02BytecodeBuilderMultiRoute;
877
- //# sourceMappingURL=Executor02BytecodeBuilderMultiRoute.js.map