@paraswap/dex-lib 3.8.1 → 3.8.3-integral-dex

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 (262) hide show
  1. package/.vscode/launch.json +9 -49
  2. package/.vscode/settings.json +2 -1
  3. package/build/abi/Uncompressor.json +250 -0
  4. package/build/abi/integral/factory.json +333 -0
  5. package/build/abi/integral/oracle.json +501 -0
  6. package/build/abi/integral/pool.json +1041 -0
  7. package/build/abi/{wombat/pool.json → integral/relayer.json} +720 -473
  8. package/build/abi/oswap/oswap.abi.json +452 -0
  9. package/build/config.js +1 -1
  10. package/build/dex/aave-v1/aave-v1.d.ts +1 -2
  11. package/build/dex/aave-v1/aave-v1.js +0 -23
  12. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  13. package/build/dex/compound.js +1 -1
  14. package/build/dex/compound.js.map +1 -1
  15. package/build/dex/curve-v1-factory/config.js +10 -47
  16. package/build/dex/curve-v1-factory/config.js.map +1 -1
  17. package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +2 -2
  18. package/build/dex/curve-v1-factory/curve-v1-factory.js +36 -96
  19. package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
  20. package/build/dex/curve-v1-factory/price-handlers/functions/constants.js.map +1 -1
  21. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js +1 -13
  22. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js.map +1 -1
  23. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.d.ts +2 -2
  24. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js +1 -1
  25. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js.map +1 -1
  26. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js +1 -1
  27. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js.map +1 -1
  28. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.d.ts +3 -4
  29. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js +9 -24
  30. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js.map +1 -1
  31. package/build/dex/curve-v1-factory/types.d.ts +4 -20
  32. package/build/dex/curve-v1-factory/types.js +3 -11
  33. package/build/dex/curve-v1-factory/types.js.map +1 -1
  34. package/build/dex/curve-v1-stable-ng/config.js +0 -18
  35. package/build/dex/curve-v1-stable-ng/config.js.map +1 -1
  36. package/build/dex/etherfi/etherfi.d.ts +26 -0
  37. package/build/dex/etherfi/etherfi.js +96 -0
  38. package/build/dex/etherfi/etherfi.js.map +1 -0
  39. package/build/dex/index.js +21 -3
  40. package/build/dex/index.js.map +1 -1
  41. package/build/dex/integral/config.d.ts +4 -0
  42. package/build/dex/integral/config.js +20 -0
  43. package/build/dex/integral/config.js.map +1 -0
  44. package/build/dex/integral/context.d.ts +40 -0
  45. package/build/dex/integral/context.js +158 -0
  46. package/build/dex/integral/context.js.map +1 -0
  47. package/build/dex/integral/helpers.d.ts +17 -0
  48. package/build/dex/integral/helpers.js +157 -0
  49. package/build/dex/integral/helpers.js.map +1 -0
  50. package/build/dex/integral/integral-factory.d.ts +21 -0
  51. package/build/dex/integral/integral-factory.js +92 -0
  52. package/build/dex/integral/integral-factory.js.map +1 -0
  53. package/build/dex/integral/integral-pool.d.ts +46 -0
  54. package/build/dex/integral/integral-pool.js +143 -0
  55. package/build/dex/integral/integral-pool.js.map +1 -0
  56. package/build/dex/integral/integral-pricing.d.ts +18 -0
  57. package/build/dex/integral/integral-pricing.js +114 -0
  58. package/build/dex/integral/integral-pricing.js.map +1 -0
  59. package/build/dex/integral/integral-relayer.d.ts +39 -0
  60. package/build/dex/integral/integral-relayer.js +189 -0
  61. package/build/dex/integral/integral-relayer.js.map +1 -0
  62. package/build/dex/integral/integral-token.d.ts +24 -0
  63. package/build/dex/integral/integral-token.js +56 -0
  64. package/build/dex/integral/integral-token.js.map +1 -0
  65. package/build/dex/integral/integral.d.ts +41 -0
  66. package/build/dex/integral/integral.js +377 -0
  67. package/build/dex/integral/integral.js.map +1 -0
  68. package/build/dex/integral/types.d.ts +84 -0
  69. package/build/dex/integral/types.js +9 -0
  70. package/build/dex/integral/types.js.map +1 -0
  71. package/build/dex/integral/utils-e2e.d.ts +9 -0
  72. package/build/dex/integral/utils-e2e.js +131 -0
  73. package/build/dex/integral/utils-e2e.js.map +1 -0
  74. package/build/dex/integral/utils.d.ts +17 -0
  75. package/build/dex/integral/utils.js +94 -0
  76. package/build/dex/integral/utils.js.map +1 -0
  77. package/build/dex/oswap/config.d.ts +5 -0
  78. package/build/dex/oswap/config.js +31 -0
  79. package/build/dex/oswap/config.js.map +1 -0
  80. package/build/dex/oswap/oswap-pool.d.ts +51 -0
  81. package/build/dex/oswap/oswap-pool.js +150 -0
  82. package/build/dex/oswap/oswap-pool.js.map +1 -0
  83. package/build/dex/oswap/oswap.d.ts +46 -0
  84. package/build/dex/oswap/oswap.js +266 -0
  85. package/build/dex/oswap/oswap.js.map +1 -0
  86. package/build/dex/oswap/types.d.ts +20 -0
  87. package/build/dex/oswap/types.js +3 -0
  88. package/build/dex/oswap/types.js.map +1 -0
  89. package/build/dex/platypus/platypus.d.ts +1 -2
  90. package/build/dex/platypus/platypus.js +0 -45
  91. package/build/dex/platypus/platypus.js.map +1 -1
  92. package/build/dex/sdai/config.d.ts +11 -0
  93. package/build/dex/sdai/config.js +21 -0
  94. package/build/dex/sdai/config.js.map +1 -0
  95. package/build/dex/sdai/constants.d.ts +2 -0
  96. package/build/dex/sdai/constants.js +6 -0
  97. package/build/dex/sdai/constants.js.map +1 -0
  98. package/build/dex/sdai/scripts/validate-state.js +102 -0
  99. package/build/dex/sdai/scripts/validate-state.js.map +1 -0
  100. package/build/dex/sdai/sdai-pool.d.ts +16 -0
  101. package/build/dex/sdai/sdai-pool.js +85 -0
  102. package/build/dex/sdai/sdai-pool.js.map +1 -0
  103. package/build/dex/sdai/sdai.d.ts +51 -0
  104. package/build/dex/sdai/sdai.js +172 -0
  105. package/build/dex/sdai/sdai.js.map +1 -0
  106. package/build/dex/sdai/types.d.ts +21 -0
  107. package/build/dex/sdai/types.js +11 -0
  108. package/build/dex/sdai/types.js.map +1 -0
  109. package/build/dex/sdai/utils.d.ts +4 -0
  110. package/build/dex/sdai/utils.js +39 -0
  111. package/build/dex/sdai/utils.js.map +1 -0
  112. package/build/dex/stable-pool.js +8 -1
  113. package/build/dex/stable-pool.js.map +1 -1
  114. package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
  115. package/build/dex/swaap-v1/swaap-v1.js +0 -14
  116. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  117. package/build/dex/uniswap-v3/contract-math/Oracle.js +4 -4
  118. package/build/dex/uniswap-v3/contract-math/Oracle.js.map +1 -1
  119. package/build/executor/compressor/Compressor.d.ts +23 -0
  120. package/build/executor/compressor/Compressor.js +144 -0
  121. package/build/executor/compressor/Compressor.js.map +1 -0
  122. package/build/executor/compressor/compress.d.ts +17 -0
  123. package/build/executor/compressor/compress.js +187 -0
  124. package/build/executor/compressor/compress.js.map +1 -0
  125. package/build/executor/compressor/compress_functions/addressSubstitution.d.ts +6 -0
  126. package/build/executor/compressor/compress_functions/addressSubstitution.js +29 -0
  127. package/build/executor/compressor/compress_functions/addressSubstitution.js.map +1 -0
  128. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.d.ts +10 -0
  129. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js +40 -0
  130. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js.map +1 -0
  131. package/build/executor/compressor/compress_functions/byteSubstitution.d.ts +11 -0
  132. package/build/executor/compressor/compress_functions/byteSubstitution.js +64 -0
  133. package/build/executor/compressor/compress_functions/byteSubstitution.js.map +1 -0
  134. package/build/executor/compressor/compress_functions/ffSubstitution.d.ts +7 -0
  135. package/build/executor/compressor/compress_functions/ffSubstitution.js +54 -0
  136. package/build/executor/compressor/compress_functions/ffSubstitution.js.map +1 -0
  137. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.d.ts +8 -0
  138. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js +67 -0
  139. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js.map +1 -0
  140. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.d.ts +8 -0
  141. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js +61 -0
  142. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js.map +1 -0
  143. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.d.ts +6 -0
  144. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js +37 -0
  145. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js.map +1 -0
  146. package/build/executor/compressor/compress_functions/searchUnusedBytes.d.ts +9 -0
  147. package/build/executor/compressor/compress_functions/searchUnusedBytes.js +33 -0
  148. package/build/executor/compressor/compress_functions/searchUnusedBytes.js.map +1 -0
  149. package/build/executor/compressor/fetchSaved.js +17 -0
  150. package/build/executor/compressor/fetchSaved.js.map +1 -0
  151. package/build/executor/compressor/utils/computeCostL2.d.ts +2 -0
  152. package/build/executor/compressor/utils/computeCostL2.js +14 -0
  153. package/build/executor/compressor/utils/computeCostL2.js.map +1 -0
  154. package/build/executor/compressor/utils/findLongestDuplicatedString.d.ts +2 -0
  155. package/build/executor/compressor/utils/findLongestDuplicatedString.js +30 -0
  156. package/build/executor/compressor/utils/findLongestDuplicatedString.js.map +1 -0
  157. package/build/executor/compressor/utils/getAllIndexes.d.ts +2 -0
  158. package/build/executor/compressor/utils/getAllIndexes.js +12 -0
  159. package/build/executor/compressor/utils/getAllIndexes.js.map +1 -0
  160. package/build/executor/compressor/utils/getByteForAddress.d.ts +2 -0
  161. package/build/executor/compressor/utils/getByteForAddress.js +14 -0
  162. package/build/executor/compressor/utils/getByteForAddress.js.map +1 -0
  163. package/build/executor/compressor/utils/intTo2Bytes.d.ts +2 -0
  164. package/build/executor/compressor/utils/intTo2Bytes.js +14 -0
  165. package/build/executor/compressor/utils/intTo2Bytes.js.map +1 -0
  166. package/build/executor/compressor/utils/intTo3Bytes.d.ts +2 -0
  167. package/build/executor/compressor/utils/intTo3Bytes.js +18 -0
  168. package/build/executor/compressor/utils/intTo3Bytes.js.map +1 -0
  169. package/build/executor/compressor/utils/intToByte.d.ts +2 -0
  170. package/build/executor/compressor/utils/intToByte.js +10 -0
  171. package/build/executor/compressor/utils/intToByte.js.map +1 -0
  172. package/build/generic-swap-transaction-builder.js +3 -1
  173. package/build/generic-swap-transaction-builder.js.map +1 -1
  174. package/build/router/simpleswap.js +3 -1
  175. package/build/router/simpleswap.js.map +1 -1
  176. package/package.json +2 -2
  177. package/src/abi/BProtocol.json +1155 -0
  178. package/src/abi/Jarvis.json +1172 -0
  179. package/src/abi/MStableAsset.json +1545 -0
  180. package/src/abi/OneInchLp.json +1304 -0
  181. package/src/abi/Onebit.json +736 -0
  182. package/src/abi/Shell.json +1294 -0
  183. package/src/abi/TraderJoeV2Router.json +50 -0
  184. package/src/abi/integral/factory.json +333 -0
  185. package/src/abi/integral/oracle.json +501 -0
  186. package/src/abi/integral/pool.json +1041 -0
  187. package/src/abi/integral/relayer.json +1536 -0
  188. package/src/abi/zrx.v2.json +1967 -0
  189. package/src/abi/zrx.v3.json +3454 -0
  190. package/src/abi/zrx.v4.json +2193 -0
  191. package/src/config.ts +1 -1
  192. package/src/dex/OneInchLp.ts +84 -0
  193. package/src/dex/bProtocol/bProtocol-e2e.test.ts +93 -0
  194. package/src/dex/bProtocol/bProtocol.ts +108 -0
  195. package/src/dex/bProtocol/types.ts +13 -0
  196. package/src/dex/curve-v1-factory/config.ts +10 -47
  197. package/src/dex/curve-v1-factory/curve-v1-factory-e2e.test.ts +16 -92
  198. package/src/dex/curve-v1-factory/curve-v1-factory-integration.test.ts +5 -125
  199. package/src/dex/curve-v1-factory/curve-v1-factory.ts +45 -137
  200. package/src/dex/curve-v1-factory/price-handlers/functions/constants.ts +2 -0
  201. package/src/dex/curve-v1-factory/price-handlers/functions/get_dx.ts +1 -24
  202. package/src/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.ts +2 -3
  203. package/src/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.ts +0 -1
  204. package/src/dex/curve-v1-factory/state-polling-pools/pool-polling-base.ts +10 -31
  205. package/src/dex/curve-v1-factory/types.ts +6 -22
  206. package/src/dex/curve-v1-stable-ng/config.ts +0 -18
  207. package/src/dex/curve-v1-stable-ng/curve-v1-stable-ng-e2e.test.ts +0 -17
  208. package/src/dex/index.ts +20 -3
  209. package/src/dex/integral/config.ts +20 -0
  210. package/src/dex/integral/context.ts +287 -0
  211. package/src/dex/integral/integral-e2e.test.ts +86 -0
  212. package/src/dex/integral/integral-events.test.ts +412 -0
  213. package/src/dex/integral/integral-factory.ts +146 -0
  214. package/src/dex/integral/integral-integration.test.ts +221 -0
  215. package/src/dex/integral/integral-pool.ts +198 -0
  216. package/src/dex/integral/integral-pricing.ts +190 -0
  217. package/src/dex/integral/integral-relayer.ts +285 -0
  218. package/src/dex/integral/integral-token.ts +95 -0
  219. package/src/dex/integral/integral.ts +523 -0
  220. package/src/dex/integral/test-artifacts/configs.json +1 -0
  221. package/src/dex/integral/test-artifacts/logs.json +1 -0
  222. package/src/dex/integral/test-artifacts/states.json +1 -0
  223. package/src/dex/integral/types.ts +88 -0
  224. package/src/dex/integral/utils-e2e.ts +194 -0
  225. package/src/dex/integral/utils.ts +146 -0
  226. package/src/dex/jarvis.ts +262 -0
  227. package/src/dex/mStable.ts +147 -0
  228. package/src/dex/onebit/onebit.ts +113 -0
  229. package/src/dex/onebit/types.ts +17 -0
  230. package/src/dex/shell.ts +84 -0
  231. package/src/dex/trader-joe-v2.ts +148 -0
  232. package/src/dex/uniswap-v3/contract-math/Oracle.ts +5 -4
  233. package/src/dex/zerox/config.ts +31 -0
  234. package/src/dex/zerox/index.ts +328 -0
  235. package/src/dex/zerox/order.ts +62 -0
  236. package/src/dex/zerox/types.ts +82 -0
  237. package/src/dex/zerox/zerox-e2e.test.ts +110 -0
  238. package/src/generic-swap-transaction-builder.ts +3 -1
  239. package/src/router/simpleswap.ts +3 -1
  240. package/tests/constants-e2e.ts +1 -1
  241. package/tests/utils-e2e.ts +0 -2
  242. package/.vscode/tasks.json +0 -15
  243. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  244. package/build/dex/aave-v2/tokens-avalanche.json +0 -44
  245. package/build/dex/aave-v2/tokens-mainnet.json +0 -188
  246. package/build/dex/aave-v2/tokens-polygon.json +0 -44
  247. package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
  248. package/build/dex/maker-psm/scripts/validate-state.js +0 -185
  249. package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
  250. package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
  251. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  252. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  253. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  254. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  255. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  256. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  257. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  258. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
  259. package/src/abi/curve-v1-factory/CurveV1Router.abi.json +0 -331
  260. package/src/dex/curve-v1-factory/optimizer.ts +0 -61
  261. /package/build/dex/{solidly-v3/scripts/check-event-pool-event.d.ts → sdai/scripts/validate-state.d.ts} +0 -0
  262. /package/build/{dex/maker-psm/scripts/validate-state.d.ts → executor/compressor/fetchSaved.d.ts} +0 -0
@@ -0,0 +1,523 @@
1
+ import _ from 'lodash';
2
+ import { DeepReadonly } from 'ts-essentials';
3
+ import * as CALLDATA_GAS_COST from '../../calldata-gas-cost';
4
+ import {
5
+ Token,
6
+ Address,
7
+ ExchangePrices,
8
+ AdapterExchangeParam,
9
+ PoolLiquidity,
10
+ Logger,
11
+ PoolPrices,
12
+ NumberAsString,
13
+ DexExchangeParam,
14
+ } from '../../types';
15
+ import { SwapSide, Network } from '../../constants';
16
+ import { getBigIntPow, getDexKeysWithNetwork, isETHAddress } from '../../utils';
17
+ import { Context, IDex } from '../idex';
18
+ import { IDexHelper } from '../../dex-helper/idex-helper';
19
+ import {
20
+ IntegralData,
21
+ IntegralFunctions,
22
+ PoolStates,
23
+ QuotingProps,
24
+ RelayerPoolState,
25
+ RelayerTokensState,
26
+ } from './types';
27
+ import { SimpleExchange } from '../simple-exchange';
28
+ import { IntegralConfig, Adapters } from './config';
29
+ import IntegralRelayerABI from '../../abi/integral/relayer.json';
30
+ import { Interface } from '@ethersproject/abi';
31
+ import { BI_POWS } from '../../bigint-constants';
32
+ import {
33
+ getDecimalsConverter,
34
+ getPoolIdentifier,
35
+ getPrice,
36
+ isInverted,
37
+ sortTokens,
38
+ } from './utils';
39
+ import { IntegralContext } from './context';
40
+ import { ceil_div } from './utils';
41
+
42
+ const PRECISION = BI_POWS[18];
43
+ const SUBGRAPH_TIMEOUT = 20 * 1000;
44
+ const SWAP_ORDER_TIMEOUT = Math.floor(Date.now() / 1000) + 24 * 3600;
45
+ const relayerInterface = new Interface(IntegralRelayerABI);
46
+
47
+ export class Integral extends SimpleExchange implements IDex<IntegralData> {
48
+ protected subgraphURL: string | undefined;
49
+ readonly hasConstantPriceLargeAmounts = false;
50
+
51
+ private readonly context: IntegralContext;
52
+ readonly isFeeOnTransferSupported = false;
53
+
54
+ public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
55
+ getDexKeysWithNetwork(IntegralConfig);
56
+
57
+ logger: Logger;
58
+
59
+ constructor(
60
+ readonly network: Network,
61
+ readonly dexKey: string,
62
+ readonly dexHelper: IDexHelper,
63
+ protected adapters = Adapters[network] || {},
64
+ ) {
65
+ super(dexHelper, dexKey);
66
+ this.logger = dexHelper.getLogger(dexKey);
67
+
68
+ this.context = IntegralContext.initialize(
69
+ network,
70
+ dexKey,
71
+ dexHelper,
72
+ this.erc20Interface,
73
+ IntegralConfig[dexKey][network].factoryAddress.toLowerCase(),
74
+ IntegralConfig[dexKey][network].relayerAddress.toLowerCase(),
75
+ );
76
+ this.subgraphURL = IntegralConfig[dexKey][network].subgraphURL;
77
+ }
78
+
79
+ async initializePricing(blockNumber: number) {
80
+ await this.context.factory.initialize(blockNumber);
81
+ const factoryState = this.context.factory.getState(blockNumber);
82
+ if (factoryState) {
83
+ await this.context.addPools(factoryState.pools, blockNumber, true);
84
+ }
85
+ }
86
+
87
+ // Returns the list of contract adapters (name and index)
88
+ // for a buy/sell. Return null if there are no adapters.
89
+ getAdapters(side: SwapSide): { name: string; index: number }[] | null {
90
+ return this.adapters[side] ? this.adapters[side] : null;
91
+ }
92
+
93
+ async getPoolIdentifiers(
94
+ srcToken: Token,
95
+ destToken: Token,
96
+ side: SwapSide,
97
+ blockNumber: number,
98
+ ): Promise<string[]> {
99
+ const src = this.dexHelper.config.wrapETH(srcToken);
100
+ const dest = this.dexHelper.config.wrapETH(destToken);
101
+
102
+ if (src.address.toLowerCase() === dest.address.toLowerCase()) {
103
+ return [];
104
+ }
105
+
106
+ const tokenAddresses = [
107
+ src.address.toLowerCase(),
108
+ dest.address.toLowerCase(),
109
+ ]
110
+ .sort((a, b) => (a > b ? 1 : -1))
111
+ .join('_');
112
+
113
+ const poolIdentifier = `${this.dexKey}_${tokenAddresses}`;
114
+ return [poolIdentifier];
115
+ }
116
+
117
+ // Returns pool prices for amounts.
118
+ // If limitPools is defined only pools in limitPools
119
+ // should be used. If limitPools is undefined then
120
+ // any pools can be used.
121
+ async getPricesVolume(
122
+ srcToken: Token,
123
+ destToken: Token,
124
+ amounts: bigint[],
125
+ side: SwapSide,
126
+ blockNumber: number,
127
+ limitPools?: string[],
128
+ ): Promise<null | ExchangePrices<IntegralData>> {
129
+ const src = this.dexHelper.config.wrapETH(srcToken);
130
+ const dest = this.dexHelper.config.wrapETH(destToken);
131
+ if (src.address.toLowerCase() === dest.address.toLowerCase()) {
132
+ return null;
133
+ }
134
+
135
+ const poolIdentifier = getPoolIdentifier(
136
+ this.dexKey,
137
+ src.address,
138
+ dest.address,
139
+ );
140
+ if (limitPools && limitPools.every(p => p !== poolIdentifier)) {
141
+ return null;
142
+ }
143
+
144
+ const props = await this.getQuotingProps(src, dest, blockNumber);
145
+ if (!props) {
146
+ return null;
147
+ }
148
+
149
+ const unitAmount = getBigIntPow(
150
+ side == SwapSide.SELL ? src.decimals : dest.decimals,
151
+ );
152
+ const unit =
153
+ side == SwapSide.SELL
154
+ ? this.quoteSell(unitAmount, props, false)
155
+ : this.quoteBuy(unitAmount, props, false);
156
+ try {
157
+ const prices =
158
+ side == SwapSide.SELL
159
+ ? amounts.map(amount => this.quoteSell(amount, props))
160
+ : amounts.map(amount => this.quoteBuy(amount, props));
161
+
162
+ return [
163
+ {
164
+ prices: prices,
165
+ unit: unit,
166
+ data: {
167
+ relayer: this.context.relayerAddress,
168
+ },
169
+ exchange: this.dexKey,
170
+ poolIdentifier,
171
+ gasCost: 0,
172
+ poolAddresses: this.context.getPoolAddresses(),
173
+ },
174
+ ];
175
+ } catch (e) {
176
+ this.logger.error(
177
+ `Error_getPricesVolume could not get price with error:`,
178
+ e,
179
+ );
180
+ return null;
181
+ }
182
+ }
183
+
184
+ // Returns estimated gas cost of calldata for this DEX in multiSwap
185
+ getCalldataGasCost(poolPrices: PoolPrices<IntegralData>): number | number[] {
186
+ return CALLDATA_GAS_COST.DEX_NO_PAYLOAD;
187
+ }
188
+
189
+ // Encode params required by the exchange adapter
190
+ // Used for multiSwap, buy & megaSwap
191
+ // Hint: abiCoder.encodeParameter() could be useful
192
+ getAdapterParam(
193
+ srcToken: string,
194
+ destToken: string,
195
+ srcAmount: string,
196
+ destAmount: string,
197
+ data: IntegralData,
198
+ side: SwapSide,
199
+ ): AdapterExchangeParam {
200
+ const { relayer: exchange } = data;
201
+
202
+ // Encode here the payload for adapter
203
+ const payload = '0x';
204
+
205
+ return {
206
+ targetExchange: exchange,
207
+ payload,
208
+ networkFee: '0',
209
+ };
210
+ }
211
+
212
+ getDexParam(
213
+ srcToken: Address,
214
+ destToken: Address,
215
+ srcAmount: NumberAsString,
216
+ destAmount: NumberAsString,
217
+ recipient: Address,
218
+ data: IntegralData,
219
+ side: SwapSide,
220
+ _: Context,
221
+ executorAddress: Address,
222
+ ): DexExchangeParam {
223
+ const { relayer: exchange } = data;
224
+
225
+ const tokenIn = this.dexHelper.config.wrapETH(srcToken);
226
+ const tokenOut = this.dexHelper.config.wrapETH(destToken);
227
+
228
+ const swapData = relayerInterface.encodeFunctionData(
229
+ side === SwapSide.SELL ? IntegralFunctions.swap : IntegralFunctions.buy,
230
+ [
231
+ {
232
+ ...{
233
+ tokenIn,
234
+ tokenOut,
235
+ wrapUnwrap: isETHAddress(srcToken) || isETHAddress(destToken),
236
+ to: recipient,
237
+ submitDeadline: SWAP_ORDER_TIMEOUT,
238
+ },
239
+ ...(side === SwapSide.SELL
240
+ ? { amountIn: srcAmount, amountOutMin: destAmount }
241
+ : { amountInMax: srcAmount, amountOut: destAmount }),
242
+ },
243
+ ],
244
+ );
245
+
246
+ return {
247
+ needWrapNative: this.needWrapNative,
248
+ dexFuncHasRecipient: true,
249
+ exchangeData: swapData,
250
+ targetExchange: exchange,
251
+ returnAmountPos: undefined,
252
+ };
253
+ }
254
+
255
+ async updatePoolState(): Promise<void> {}
256
+
257
+ // Returns list of top pools based on liquidity. Max
258
+ // limit number pools should be returned.
259
+ async getTopPoolsForToken(
260
+ tokenAddress: Address,
261
+ limit: number,
262
+ ): Promise<PoolLiquidity[]> {
263
+ if (!this.subgraphURL) {
264
+ return [];
265
+ }
266
+ const query = `
267
+ query ($token: Bytes!, $limit: Int) {
268
+ pools0: pairs(
269
+ first: $limit
270
+ orderBy: reserveUSD
271
+ orderDirection: desc
272
+ where: {token0: $token}
273
+ ) {
274
+ id
275
+ token0 {
276
+ id
277
+ decimals
278
+ }
279
+ token1 {
280
+ id
281
+ decimals
282
+ }
283
+ reserveUSD
284
+ }
285
+ pools1: pairs(
286
+ first: $limit
287
+ orderBy: reserveUSD
288
+ orderDirection: desc
289
+ where: {token1: $token}
290
+ ) {
291
+ id
292
+ token0 {
293
+ id
294
+ decimals
295
+ }
296
+ token1 {
297
+ id
298
+ decimals
299
+ }
300
+ reserveUSD
301
+ }
302
+ }`;
303
+ const { data } = await this.dexHelper.httpRequest.querySubgraph(
304
+ this.subgraphURL,
305
+ {
306
+ query,
307
+ variables: { token: tokenAddress.toLowerCase(), limit },
308
+ },
309
+ { timeout: SUBGRAPH_TIMEOUT },
310
+ );
311
+
312
+ if (!(data && data.pools0 && data.pools1))
313
+ throw new Error("Couldn't fetch the pools from the subgraph");
314
+ const pools0 = _.map(data.pools0, pool => ({
315
+ exchange: this.dexKey,
316
+ address: pool.id.toLowerCase(),
317
+ connectorTokens: [
318
+ {
319
+ address: pool.token1.id.toLowerCase(),
320
+ decimals: parseInt(pool.token1.decimals),
321
+ },
322
+ ],
323
+ liquidityUSD: parseFloat(pool.reserveUSD),
324
+ }));
325
+
326
+ const pools1 = _.map(data.pools1, pool => ({
327
+ exchange: this.dexKey,
328
+ address: pool.id.toLowerCase(),
329
+ connectorTokens: [
330
+ {
331
+ address: pool.token0.id.toLowerCase(),
332
+ decimals: parseInt(pool.token0.decimals),
333
+ },
334
+ ],
335
+ liquidityUSD: parseFloat(pool.reserveUSD),
336
+ }));
337
+
338
+ return _.slice(
339
+ _.sortBy(_.concat(pools0, pools1), [pool => -1 * pool.liquidityUSD]),
340
+ 0,
341
+ limit,
342
+ );
343
+ }
344
+
345
+ async getPriceOnChain(
346
+ tokenIn: Token,
347
+ tokenOut: Token,
348
+ inverted: boolean,
349
+ blockNumber: number,
350
+ ): Promise<QuotingProps | null> {
351
+ try {
352
+ const calldata = [
353
+ {
354
+ target: this.context.relayerAddress,
355
+ callData: relayerInterface.encodeFunctionData('getPoolState', [
356
+ tokenIn.address,
357
+ tokenOut.address,
358
+ ]),
359
+ },
360
+ ];
361
+ const data: { returnData: any[] } =
362
+ await this.dexHelper.multiContract.methods
363
+ .aggregate(calldata)
364
+ .call({}, blockNumber);
365
+
366
+ const result = relayerInterface.decodeFunctionResult(
367
+ 'getPoolState',
368
+ data.returnData[0],
369
+ );
370
+ const _limits = inverted
371
+ ? [result.limitMin1, result.limitMax1]
372
+ : [result.limitMin0, result.limitMax0];
373
+ const limits: [bigint, bigint] = [
374
+ BigInt(_limits[0].toString()),
375
+ BigInt(_limits[1].toString()),
376
+ ];
377
+ const [decimals0, decimals1] = inverted
378
+ ? [tokenOut.decimals, tokenIn.decimals]
379
+ : [tokenIn.decimals, tokenOut.decimals];
380
+ return {
381
+ price: BigInt(result.price.toString()),
382
+ fee: BigInt(result.fee.toString()),
383
+ tokenOutLimits: limits,
384
+ decimalsConverter: getDecimalsConverter(decimals0, decimals1, inverted),
385
+ };
386
+ } catch (e) {
387
+ this.logger.error(
388
+ `Error_getPriceOnChain could not get data with error:`,
389
+ e,
390
+ );
391
+ return null;
392
+ }
393
+ }
394
+
395
+ private async getQuotingProps(src: Token, dest: Token, blockNumber: number) {
396
+ const poolId = getPoolIdentifier(this.dexKey, src.address, dest.address);
397
+ const inverted = isInverted(src.address, dest.address);
398
+
399
+ const states = this.getStates(poolId, blockNumber);
400
+ if (!states) {
401
+ return await this.getPriceOnChain(src, dest, inverted, blockNumber);
402
+ }
403
+ const { base, poolAddress, relayer, relayerTokens } = states;
404
+
405
+ const price = getPrice(states, inverted);
406
+
407
+ const token0 = sortTokens(src.address, dest.address)[0];
408
+ const { max0, max1 } = this.getMaxLimits(
409
+ poolAddress,
410
+ relayer,
411
+ relayerTokens,
412
+ );
413
+ const props: QuotingProps = {
414
+ price,
415
+ fee: relayer.swapFee,
416
+ tokenOutLimits:
417
+ dest.address === token0
418
+ ? [relayer.limits.min0, max0]
419
+ : [relayer.limits.min1, max1],
420
+ decimalsConverter: getDecimalsConverter(
421
+ base.decimals0,
422
+ base.decimals1,
423
+ inverted,
424
+ ),
425
+ };
426
+ return props;
427
+ }
428
+
429
+ private quoteSell(
430
+ amountIn: bigint,
431
+ props: DeepReadonly<QuotingProps>,
432
+ checkLimit: boolean = true,
433
+ ) {
434
+ if (amountIn === 0n) {
435
+ return 0n;
436
+ }
437
+
438
+ const fee = (amountIn * props.fee) / PRECISION;
439
+ const amountInMinusFee = amountIn - fee;
440
+ const amountOut =
441
+ (amountInMinusFee * props.price) / props.decimalsConverter;
442
+ if (checkLimit && !this.checkLimits(amountOut, props.tokenOutLimits)) {
443
+ return 0n;
444
+ // throw new Error(
445
+ // `Out of Limits - amountOut ${amountOut} not in between limits ${props.tokenOutLimits}`,
446
+ // );
447
+ }
448
+ return amountOut;
449
+ }
450
+
451
+ private quoteBuy(
452
+ amountOut: bigint,
453
+ props: DeepReadonly<QuotingProps>,
454
+ checkLimit: boolean = true,
455
+ ) {
456
+ if (amountOut === 0n) {
457
+ return 0n;
458
+ }
459
+
460
+ if (checkLimit && !this.checkLimits(amountOut, props.tokenOutLimits)) {
461
+ return 0n;
462
+ // throw new Error(
463
+ // `Out of Limits - amountOut ${amountOut} not in between limits ${props.tokenOutLimits}`,
464
+ // );
465
+ }
466
+
467
+ const amountIn = ceil_div(amountOut * props.decimalsConverter, props.price);
468
+ if (amountIn <= 0n) {
469
+ return 0n;
470
+ }
471
+ const amountInPlusFee = ceil_div(
472
+ amountIn * PRECISION,
473
+ PRECISION - props.fee,
474
+ );
475
+ return amountInPlusFee;
476
+ }
477
+
478
+ private checkLimits(amount: bigint, limits: readonly [bigint, bigint]) {
479
+ if (amount < limits[0] || amount > limits[1]) {
480
+ return false;
481
+ }
482
+ return true;
483
+ }
484
+
485
+ private getStates(poolId: string, blockNumber: number): PoolStates | null {
486
+ const poolStates = this.context.pools[poolId];
487
+ if (poolStates && poolStates.base) {
488
+ const base = poolStates.base.getState(blockNumber);
489
+ const pricing =
490
+ poolStates.pricing && poolStates.pricing.getState(blockNumber);
491
+ const relayerState = this.context.relayer.getState(blockNumber);
492
+ const relayer =
493
+ relayerState && relayerState.pools[poolStates.base.poolAddress];
494
+ return base && pricing && relayer
495
+ ? {
496
+ base,
497
+ pricing,
498
+ relayer,
499
+ relayerTokens: relayerState.tokens,
500
+ poolAddress: poolStates.base.poolAddress,
501
+ }
502
+ : null;
503
+ } else {
504
+ return null;
505
+ }
506
+ }
507
+
508
+ private getMaxLimits(
509
+ poolAddress: Address,
510
+ relayer: RelayerPoolState,
511
+ relayerTokens: RelayerTokensState,
512
+ ) {
513
+ const { token0, token1 } =
514
+ this.context.relayer.getPools()[poolAddress.toLowerCase()];
515
+ const max0 =
516
+ (relayerTokens[token0].balance * relayer.limits.maxMultiplier0) /
517
+ 10n ** 18n;
518
+ const max1 =
519
+ (relayerTokens[token1].balance * relayer.limits.maxMultiplier1) /
520
+ 10n ** 18n;
521
+ return { max0, max1 };
522
+ }
523
+ }
@@ -0,0 +1,88 @@
1
+ import { Address, Token } from '../../types';
2
+ import { IntegralEventPool } from './integral-pool';
3
+ import { PoolState as UniswapPoolState } from '../uniswap-v3/types';
4
+ import { BigNumber } from 'ethers';
5
+ import { IntegralPricing } from './integral-pricing';
6
+
7
+ export type Requires<Class, Prop extends keyof Class> = Class &
8
+ Required<Pick<Class, Prop>>;
9
+
10
+ export type IntegralPool = {
11
+ base?: IntegralEventPool;
12
+ pricing?: IntegralPricing;
13
+ enabled: boolean;
14
+ };
15
+
16
+ export type QuotingProps = {
17
+ price: bigint;
18
+ fee: bigint;
19
+ tokenOutLimits: [bigint, bigint];
20
+ decimalsConverter: bigint;
21
+ };
22
+
23
+ export type PoolState = {
24
+ swapFee: bigint;
25
+ mintFee: bigint;
26
+ burnFee: bigint;
27
+ decimals0: number;
28
+ decimals1: number;
29
+ oracle: Address;
30
+ uniswapPool: Address;
31
+ uniswapPoolFee: bigint;
32
+ };
33
+
34
+ export type RelayerPoolState = {
35
+ isEnabled: boolean;
36
+ swapFee: bigint;
37
+ twapInterval: number;
38
+ limits: {
39
+ min0: bigint;
40
+ min1: bigint;
41
+ maxMultiplier0: bigint;
42
+ maxMultiplier1: bigint;
43
+ };
44
+ };
45
+ export type RelayerTokensState = {
46
+ [tokenAddress: string]: { balance: bigint };
47
+ };
48
+ export type RelayerState = {
49
+ pools: { [poolAddress: string]: RelayerPoolState };
50
+ tokens: RelayerTokensState;
51
+ };
52
+
53
+ export type PoolInitProps = {
54
+ [poolAddress: string]: { token0: Address; token1: Address };
55
+ };
56
+ export type FactoryState = { pools: PoolInitProps };
57
+
58
+ export type PoolStates = {
59
+ base: PoolState;
60
+ relayer: RelayerPoolState;
61
+ relayerTokens: RelayerTokensState;
62
+ pricing: UniswapPoolState;
63
+ poolAddress: Address;
64
+ };
65
+
66
+ export type TokenState = Record<string, never>;
67
+
68
+ export type IntegralData = {
69
+ relayer: Address;
70
+ };
71
+
72
+ export type DexParams = {
73
+ factoryAddress: string;
74
+ relayerAddress: string;
75
+ subgraphURL?: string;
76
+ };
77
+
78
+ export enum IntegralFunctions {
79
+ swap = 'sell',
80
+ buy = 'buy',
81
+ }
82
+
83
+ export type Observation = {
84
+ blockTimestamp: number;
85
+ initialized: boolean;
86
+ secondsPerLiquidityCumulativeX128: BigNumber;
87
+ tickCumulative: BigNumber;
88
+ };